ETH Price: $3,292.18 (-0.23%)

Token

xMPL (xMPL)
 

Overview

Max Total Supply

71,864.488586392503877055 xMPL

Holders

150 (0.00%)

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
Null: 0x000...000
Balance
0 xMPL

Value
$0.00
0x0000000000000000000000000000000000000000
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Maple is an institutional crypto-capital network providing infrastructure for credit experts to run lending businesses, and connecting capital from institutional and individual lenders to blue-chip companies. xMPL is a governance and utility token that enables holders to share in Maple’s growth.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
xMPL

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 999999 runs

Other Settings:
default evmVersion, GNU AGPLv3 license
File 1 of 1 : xMPL.sol
// SPDX-License-Identifier: AGPL-3.0-or-later
pragma solidity 0.8.7;

/**
 *  @title  xMPL
 *  @author lucas-manuel, JGCarv, deluca-mike, edag94, vbidin
 *  @notice This contract contains functionality to facilitate on-chain distribution
 *          of protocol revenues denominated in MPL tokens. xMPL inherits the core
 *          functionality from Maple's Revenue Distribution Token, which allows
 *          users to lock assets to earn rewards distributions based on a vesting
 *          schedule, with the added functionality to perform a one time asset
 *          migration of the underlying token.
 *  @dev    This code was deployed at commit 9604d297132503cb05d74f2998c18b07f345ecc0
 *          (https://github.com/maple-labs/xMPL/releases/tag/v1.0.1).
 */

/// @title Interface of the ERC20 standard as defined in the EIP, including EIP-2612 permit functionality.
interface IERC20 {

    /**************/
    /*** Events ***/
    /**************/

    /**
     *  @dev   Emitted when one account has set the allowance of another account over their tokens.
     *  @param owner_   Account that tokens are approved from.
     *  @param spender_ Account that tokens are approved for.
     *  @param amount_  Amount of tokens that have been approved.
     */
    event Approval(address indexed owner_, address indexed spender_, uint256 amount_);

    /**
     *  @dev   Emitted when tokens have moved from one account to another.
     *  @param owner_     Account that tokens have moved from.
     *  @param recipient_ Account that tokens have moved to.
     *  @param amount_    Amount of tokens that have been transferred.
     */
    event Transfer(address indexed owner_, address indexed recipient_, uint256 amount_);

    /**************************/
    /*** External Functions ***/
    /**************************/

    /**
     *  @dev    Function that allows one account to set the allowance of another account over their tokens.
     *          Emits an {Approval} event.
     *  @param  spender_ Account that tokens are approved for.
     *  @param  amount_  Amount of tokens that have been approved.
     *  @return success_ Boolean indicating whether the operation succeeded.
     */
    function approve(address spender_, uint256 amount_) external returns (bool success_);

    /**
     *  @dev    Function that allows one account to decrease the allowance of another account over their tokens.
     *          Emits an {Approval} event.
     *  @param  spender_          Account that tokens are approved for.
     *  @param  subtractedAmount_ Amount to decrease approval by.
     *  @return success_          Boolean indicating whether the operation succeeded.
     */
    function decreaseAllowance(address spender_, uint256 subtractedAmount_) external returns (bool success_);

    /**
     *  @dev    Function that allows one account to increase the allowance of another account over their tokens.
     *          Emits an {Approval} event.
     *  @param  spender_     Account that tokens are approved for.
     *  @param  addedAmount_ Amount to increase approval by.
     *  @return success_     Boolean indicating whether the operation succeeded.
     */
    function increaseAllowance(address spender_, uint256 addedAmount_) external returns (bool success_);

    /**
     *  @dev   Approve by signature.
     *  @param owner_    Owner address that signed the permit.
     *  @param spender_  Spender of the permit.
     *  @param amount_   Permit approval spend limit.
     *  @param deadline_ Deadline after which the permit is invalid.
     *  @param v_        ECDSA signature v component.
     *  @param r_        ECDSA signature r component.
     *  @param s_        ECDSA signature s component.
     */
    function permit(address owner_, address spender_, uint amount_, uint deadline_, uint8 v_, bytes32 r_, bytes32 s_) external;

    /**
     *  @dev    Moves an amount of tokens from `msg.sender` to a specified account.
     *          Emits a {Transfer} event.
     *  @param  recipient_ Account that receives tokens.
     *  @param  amount_    Amount of tokens that are transferred.
     *  @return success_   Boolean indicating whether the operation succeeded.
     */
    function transfer(address recipient_, uint256 amount_) external returns (bool success_);

    /**
     *  @dev    Moves a pre-approved amount of tokens from a sender to a specified account.
     *          Emits a {Transfer} event.
     *          Emits an {Approval} event.
     *  @param  owner_     Account that tokens are moving from.
     *  @param  recipient_ Account that receives tokens.
     *  @param  amount_    Amount of tokens that are transferred.
     *  @return success_   Boolean indicating whether the operation succeeded.
     */
    function transferFrom(address owner_, address recipient_, uint256 amount_) external returns (bool success_);

    /**********************/
    /*** View Functions ***/
    /**********************/

    /**
     *  @dev    Returns the allowance that one account has given another over their tokens.
     *  @param  owner_     Account that tokens are approved from.
     *  @param  spender_   Account that tokens are approved for.
     *  @return allowance_ Allowance that one account has given another over their tokens.
     */
    function allowance(address owner_, address spender_) external view returns (uint256 allowance_);

    /**
     *  @dev    Returns the amount of tokens owned by a given account.
     *  @param  account_ Account that owns the tokens.
     *  @return balance_ Amount of tokens owned by a given account.
     */
    function balanceOf(address account_) external view returns (uint256 balance_);

    /**
     *  @dev    Returns the decimal precision used by the token.
     *  @return decimals_ The decimal precision used by the token.
     */
    function decimals() external view returns (uint8 decimals_);

    /**
     *  @dev    Returns the signature domain separator.
     *  @return domainSeparator_ The signature domain separator.
     */
    function DOMAIN_SEPARATOR() external view returns (bytes32 domainSeparator_);

    /**
     *  @dev    Returns the name of the token.
     *  @return name_ The name of the token.
     */
    function name() external view returns (string memory name_);

    /**
      *  @dev    Returns the nonce for the given owner.
      *  @param  owner_  The address of the owner account.
      *  @return nonce_ The nonce for the given owner.
     */
    function nonces(address owner_) external view returns (uint256 nonce_);

    /**
     *  @dev    Returns the permit type hash.
     *  @return permitTypehash_ The permit type hash.
     */
    function PERMIT_TYPEHASH() external view returns (bytes32 permitTypehash_);

    /**
     *  @dev    Returns the symbol of the token.
     *  @return symbol_ The symbol of the token.
     */
    function symbol() external view returns (string memory symbol_);

    /**
     *  @dev    Returns the total amount of tokens in existence.
     *  @return totalSupply_ The total amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256 totalSupply_);

}

/// @title Small Library to standardize ERC20 token interactions.
library ERC20Helper {

    /**************************/
    /*** Internal Functions ***/
    /**************************/

    function transfer(address token_, address to_, uint256 amount_) internal returns (bool success_) {
        return _call(token_, abi.encodeWithSelector(IERC20.transfer.selector, to_, amount_));
    }

    function transferFrom(address token_, address from_, address to_, uint256 amount_) internal returns (bool success_) {
        return _call(token_, abi.encodeWithSelector(IERC20.transferFrom.selector, from_, to_, amount_));
    }

    function approve(address token_, address spender_, uint256 amount_) internal returns (bool success_) {
        // If setting approval to zero fails, return false.
        if (!_call(token_, abi.encodeWithSelector(IERC20.approve.selector, spender_, uint256(0)))) return false;

        // If `amount_` is zero, return true as the previous step already did this.
        if (amount_ == uint256(0)) return true;

        // Return the result of setting the approval to `amount_`.
        return _call(token_, abi.encodeWithSelector(IERC20.approve.selector, spender_, amount_));
    }

    function _call(address token_, bytes memory data_) private returns (bool success_) {
        if (token_.code.length == uint256(0)) return false;

        bytes memory returnData;
        ( success_, returnData ) = token_.call(data_);

        return success_ && (returnData.length == uint256(0) || abi.decode(returnData, (bool)));
    }

}

/// @title Token migrator contract to migrate MPL tokens after a timelock.
contract Migrator {

    address public immutable newToken;
    address public immutable oldToken;

    constructor(address oldToken_, address newToken_) {
        require(IERC20(newToken_).decimals() == IERC20(oldToken_).decimals(), "M:C:DECIMAL_MISMATCH");

        oldToken = oldToken_;
        newToken = newToken_;
    }

    function migrate(uint256 amount_) external {
        migrate(msg.sender, amount_);
    }

    function migrate(address owner_, uint256 amount_) public {
        require(amount_ != uint256(0),                                              "M:M:ZERO_AMOUNT");
        require(ERC20Helper.transferFrom(oldToken, owner_, address(this), amount_), "M:M:TRANSFER_FROM_FAILED");
        require(ERC20Helper.transfer(newToken, owner_, amount_),                    "M:M:TRANSFER_FAILED");
    }

}

/*
    ███████╗██████╗  ██████╗    ██████╗  ██████╗
    ██╔════╝██╔══██╗██╔════╝    ╚════██╗██╔═████╗
    █████╗  ██████╔╝██║          █████╔╝██║██╔██║
    ██╔══╝  ██╔══██╗██║         ██╔═══╝ ████╔╝██║
    ███████╗██║  ██║╚██████╗    ███████╗╚██████╔╝
    ╚══════╝╚═╝  ╚═╝ ╚═════╝    ╚══════╝ ╚═════╝
*/

/**
 *  @title Modern ERC-20 implementation.
 *  @dev   Acknowledgements to Solmate, OpenZeppelin, and DSS for inspiring this code.
 */
contract ERC20 is IERC20 {

    /**************/
    /*** ERC-20 ***/
    /**************/

    string public override name;
    string public override symbol;

    uint8 public immutable override decimals;

    uint256 public override totalSupply;

    mapping(address => uint256) public override balanceOf;

    mapping(address => mapping(address => uint256)) public override allowance;

    /****************/
    /*** ERC-2612 ***/
    /****************/

    // PERMIT_TYPEHASH = keccak256("Permit(address owner,address spender,uint256 value,uint256 nonce,uint256 deadline)");
    bytes32 public constant override PERMIT_TYPEHASH = 0x6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c9;

    mapping(address => uint256) public override nonces;

    /**
     *  @param name_     The name of the token.
     *  @param symbol_   The symbol of the token.
     *  @param decimals_ The decimal precision used by the token.
     */
    constructor(string memory name_, string memory symbol_, uint8 decimals_) {
        name     = name_;
        symbol   = symbol_;
        decimals = decimals_;
    }

    /**************************/
    /*** External Functions ***/
    /**************************/

    function approve(address spender_, uint256 amount_) external override returns (bool success_) {
        _approve(msg.sender, spender_, amount_);
        return true;
    }

    function decreaseAllowance(address spender_, uint256 subtractedAmount_) external override returns (bool success_) {
        _decreaseAllowance(msg.sender, spender_, subtractedAmount_);
        return true;
    }

    function increaseAllowance(address spender_, uint256 addedAmount_) external override returns (bool success_) {
        _approve(msg.sender, spender_, allowance[msg.sender][spender_] + addedAmount_);
        return true;
    }

    function permit(address owner_, address spender_, uint256 amount_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_) external override {
        require(deadline_ >= block.timestamp, "ERC20:P:EXPIRED");

        // Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}.
        require(
            uint256(s_) <= uint256(0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) &&
            (v_ == 27 || v_ == 28),
            "ERC20:P:MALLEABLE"
        );

        // Nonce realistically cannot overflow.
        unchecked {
            bytes32 digest = keccak256(
                abi.encodePacked(
                    "\x19\x01",
                    DOMAIN_SEPARATOR(),
                    keccak256(abi.encode(PERMIT_TYPEHASH, owner_, spender_, amount_, nonces[owner_]++, deadline_))
                )
            );

            address recoveredAddress = ecrecover(digest, v_, r_, s_);

            require(recoveredAddress == owner_ && owner_ != address(0), "ERC20:P:INVALID_SIGNATURE");
        }

        _approve(owner_, spender_, amount_);
    }

    function transfer(address recipient_, uint256 amount_) external override returns (bool success_) {
        _transfer(msg.sender, recipient_, amount_);
        return true;
    }

    function transferFrom(address owner_, address recipient_, uint256 amount_) external override returns (bool success_) {
        _decreaseAllowance(owner_, msg.sender, amount_);
        _transfer(owner_, recipient_, amount_);
        return true;
    }

    /**********************/
    /*** View Functions ***/
    /**********************/

    function DOMAIN_SEPARATOR() public view override returns (bytes32 domainSeparator_) {
        return keccak256(
            abi.encode(
                keccak256("EIP712Domain(string name,string version,uint256 chainId,address verifyingContract)"),
                keccak256(bytes(name)),
                keccak256(bytes("1")),
                block.chainid,
                address(this)
            )
        );
    }

    /**************************/
    /*** Internal Functions ***/
    /**************************/

    function _approve(address owner_, address spender_, uint256 amount_) internal {
        emit Approval(owner_, spender_, allowance[owner_][spender_] = amount_);
    }

    function _burn(address owner_, uint256 amount_) internal {
        balanceOf[owner_] -= amount_;

        // Cannot underflow because a user's balance will never be larger than the total supply.
        unchecked { totalSupply -= amount_; }

        emit Transfer(owner_, address(0), amount_);
    }

    function _decreaseAllowance(address owner_, address spender_, uint256 subtractedAmount_) internal {
        uint256 spenderAllowance = allowance[owner_][spender_];  // Cache to memory.

        if (spenderAllowance != type(uint256).max) {
            _approve(owner_, spender_, spenderAllowance - subtractedAmount_);
        }
    }

    function _mint(address recipient_, uint256 amount_) internal {
        totalSupply += amount_;

        // Cannot overflow because totalSupply would first overflow in the statement above.
        unchecked { balanceOf[recipient_] += amount_; }

        emit Transfer(address(0), recipient_, amount_);
    }

    function _transfer(address owner_, address recipient_, uint256 amount_) internal {
        balanceOf[owner_] -= amount_;

        // Cannot overflow because minting prevents overflow of totalSupply, and sum of user balances == totalSupply.
        unchecked { balanceOf[recipient_] += amount_; }

        emit Transfer(owner_, recipient_, amount_);
    }

}

/// @title A standard for tokenized Vaults with a single underlying ERC-20 token.
interface IERC4626 is IERC20 {

    /**************/
    /*** Events ***/
    /**************/

    /**
     *  @dev   `caller_` has exchanged `assets_` for `shares_` and transferred them to `owner_`.
     *         MUST be emitted when assets are deposited via the `deposit` or `mint` methods.
     *  @param caller_ The caller of the function that emitted the `Deposit` event.
     *  @param owner_  The owner of the shares.
     *  @param assets_ The amount of assets deposited.
     *  @param shares_ The amount of shares minted.
     */
    event Deposit(address indexed caller_, address indexed owner_, uint256 assets_, uint256 shares_);

    /**
     *  @dev   `caller_` has exchanged `shares_`, owned by `owner_`, for `assets_`, and transferred them to `receiver_`.
     *         MUST be emitted when assets are withdrawn via the `withdraw` or `redeem` methods.
     *  @param caller_   The caller of the function that emitted the `Withdraw` event.
     *  @param receiver_ The receiver of the assets.
     *  @param owner_    The owner of the shares.
     *  @param assets_   The amount of assets withdrawn.
     *  @param shares_   The amount of shares burned.
     */
    event Withdraw(address indexed caller_, address indexed receiver_, address indexed owner_, uint256 assets_, uint256 shares_);

    /***********************/
    /*** State Variables ***/
    /***********************/

    /**
     *  @dev    The address of the underlying asset used by the Vault.
     *          MUST be a contract that implements the ERC-20 standard.
     *          MUST NOT revert.
     *  @return asset_ The address of the underlying asset.
     */
    function asset() external view returns (address asset_);

    /********************************/
    /*** State Changing Functions ***/
    /********************************/

    /**
     *  @dev    Mints `shares_` to `receiver_` by depositing `assets_` into the Vault.
     *          MUST emit the {Deposit} event.
     *          MUST revert if all of the assets cannot be deposited (due to insufficient approval, deposit limits, slippage, etc).
     *  @param  assets_   The amount of assets to deposit.
     *  @param  receiver_ The receiver of the shares.
     *  @return shares_   The amount of shares minted.
     */
    function deposit(uint256 assets_, address receiver_) external returns (uint256 shares_);

    /**
     *  @dev    Mints `shares_` to `receiver_` by depositing `assets_` into the Vault.
     *          MUST emit the {Deposit} event.
     *          MUST revert if all of shares cannot be minted (due to insufficient approval, deposit limits, slippage, etc).
     *  @param  shares_   The amount of shares to mint.
     *  @param  receiver_ The receiver of the shares.
     *  @return assets_   The amount of assets deposited.
     */
    function mint(uint256 shares_, address receiver_) external returns (uint256 assets_);

    /**
     *  @dev    Burns `shares_` from `owner_` and sends `assets_` to `receiver_`.
     *          MUST emit the {Withdraw} event.
     *          MUST revert if all of the shares cannot be redeemed (due to insufficient shares, withdrawal limits, slippage, etc).
     *  @param  shares_   The amount of shares to redeem.
     *  @param  receiver_ The receiver of the assets.
     *  @param  owner_    The owner of the shares.
     *  @return assets_   The amount of assets sent to the receiver.
     */
    function redeem(uint256 shares_, address receiver_, address owner_) external returns (uint256 assets_);

    /**
     *  @dev    Burns `shares_` from `owner_` and sends `assets_` to `receiver_`.
     *          MUST emit the {Withdraw} event.
     *          MUST revert if all of the assets cannot be withdrawn (due to insufficient assets, withdrawal limits, slippage, etc).
     *  @param  assets_   The amount of assets to withdraw.
     *  @param  receiver_ The receiver of the assets.
     *  @param  owner_    The owner of the assets.
     *  @return shares_   The amount of shares burned from the owner.
     */
    function withdraw(uint256 assets_, address receiver_, address owner_) external returns (uint256 shares_);

    /**********************/
    /*** View Functions ***/
    /**********************/

    /**
     *  @dev    The amount of `assets_` the `shares_` are currently equivalent to.
     *          MUST NOT be inclusive of any fees that are charged against assets in the Vault.
     *          MUST NOT reflect slippage or other on-chain conditions when performing the actual exchange.
     *          MUST NOT show any variations depending on the caller.
     *          MUST NOT revert.
     *  @param  shares_ The amount of shares to convert.
     *  @return assets_ The amount of equivalent assets.
     */
    function convertToAssets(uint256 shares_) external view returns (uint256 assets_);

    /**
     *  @dev    The amount of `shares_` the `assets_` are currently equivalent to.
     *          MUST NOT be inclusive of any fees that are charged against assets in the Vault.
     *          MUST NOT reflect slippage or other on-chain conditions when performing the actual exchange.
     *          MUST NOT show any variations depending on the caller.
     *          MUST NOT revert.
     *  @param  assets_ The amount of assets to convert.
     *  @return shares_ The amount of equivalent shares.
     */
    function convertToShares(uint256 assets_) external view returns (uint256 shares_);

    /**
     *  @dev    Maximum amount of `assets_` that can be deposited on behalf of the `receiver_` through a `deposit` call.
     *          MUST return a limited value if the receiver is subject to any limits, or the maximum value otherwise.
     *          MUST NOT revert.
     *  @param  receiver_ The receiver of the assets.
     *  @return assets_   The maximum amount of assets that can be deposited.
     */
    function maxDeposit(address receiver_) external view returns (uint256 assets_);

    /**
     *  @dev    Maximum amount of `shares_` that can be minted on behalf of the `receiver_` through a `mint` call.
     *          MUST return a limited value if the receiver is subject to any limits, or the maximum value otherwise.
     *          MUST NOT revert.
     *  @param  receiver_ The receiver of the shares.
     *  @return shares_   The maximum amount of shares that can be minted.
     */
    function maxMint(address receiver_) external view returns (uint256 shares_);

    /**
     *  @dev    Maximum amount of `shares_` that can be redeemed from the `owner_` through a `redeem` call.
     *          MUST return a limited value if the owner is subject to any limits, or the total amount of owned shares otherwise.
     *          MUST NOT revert.
     *  @param  owner_  The owner of the shares.
     *  @return shares_ The maximum amount of shares that can be redeemed.
     */
    function maxRedeem(address owner_) external view returns (uint256 shares_);

    /**
     *  @dev    Maximum amount of `assets_` that can be withdrawn from the `owner_` through a `withdraw` call.
     *          MUST return a limited value if the owner is subject to any limits, or the total amount of owned assets otherwise.
     *          MUST NOT revert.
     *  @param  owner_  The owner of the assets.
     *  @return assets_ The maximum amount of assets that can be withdrawn.
     */
    function maxWithdraw(address owner_) external view returns (uint256 assets_);

    /**
     *  @dev    Allows an on-chain or off-chain user to simulate the effects of their deposit at the current block, given current on-chain conditions.
     *          MUST return as close to and no more than the exact amount of shares that would be minted in a `deposit` call in the same transaction.
     *          MUST NOT account for deposit limits like those returned from `maxDeposit` and should always act as though the deposit would be accepted.
     *          MUST NOT revert.
     *  @param  assets_ The amount of assets to deposit.
     *  @return shares_ The amount of shares that would be minted.
     */
    function previewDeposit(uint256 assets_) external view returns (uint256 shares_);

    /**
     *  @dev    Allows an on-chain or off-chain user to simulate the effects of their mint at the current block, given current on-chain conditions.
     *          MUST return as close to and no fewer than the exact amount of assets that would be deposited in a `mint` call in the same transaction.
     *          MUST NOT account for mint limits like those returned from `maxMint` and should always act as though the minting would be accepted.
     *          MUST NOT revert.
     *  @param  shares_ The amount of shares to mint.
     *  @return assets_ The amount of assets that would be deposited.
     */
    function previewMint(uint256 shares_) external view returns (uint256 assets_);

    /**
     *  @dev    Allows an on-chain or off-chain user to simulate the effects of their redemption at the current block, given current on-chain conditions.
     *          MUST return as close to and no more than the exact amount of assets that would be withdrawn in a `redeem` call in the same transaction.
     *          MUST NOT account for redemption limits like those returned from `maxRedeem` and should always act as though the redemption would be accepted.
     *          MUST NOT revert.
     *  @param  shares_ The amount of shares to redeem.
     *  @return assets_ The amount of assets that would be withdrawn.
     */
    function previewRedeem(uint256 shares_) external view returns (uint256 assets_);

    /**
     *  @dev    Allows an on-chain or off-chain user to simulate the effects of their withdrawal at the current block, given current on-chain conditions.
     *          MUST return as close to and no fewer than the exact amount of shares that would be burned in a `withdraw` call in the same transaction.
     *          MUST NOT account for withdrawal limits like those returned from `maxWithdraw` and should always act as though the withdrawal would be accepted.
     *          MUST NOT revert.
     *  @param  assets_ The amount of assets to withdraw.
     *  @return shares_ The amount of shares that would be redeemed.
     */
    function previewWithdraw(uint256 assets_) external view returns (uint256 shares_);

    /**
     *  @dev    Total amount of the underlying asset that is managed by the Vault.
     *          SHOULD include compounding that occurs from any yields.
     *          MUST NOT revert.
     *  @return totalAssets_ The total amount of assets the Vault manages.
     */
    function totalAssets() external view returns (uint256 totalAssets_);

}

/// @title A token that represents ownership of future revenues distributed linearly over time.
interface IRevenueDistributionToken is IERC20, IERC4626 {

    /**************/
    /*** Events ***/
    /**************/

    /**
     *  @dev   Issuance parameters have been updated after a `_mint` or `_burn`.
     *  @param freeAssets_   Resulting `freeAssets` (y-intercept) value after accounting update.
     *  @param issuanceRate_ The new issuance rate of `asset` until `vestingPeriodFinish_`.
     */
    event IssuanceParamsUpdated(uint256 freeAssets_, uint256 issuanceRate_);

    /**
     *  @dev   `newOwner_` has accepted the transferral of RDT ownership from `previousOwner_`.
     *  @param previousOwner_ The previous RDT owner.
     *  @param newOwner_      The new RDT owner.
     */
    event OwnershipAccepted(address indexed previousOwner_, address indexed newOwner_);

    /**
     *  @dev   `owner_` has set the new pending owner of RDT to `pendingOwner_`.
     *  @param owner_        The current RDT owner.
     *  @param pendingOwner_ The new pending RDT owner.
     */
    event PendingOwnerSet(address indexed owner_, address indexed pendingOwner_);

    /**
     *  @dev   `owner_` has updated the RDT vesting schedule to end at `vestingPeriodFinish_`.
     *  @param owner_               The current RDT owner.
     *  @param vestingPeriodFinish_ When the unvested balance will finish vesting.
     */
    event VestingScheduleUpdated(address indexed owner_, uint256 vestingPeriodFinish_);

    /***********************/
    /*** State Variables ***/
    /***********************/

    /**
     *  @dev The total amount of the underlying asset that is currently unlocked and is not time-dependent.
     *       Analogous to the y-intercept in a linear function.
     */
    function freeAssets() external view returns (uint256 freeAssets_);

    /**
     *  @dev The rate of issuance of the vesting schedule that is currently active.
     *       Denominated as the amount of underlying assets vesting per second.
     */
    function issuanceRate() external view returns (uint256 issuanceRate_);

    /**
     *  @dev The timestamp of when the linear function was last recalculated.
     *       Analogous to t0 in a linear function.
     */
    function lastUpdated() external view returns (uint256 lastUpdated_);

    /**
     *  @dev The address of the account that is allowed to update the vesting schedule.
     */
    function owner() external view returns (address owner_);

    /**
     *  @dev The next owner, nominated by the current owner.
     */
    function pendingOwner() external view returns (address pendingOwner_);

    /**
     *  @dev The precision at which the issuance rate is measured.
     */
    function precision() external view returns (uint256 precision_);

    /**
     *  @dev The end of the current vesting schedule.
     */
    function vestingPeriodFinish() external view returns (uint256 vestingPeriodFinish_);

    /********************************/
    /*** Administrative Functions ***/
    /********************************/

    /**
     *  @dev Sets the pending owner as the new owner.
     *       Can be called only by the pending owner, and only after their nomination by the current owner.
     */
    function acceptOwnership() external;

    /**
     *  @dev   Sets a new address as the pending owner.
     *  @param pendingOwner_ The address of the next potential owner.
     */
    function setPendingOwner(address pendingOwner_) external;

    /**
     *  @dev    Updates the current vesting formula based on the amount of total unvested funds in the contract and the new `vestingPeriod_`.
     *  @param  vestingPeriod_ The amount of time over which all currently unaccounted underlying assets will be vested over.
     *  @return issuanceRate_  The new issuance rate.
     *  @return freeAssets_    The new amount of underlying assets that are unlocked.
     */
    function updateVestingSchedule(uint256 vestingPeriod_) external returns (uint256 issuanceRate_, uint256 freeAssets_);

    /************************/
    /*** Staker Functions ***/
    /************************/

    /**
     *  @dev    Does a ERC4626 `deposit` with a ERC-2612 `permit`.
     *  @param  assets_   The amount of `asset` to deposit.
     *  @param  receiver_ The receiver of the shares.
     *  @param  deadline_ The timestamp after which the `permit` signature is no longer valid.
     *  @param  v_        ECDSA signature v component.
     *  @param  r_        ECDSA signature r component.
     *  @param  s_        ECDSA signature s component.
     *  @return shares_   The amount of shares minted.
     */
    function depositWithPermit(uint256 assets_, address receiver_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_) external returns (uint256 shares_);

    /**
     *  @dev    Does a ERC4626 `mint` with a ERC-2612 `permit`.
     *  @param  shares_    The amount of `shares` to mint.
     *  @param  receiver_  The receiver of the shares.
     *  @param  maxAssets_ The maximum amount of assets that can be taken, as per the permit.
     *  @param  deadline_  The timestamp after which the `permit` signature is no longer valid.
     *  @param  v_         ECDSA signature v component.
     *  @param  r_         ECDSA signature r component.
     *  @param  s_         ECDSA signature s component.
     *  @return assets_    The amount of shares deposited.
     */
    function mintWithPermit(uint256 shares_, address receiver_, uint256 maxAssets_, uint256 deadline_, uint8 v_, bytes32 r_, bytes32 s_) external returns (uint256 assets_);

    /**********************/
    /*** View Functions ***/
    /**********************/

    /**
     *  @dev    Returns the amount of underlying assets owned by the specified account.
     *  @param  account_ Address of the account.
     *  @return assets_  Amount of assets owned.
     */
    function balanceOfAssets(address account_) external view returns (uint256 assets_);

}

/*
    ██████╗ ██████╗ ████████╗
    ██╔══██╗██╔══██╗╚══██╔══╝
    ██████╔╝██║  ██║   ██║
    ██╔══██╗██║  ██║   ██║
    ██║  ██║██████╔╝   ██║
    ╚═╝  ╚═╝╚═════╝    ╚═╝
*/

/// @title A token that represents ownership of future revenues distributed linearly over time.
contract RevenueDistributionToken is IRevenueDistributionToken, ERC20 {

    uint256 public immutable override precision;  // Precision of rates, equals max deposit amounts before rounding errors occur

    address public override asset;  // Underlying ERC-20 asset used by ERC-4626 functionality.

    address public override owner;         // Current owner of the contract, able to update the vesting schedule.
    address public override pendingOwner;  // Pending owner of the contract, able to accept ownership.

    uint256 public override freeAssets;           // Amount of assets unlocked regardless of time passed.
    uint256 public override issuanceRate;         // asset/second rate dependent on aggregate vesting schedule.
    uint256 public override lastUpdated;          // Timestamp of when issuance equation was last updated.
    uint256 public override vestingPeriodFinish;  // Timestamp when current vesting schedule ends.

    uint256 private locked = 1;  // Used in reentrancy check.

    /*****************/
    /*** Modifiers ***/
    /*****************/

    modifier nonReentrant() {
        require(locked == 1, "RDT:LOCKED");

        locked = 2;

        _;

        locked = 1;
    }

    constructor(string memory name_, string memory symbol_, address owner_, address asset_, uint256 precision_)
        ERC20(name_, symbol_, ERC20(asset_).decimals())
    {
        require((owner = owner_) != address(0), "RDT:C:OWNER_ZERO_ADDRESS");

        asset     = asset_;  // Don't need to check zero address as ERC20(asset_).decimals() will fail in ERC20 constructor.
        precision = precision_;
    }

    /********************************/
    /*** Administrative Functions ***/
    /********************************/

    function acceptOwnership() external virtual override {
        require(msg.sender == pendingOwner, "RDT:AO:NOT_PO");

        emit OwnershipAccepted(owner, msg.sender);

        owner        = msg.sender;
        pendingOwner = address(0);
    }

    function setPendingOwner(address pendingOwner_) external virtual override {
        require(msg.sender == owner, "RDT:SPO:NOT_OWNER");

        pendingOwner = pendingOwner_;

        emit PendingOwnerSet(msg.sender, pendingOwner_);
    }

    function updateVestingSchedule(uint256 vestingPeriod_) external virtual override returns (uint256 issuanceRate_, uint256 freeAssets_) {
        require(msg.sender == owner, "RDT:UVS:NOT_OWNER");
        require(totalSupply != 0,    "RDT:UVS:ZERO_SUPPLY");

        // Update "y-intercept" to reflect current available asset.
        freeAssets_ = freeAssets = totalAssets();

        // Calculate slope.
        issuanceRate_ = issuanceRate = ((ERC20(asset).balanceOf(address(this)) - freeAssets_) * precision) / vestingPeriod_;

        // Update timestamp and period finish.
        vestingPeriodFinish = (lastUpdated = block.timestamp) + vestingPeriod_;

        emit IssuanceParamsUpdated(freeAssets_, issuanceRate_);
        emit VestingScheduleUpdated(msg.sender, vestingPeriodFinish);
    }

    /************************/
    /*** Staker Functions ***/
    /************************/

    function deposit(uint256 assets_, address receiver_) external virtual override nonReentrant returns (uint256 shares_) {
        _mint(shares_ = previewDeposit(assets_), assets_, receiver_, msg.sender);
    }

    function depositWithPermit(
        uint256 assets_,
        address receiver_,
        uint256 deadline_,
        uint8   v_,
        bytes32 r_,
        bytes32 s_
    )
        external virtual override nonReentrant returns (uint256 shares_)
    {
        ERC20(asset).permit(msg.sender, address(this), assets_, deadline_, v_, r_, s_);
        _mint(shares_ = previewDeposit(assets_), assets_, receiver_, msg.sender);
    }

    function mint(uint256 shares_, address receiver_) external virtual override nonReentrant returns (uint256 assets_) {
        _mint(shares_, assets_ = previewMint(shares_), receiver_, msg.sender);
    }

    function mintWithPermit(
        uint256 shares_,
        address receiver_,
        uint256 maxAssets_,
        uint256 deadline_,
        uint8   v_,
        bytes32 r_,
        bytes32 s_
    )
        external virtual override nonReentrant returns (uint256 assets_)
    {
        require((assets_ = previewMint(shares_)) <= maxAssets_, "RDT:MWP:INSUFFICIENT_PERMIT");

        ERC20(asset).permit(msg.sender, address(this), maxAssets_, deadline_, v_, r_, s_);
        _mint(shares_, assets_, receiver_, msg.sender);
    }

    function redeem(uint256 shares_, address receiver_, address owner_) external virtual override nonReentrant returns (uint256 assets_) {
        _burn(shares_, assets_ = previewRedeem(shares_), receiver_, owner_, msg.sender);
    }

    function withdraw(uint256 assets_, address receiver_, address owner_) external virtual override nonReentrant returns (uint256 shares_) {
        _burn(shares_ = previewWithdraw(assets_), assets_, receiver_, owner_, msg.sender);
    }

    /**************************/
    /*** Internal Functions ***/
    /**************************/

    function _mint(uint256 shares_, uint256 assets_, address receiver_, address caller_) internal {
        require(receiver_ != address(0), "RDT:M:ZERO_RECEIVER");
        require(shares_   != uint256(0), "RDT:M:ZERO_SHARES");
        require(assets_   != uint256(0), "RDT:M:ZERO_ASSETS");

        _mint(receiver_, shares_);

        uint256 freeAssetsCache = freeAssets = totalAssets() + assets_;

        uint256 issuanceRate_ = _updateIssuanceParams();

        emit Deposit(caller_, receiver_, assets_, shares_);
        emit IssuanceParamsUpdated(freeAssetsCache, issuanceRate_);

        require(ERC20Helper.transferFrom(asset, caller_, address(this), assets_), "RDT:M:TRANSFER_FROM");
    }

    function _burn(uint256 shares_, uint256 assets_, address receiver_, address owner_, address caller_) internal {
        require(receiver_ != address(0), "RDT:B:ZERO_RECEIVER");
        require(shares_   != uint256(0), "RDT:B:ZERO_SHARES");
        require(assets_   != uint256(0), "RDT:B:ZERO_ASSETS");

        if (caller_ != owner_) {
            _decreaseAllowance(owner_, caller_, shares_);
        }

        _burn(owner_, shares_);

        uint256 freeAssetsCache = freeAssets = totalAssets() - assets_;

        uint256 issuanceRate_ = _updateIssuanceParams();

        emit Withdraw(caller_, receiver_, owner_, assets_, shares_);
        emit IssuanceParamsUpdated(freeAssetsCache, issuanceRate_);

        require(ERC20Helper.transfer(asset, receiver_, assets_), "RDT:B:TRANSFER");
    }

    function _updateIssuanceParams() internal returns (uint256 issuanceRate_) {
        return issuanceRate = (lastUpdated = block.timestamp) > vestingPeriodFinish ? 0 : issuanceRate;
    }

    /**********************/
    /*** View Functions ***/
    /**********************/

    function balanceOfAssets(address account_) public view virtual override returns (uint256 balanceOfAssets_) {
        return convertToAssets(balanceOf[account_]);
    }

    function convertToAssets(uint256 shares_) public view virtual override returns (uint256 assets_) {
        uint256 supply = totalSupply;  // Cache to stack.

        assets_ = supply == 0 ? shares_ : (shares_ * totalAssets()) / supply;
    }

    function convertToShares(uint256 assets_) public view virtual override returns (uint256 shares_) {
        uint256 supply = totalSupply;  // Cache to stack.

        shares_ = supply == 0 ? assets_ : (assets_ * supply) / totalAssets();
    }

    function maxDeposit(address receiver_) external pure virtual override returns (uint256 maxAssets_) {
        receiver_;  // Silence warning
        maxAssets_ = type(uint256).max;
    }

    function maxMint(address receiver_) external pure virtual override returns (uint256 maxShares_) {
        receiver_;  // Silence warning
        maxShares_ = type(uint256).max;
    }

    function maxRedeem(address owner_) external view virtual override returns (uint256 maxShares_) {
        maxShares_ = balanceOf[owner_];
    }

    function maxWithdraw(address owner_) external view virtual override returns (uint256 maxAssets_) {
        maxAssets_ = balanceOfAssets(owner_);
    }

    function previewDeposit(uint256 assets_) public view virtual override returns (uint256 shares_) {
        // As per https://eips.ethereum.org/EIPS/eip-4626#security-considerations,
        // it should round DOWN if it’s calculating the amount of shares to issue to a user, given an amount of assets provided.
        shares_ = convertToShares(assets_);
    }

    function previewMint(uint256 shares_) public view virtual override returns (uint256 assets_) {
        uint256 supply = totalSupply;  // Cache to stack.

        // As per https://eips.ethereum.org/EIPS/eip-4626#security-considerations,
        // it should round UP if it’s calculating the amount of assets a user must provide, to be issued a given amount of shares.
        assets_ = supply == 0 ? shares_ : _divRoundUp(shares_ * totalAssets(), supply);
    }

    function previewRedeem(uint256 shares_) public view virtual override returns (uint256 assets_) {
        // As per https://eips.ethereum.org/EIPS/eip-4626#security-considerations,
        // it should round DOWN if it’s calculating the amount of assets to send to a user, given amount of shares returned.
        assets_ = convertToAssets(shares_);
    }

    function previewWithdraw(uint256 assets_) public view virtual override returns (uint256 shares_) {
        uint256 supply = totalSupply;  // Cache to stack.

        // As per https://eips.ethereum.org/EIPS/eip-4626#security-considerations,
        // it should round UP if it’s calculating the amount of shares a user must return, to be sent a given amount of assets.
        shares_ = supply == 0 ? assets_ : _divRoundUp(assets_ * supply, totalAssets());
    }

    function totalAssets() public view virtual override returns (uint256 totalManagedAssets_) {
        uint256 issuanceRate_ = issuanceRate;

        if (issuanceRate_ == 0) return freeAssets;

        uint256 vestingPeriodFinish_ = vestingPeriodFinish;
        uint256 lastUpdated_         = lastUpdated;

        uint256 vestingTimePassed =
            block.timestamp > vestingPeriodFinish_ ?
                vestingPeriodFinish_ - lastUpdated_ :
                block.timestamp - lastUpdated_;

        return ((issuanceRate_ * vestingTimePassed) / precision) + freeAssets;
    }

    /**************************/
    /*** Internal Functions ***/
    /**************************/

    function _divRoundUp(uint256 numerator_, uint256 divisor_) internal pure returns (uint256 result_) {
       return (numerator_ / divisor_) + (numerator_ % divisor_ > 0 ? 1 : 0);
    }

}

/// @title A token that represents ownership of future MPL-denominated revenues distributed linearly over time.
interface IxMPL is IRevenueDistributionToken {

    /**************/
    /*** Events ***/
    /**************/

    /**
    *  @dev Notifies that a scheduled migration was cancelled.
    */
    event MigrationCancelled();

    /**
    *  @dev   Notifies that a scheduled migration was executed.
    *  @param fromAsset_ The address of the old asset.
    *  @param toAsset_   The address of new asset migrated to.
    *  @param amount_    The amount of tokens migrated.
    */
    event MigrationPerformed(address indexed fromAsset_, address indexed toAsset_, uint256 amount_);

    /**
    *  @dev   Notifies that migration was scheduled.
    *  @param fromAsset_     The current asset address.
    *  @param toAsset_       The address of the asset to be migrated to.
    *  @param migrator_      The address of the migrator contract.
    *  @param migrationTime_ The earliest time the migration is scheduled for.
    */
    event MigrationScheduled(address indexed fromAsset_, address indexed toAsset_, address indexed migrator_, uint256 migrationTime_);

    /********************************/
    /*** Administrative Functions ***/
    /********************************/

    /**
    *  @dev Cancel the scheduled migration
    */
    function cancelMigration() external;

    /**
    *  @dev Perform a migration of the asset.
    */
    function performMigration() external;

    /**
    *  @dev   Schedule a migration to be executed after a delay.
    *  @param migrator_ The address of the migrator contract.
    *  @param newAsset_ The address of the new asset token.
    */
    function scheduleMigration(address migrator_, address newAsset_) external;

    /**********************/
    /*** View Functions ***/
    /**********************/

    /**
    *  @dev    Get the minimum delay that a scheduled transaction needs in order to be executed.
    *  @return minimumMigrationDelay_ The delay in seconds.
    */
    function MINIMUM_MIGRATION_DELAY() external pure returns (uint256 minimumMigrationDelay_);

    /**
    *  @dev    Get the timestamp that a migration is scheduled for.
    *  @return scheduledMigrationTimestamp_ The timestamp of the migration.
    */
    function scheduledMigrationTimestamp() external view returns (uint256 scheduledMigrationTimestamp_);

    /**
    *  @dev    The address of the migrator contract to be used during the scheduled migration.
    *  @return scheduledMigrator_ The address of the migrator.
    */
    function scheduledMigrator() external view returns (address scheduledMigrator_);

    /**
    *  @dev    The address of the new asset token to be migrated to during the scheduled migration.
    *  @return scheduledNewAsset_ The address of the new asset token.
    */
    function scheduledNewAsset() external view returns (address scheduledNewAsset_);

}

/*
    ██╗  ██╗███╗   ███╗██████╗ ██╗
    ╚██╗██╔╝████╗ ████║██╔══██╗██║
     ╚███╔╝ ██╔████╔██║██████╔╝██║
     ██╔██╗ ██║╚██╔╝██║██╔═══╝ ██║
    ██╔╝ ██╗██║ ╚═╝ ██║██║     ███████╗
    ╚═╝  ╚═╝╚═╝     ╚═╝╚═╝     ╚══════╝
*/

/// @title A token that represents ownership of future MPL-denominated revenues distributed linearly over time.
contract xMPL is IxMPL, RevenueDistributionToken {

    uint256 public constant override MINIMUM_MIGRATION_DELAY = 10 days;

    address public override scheduledMigrator;
    address public override scheduledNewAsset;

    uint256 public override scheduledMigrationTimestamp;

    constructor(string memory name_, string memory symbol_, address owner_, address asset_, uint256 precision_)
        RevenueDistributionToken(name_, symbol_, owner_, asset_, precision_) { }

    /*****************/
    /*** Modifiers ***/
    /*****************/

    modifier onlyOwner {
        require(msg.sender == owner, "xMPL:NOT_OWNER");
        _;
    }

    /********************************/
    /*** Administrative Functions ***/
    /********************************/

    function cancelMigration() external override onlyOwner {
        require(scheduledMigrationTimestamp != 0, "xMPL:CM:NOT_SCHEDULED");

        _cleanupMigration();

        emit MigrationCancelled();
    }

    function performMigration() external override onlyOwner {
        uint256 migrationTimestamp = scheduledMigrationTimestamp;
        address migrator           = scheduledMigrator;
        address oldAsset           = asset;
        address newAsset           = scheduledNewAsset;

        require(migrationTimestamp != 0,               "xMPL:PM:NOT_SCHEDULED");
        require(block.timestamp >= migrationTimestamp, "xMPL:PM:TOO_EARLY");

        uint256 oldAssetBalanceBeforeMigration = ERC20(oldAsset).balanceOf(address(this));
        uint256 newAssetBalanceBeforeMigration = ERC20(newAsset).balanceOf(address(this));

        require(ERC20(oldAsset).approve(migrator, oldAssetBalanceBeforeMigration), "xMPL:PM:APPROVAL_FAILED");

        Migrator(migrator).migrate(oldAssetBalanceBeforeMigration);

        require(ERC20(newAsset).balanceOf(address(this)) - newAssetBalanceBeforeMigration == oldAssetBalanceBeforeMigration, "xMPL:PM:WRONG_AMOUNT");

        emit MigrationPerformed(oldAsset, newAsset, oldAssetBalanceBeforeMigration);

        asset = newAsset;

        _cleanupMigration();
    }

    function scheduleMigration(address migrator_, address newAsset_) external override onlyOwner {
        require(migrator_ != address(0), "xMPL:SM:INVALID_MIGRATOR");
        require(newAsset_ != address(0), "xMPL:SM:INVALID_NEW_ASSET");

        scheduledMigrationTimestamp = block.timestamp + MINIMUM_MIGRATION_DELAY;
        scheduledMigrator           = migrator_;
        scheduledNewAsset           = newAsset_;

        emit MigrationScheduled(asset, newAsset_, migrator_, scheduledMigrationTimestamp);
    }

    /*************************/
    /*** Utility Functions ***/
    /*************************/

    function _cleanupMigration() internal {
        delete scheduledMigrationTimestamp;
        delete scheduledMigrator;
        delete scheduledNewAsset;
    }

}

Settings
{
  "optimizer": {
    "enabled": true,
    "runs": 999999
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  },
  "metadata": {
    "bytecodeHash": "none"
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name_","type":"string"},{"internalType":"string","name":"symbol_","type":"string"},{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"asset_","type":"address"},{"internalType":"uint256","name":"precision_","type":"uint256"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":true,"internalType":"address","name":"spender_","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller_","type":"address"},{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"Deposit","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"freeAssets_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"issuanceRate_","type":"uint256"}],"name":"IssuanceParamsUpdated","type":"event"},{"anonymous":false,"inputs":[],"name":"MigrationCancelled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromAsset_","type":"address"},{"indexed":true,"internalType":"address","name":"toAsset_","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"MigrationPerformed","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"fromAsset_","type":"address"},{"indexed":true,"internalType":"address","name":"toAsset_","type":"address"},{"indexed":true,"internalType":"address","name":"migrator_","type":"address"},{"indexed":false,"internalType":"uint256","name":"migrationTime_","type":"uint256"}],"name":"MigrationScheduled","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner_","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner_","type":"address"}],"name":"OwnershipAccepted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":true,"internalType":"address","name":"pendingOwner_","type":"address"}],"name":"PendingOwnerSet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":true,"internalType":"address","name":"recipient_","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"vestingPeriodFinish_","type":"uint256"}],"name":"VestingScheduleUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"caller_","type":"address"},{"indexed":true,"internalType":"address","name":"receiver_","type":"address"},{"indexed":true,"internalType":"address","name":"owner_","type":"address"},{"indexed":false,"internalType":"uint256","name":"assets_","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"Withdraw","type":"event"},{"inputs":[],"name":"DOMAIN_SEPARATOR","outputs":[{"internalType":"bytes32","name":"domainSeparator_","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINIMUM_MIGRATION_DELAY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PERMIT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"acceptOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"},{"internalType":"address","name":"","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"asset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account_","type":"address"}],"name":"balanceOfAssets","outputs":[{"internalType":"uint256","name":"balanceOfAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cancelMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"convertToAssets","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"name":"convertToShares","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"decimals","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"subtractedAmount_","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"}],"name":"deposit","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"uint256","name":"deadline_","type":"uint256"},{"internalType":"uint8","name":"v_","type":"uint8"},{"internalType":"bytes32","name":"r_","type":"bytes32"},{"internalType":"bytes32","name":"s_","type":"bytes32"}],"name":"depositWithPermit","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"freeAssets","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"addedAmount_","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"issuanceRate","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lastUpdated","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver_","type":"address"}],"name":"maxDeposit","outputs":[{"internalType":"uint256","name":"maxAssets_","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"receiver_","type":"address"}],"name":"maxMint","outputs":[{"internalType":"uint256","name":"maxShares_","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"maxRedeem","outputs":[{"internalType":"uint256","name":"maxShares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"}],"name":"maxWithdraw","outputs":[{"internalType":"uint256","name":"maxAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"}],"name":"mint","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"uint256","name":"maxAssets_","type":"uint256"},{"internalType":"uint256","name":"deadline_","type":"uint256"},{"internalType":"uint8","name":"v_","type":"uint8"},{"internalType":"bytes32","name":"r_","type":"bytes32"},{"internalType":"bytes32","name":"s_","type":"bytes32"}],"name":"mintWithPermit","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"nonces","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pendingOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"performMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"spender_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"},{"internalType":"uint256","name":"deadline_","type":"uint256"},{"internalType":"uint8","name":"v_","type":"uint8"},{"internalType":"bytes32","name":"r_","type":"bytes32"},{"internalType":"bytes32","name":"s_","type":"bytes32"}],"name":"permit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"precision","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"name":"previewDeposit","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"previewMint","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"name":"previewRedeem","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"name":"previewWithdraw","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"shares_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"name":"redeem","outputs":[{"internalType":"uint256","name":"assets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"migrator_","type":"address"},{"internalType":"address","name":"newAsset_","type":"address"}],"name":"scheduleMigration","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"scheduledMigrationTimestamp","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scheduledMigrator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scheduledNewAsset","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"pendingOwner_","type":"address"}],"name":"setPendingOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalAssets","outputs":[{"internalType":"uint256","name":"totalManagedAssets_","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner_","type":"address"},{"internalType":"address","name":"recipient_","type":"address"},{"internalType":"uint256","name":"amount_","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"success_","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"vestingPeriod_","type":"uint256"}],"name":"updateVestingSchedule","outputs":[{"internalType":"uint256","name":"issuanceRate_","type":"uint256"},{"internalType":"uint256","name":"freeAssets_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"vestingPeriodFinish","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"assets_","type":"uint256"},{"internalType":"address","name":"receiver_","type":"address"},{"internalType":"address","name":"owner_","type":"address"}],"name":"withdraw","outputs":[{"internalType":"uint256","name":"shares_","type":"uint256"}],"stateMutability":"nonpayable","type":"function"}]

60c06040526001600d553480156200001657600080fd5b506040516200364738038062003647833981016040819052620000399162000327565b84848484848484836001600160a01b031663313ce5676040518163ffffffff1660e01b815260040160206040518083038186803b1580156200007a57600080fd5b505afa1580156200008f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190620000b59190620003c0565b8251620000ca906000906020860190620001ad565b508151620000e0906001906020850190620001ad565b5060f81b7fff00000000000000000000000000000000000000000000000000000000000000166080525050600780546001600160a01b0319166001600160a01b0385169081179091556200017a5760405162461bcd60e51b815260206004820152601860248201527f5244543a433a4f574e45525f5a45524f5f414444524553530000000000000000604482015260640160405180910390fd5b600680546001600160a01b0319166001600160a01b03939093169290921790915560a052506200043f9650505050505050565b828054620001bb90620003ec565b90600052602060002090601f016020900481019282620001df57600085556200022a565b82601f10620001fa57805160ff19168380011785556200022a565b828001600101855582156200022a579182015b828111156200022a5782518255916020019190600101906200020d565b50620002389291506200023c565b5090565b5b808211156200023857600081556001016200023d565b80516001600160a01b03811681146200026b57600080fd5b919050565b600082601f8301126200028257600080fd5b81516001600160401b03808211156200029f576200029f62000429565b604051601f8301601f19908116603f01168101908282118183101715620002ca57620002ca62000429565b81604052838152602092508683858801011115620002e757600080fd5b600091505b838210156200030b5785820183015181830184015290820190620002ec565b838211156200031d5760008385830101525b9695505050505050565b600080600080600060a086880312156200034057600080fd5b85516001600160401b03808211156200035857600080fd5b6200036689838a0162000270565b965060208801519150808211156200037d57600080fd5b506200038c8882890162000270565b9450506200039d6040870162000253565b9250620003ad6060870162000253565b9150608086015190509295509295909350565b600060208284031215620003d357600080fd5b815160ff81168114620003e557600080fd5b9392505050565b600181811c908216806200040157607f821691505b602082108114156200042357634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b60805160f81c60a0516131d162000476600039600081816106e90152818161081d01526120a30152600061041a01526131d16000f3fe608060405234801561001057600080fd5b50600436106103415760003560e01c806379ba5097116101bd578063ba087652116100f9578063d3b5dc3b116100a2578063dd62ed3e1161007c578063dd62ed3e14610754578063e13aa9901461077f578063e30c3978146107a7578063ef8b30f7146107c757600080fd5b8063d3b5dc3b146106e4578063d505accf1461070b578063d905777e1461071e57600080fd5b8063c6e6f592116100d3578063c6e6f592146106b5578063ce96cb77146106c8578063d0b06f5d146106db57600080fd5b8063ba0876521461068f578063c42069ec146106a2578063c63d75b6146104e057600080fd5b806394bf804d11610166578063a9059cbb11610140578063a9059cbb14610643578063ab0b0fd314610656578063b3d7f6b914610669578063b460af941461067c57600080fd5b806394bf804d1461061557806395d89b4114610628578063a457c2d71461063057600080fd5b8063899d0c0111610197578063899d0c01146105d95780638da5cb5b146105e25780639159b2061461060257600080fd5b806379ba5097146105915780637bb002d6146105995780637ecebe00146105b957600080fd5b806336f8d3f11161028c5780634cdad506116102355780636109ff4b1161020f5780636109ff4b1461054c5780636e2f2aca146105545780636e553f651461055e57806370a082311461057157600080fd5b80634cdad5061461051357806350921b231461052657806360dd37d91461053957600080fd5b80633c2f7773116102665780633c2f7773146104ce5780633c9ae2ba146104d7578063402d267d146104e057600080fd5b806336f8d3f11461045657806338d52e0f1461049b57806339509351146104bb57600080fd5b806311f240ac116102ee57806330adf81f116102c857806330adf81f146103ee578063313ce567146104155780633644e5151461044e57600080fd5b806311f240ac146103c957806318160ddd146103d257806323b872dd146103db57600080fd5b8063095ea7b31161031f578063095ea7b3146103895780630a28a477146103ac57806310639ea0146103bf57600080fd5b806301e1d1141461034657806306fdde031461036157806307a2d13a14610376575b600080fd5b61034e6107da565b6040519081526020015b60405180910390f35b610369610863565b6040516103589190613001565b61034e610384366004612dfe565b6108f1565b61039c610397366004612db2565b610928565b6040519015158152602001610358565b61034e6103ba366004612dfe565b61093f565b6103c7610965565b005b61034e60095481565b61034e60025481565b61039c6103e9366004612d0c565b610abd565b61034e7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61043c7f000000000000000000000000000000000000000000000000000000000000000081565b60405160ff9091168152602001610358565b61034e610adf565b600f546104769073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610358565b6006546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61039c6104c9366004612db2565b610baa565b61034e600c5481565b61034e600a5481565b61034e6104ee366004612cbe565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b61034e610521366004612dfe565b610bf3565b61034e610534366004612eba565b610bfe565b61034e610547366004612e8f565b610d45565b6103c7610ef7565b61034e620d2f0081565b61034e61056c366004612e30565b611523565b61034e61057f366004612cbe565b60036020526000908152604090205481565b6103c76115b8565b600e546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61034e6105c7366004612cbe565b60056020526000908152604090205481565b61034e60105481565b6007546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61034e610610366004612cbe565b6116b6565b61034e610623366004612e30565b6116e5565b61036961176f565b61039c61063e366004612db2565b61177c565b61039c610651366004612db2565b611789565b6103c7610664366004612cd9565b611796565b61034e610677366004612dfe565b6119bc565b61034e61068a366004612e53565b6119e3565b61034e61069d366004612e53565b611a7a565b6103c76106b0366004612cbe565b611b05565b61034e6106c3366004612dfe565b611bf7565b61034e6106d6366004612cbe565b611c15565b61034e600b5481565b61034e7f000000000000000000000000000000000000000000000000000000000000000081565b6103c7610719366004612d48565b611c20565b61034e61072c366004612cbe565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b61034e610762366004612cd9565b600460209081526000928352604080842090915290825290205481565b61079261078d366004612dfe565b611f71565b60408051928352602083019190915201610358565b6008546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61034e6107d5366004612dfe565b6121e6565b600a54600090806107ed57505060095490565b600c54600b54600042831061080b5761080682426130bb565b610815565b61081582846130bb565b6009549091507f0000000000000000000000000000000000000000000000000000000000000000610846838761307e565b610850919061306a565b61085a9190613052565b94505050505090565b60008054610870906130fe565b80601f016020809104026020016040519081016040528092919081815260200182805461089c906130fe565b80156108e95780601f106108be576101008083540402835291602001916108e9565b820191906000526020600020905b8154815290600101906020018083116108cc57829003601f168201915b505050505081565b600254600090801561091f57806109066107da565b610910908561307e565b61091a919061306a565b610921565b825b9392505050565b60006109353384846121f1565b5060015b92915050565b600254600090801561091f5761091a610958828561307e565b6109606107da565b612260565b60075473ffffffffffffffffffffffffffffffffffffffff1633146109eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f784d504c3a4e4f545f4f574e455200000000000000000000000000000000000060448201526064015b60405180910390fd5b601054610a54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f784d504c3a434d3a4e4f545f5343484544554c4544000000000000000000000060448201526064016109e2565b610a926000601055600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600f80549091169055565b6040517f29183829efed7c15f37ba982c36934966b558232f770f334108ac30e4301333a90600090a1565b6000610aca843384612293565b610ad5848484612302565b5060019392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051610b119190612f2e565b604080519182900382208282018252600183527f31000000000000000000000000000000000000000000000000000000000000006020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610935918590610bee908690613052565b6121f1565b6000610939826108f1565b6000600d54600114610c6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d556006546040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018990526064810187905260ff8616608482015260a4810185905260c4810184905273ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e401600060405180830381600087803b158015610d0757600080fd5b505af1158015610d1b573d6000803e3d6000fd5b50505050610d36610d2b886121e6565b91508188883361239f565b6001600d559695505050505050565b6000600d54600114610db3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d5585610dc2896119bc565b9150811115610e2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5244543a4d57503a494e53554646494349454e545f5045524d4954000000000060448201526064016109e2565b6006546040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526064810187905260ff8616608482015260a4810185905260c4810184905273ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e401600060405180830381600087803b158015610ec357600080fd5b505af1158015610ed7573d6000803e3d6000fd5b50505050610ee78882893361239f565b6001600d55979650505050505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610f78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f784d504c3a4e4f545f4f574e455200000000000000000000000000000000000060448201526064016109e2565b601054600e54600654600f5473ffffffffffffffffffffffffffffffffffffffff92831692918216911683611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f784d504c3a504d3a4e4f545f5343484544554c4544000000000000000000000060448201526064016109e2565b83421015611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f784d504c3a504d3a544f4f5f4541524c5900000000000000000000000000000060448201526064016109e2565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b1580156110db57600080fd5b505afa1580156110ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111139190612e17565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b15801561117e57600080fd5b505afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b69190612e17565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018590529192509085169063095ea7b390604401602060405180830381600087803b15801561122a57600080fd5b505af115801561123e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112629190612ddc565b6112c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f784d504c3a504d3a415050524f56414c5f4641494c454400000000000000000060448201526064016109e2565b6040517f454b06080000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff86169063454b060890602401600060405180830381600087803b15801561133057600080fd5b505af1158015611344573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015284925083915073ffffffffffffffffffffffffffffffffffffffff8616906370a082319060240160206040518083038186803b1580156113b157600080fd5b505afa1580156113c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e99190612e17565b6113f391906130bb565b1461145a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f784d504c3a504d3a57524f4e475f414d4f554e5400000000000000000000000060448201526064016109e2565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd2b4bfa00cffc450ec3f60db3c511bebc1e88911c9c7b25ef8b294c934fa116c846040516114b991815260200190565b60405180910390a3600680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8616179091556000601055600e805482169055600f805490911690555b505050505050565b6000600d54600114611591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d556115ad6115a2846121e6565b91508184843361239f565b6001600d5592915050565b60085473ffffffffffffffffffffffffffffffffffffffff163314611639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5244543a414f3a4e4f545f504f0000000000000000000000000000000000000060448201526064016109e2565b600754604051339173ffffffffffffffffffffffffffffffffffffffff16907f357bdeb5828fa83945f38a88510ce5cd7d628dafb346d767efbc693149fdd97c90600090a3600780547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163317909155600880549091169055565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812054610939906108f1565b6000600d54600114611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d556115ad83611765816119bc565b925082843361239f565b60018054610870906130fe565b6000610935338484612293565b6000610935338484612302565b60075473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f784d504c3a4e4f545f4f574e455200000000000000000000000000000000000060448201526064016109e2565b73ffffffffffffffffffffffffffffffffffffffff8216611894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f784d504c3a534d3a494e56414c49445f4d49475241544f52000000000000000060448201526064016109e2565b73ffffffffffffffffffffffffffffffffffffffff8116611911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f784d504c3a534d3a494e56414c49445f4e45575f41535345540000000000000060448201526064016109e2565b61191e620d2f0042613052565b6010819055600e805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909355600f8054868316931683179055600654604051939492939116917ffc384cf40fadcb79796c4f6b26dab65f122020fbffaa19c2ad28bf4da410cded916119b091815260200190565b60405180910390a45050565b600254600090801561091f5761091a6119d36107da565b6119dd908561307e565b82612260565b6000600d54600114611a51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d55611a6e611a628561093f565b91508185858533612650565b6001600d559392505050565b6000600d54600114611ae8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d55611a6e84611afa81610bf3565b925082858533612650565b60075473ffffffffffffffffffffffffffffffffffffffff163314611b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a53504f3a4e4f545f4f574e455200000000000000000000000000000060448201526064016109e2565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907fa86864fa6b65f969d5ac8391ddaac6a0eba3f41386cbf6e78c3e4d6c59eb115f90600090a350565b600254600090801561091f57611c0b6107da565b610910828561307e565b6000610939826116b6565b42841015611c8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f45524332303a503a45585049524544000000000000000000000000000000000060448201526064016109e2565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08111801590611cca57508260ff16601b1480611cca57508260ff16601c145b611d30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f45524332303a503a4d414c4c4541424c4500000000000000000000000000000060448201526064016109e2565b6000611d3a610adf565b73ffffffffffffffffffffffffffffffffffffffff89811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938c166060840152608083018b905260a083019390935260c08083018a90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611e99573d6000803e3d6000fd5b5050506020604051035190508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148015611ef5575073ffffffffffffffffffffffffffffffffffffffff891615155b611f5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f45524332303a503a494e56414c49445f5349474e41545552450000000000000060448201526064016109e2565b5050611f688787876121f1565b50505050505050565b600754600090819073ffffffffffffffffffffffffffffffffffffffff163314611ff7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a5556533a4e4f545f4f574e455200000000000000000000000000000060448201526064016109e2565b600254612060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a5556533a5a45524f5f535550504c590000000000000000000000000060448201526064016109e2565b6120686107da565b60098190556006546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925084917f000000000000000000000000000000000000000000000000000000000000000091849173ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b1580156120ff57600080fd5b505afa158015612113573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121379190612e17565b61214191906130bb565b61214b919061307e565b612155919061306a565b600a81905591508242600b81905561216d9190613052565b600c5560408051828152602081018490527f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa910160405180910390a1600c5460405190815233907f8c84e3b4df93f5b7c8d4ab6647708f5b14cacc124e22908187e30695ec54bab39060200160405180910390a2915091565b600061093982611bf7565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008061226d8385613152565b1161227957600061227c565b60015b60ff16612289838561306a565b6109219190613052565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600460209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122fc576122fc8484610bee85856130bb565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080548392906123379084906130bb565b909155505073ffffffffffffffffffffffffffffffffffffffff808316600081815260036020526040908190208054850190555190918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122539085815260200190565b73ffffffffffffffffffffffffffffffffffffffff821661241c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a4d3a5a45524f5f52454345495645520000000000000000000000000060448201526064016109e2565b83612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a4d3a5a45524f5f53484152455300000000000000000000000000000060448201526064016109e2565b826124ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a4d3a5a45524f5f41535345545300000000000000000000000000000060448201526064016109e2565b6124f48285612955565b6000836124ff6107da565b6125099190613052565b60098190559050600061251a6129ce565b90508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78789604051612584929190918252602082015260400190565b60405180910390a360408051838152602081018390527f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa910160405180910390a16006546125ea9073ffffffffffffffffffffffffffffffffffffffff168430886129f3565b61151b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a4d3a5452414e534645525f46524f4d0000000000000000000000000060448201526064016109e2565b73ffffffffffffffffffffffffffffffffffffffff83166126cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a423a5a45524f5f52454345495645520000000000000000000000000060448201526064016109e2565b84612734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a423a5a45524f5f53484152455300000000000000000000000000000060448201526064016109e2565b8361279b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a423a5a45524f5f41535345545300000000000000000000000000000060448201526064016109e2565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127d9576127d9828287612293565b6127e38286612adb565b6000846127ee6107da565b6127f891906130bb565b6009819055905060006128096129ce565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db898b60405161288a929190918252602082015260400190565b60405180910390a460408051838152602081018390527f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa910160405180910390a16006546128ef9073ffffffffffffffffffffffffffffffffffffffff168688612b69565b611f68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f5244543a423a5452414e5346455200000000000000000000000000000000000060448201526064016109e2565b80600260008282546129679190613052565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6000600c5442600b819055116129e657600a546129e9565b60005b600a819055905090565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052600090612ad29086907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612bca565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290612b109084906130bb565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016129c2565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052600090612bc29085907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612a50565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff83163b612bf057506000610939565b60608373ffffffffffffffffffffffffffffffffffffffff1683604051612c179190612f12565b6000604051808303816000865af19150503d8060008114612c54576040519150601f19603f3d011682016040523d82523d6000602084013e612c59565b606091505b509092509050818015612bc2575080511580612bc2575080806020019051810190612bc29190612ddc565b803573ffffffffffffffffffffffffffffffffffffffff81168114612ca857600080fd5b919050565b803560ff81168114612ca857600080fd5b600060208284031215612cd057600080fd5b61092182612c84565b60008060408385031215612cec57600080fd5b612cf583612c84565b9150612d0360208401612c84565b90509250929050565b600080600060608486031215612d2157600080fd5b612d2a84612c84565b9250612d3860208501612c84565b9150604084013590509250925092565b600080600080600080600060e0888a031215612d6357600080fd5b612d6c88612c84565b9650612d7a60208901612c84565b95506040880135945060608801359350612d9660808901612cad565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612dc557600080fd5b612dce83612c84565b946020939093013593505050565b600060208284031215612dee57600080fd5b8151801515811461092157600080fd5b600060208284031215612e1057600080fd5b5035919050565b600060208284031215612e2957600080fd5b5051919050565b60008060408385031215612e4357600080fd5b82359150612d0360208401612c84565b600080600060608486031215612e6857600080fd5b83359250612e7860208501612c84565b9150612e8660408501612c84565b90509250925092565b600080600080600080600060e0888a031215612eaa57600080fd5b87359650612d7a60208901612c84565b60008060008060008060c08789031215612ed357600080fd5b86359550612ee360208801612c84565b945060408701359350612ef860608801612cad565b92506080870135915060a087013590509295509295509295565b60008251612f248184602087016130d2565b9190910192915050565b600080835481600182811c915080831680612f4a57607f831692505b6020808410821415612f83577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015612f975760018114612fc657612ff3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650612ff3565b60008a81526020902060005b86811015612feb5781548b820152908501908301612fd2565b505084890196505b509498975050505050505050565b60208152600082518060208401526130208160408501602087016130d2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000821982111561306557613065613166565b500190565b60008261307957613079613195565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156130b6576130b6613166565b500290565b6000828210156130cd576130cd613166565b500390565b60005b838110156130ed5781810151838201526020016130d5565b838111156122fc5750506000910152565b600181811c9082168061311257607f821691505b6020821081141561314c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008261316157613161613195565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c6343000807000a00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000d6d4bcde6c816f17889f1dd3000af0261b03a19600000000000000000000000033349b282065b0284d756f0577fb39c158f935e6000000000000000000000000000000000000000c9f2c9cd04674edea400000000000000000000000000000000000000000000000000000000000000000000004784d504c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004784d504c00000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106103415760003560e01c806379ba5097116101bd578063ba087652116100f9578063d3b5dc3b116100a2578063dd62ed3e1161007c578063dd62ed3e14610754578063e13aa9901461077f578063e30c3978146107a7578063ef8b30f7146107c757600080fd5b8063d3b5dc3b146106e4578063d505accf1461070b578063d905777e1461071e57600080fd5b8063c6e6f592116100d3578063c6e6f592146106b5578063ce96cb77146106c8578063d0b06f5d146106db57600080fd5b8063ba0876521461068f578063c42069ec146106a2578063c63d75b6146104e057600080fd5b806394bf804d11610166578063a9059cbb11610140578063a9059cbb14610643578063ab0b0fd314610656578063b3d7f6b914610669578063b460af941461067c57600080fd5b806394bf804d1461061557806395d89b4114610628578063a457c2d71461063057600080fd5b8063899d0c0111610197578063899d0c01146105d95780638da5cb5b146105e25780639159b2061461060257600080fd5b806379ba5097146105915780637bb002d6146105995780637ecebe00146105b957600080fd5b806336f8d3f11161028c5780634cdad506116102355780636109ff4b1161020f5780636109ff4b1461054c5780636e2f2aca146105545780636e553f651461055e57806370a082311461057157600080fd5b80634cdad5061461051357806350921b231461052657806360dd37d91461053957600080fd5b80633c2f7773116102665780633c2f7773146104ce5780633c9ae2ba146104d7578063402d267d146104e057600080fd5b806336f8d3f11461045657806338d52e0f1461049b57806339509351146104bb57600080fd5b806311f240ac116102ee57806330adf81f116102c857806330adf81f146103ee578063313ce567146104155780633644e5151461044e57600080fd5b806311f240ac146103c957806318160ddd146103d257806323b872dd146103db57600080fd5b8063095ea7b31161031f578063095ea7b3146103895780630a28a477146103ac57806310639ea0146103bf57600080fd5b806301e1d1141461034657806306fdde031461036157806307a2d13a14610376575b600080fd5b61034e6107da565b6040519081526020015b60405180910390f35b610369610863565b6040516103589190613001565b61034e610384366004612dfe565b6108f1565b61039c610397366004612db2565b610928565b6040519015158152602001610358565b61034e6103ba366004612dfe565b61093f565b6103c7610965565b005b61034e60095481565b61034e60025481565b61039c6103e9366004612d0c565b610abd565b61034e7f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c981565b61043c7f000000000000000000000000000000000000000000000000000000000000001281565b60405160ff9091168152602001610358565b61034e610adf565b600f546104769073ffffffffffffffffffffffffffffffffffffffff1681565b60405173ffffffffffffffffffffffffffffffffffffffff9091168152602001610358565b6006546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61039c6104c9366004612db2565b610baa565b61034e600c5481565b61034e600a5481565b61034e6104ee366004612cbe565b507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff90565b61034e610521366004612dfe565b610bf3565b61034e610534366004612eba565b610bfe565b61034e610547366004612e8f565b610d45565b6103c7610ef7565b61034e620d2f0081565b61034e61056c366004612e30565b611523565b61034e61057f366004612cbe565b60036020526000908152604090205481565b6103c76115b8565b600e546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61034e6105c7366004612cbe565b60056020526000908152604090205481565b61034e60105481565b6007546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61034e610610366004612cbe565b6116b6565b61034e610623366004612e30565b6116e5565b61036961176f565b61039c61063e366004612db2565b61177c565b61039c610651366004612db2565b611789565b6103c7610664366004612cd9565b611796565b61034e610677366004612dfe565b6119bc565b61034e61068a366004612e53565b6119e3565b61034e61069d366004612e53565b611a7a565b6103c76106b0366004612cbe565b611b05565b61034e6106c3366004612dfe565b611bf7565b61034e6106d6366004612cbe565b611c15565b61034e600b5481565b61034e7f000000000000000000000000000000000000000c9f2c9cd04674edea4000000081565b6103c7610719366004612d48565b611c20565b61034e61072c366004612cbe565b73ffffffffffffffffffffffffffffffffffffffff1660009081526003602052604090205490565b61034e610762366004612cd9565b600460209081526000928352604080842090915290825290205481565b61079261078d366004612dfe565b611f71565b60408051928352602083019190915201610358565b6008546104769073ffffffffffffffffffffffffffffffffffffffff1681565b61034e6107d5366004612dfe565b6121e6565b600a54600090806107ed57505060095490565b600c54600b54600042831061080b5761080682426130bb565b610815565b61081582846130bb565b6009549091507f000000000000000000000000000000000000000c9f2c9cd04674edea40000000610846838761307e565b610850919061306a565b61085a9190613052565b94505050505090565b60008054610870906130fe565b80601f016020809104026020016040519081016040528092919081815260200182805461089c906130fe565b80156108e95780601f106108be576101008083540402835291602001916108e9565b820191906000526020600020905b8154815290600101906020018083116108cc57829003601f168201915b505050505081565b600254600090801561091f57806109066107da565b610910908561307e565b61091a919061306a565b610921565b825b9392505050565b60006109353384846121f1565b5060015b92915050565b600254600090801561091f5761091a610958828561307e565b6109606107da565b612260565b60075473ffffffffffffffffffffffffffffffffffffffff1633146109eb576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f784d504c3a4e4f545f4f574e455200000000000000000000000000000000000060448201526064015b60405180910390fd5b601054610a54576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f784d504c3a434d3a4e4f545f5343484544554c4544000000000000000000000060448201526064016109e2565b610a926000601055600e80547fffffffffffffffffffffffff0000000000000000000000000000000000000000908116909155600f80549091169055565b6040517f29183829efed7c15f37ba982c36934966b558232f770f334108ac30e4301333a90600090a1565b6000610aca843384612293565b610ad5848484612302565b5060019392505050565b60007f8b73c3c69bb8fe3d512ecc4cf759cc79239f7b179b0ffacaa9a75d522b39400f6000604051610b119190612f2e565b604080519182900382208282018252600183527f31000000000000000000000000000000000000000000000000000000000000006020938401528151928301939093528101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608201524660808201523060a082015260c00160405160208183030381529060405280519060200120905090565b33600081815260046020908152604080832073ffffffffffffffffffffffffffffffffffffffff871684529091528120549091610935918590610bee908690613052565b6121f1565b6000610939826108f1565b6000600d54600114610c6c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d556006546040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018990526064810187905260ff8616608482015260a4810185905260c4810184905273ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e401600060405180830381600087803b158015610d0757600080fd5b505af1158015610d1b573d6000803e3d6000fd5b50505050610d36610d2b886121e6565b91508188883361239f565b6001600d559695505050505050565b6000600d54600114610db3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d5585610dc2896119bc565b9150811115610e2d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601b60248201527f5244543a4d57503a494e53554646494349454e545f5045524d4954000000000060448201526064016109e2565b6006546040517fd505accf000000000000000000000000000000000000000000000000000000008152336004820152306024820152604481018890526064810187905260ff8616608482015260a4810185905260c4810184905273ffffffffffffffffffffffffffffffffffffffff9091169063d505accf9060e401600060405180830381600087803b158015610ec357600080fd5b505af1158015610ed7573d6000803e3d6000fd5b50505050610ee78882893361239f565b6001600d55979650505050505050565b60075473ffffffffffffffffffffffffffffffffffffffff163314610f78576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f784d504c3a4e4f545f4f574e455200000000000000000000000000000000000060448201526064016109e2565b601054600e54600654600f5473ffffffffffffffffffffffffffffffffffffffff92831692918216911683611009576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601560248201527f784d504c3a504d3a4e4f545f5343484544554c4544000000000000000000000060448201526064016109e2565b83421015611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f784d504c3a504d3a544f4f5f4541524c5900000000000000000000000000000060448201526064016109e2565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015260009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b1580156110db57600080fd5b505afa1580156110ef573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111139190612e17565b6040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015290915060009073ffffffffffffffffffffffffffffffffffffffff8416906370a082319060240160206040518083038186803b15801561117e57600080fd5b505afa158015611192573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111b69190612e17565b6040517f095ea7b300000000000000000000000000000000000000000000000000000000815273ffffffffffffffffffffffffffffffffffffffff8781166004830152602482018590529192509085169063095ea7b390604401602060405180830381600087803b15801561122a57600080fd5b505af115801561123e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112629190612ddc565b6112c8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601760248201527f784d504c3a504d3a415050524f56414c5f4641494c454400000000000000000060448201526064016109e2565b6040517f454b06080000000000000000000000000000000000000000000000000000000081526004810183905273ffffffffffffffffffffffffffffffffffffffff86169063454b060890602401600060405180830381600087803b15801561133057600080fd5b505af1158015611344573d6000803e3d6000fd5b50506040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015284925083915073ffffffffffffffffffffffffffffffffffffffff8616906370a082319060240160206040518083038186803b1580156113b157600080fd5b505afa1580156113c5573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113e99190612e17565b6113f391906130bb565b1461145a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601460248201527f784d504c3a504d3a57524f4e475f414d4f554e5400000000000000000000000060448201526064016109e2565b8273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fd2b4bfa00cffc450ec3f60db3c511bebc1e88911c9c7b25ef8b294c934fa116c846040516114b991815260200190565b60405180910390a3600680547fffffffffffffffffffffffff000000000000000000000000000000000000000090811673ffffffffffffffffffffffffffffffffffffffff8616179091556000601055600e805482169055600f805490911690555b505050505050565b6000600d54600114611591576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d556115ad6115a2846121e6565b91508184843361239f565b6001600d5592915050565b60085473ffffffffffffffffffffffffffffffffffffffff163314611639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600d60248201527f5244543a414f3a4e4f545f504f0000000000000000000000000000000000000060448201526064016109e2565b600754604051339173ffffffffffffffffffffffffffffffffffffffff16907f357bdeb5828fa83945f38a88510ce5cd7d628dafb346d767efbc693149fdd97c90600090a3600780547fffffffffffffffffffffffff00000000000000000000000000000000000000009081163317909155600880549091169055565b73ffffffffffffffffffffffffffffffffffffffff8116600090815260036020526040812054610939906108f1565b6000600d54600114611753576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d556115ad83611765816119bc565b925082843361239f565b60018054610870906130fe565b6000610935338484612293565b6000610935338484612302565b60075473ffffffffffffffffffffffffffffffffffffffff163314611817576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f784d504c3a4e4f545f4f574e455200000000000000000000000000000000000060448201526064016109e2565b73ffffffffffffffffffffffffffffffffffffffff8216611894576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601860248201527f784d504c3a534d3a494e56414c49445f4d49475241544f52000000000000000060448201526064016109e2565b73ffffffffffffffffffffffffffffffffffffffff8116611911576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f784d504c3a534d3a494e56414c49445f4e45575f41535345540000000000000060448201526064016109e2565b61191e620d2f0042613052565b6010819055600e805473ffffffffffffffffffffffffffffffffffffffff8086167fffffffffffffffffffffffff00000000000000000000000000000000000000009283168117909355600f8054868316931683179055600654604051939492939116917ffc384cf40fadcb79796c4f6b26dab65f122020fbffaa19c2ad28bf4da410cded916119b091815260200190565b60405180910390a45050565b600254600090801561091f5761091a6119d36107da565b6119dd908561307e565b82612260565b6000600d54600114611a51576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d55611a6e611a628561093f565b91508185858533612650565b6001600d559392505050565b6000600d54600114611ae8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600a60248201527f5244543a4c4f434b45440000000000000000000000000000000000000000000060448201526064016109e2565b6002600d55611a6e84611afa81610bf3565b925082858533612650565b60075473ffffffffffffffffffffffffffffffffffffffff163314611b86576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a53504f3a4e4f545f4f574e455200000000000000000000000000000060448201526064016109e2565b600880547fffffffffffffffffffffffff00000000000000000000000000000000000000001673ffffffffffffffffffffffffffffffffffffffff831690811790915560405133907fa86864fa6b65f969d5ac8391ddaac6a0eba3f41386cbf6e78c3e4d6c59eb115f90600090a350565b600254600090801561091f57611c0b6107da565b610910828561307e565b6000610939826116b6565b42841015611c8a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600f60248201527f45524332303a503a45585049524544000000000000000000000000000000000060448201526064016109e2565b7f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08111801590611cca57508260ff16601b1480611cca57508260ff16601c145b611d30576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f45524332303a503a4d414c4c4541424c4500000000000000000000000000000060448201526064016109e2565b6000611d3a610adf565b73ffffffffffffffffffffffffffffffffffffffff89811660008181526005602090815260409182902080546001810190915582517f6e71edae12b1b97f4d1f60370fef10105fa2faae0126114a169c64845d6126c98184015280840194909452938c166060840152608083018b905260a083019390935260c08083018a90528151808403909101815260e0830190915280519201919091207f190100000000000000000000000000000000000000000000000000000000000061010083015261010282019290925261012281019190915261014201604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181528282528051602091820120600080855291840180845281905260ff88169284019290925260608301869052608083018590529092509060019060a0016020604051602081039080840390855afa158015611e99573d6000803e3d6000fd5b5050506020604051035190508873ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16148015611ef5575073ffffffffffffffffffffffffffffffffffffffff891615155b611f5b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601960248201527f45524332303a503a494e56414c49445f5349474e41545552450000000000000060448201526064016109e2565b5050611f688787876121f1565b50505050505050565b600754600090819073ffffffffffffffffffffffffffffffffffffffff163314611ff7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a5556533a4e4f545f4f574e455200000000000000000000000000000060448201526064016109e2565b600254612060576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a5556533a5a45524f5f535550504c590000000000000000000000000060448201526064016109e2565b6120686107da565b60098190556006546040517f70a0823100000000000000000000000000000000000000000000000000000000815230600482015291925084917f000000000000000000000000000000000000000c9f2c9cd04674edea4000000091849173ffffffffffffffffffffffffffffffffffffffff909116906370a082319060240160206040518083038186803b1580156120ff57600080fd5b505afa158015612113573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906121379190612e17565b61214191906130bb565b61214b919061307e565b612155919061306a565b600a81905591508242600b81905561216d9190613052565b600c5560408051828152602081018490527f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa910160405180910390a1600c5460405190815233907f8c84e3b4df93f5b7c8d4ab6647708f5b14cacc124e22908187e30695ec54bab39060200160405180910390a2915091565b600061093982611bf7565b73ffffffffffffffffffffffffffffffffffffffff83811660008181526004602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b60008061226d8385613152565b1161227957600061227c565b60015b60ff16612289838561306a565b6109219190613052565b73ffffffffffffffffffffffffffffffffffffffff8084166000908152600460209081526040808320938616835292905220547fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff81146122fc576122fc8484610bee85856130bb565b50505050565b73ffffffffffffffffffffffffffffffffffffffff8316600090815260036020526040812080548392906123379084906130bb565b909155505073ffffffffffffffffffffffffffffffffffffffff808316600081815260036020526040908190208054850190555190918516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906122539085815260200190565b73ffffffffffffffffffffffffffffffffffffffff821661241c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a4d3a5a45524f5f52454345495645520000000000000000000000000060448201526064016109e2565b83612483576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a4d3a5a45524f5f53484152455300000000000000000000000000000060448201526064016109e2565b826124ea576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a4d3a5a45524f5f41535345545300000000000000000000000000000060448201526064016109e2565b6124f48285612955565b6000836124ff6107da565b6125099190613052565b60098190559050600061251a6129ce565b90508373ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167fdcbc1c05240f31ff3ad067ef1ee35ce4997762752e3a095284754544f4c709d78789604051612584929190918252602082015260400190565b60405180910390a360408051838152602081018390527f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa910160405180910390a16006546125ea9073ffffffffffffffffffffffffffffffffffffffff168430886129f3565b61151b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a4d3a5452414e534645525f46524f4d0000000000000000000000000060448201526064016109e2565b73ffffffffffffffffffffffffffffffffffffffff83166126cd576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601360248201527f5244543a423a5a45524f5f52454345495645520000000000000000000000000060448201526064016109e2565b84612734576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a423a5a45524f5f53484152455300000000000000000000000000000060448201526064016109e2565b8361279b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152601160248201527f5244543a423a5a45524f5f41535345545300000000000000000000000000000060448201526064016109e2565b8173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127d9576127d9828287612293565b6127e38286612adb565b6000846127ee6107da565b6127f891906130bb565b6009819055905060006128096129ce565b90508373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167ffbde797d201c681b91056529119e0b02407c7bb96a4a2c75c01fc9667232c8db898b60405161288a929190918252602082015260400190565b60405180910390a460408051838152602081018390527f68b521a89bf844ff03e484d89fd64ce292a698ec522170f0dad7ecd11c2dc8fa910160405180910390a16006546128ef9073ffffffffffffffffffffffffffffffffffffffff168688612b69565b611f68576040517f08c379a000000000000000000000000000000000000000000000000000000000815260206004820152600e60248201527f5244543a423a5452414e5346455200000000000000000000000000000000000060448201526064016109e2565b80600260008282546129679190613052565b909155505073ffffffffffffffffffffffffffffffffffffffff82166000818152600360209081526040808320805486019055518481527fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91015b60405180910390a35050565b6000600c5442600b819055116129e657600a546129e9565b60005b600a819055905090565b60405173ffffffffffffffffffffffffffffffffffffffff80851660248301528316604482015260648101829052600090612ad29086907f23b872dd00000000000000000000000000000000000000000000000000000000906084015b604080517fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe08184030181529190526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fffffffff0000000000000000000000000000000000000000000000000000000090931692909217909152612bca565b95945050505050565b73ffffffffffffffffffffffffffffffffffffffff821660009081526003602052604081208054839290612b109084906130bb565b909155505060028054829003905560405181815260009073ffffffffffffffffffffffffffffffffffffffff8416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef906020016129c2565b60405173ffffffffffffffffffffffffffffffffffffffff8316602482015260448101829052600090612bc29085907fa9059cbb0000000000000000000000000000000000000000000000000000000090606401612a50565b949350505050565b600073ffffffffffffffffffffffffffffffffffffffff83163b612bf057506000610939565b60608373ffffffffffffffffffffffffffffffffffffffff1683604051612c179190612f12565b6000604051808303816000865af19150503d8060008114612c54576040519150601f19603f3d011682016040523d82523d6000602084013e612c59565b606091505b509092509050818015612bc2575080511580612bc2575080806020019051810190612bc29190612ddc565b803573ffffffffffffffffffffffffffffffffffffffff81168114612ca857600080fd5b919050565b803560ff81168114612ca857600080fd5b600060208284031215612cd057600080fd5b61092182612c84565b60008060408385031215612cec57600080fd5b612cf583612c84565b9150612d0360208401612c84565b90509250929050565b600080600060608486031215612d2157600080fd5b612d2a84612c84565b9250612d3860208501612c84565b9150604084013590509250925092565b600080600080600080600060e0888a031215612d6357600080fd5b612d6c88612c84565b9650612d7a60208901612c84565b95506040880135945060608801359350612d9660808901612cad565b925060a0880135915060c0880135905092959891949750929550565b60008060408385031215612dc557600080fd5b612dce83612c84565b946020939093013593505050565b600060208284031215612dee57600080fd5b8151801515811461092157600080fd5b600060208284031215612e1057600080fd5b5035919050565b600060208284031215612e2957600080fd5b5051919050565b60008060408385031215612e4357600080fd5b82359150612d0360208401612c84565b600080600060608486031215612e6857600080fd5b83359250612e7860208501612c84565b9150612e8660408501612c84565b90509250925092565b600080600080600080600060e0888a031215612eaa57600080fd5b87359650612d7a60208901612c84565b60008060008060008060c08789031215612ed357600080fd5b86359550612ee360208801612c84565b945060408701359350612ef860608801612cad565b92506080870135915060a087013590509295509295509295565b60008251612f248184602087016130d2565b9190910192915050565b600080835481600182811c915080831680612f4a57607f831692505b6020808410821415612f83577f4e487b710000000000000000000000000000000000000000000000000000000086526022600452602486fd5b818015612f975760018114612fc657612ff3565b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00861689528489019650612ff3565b60008a81526020902060005b86811015612feb5781548b820152908501908301612fd2565b505084890196505b509498975050505050505050565b60208152600082518060208401526130208160408501602087016130d2565b601f017fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0169190910160400192915050565b6000821982111561306557613065613166565b500190565b60008261307957613079613195565b500490565b6000817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156130b6576130b6613166565b500290565b6000828210156130cd576130cd613166565b500390565b60005b838110156130ed5781810151838201526020016130d5565b838111156122fc5750506000910152565b600181811c9082168061311257607f821691505b6020821081141561314c577f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b50919050565b60008261316157613161613195565b500690565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fdfea164736f6c6343000807000a

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

00000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e0000000000000000000000000d6d4bcde6c816f17889f1dd3000af0261b03a19600000000000000000000000033349b282065b0284d756f0577fb39c158f935e6000000000000000000000000000000000000000c9f2c9cd04674edea400000000000000000000000000000000000000000000000000000000000000000000004784d504c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004784d504c00000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name_ (string): xMPL
Arg [1] : symbol_ (string): xMPL
Arg [2] : owner_ (address): 0xd6d4Bcde6c816F17889f1Dd3000aF0261B03a196
Arg [3] : asset_ (address): 0x33349B282065b0284d756F0577FB39c158F935e6
Arg [4] : precision_ (uint256): 1000000000000000000000000000000

-----Encoded View---------------
9 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [2] : 000000000000000000000000d6d4bcde6c816f17889f1dd3000af0261b03a196
Arg [3] : 00000000000000000000000033349b282065b0284d756f0577fb39c158f935e6
Arg [4] : 000000000000000000000000000000000000000c9f2c9cd04674edea40000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 784d504c00000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [8] : 784d504c00000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

47724:2860:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43268:580;;;:::i;:::-;;;8348:25:1;;;8336:2;8321:18;43268:580:0;;;;;;;;10599:27;;;:::i;:::-;;;;;;;:::i;40423:241::-;;;;;;:::i;:::-;;:::i;11720:171::-;;;;;;:::i;:::-;;:::i;:::-;;;8175:14:1;;8168:22;8150:41;;8138:2;8123:18;11720:171:0;8010:187:1;42798:464:0;;;;;;:::i;:::-;;:::i;48490:204::-;;;:::i;:::-;;33889:34;;;;;;10715:35;;;;;;13760:250;;;;;;:::i;:::-;;:::i;11089:117::-;;11140:66;11089:117;;10668:40;;;;;;;;19666:4:1;19654:17;;;19636:36;;19624:2;19609:18;10668:40:0;19494:184:1;14104:419:0;;;:::i;47900:41::-;;;;;;;;;;;;6552:42:1;6540:55;;;6522:74;;6510:2;6495:18;47900:41:0;6376:226:1;33575:29:0;;;;;;;;;12114:225;;;;;;:::i;:::-;;:::i;34214:43::-;;;;;;33995:36;;;;;;40917:185;;;;;;:::i;:::-;-1:-1:-1;41078:17:0;;40917:185;42436:356;;;;;;:::i;:::-;;:::i;36723:426::-;;;;;;:::i;:::-;;:::i;37362:525::-;;;;;;:::i;:::-;;:::i;48700:1102::-;;;:::i;47780:66::-;;47839:7;47780:66;;36510:207;;;;;;:::i;:::-;;:::i;10757:53::-;;;;;;:::i;:::-;;;;;;;;;;;;;;35119:245;;;:::i;47853:41::-;;;;;;;;;11213:50;;;;;;:::i;:::-;;;;;;;;;;;;;;47948:51;;;;;;33671:29;;;;;;;;;40250:167;;;;;;:::i;:::-;;:::i;37155:201::-;;;;;;:::i;:::-;;:::i;10632:29::-;;;:::i;11897:211::-;;;;;;:::i;:::-;;:::i;13577:177::-;;;;;;:::i;:::-;;:::i;49808:513::-;;;;;;:::i;:::-;;:::i;41967:463::-;;;;;;:::i;:::-;;:::i;38128:233::-;;;;;;:::i;:::-;;:::i;37893:229::-;;;;;;:::i;:::-;;:::i;35370:237::-;;;;;;:::i;:::-;;:::i;40670:241::-;;;;;;:::i;:::-;;:::i;41444:150::-;;;;;;:::i;:::-;;:::i;34107:35::-;;;;;;33445:43;;;;;12345:1226;;;;;;:::i;:::-;;:::i;41296:142::-;;;;;;:::i;:::-;41414:17;;41371:18;41414:17;;;:9;:17;;;;;;;41296:142;10817:73;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;35613:797;;;;;;:::i;:::-;;:::i;:::-;;;;19415:25:1;;;19471:2;19456:18;;19449:34;;;;19388:18;35613:797:0;19241:248:1;33785:36:0;;;;;;;;;41600:361;;;;;;:::i;:::-;;:::i;43268:580::-;43392:12;;43329:27;;43419:18;43415:41;;-1:-1:-1;;43446:10:0;;;43268:580::o;43415:41::-;43498:19;;43558:11;;43467:28;43620:15;:38;-1:-1:-1;43620:141:0;;43731:30;43749:12;43731:15;:30;:::i;:::-;43620:141;;;43677:35;43700:12;43677:20;:35;:::i;:::-;43831:10;;43580:181;;-1:-1:-1;43818:9:0;43781:33;43580:181;43781:13;:33;:::i;:::-;43780:47;;;;:::i;:::-;43779:62;;;;:::i;:::-;43772:69;;;;;;43268:580;:::o;10599:27::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;40423:241::-;40547:11;;40503:15;;40599:11;;:58;;40651:6;40634:13;:11;:13::i;:::-;40624:23;;:7;:23;:::i;:::-;40623:34;;;;:::i;:::-;40599:58;;;40613:7;40599:58;40589:68;40423:241;-1:-1:-1;;;40423:241:0:o;11720:171::-;11799:13;11824:39;11833:10;11845:8;11855:7;11824:8;:39::i;:::-;-1:-1:-1;11880:4:0;11720:171;;;;;:::o;42798:464::-;42922:11;;42878:15;;43187:11;;:68;;43211:44;43223:16;43233:6;43223:7;:16;:::i;:::-;43241:13;:11;:13::i;:::-;43211:11;:44::i;48490:204::-;48324:5;;;;48310:10;:19;48302:46;;;;;;;18918:2:1;48302:46:0;;;18900:21:1;18957:2;18937:18;;;18930:30;18996:16;18976:18;;;18969:44;19030:18;;48302:46:0;;;;;;;;;48563:27:::1;::::0;48555:66:::1;;;::::0;::::1;::::0;;18215:2:1;48555:66:0::1;::::0;::::1;18197:21:1::0;18254:2;18234:18;;;18227:30;18293:23;18273:18;;;18266:51;18334:18;;48555:66:0::1;18013:345:1::0;48555:66:0::1;48632:19;50472:34:::0;50479:27;50472:34;50523:17;50516:24;;;;;;;;;50557:17;50550:24;;;;;;;50424:157;48632:19:::1;48667:20;::::0;::::1;::::0;;;::::1;48490:204::o:0;13760:250::-;13862:13;13887:47;13906:6;13914:10;13926:7;13887:18;:47::i;:::-;13944:38;13954:6;13962:10;13974:7;13944:9;:38::i;:::-;-1:-1:-1;13999:4:0;13760:250;;;;;:::o;14104:419::-;14162:24;14256:95;14385:4;14369:22;;;;;;:::i;:::-;;;;;;;;;;14419:10;;;;;;;;;;;;;;14228:278;;;;;9262:25:1;;;;9303:18;;9296:34;;;;14409:21:0;9346:18:1;;;9339:34;14448:13:0;9389:18:1;;;9382:34;14487:4:0;9432:19:1;;;9425:84;9234:19;;14228:278:0;;;;;;;;;;;;14205:311;;;;;;14198:318;;14104:419;:::o;12114:225::-;12242:10;12208:13;12264:21;;;:9;:21;;;;;;;;;:31;;;;;;;;;;12208:13;;12233:78;;12254:8;;12264:46;;12298:12;;12264:46;:::i;:::-;12233:8;:78::i;42436:356::-;42514:15;42761:24;42777:7;42761:15;:24::i;36723:426::-;36951:15;34492:6;;34502:1;34492:11;34484:34;;;;;;;14756:2:1;34484:34:0;;;14738:21:1;14795:2;14775:18;;;14768:30;14834:12;14814:18;;;14807:40;14864:18;;34484:34:0;14554:334:1;34484:34:0;34538:1;34529:6;:10;36988:5:::1;::::0;36982:78:::1;::::0;;;;37002:10:::1;36982:78;::::0;::::1;7382:34:1::0;37022:4:0::1;7432:18:1::0;;;7425:43;7484:18;;;7477:34;;;7527:18;;;7520:34;;;7603:4;7591:17;;7570:19;;;7563:46;7625:19;;;7618:35;;;7669:19;;;7662:35;;;36988:5:0::1;::::0;;::::1;::::0;36982:19:::1;::::0;7293::1;;36982:78:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37070:72;37086:23;37101:7;37086:14;:23::i;:::-;37076:33;;;37111:7;37120:9;37131:10;37070:5;:72::i;:::-;34571:1:::0;34562:6;:10;36723:426;;-1:-1:-1;;;;;;36723:426:0:o;37362:525::-;37615:15;34492:6;;34502:1;34492:11;34484:34;;;;;;;14756:2:1;34484:34:0;;;14738:21:1;14795:2;14775:18;;;14768:30;14834:12;14814:18;;;14807:40;14864:18;;34484:34:0;14554:334:1;34484:34:0;34538:1;34529:6;:10;37690;37665:20:::1;37677:7:::0;37665:11:::1;:20::i;:::-;37655:30;;;37654:46;;37646:86;;;::::0;::::1;::::0;;17859:2:1;37646:86:0::1;::::0;::::1;17841:21:1::0;17898:2;17878:18;;;17871:30;17937:29;17917:18;;;17910:57;17984:18;;37646:86:0::1;17657:351:1::0;37646:86:0::1;37749:5;::::0;37743:81:::1;::::0;;;;37763:10:::1;37743:81;::::0;::::1;7382:34:1::0;37783:4:0::1;7432:18:1::0;;;7425:43;7484:18;;;7477:34;;;7527:18;;;7520:34;;;7603:4;7591:17;;7570:19;;;7563:46;7625:19;;;7618:35;;;7669:19;;;7662:35;;;37749:5:0::1;::::0;;::::1;::::0;37743:19:::1;::::0;7293::1;;37743:81:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;37834:46;37840:7;37849;37858:9;37869:10;37834:5;:46::i;:::-;34571:1:::0;34562:6;:10;37362:525;;-1:-1:-1;;;;;;;37362:525:0:o;48700:1102::-;48324:5;;;;48310:10;:19;48302:46;;;;;;;18918:2:1;48302:46:0;;;18900:21:1;18957:2;18937:18;;;18930:30;18996:16;18976:18;;;18969:44;19030:18;;48302:46:0;18716:338:1;48302:46:0;48795:27:::1;::::0;48861:17:::1;::::0;48917:5:::1;::::0;48961:17:::1;::::0;48861::::1;::::0;;::::1;::::0;48917:5;;::::1;::::0;48961:17:::1;48997:23:::0;48989:71:::1;;;::::0;::::1;::::0;;12309:2:1;48989:71:0::1;::::0;::::1;12291:21:1::0;12348:2;12328:18;;;12321:30;12387:23;12367:18;;;12360:51;12428:18;;48989:71:0::1;12107:345:1::0;48989:71:0::1;49097:18;49078:15;:37;;49070:67;;;::::0;::::1;::::0;;17167:2:1;49070:67:0::1;::::0;::::1;17149:21:1::0;17206:2;17186:18;;;17179:30;17245:19;17225:18;;;17218:47;17282:18;;49070:67:0::1;16965:341:1::0;49070:67:0::1;49189:40;::::0;;;;49223:4:::1;49189:40;::::0;::::1;6522:74:1::0;49148:38:0::1;::::0;49189:25:::1;::::0;::::1;::::0;::::1;::::0;6495:18:1;;49189:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49280;::::0;;;;49314:4:::1;49280:40;::::0;::::1;6522:74:1::0;49148:81:0;;-1:-1:-1;49239:38:0::1;::::0;49280:25:::1;::::0;::::1;::::0;::::1;::::0;6495:18:1;;49280:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49339:65;::::0;;;;:23:::1;7900:55:1::0;;;49339:65:0::1;::::0;::::1;7882:74:1::0;7972:18;;;7965:34;;;49239:81:0;;-1:-1:-1;49339:23:0;;::::1;::::0;::::1;::::0;7855:18:1;;49339:65:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;49331:101;;;::::0;::::1;::::0;;13353:2:1;49331:101:0::1;::::0;::::1;13335:21:1::0;13392:2;13372:18;;;13365:30;13431:25;13411:18;;;13404:53;13474:18;;49331:101:0::1;13151:347:1::0;49331:101:0::1;49443:58;::::0;;;;::::1;::::0;::::1;8348:25:1::0;;;49443:26:0::1;::::0;::::1;::::0;::::1;::::0;8321:18:1;;49443:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;49520:40:0::1;::::0;;;;49554:4:::1;49520:40;::::0;::::1;6522:74:1::0;49597:30:0;;-1:-1:-1;49563:30:0;;-1:-1:-1;49520:25:0::1;::::0;::::1;::::0;::::1;::::0;6495:18:1;;49520:40:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:73;;;;:::i;:::-;:107;49512:140;;;::::0;::::1;::::0;;14407:2:1;49512:140:0::1;::::0;::::1;14389:21:1::0;14446:2;14426:18;;;14419:30;14485:22;14465:18;;;14458:50;14525:18;;49512:140:0::1;14205:344:1::0;49512:140:0::1;49697:8;49668:70;;49687:8;49668:70;;;49707:30;49668:70;;;;8348:25:1::0;;8336:2;8321:18;;8202:177;49668:70:0::1;;;;;;;;49749:5;:16:::0;;;;;::::1;;::::0;::::1;;::::0;;;-1:-1:-1;50479:27:0;50472:34;50523:17;50516:24;;;;;;50557:17;50550:24;;;;;;;49776:19:::1;48756:1046;;;;;;48700:1102::o:0;36510:207::-;36611:15;34492:6;;34502:1;34492:11;34484:34;;;;;;;14756:2:1;34484:34:0;;;14738:21:1;14795:2;14775:18;;;14768:30;14834:12;14814:18;;;14807:40;14864:18;;34484:34:0;14554:334:1;34484:34:0;34538:1;34529:6;:10;36638:72:::1;36654:23;36669:7:::0;36654:14:::1;:23::i;:::-;36644:33;;;36679:7;36688:9;36699:10;36638:5;:72::i;:::-;34571:1:::0;34562:6;:10;36510:207;;-1:-1:-1;;36510:207:0:o;35119:245::-;35204:12;;;;35190:10;:26;35182:52;;;;;;;15443:2:1;35182:52:0;;;15425:21:1;15482:2;15462:18;;;15455:30;15521:15;15501:18;;;15494:43;15554:18;;35182:52:0;15241:337:1;35182:52:0;35268:5;;35250:36;;35275:10;;35250:36;35268:5;;35250:36;;35268:5;;35250:36;35297:5;:25;;;;;;35312:10;35297:25;;;;35332:12;:25;;;;;;;35119:245::o;40250:167::-;40390:19;;;40331:24;40390:19;;;:9;:19;;;;;;40374:36;;:15;:36::i;37155:201::-;37253:15;34492:6;;34502:1;34492:11;34484:34;;;;;;;14756:2:1;34484:34:0;;;14738:21:1;14795:2;14775:18;;;14768:30;14834:12;14814:18;;;14807:40;14864:18;;34484:34:0;14554:334:1;34484:34:0;34538:1;34529:6;:10;37280:69:::1;37286:7:::0;37305:20:::1;37286:7:::0;37305:11:::1;:20::i;:::-;37295:30;;;37327:9;37338:10;37280:5;:69::i;10632:29::-:0;;;;;;;:::i;11897:211::-;11996:13;12021:59;12040:10;12052:8;12062:17;12021:18;:59::i;13577:177::-;13659:13;13684:42;13694:10;13706;13718:7;13684:9;:42::i;49808:513::-;48324:5;;;;48310:10;:19;48302:46;;;;;;;18918:2:1;48302:46:0;;;18900:21:1;18957:2;18937:18;;;18930:30;18996:16;18976:18;;;18969:44;19030:18;;48302:46:0;18716:338:1;48302:46:0;49919:23:::1;::::0;::::1;49911:60;;;::::0;::::1;::::0;;18565:2:1;49911:60:0::1;::::0;::::1;18547:21:1::0;18604:2;18584:18;;;18577:30;18643:26;18623:18;;;18616:54;18687:18;;49911:60:0::1;18363:348:1::0;49911:60:0::1;49989:23;::::0;::::1;49981:61;;;::::0;::::1;::::0;;11609:2:1;49981:61:0::1;::::0;::::1;11591:21:1::0;11648:2;11628:18;;;11621:30;11687:27;11667:18;;;11660:55;11732:18;;49981:61:0::1;11407:349:1::0;49981:61:0::1;50083:41;47839:7;50083:15;:41;:::i;:::-;50053:27;:71:::0;;;50134:17:::1;:39:::0;;::::1;::::0;;::::1;::::0;;;::::1;::::0;::::1;::::0;;;50183:17:::1;:39:::0;;;;::::1;::::0;::::1;::::0;::::1;::::0;;50257:5:::1;::::0;50238:76:::1;::::0;50134:39;;50183;;50257:5;::::1;::::0;50238:76:::1;::::0;::::1;::::0;8348:25:1;;8336:2;8321:18;;8202:177;50238:76:0::1;;;;;;;;49808:513:::0;;:::o;41967:463::-;42087:11;;42043:15;;42355:11;;:68;;42379:44;42401:13;:11;:13::i;:::-;42391:23;;:7;:23;:::i;:::-;42416:6;42379:11;:44::i;38128:233::-;38246:15;34492:6;;34502:1;34492:11;34484:34;;;;;;;14756:2:1;34484:34:0;;;14738:21:1;14795:2;14775:18;;;14768:30;14834:12;14814:18;;;14807:40;14864:18;;34484:34:0;14554:334:1;34484:34:0;34538:1;34529:6;:10;38273:81:::1;38289:24;38305:7:::0;38289:15:::1;:24::i;:::-;38279:34;;;38315:7;38324:9;38335:6;38343:10;38273:5;:81::i;:::-;34571:1:::0;34562:6;:10;38128:233;;-1:-1:-1;;;38128:233:0:o;37893:229::-;38009:15;34492:6;;34502:1;34492:11;34484:34;;;;;;;14756:2:1;34484:34:0;;;14738:21:1;14795:2;14775:18;;;14768:30;14834:12;14814:18;;;14807:40;14864:18;;34484:34:0;14554:334:1;34484:34:0;34538:1;34529:6;:10;38036:79:::1;38042:7:::0;38061:22:::1;38042:7:::0;38061:13:::1;:22::i;:::-;38051:32;;;38085:9;38096:6;38104:10;38036:5;:79::i;35370:237::-:0;35476:5;;;;35462:10;:19;35454:49;;;;;;;16821:2:1;35454:49:0;;;16803:21:1;16860:2;16840:18;;;16833:30;16899:19;16879:18;;;16872:47;16936:18;;35454:49:0;16619:341:1;35454:49:0;35514:12;:28;;;;;;;;;;;;;35558:42;;35574:10;;35558:42;;-1:-1:-1;;35558:42:0;35370:237;:::o;40670:241::-;40794:11;;40750:15;;40846:11;;:58;;40891:13;:11;:13::i;:::-;40871:16;40881:6;40871:7;:16;:::i;41444:150::-;41521:18;41564:23;41580:6;41564:15;:23::i;12345:1226::-;12514:15;12501:9;:28;;12493:56;;;;;;;16131:2:1;12493:56:0;;;16113:21:1;16170:2;16150:18;;;16143:30;16209:17;16189:18;;;16182:45;16244:18;;12493:56:0;15929:339:1;12493:56:0;12823:66;12800:90;;;;;:128;;;12907:2;:8;;12913:2;12907:8;:20;;;;12919:2;:8;;12925:2;12919:8;12907:20;12779:192;;;;;;;12659:2:1;12779:192:0;;;12641:21:1;12698:2;12678:18;;;12671:30;12737:19;12717:18;;;12710:47;12774:18;;12779:192:0;12457:341:1;12779:192:0;13054:14;13168:18;:16;:18::i;:::-;13273:14;;;;13229:15;13273:14;;;:6;:14;;;;;;;;;:16;;;;;;;;13218:83;;11140:66;13218:83;;;8671:25:1;8773:18;;;8766:43;;;;8845:15;;;8825:18;;;8818:43;8877:18;;;8870:34;;;8920:19;;;8913:35;;;;8964:19;;;;8957:35;;;13218:83:0;;;;;;;;;;8643:19:1;;;13218:83:0;;;13208:94;;;;;;;;6197:66:1;13098:222:0;;;6185:79:1;6280:11;;;6273:27;;;;6316:12;;;6309:28;;;;6353:12;;13098:222:0;;;;;;;;;;;;;13071:263;;13098:222;13071:263;;;;13349:24;13376:29;;;;;;;;;9747:25:1;;;9820:4;9808:17;;9788:18;;;9781:45;;;;9842:18;;;9835:34;;;9885:18;;;9878:34;;;13071:263:0;;-1:-1:-1;13349:24:0;13376:29;;9719:19:1;;13376:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13349:56;;13448:6;13428:26;;:16;:26;;;:50;;;;-1:-1:-1;13458:20:0;;;;;13428:50;13420:88;;;;;;;13705:2:1;13420:88:0;;;13687:21:1;13744:2;13724:18;;;13717:30;13783:27;13763:18;;;13756:55;13828:18;;13420:88:0;13503:349:1;13420:88:0;13030:489;;13529:35;13538:6;13546:8;13556:7;13529:8;:35::i;:::-;12345:1226;;;;;;;:::o;35613:797::-;35779:5;;35703:21;;;;35779:5;;35765:10;:19;35757:49;;;;;;;15785:2:1;35757:49:0;;;15767:21:1;15824:2;15804:18;;;15797:30;15863:19;15843:18;;;15836:47;15900:18;;35757:49:0;15583:341:1;35757:49:0;35824:11;;35816:51;;;;;;;10918:2:1;35816:51:0;;;10900:21:1;10957:2;10937:18;;;10930:30;10996:21;10976:18;;;10969:49;11035:18;;35816:51:0;10716:343:1;35816:51:0;35973:13;:11;:13::i;:::-;35960:10;:26;;;36064:5;;36058:37;;;;;36089:4;36058:37;;;6522:74:1;35960:26:0;;-1:-1:-1;36126:14:0;;36113:9;;35960:26;;36064:5;;;;;36058:22;;6495:18:1;;36058:37:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:51;;;;:::i;:::-;36057:65;;;;:::i;:::-;36056:84;;;;:::i;:::-;36041:12;:99;;;36025:115;;36254:14;36235:15;36221:11;:29;;;36220:48;;;;:::i;:::-;36198:19;:70;36284:49;;;19415:25:1;;;19471:2;19456:18;;19449:34;;;36284:49:0;;19388:18:1;36284:49:0;;;;;;;36383:19;;36348:55;;8348:25:1;;;36371:10:0;;36348:55;;8336:2:1;8321:18;36348:55:0;;;;;;;35613:797;;;:::o;41600:361::-;41679:15;41930:24;41946:7;41930:15;:24::i;14629:165::-;14722:65;;;;14749:17;;;;:9;:17;;;;;;;;14722:65;;;14749:27;;;;;;;;;;:37;;;14722:65;;8348:25:1;;;14722:65:0;;8321:18:1;14722:65:0;;;;;;;;14629:165;;;:::o;43954:183::-;44036:15;;44096:21;44109:8;44096:10;:21;:::i;:::-;:25;:33;;44128:1;44096:33;;;44124:1;44096:33;44069:61;;44070:21;44083:8;44070:10;:21;:::i;:::-;44069:61;;;;:::i;15105:332::-;15240:17;;;;15213:24;15240:17;;;:9;:17;;;;;;;;:27;;;;;;;;;;15323:17;15303:37;;15299:132;;15356:64;15365:6;15373:8;15383:36;15402:17;15383:16;:36;:::i;15356:64::-;15203:234;15105:332;;;:::o;15755:354::-;15846:17;;;;;;;:9;:17;;;;;:28;;15867:7;;15846:17;:28;;15867:7;;15846:28;:::i;:::-;;;;-1:-1:-1;;16015:21:0;;;;;;;;:9;:21;;;;;;;:32;;;;;;16065:37;16015:21;;16065:37;;;;;;;16040:7;8348:25:1;;8336:2;8321:18;;8202:177;38467:695:0;38579:23;;;38571:55;;;;;;;14059:2:1;38571:55:0;;;14041:21:1;14098:2;14078:18;;;14071:30;14137:21;14117:18;;;14110:49;14176:18;;38571:55:0;13857:343:1;38571:55:0;38644:23;38636:53;;;;;;;10572:2:1;38636:53:0;;;10554:21:1;10611:2;10591:18;;;10584:30;10650:19;10630:18;;;10623:47;10687:18;;38636:53:0;10370:341:1;38636:53:0;38707:23;38699:53;;;;;;;11963:2:1;38699:53:0;;;11945:21:1;12002:2;11982:18;;;11975:30;12041:19;12021:18;;;12014:47;12078:18;;38699:53:0;11761:341:1;38699:53:0;38763:25;38769:9;38780:7;38763:5;:25::i;:::-;38799:23;38854:7;38838:13;:11;:13::i;:::-;:23;;;;:::i;:::-;38825:10;:36;;;38799:62;;38872:21;38896:23;:21;:23::i;:::-;38872:47;;38952:9;38935:45;;38943:7;38935:45;;;38963:7;38972;38935:45;;;;;;19415:25:1;;;19471:2;19456:18;;19449:34;19403:2;19388:18;;19241:248;38935:45:0;;;;;;;;38995:53;;;19415:25:1;;;19471:2;19456:18;;19449:34;;;38995:53:0;;19388:18:1;38995:53:0;;;;;;;39092:5;;39067:64;;39092:5;;39099:7;39116:4;39123:7;39067:24;:64::i;:::-;39059:96;;;;;;;15095:2:1;39059:96:0;;;15077:21:1;15134:2;15114:18;;;15107:30;15173:21;15153:18;;;15146:49;15212:18;;39059:96:0;14893:343:1;39168:797:0;39296:23;;;39288:55;;;;;;;13005:2:1;39288:55:0;;;12987:21:1;13044:2;13024:18;;;13017:30;13083:21;13063:18;;;13056:49;13122:18;;39288:55:0;12803:343:1;39288:55:0;39361:23;39353:53;;;;;;;17513:2:1;39353:53:0;;;17495:21:1;17552:2;17532:18;;;17525:30;17591:19;17571:18;;;17564:47;17628:18;;39353:53:0;17311:341:1;39353:53:0;39424:23;39416:53;;;;;;;16475:2:1;39416:53:0;;;16457:21:1;16514:2;16494:18;;;16487:30;16553:19;16533:18;;;16526:47;16590:18;;39416:53:0;16273:341:1;39416:53:0;39495:6;39484:17;;:7;:17;;;39480:92;;39517:44;39536:6;39544:7;39553;39517:18;:44::i;:::-;39582:22;39588:6;39596:7;39582:5;:22::i;:::-;39615:23;39670:7;39654:13;:11;:13::i;:::-;:23;;;;:::i;:::-;39641:10;:36;;;39615:62;;39688:21;39712:23;:21;:23::i;:::-;39688:47;;39780:6;39751:54;;39769:9;39751:54;;39760:7;39751:54;;;39788:7;39797;39751:54;;;;;;19415:25:1;;;19471:2;19456:18;;19449:34;19403:2;19388:18;;19241:248;39751:54:0;;;;;;;;39820:53;;;19415:25:1;;;19471:2;19456:18;;19449:34;;;39820:53:0;;19388:18:1;39820:53:0;;;;;;;39913:5;;39892:47;;39913:5;;39920:9;39931:7;39892:20;:47::i;:::-;39884:74;;;;;;;11266:2:1;39884:74:0;;;11248:21:1;11305:2;11285:18;;;11278:30;11344:16;11324:18;;;11317:44;11378:18;;39884:74:0;11064:338:1;15443:306:0;15529:7;15514:11;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;15651:21:0;;;;;;;:9;:21;;;;;;;;:32;;;;;;15701:41;8348:25:1;;;15701:41:0;;8321:18:1;15701:41:0;;;;;;;;15443:306;;:::o;39971:185::-;40022:21;40111:19;;40092:15;40078:11;:29;;;40077:53;:72;;40137:12;;40077:72;;;40133:1;40077:72;40062:12;:87;;;40055:94;;39971:185;:::o;7571:228::-;7718:73;;6819:42:1;6888:15;;;7718:73:0;;;6870:34:1;6940:15;;6920:18;;;6913:43;6972:18;;;6965:34;;;7672:13:0;;7704:88;;7710:6;;7741:28;;6782:18:1;;7718:73:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7704:5;:88::i;:::-;7697:95;7571:228;-1:-1:-1;;;;;7571:228:0:o;14800:299::-;14867:17;;;;;;;:9;:17;;;;;:28;;14888:7;;14867:17;:28;;14888:7;;14867:28;:::i;:::-;;;;-1:-1:-1;;15015:11:0;:22;;;;;;;15055:37;;8348:25:1;;;-1:-1:-1;;15055:37:0;;;;;;8336:2:1;8321:18;15055:37:0;8202:177:1;7367:198:0;7495:62;;7912:42:1;7900:55;;7495:62:0;;;7882:74:1;7972:18;;;7965:34;;;7449:13:0;;7481:77;;7487:6;;7518:24;;7855:18:1;;7495:62:0;7708:297:1;7481:77:0;7474:84;7367:198;-1:-1:-1;;;;7367:198:0:o;8391:336::-;8459:13;8488:18;;;;8484:50;;-1:-1:-1;8529:5:0;8522:12;;8484:50;8545:23;8605:6;:11;;8617:5;8605:18;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8578:45:0;;-1:-1:-1;8578:45:0;-1:-1:-1;8578:45:0;8641:79;;;;-1:-1:-1;8654:17:0;;:31;;:65;;;8700:10;8689:30;;;;;;;;;;;;:::i;14:196:1:-;82:20;;142:42;131:54;;121:65;;111:93;;200:1;197;190:12;111:93;14:196;;;:::o;215:156::-;281:20;;341:4;330:16;;320:27;;310:55;;361:1;358;351:12;376:186;435:6;488:2;476:9;467:7;463:23;459:32;456:52;;;504:1;501;494:12;456:52;527:29;546:9;527:29;:::i;567:260::-;635:6;643;696:2;684:9;675:7;671:23;667:32;664:52;;;712:1;709;702:12;664:52;735:29;754:9;735:29;:::i;:::-;725:39;;783:38;817:2;806:9;802:18;783:38;:::i;:::-;773:48;;567:260;;;;;:::o;832:328::-;909:6;917;925;978:2;966:9;957:7;953:23;949:32;946:52;;;994:1;991;984:12;946:52;1017:29;1036:9;1017:29;:::i;:::-;1007:39;;1065:38;1099:2;1088:9;1084:18;1065:38;:::i;:::-;1055:48;;1150:2;1139:9;1135:18;1122:32;1112:42;;832:328;;;;;:::o;1165:606::-;1276:6;1284;1292;1300;1308;1316;1324;1377:3;1365:9;1356:7;1352:23;1348:33;1345:53;;;1394:1;1391;1384:12;1345:53;1417:29;1436:9;1417:29;:::i;:::-;1407:39;;1465:38;1499:2;1488:9;1484:18;1465:38;:::i;:::-;1455:48;;1550:2;1539:9;1535:18;1522:32;1512:42;;1601:2;1590:9;1586:18;1573:32;1563:42;;1624:37;1656:3;1645:9;1641:19;1624:37;:::i;:::-;1614:47;;1708:3;1697:9;1693:19;1680:33;1670:43;;1760:3;1749:9;1745:19;1732:33;1722:43;;1165:606;;;;;;;;;;:::o;1776:254::-;1844:6;1852;1905:2;1893:9;1884:7;1880:23;1876:32;1873:52;;;1921:1;1918;1911:12;1873:52;1944:29;1963:9;1944:29;:::i;:::-;1934:39;2020:2;2005:18;;;;1992:32;;-1:-1:-1;;;1776:254:1:o;2035:277::-;2102:6;2155:2;2143:9;2134:7;2130:23;2126:32;2123:52;;;2171:1;2168;2161:12;2123:52;2203:9;2197:16;2256:5;2249:13;2242:21;2235:5;2232:32;2222:60;;2278:1;2275;2268:12;2317:180;2376:6;2429:2;2417:9;2408:7;2404:23;2400:32;2397:52;;;2445:1;2442;2435:12;2397:52;-1:-1:-1;2468:23:1;;2317:180;-1:-1:-1;2317:180:1:o;2502:184::-;2572:6;2625:2;2613:9;2604:7;2600:23;2596:32;2593:52;;;2641:1;2638;2631:12;2593:52;-1:-1:-1;2664:16:1;;2502:184;-1:-1:-1;2502:184:1:o;2691:254::-;2759:6;2767;2820:2;2808:9;2799:7;2795:23;2791:32;2788:52;;;2836:1;2833;2826:12;2788:52;2872:9;2859:23;2849:33;;2901:38;2935:2;2924:9;2920:18;2901:38;:::i;2950:328::-;3027:6;3035;3043;3096:2;3084:9;3075:7;3071:23;3067:32;3064:52;;;3112:1;3109;3102:12;3064:52;3148:9;3135:23;3125:33;;3177:38;3211:2;3200:9;3196:18;3177:38;:::i;:::-;3167:48;;3234:38;3268:2;3257:9;3253:18;3234:38;:::i;:::-;3224:48;;2950:328;;;;;:::o;3283:600::-;3394:6;3402;3410;3418;3426;3434;3442;3495:3;3483:9;3474:7;3470:23;3466:33;3463:53;;;3512:1;3509;3502:12;3463:53;3548:9;3535:23;3525:33;;3577:38;3611:2;3600:9;3596:18;3577:38;:::i;3888:531::-;3990:6;3998;4006;4014;4022;4030;4083:3;4071:9;4062:7;4058:23;4054:33;4051:53;;;4100:1;4097;4090:12;4051:53;4136:9;4123:23;4113:33;;4165:38;4199:2;4188:9;4184:18;4165:38;:::i;:::-;4155:48;;4250:2;4239:9;4235:18;4222:32;4212:42;;4273:36;4305:2;4294:9;4290:18;4273:36;:::i;:::-;4263:46;;4356:3;4345:9;4341:19;4328:33;4318:43;;4408:3;4397:9;4393:19;4380:33;4370:43;;3888:531;;;;;;;;:::o;4424:274::-;4553:3;4591:6;4585:13;4607:53;4653:6;4648:3;4641:4;4633:6;4629:17;4607:53;:::i;:::-;4676:16;;;;;4424:274;-1:-1:-1;;4424:274:1:o;4703:1219::-;4833:3;4862:1;4895:6;4889:13;4925:3;4947:1;4975:9;4971:2;4967:18;4957:28;;5035:2;5024:9;5020:18;5057;5047:61;;5101:4;5093:6;5089:17;5079:27;;5047:61;5127:2;5175;5167:6;5164:14;5144:18;5141:38;5138:222;;;5214:77;5209:3;5202:90;5315:4;5312:1;5305:15;5345:4;5340:3;5333:17;5138:222;5376:18;5403:162;;;;5579:1;5574:323;;;;5369:528;;5403:162;5451:66;5440:9;5436:82;5431:3;5424:95;5548:6;5543:3;5539:16;5532:23;;5403:162;;5574:323;19759:1;19752:14;;;19796:4;19783:18;;5672:1;5686:165;5700:6;5697:1;5694:13;5686:165;;;5778:14;;5765:11;;;5758:35;5821:16;;;;5715:10;;5686:165;;;5690:3;;5880:6;5875:3;5871:16;5864:23;;5369:528;-1:-1:-1;5913:3:1;;4703:1219;-1:-1:-1;;;;;;;;4703:1219:1:o;9923:442::-;10072:2;10061:9;10054:21;10035:4;10104:6;10098:13;10147:6;10142:2;10131:9;10127:18;10120:34;10163:66;10222:6;10217:2;10206:9;10202:18;10197:2;10189:6;10185:15;10163:66;:::i;:::-;10281:2;10269:15;10286:66;10265:88;10250:104;;;;10356:2;10246:113;;9923:442;-1:-1:-1;;9923:442:1:o;19812:128::-;19852:3;19883:1;19879:6;19876:1;19873:13;19870:39;;;19889:18;;:::i;:::-;-1:-1:-1;19925:9:1;;19812:128::o;19945:120::-;19985:1;20011;20001:35;;20016:18;;:::i;:::-;-1:-1:-1;20050:9:1;;19945:120::o;20070:228::-;20110:7;20236:1;20168:66;20164:74;20161:1;20158:81;20153:1;20146:9;20139:17;20135:105;20132:131;;;20243:18;;:::i;:::-;-1:-1:-1;20283:9:1;;20070:228::o;20303:125::-;20343:4;20371:1;20368;20365:8;20362:34;;;20376:18;;:::i;:::-;-1:-1:-1;20413:9:1;;20303:125::o;20433:258::-;20505:1;20515:113;20529:6;20526:1;20523:13;20515:113;;;20605:11;;;20599:18;20586:11;;;20579:39;20551:2;20544:10;20515:113;;;20646:6;20643:1;20640:13;20637:48;;;-1:-1:-1;;20681:1:1;20663:16;;20656:27;20433:258::o;20696:437::-;20775:1;20771:12;;;;20818;;;20839:61;;20893:4;20885:6;20881:17;20871:27;;20839:61;20946:2;20938:6;20935:14;20915:18;20912:38;20909:218;;;20983:77;20980:1;20973:88;21084:4;21081:1;21074:15;21112:4;21109:1;21102:15;20909:218;;20696:437;;;:::o;21138:112::-;21170:1;21196;21186:35;;21201:18;;:::i;:::-;-1:-1:-1;21235:9:1;;21138:112::o;21255:184::-;21307:77;21304:1;21297:88;21404:4;21401:1;21394:15;21428:4;21425:1;21418:15;21444:184;21496:77;21493:1;21486:88;21593:4;21590:1;21583:15;21617:4;21614:1;21607:15

Swarm Source

none
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.