ETH Price: $3,398.92 (-0.56%)
Gas: 21 Gwei

Token

MGDC (MGDC)
 

Overview

Max Total Supply

140,141.868854166409758706 MGDC

Holders

55

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Filtered by Token Holder
biruu.eth
Balance
150 MGDC

Value
$0.00
0xd5c7aadeabddd49ead07f7eaa89c24824cce6745
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
MGDCStake

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-05-09
*/

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

// File: @openzeppelin/contracts/token/ERC20/IERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/token/ERC20/extensions/IERC20Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC20/extensions/IERC20Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the decimals places of the token.
     */
    function decimals() external view returns (uint8);
}

// File: @openzeppelin/contracts/token/ERC20/ERC20.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/ERC20.sol)

pragma solidity ^0.8.0;




/**
 * @dev Implementation of the {IERC20} interface.
 *
 * This implementation is agnostic to the way tokens are created. This means
 * that a supply mechanism has to be added in a derived contract using {_mint}.
 * For a generic mechanism see {ERC20PresetMinterPauser}.
 *
 * TIP: For a detailed writeup see our guide
 * https://forum.zeppelin.solutions/t/how-to-implement-erc20-supply-mechanisms/226[How
 * to implement supply mechanisms].
 *
 * We have followed general OpenZeppelin Contracts guidelines: functions revert
 * instead returning `false` on failure. This behavior is nonetheless
 * conventional and does not conflict with the expectations of ERC20
 * applications.
 *
 * Additionally, an {Approval} event is emitted on calls to {transferFrom}.
 * This allows applications to reconstruct the allowance for all accounts just
 * by listening to said events. Other implementations of the EIP may not emit
 * these events, as it isn't required by the specification.
 *
 * Finally, the non-standard {decreaseAllowance} and {increaseAllowance}
 * functions have been added to mitigate the well-known issues around setting
 * allowances. See {IERC20-approve}.
 */
contract ERC20 is Context, IERC20, IERC20Metadata {
    mapping(address => uint256) private _balances;

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

    /**
     * @dev Sets the values for {name} and {symbol}.
     *
     * The default value of {decimals} is 18. To select a different value for
     * {decimals} you should overload it.
     *
     * All two of these values are immutable: they can only be set once during
     * construction.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

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

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

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

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

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

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

    /**
     * @dev See {IERC20-approve}.
     *
     * NOTE: If `amount` is the maximum `uint256`, the allowance is not updated on
     * `transferFrom`. This is semantically equivalent to an infinite approval.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        address owner = _msgSender();
        _approve(owner, spender, amount);
        return true;
    }

    /**
     * @dev See {IERC20-transferFrom}.
     *
     * Emits an {Approval} event indicating the updated allowance. This is not
     * required by the EIP. See the note at the beginning of {ERC20}.
     *
     * NOTE: Does not update the allowance if the current allowance
     * is the maximum `uint256`.
     *
     * Requirements:
     *
     * - `from` and `to` cannot be the zero address.
     * - `from` must have a balance of at least `amount`.
     * - the caller must have allowance for ``from``'s tokens of at least
     * `amount`.
     */
    function transferFrom(
        address from,
        address to,
        uint256 amount
    ) public virtual override returns (bool) {
        address spender = _msgSender();
        _spendAllowance(from, spender, amount);
        _transfer(from, to, amount);
        return true;
    }

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

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

        return true;
    }

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

        _beforeTokenTransfer(from, to, amount);

        uint256 fromBalance = _balances[from];
        require(fromBalance >= amount, "ERC20: transfer amount exceeds balance");
        unchecked {
            _balances[from] = fromBalance - amount;
        }
        _balances[to] += amount;

        emit Transfer(from, to, amount);

        _afterTokenTransfer(from, to, amount);
    }

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

        _beforeTokenTransfer(address(0), account, amount);

        _totalSupply += amount;
        _balances[account] += amount;
        emit Transfer(address(0), account, amount);

        _afterTokenTransfer(address(0), account, amount);
    }

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

        _beforeTokenTransfer(account, address(0), amount);

        uint256 accountBalance = _balances[account];
        require(accountBalance >= amount, "ERC20: burn amount exceeds balance");
        unchecked {
            _balances[account] = accountBalance - amount;
        }
        _totalSupply -= amount;

        emit Transfer(account, address(0), amount);

        _afterTokenTransfer(account, address(0), amount);
    }

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

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

    /**
     * @dev Spend `amount` form the allowance of `owner` toward `spender`.
     *
     * Does not update the allowance amount in case of infinite allowance.
     * Revert if not enough allowance is available.
     *
     * Might emit an {Approval} event.
     */
    function _spendAllowance(
        address owner,
        address spender,
        uint256 amount
    ) internal virtual {
        uint256 currentAllowance = allowance(owner, spender);
        if (currentAllowance != type(uint256).max) {
            require(currentAllowance >= amount, "ERC20: insufficient allowance");
            unchecked {
                _approve(owner, spender, currentAllowance - amount);
            }
        }
    }

    /**
     * @dev Hook that is called before any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * will be transferred to `to`.
     * - when `from` is zero, `amount` tokens will be minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * has been transferred to `to`.
     * - when `from` is zero, `amount` tokens have been minted for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens have been burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal virtual {}
}

// File: @openzeppelin/contracts/token/ERC20/extensions/ERC20Burnable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC20/extensions/ERC20Burnable.sol)

pragma solidity ^0.8.0;



/**
 * @dev Extension of {ERC20} that allows token holders to destroy both their own
 * tokens and those that they have an allowance for, in a way that can be
 * recognized off-chain (via event analysis).
 */
abstract contract ERC20Burnable is Context, ERC20 {
    /**
     * @dev Destroys `amount` tokens from the caller.
     *
     * See {ERC20-_burn}.
     */
    function burn(uint256 amount) public virtual {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev Destroys `amount` tokens from `account`, deducting from the caller's
     * allowance.
     *
     * See {ERC20-_burn} and {ERC20-allowance}.
     *
     * Requirements:
     *
     * - the caller must have allowance for ``accounts``'s tokens of at least
     * `amount`.
     */
    function burnFrom(address account, uint256 amount) public virtual {
        _spendAllowance(account, _msgSender(), amount);
        _burn(account, amount);
    }
}

// File: contracts/staking.sol


pragma solidity ^0.8.4;




contract MGDCStake is ERC20Burnable, Ownable {
    uint256 public MAX_WALLET_Staked = 30;
    uint256 public MGDC_EMISSIONS_RATE = 34722222222222; // 3 per day
    address public constant MGDC_ADDRESS = 0x0191c41DBceB20a612b25137133ca719E84f7933;
    bool public stakingLive = false;

    mapping(uint256 => uint256) internal MGDCTokenIdTimeStaked;
    mapping(uint256 => address) internal MGDCTokenIdTostaker;
    mapping(address => uint256[]) internal stakerToMGDCTokenIds;
    
    
    IERC721Enumerable private constant _MGDCIERC721Enumerable = IERC721Enumerable(MGDC_ADDRESS);

    constructor() ERC20("MGDC", "MGDC") {
         _mint(msg.sender, 100000000000000000000000);
    }

    modifier stakingEnabled {
        require(stakingLive, "STAKING_NOT_LIVE");
        _;
    }

    function getMGDCStaked(address staker) public view returns (uint256[] memory) {
        return stakerToMGDCTokenIds[staker];
    }
    
    function getStakedCount(address staker) public view returns (uint256) {
        return stakerToMGDCTokenIds[staker].length ;
    }

    function removeTokenIdFromArray(uint256[] storage array, uint256 tokenId) internal {
        uint256 length = array.length;
        for (uint256 i = 0; i < length; i++) {
            if (array[i] == tokenId) {
                length--;
                if (i < length) {
                    array[i] = array[length];
                }
                array.pop();
                break;
            }
        }
    }

    function stakeMGDCByIds(uint256[] memory tokenIds) public stakingEnabled {
        require(getStakedCount(msg.sender) + tokenIds.length <= MAX_WALLET_Staked, "MAX_TOKENS_BURRIED_PER_WALLET");

        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            require(_MGDCIERC721Enumerable.ownerOf(id) == msg.sender && MGDCTokenIdTostaker[id] == address(0), "TOKEN_IS_NOT_YOURS");
            _MGDCIERC721Enumerable.transferFrom(msg.sender, address(this), id);

            stakerToMGDCTokenIds[msg.sender].push(id);
            MGDCTokenIdTimeStaked[id] = block.timestamp;
            MGDCTokenIdTostaker[id] = msg.sender;
        }
    }


    function unstakeAll() public {
        require(getStakedCount(msg.sender) > 0, "MUST_ATLEAST_BE_Staked_ONCE");
        uint256 totalRewards = 0;

        for (uint256 i = stakerToMGDCTokenIds[msg.sender].length; i > 0; i--) {
            uint256 tokenId = stakerToMGDCTokenIds[msg.sender][i - 1];

            _MGDCIERC721Enumerable.transferFrom(address(this), msg.sender, tokenId);
            totalRewards += ((block.timestamp - MGDCTokenIdTimeStaked[tokenId]) * MGDC_EMISSIONS_RATE);
            stakerToMGDCTokenIds[msg.sender].pop();
            MGDCTokenIdTostaker[tokenId] = address(0);
        }
        
        _mint(msg.sender, totalRewards);
    }

    function unstakeMGDCByIds(uint256[] memory tokenIds) public {
        uint256 totalRewards = 0;

        for (uint256 i = 0; i < tokenIds.length; i++) {
            uint256 id = tokenIds[i];
            require(MGDCTokenIdTostaker[id] == msg.sender, "NOT_ORIGINAL_staker");

            _MGDCIERC721Enumerable.transferFrom(address(this), msg.sender, id);
            totalRewards += ((block.timestamp - MGDCTokenIdTimeStaked[id]) * MGDC_EMISSIONS_RATE);

            removeTokenIdFromArray(stakerToMGDCTokenIds[msg.sender], id);
            MGDCTokenIdTostaker[id] = address(0);
        }

        _mint(msg.sender, totalRewards);
    }


    function claimByMGDCTokenId(uint256 tokenId) public {
        require(MGDCTokenIdTostaker[tokenId] == msg.sender, "NOT_Staked_BY_YOU");
        _mint(msg.sender, ((block.timestamp - MGDCTokenIdTimeStaked[tokenId]) * MGDC_EMISSIONS_RATE));
        MGDCTokenIdTimeStaked[tokenId] = block.timestamp;
    }
    

    function claimAll() public {
        uint256 totalRewards = 0;

        uint256[] memory MGDCTokenIds = stakerToMGDCTokenIds[msg.sender];
        for (uint256 i = 0; i < MGDCTokenIds.length; i++) {
            uint256 id = MGDCTokenIds[i];
            require(MGDCTokenIdTostaker[id] == msg.sender, "NOT_Staked_BY_YOU");
            totalRewards += ((block.timestamp - MGDCTokenIdTimeStaked[id]) * MGDC_EMISSIONS_RATE);
            MGDCTokenIdTimeStaked[id] = block.timestamp;
        }
      
        _mint(msg.sender, totalRewards);
    }

    function getAllRewards(address staker) public view returns (uint256) {
        uint256 totalRewards = 0;

        uint256[] memory MGDCTokenIds = stakerToMGDCTokenIds[staker];
        for (uint256 i = 0; i < MGDCTokenIds.length; i++) {
            totalRewards += ((block.timestamp - MGDCTokenIdTimeStaked[MGDCTokenIds[i]]) * MGDC_EMISSIONS_RATE);
        }

        return totalRewards;
    }

    function getRewardsByMGDCTokenId(uint256 tokenId) public view returns (uint256) {
        require(MGDCTokenIdTostaker[tokenId] != address(0), "TOKEN_NOT_Staked");

        uint256 secondsStaked = block.timestamp - MGDCTokenIdTimeStaked[tokenId];
        return secondsStaked * MGDC_EMISSIONS_RATE;
    }
    
    function getMGDCtaker(uint256 tokenId) public view returns (address) {
        return MGDCTokenIdTostaker[tokenId];
    }

    function mintByOwner(uint256 _count) public onlyOwner (){
        _mint(msg.sender, _count);
    }
    function setEmissionRate(uint256 _rate) public onlyOwner () {
        MGDC_EMISSIONS_RATE=_rate;
    }
    
    function setMaxStaked(uint256 _count) public onlyOwner () {
        MAX_WALLET_Staked=_count;
    }

    function toggle() external onlyOwner {
        stakingLive = !stakingLive;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"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":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_WALLET_Staked","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MGDC_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MGDC_EMISSIONS_RATE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","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":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimByMGDCTokenId","outputs":[],"stateMutability":"nonpayable","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":"subtractedValue","type":"uint256"}],"name":"decreaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getAllRewards","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getMGDCStaked","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMGDCtaker","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getRewardsByMGDCTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"staker","type":"address"}],"name":"getStakedCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"addedValue","type":"uint256"}],"name":"increaseAllowance","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_rate","type":"uint256"}],"name":"setEmissionRate","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_count","type":"uint256"}],"name":"setMaxStaked","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"stakeMGDCByIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggle","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unstakeAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"unstakeMGDCByIds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052601e600655651f9465b8ab8e6007556008805460ff191690553480156200002a57600080fd5b506040805180820182526004808252634d47444360e01b6020808401828152855180870190965292855284015281519192916200006a91600391620001f7565b50805162000080906004906020840190620001f7565b5050506200009d62000097620000b960201b60201c565b620000bd565b620000b33369152d02c7e14af68000006200010f565b62000301565b3390565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b0382166200016a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b80600260008282546200017e91906200029d565b90915550506001600160a01b03821660009081526020819052604081208054839290620001ad9084906200029d565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b8280546200020590620002c4565b90600052602060002090601f01602090048101928262000229576000855562000274565b82601f106200024457805160ff191683800117855562000274565b8280016001018555821562000274579182015b828111156200027457825182559160200191906001019062000257565b506200028292915062000286565b5090565b5b8082111562000282576000815560010162000287565b60008219821115620002bf57634e487b7160e01b600052601160045260246000fd5b500190565b600181811c90821680620002d957607f821691505b60208210811415620002fb57634e487b7160e01b600052602260045260246000fd5b50919050565b611ca880620003116000396000f3fe608060405234801561001057600080fd5b50600436106102065760003560e01c80635bd7e11a1161011a578063a34fd32a116100ad578063b2eefc971161007c578063b2eefc971461047b578063d1058e591461048e578063d92656a714610496578063dd62ed3e146104a3578063f2fde38b146104dc57600080fd5b8063a34fd32a14610431578063a457c2d71461043a578063a8fff0f21461044d578063a9059cbb1461046857600080fd5b806383c13db2116100e957806383c13db2146103dc5780638da5cb5b1461040557806395d89b4114610416578063a1bdb15e1461041e57600080fd5b80635bd7e11a1461035757806370a0823114610398578063715018a6146103c157806379cc6790146103c957600080fd5b806323b872dd1161019d578063362a3fad1161016c578063362a3fad1461030d578063395093511461032057806340a3d2461461033357806342966c681461033b5780634ead49b01461034e57600080fd5b806323b872dd146102d05780632a944b19146102e3578063313ce567146102f657806335322f371461030557600080fd5b8063154d5d19116101d9578063154d5d1914610274578063164620b81461029557806318160ddd146102a8578063183e1861146102b057600080fd5b806306fdde031461020b578063095ea7b314610229578063095feb801461024c578063106da5ba14610261575b600080fd5b6102136104ef565b60405161022091906118c5565b60405180910390f35b61023c61023736600461192f565b610581565b6040519015158152602001610220565b61025f61025a36600461195b565b610599565b005b61025f61026f36600461195b565b6105d1565b61028761028236600461195b565b61066f565b604051908152602001610220565b61025f6102a336600461198a565b6106f6565b600254610287565b6102c36102be366004611a48565b61087f565b6040516102209190611a65565b61023c6102de366004611aa9565b6108eb565b61025f6102f136600461195b565b61090f565b60405160128152602001610220565b61025f610946565b61028761031b366004611a48565b610b0a565b61023c61032e36600461192f565b610beb565b61025f610c2a565b61025f61034936600461195b565b610c68565b61028760065481565b61038061036536600461195b565b6000908152600a60205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610220565b6102876103a6366004611a48565b6001600160a01b031660009081526020819052604090205490565b61025f610c72565b61025f6103d736600461192f565b610ca8565b6102876103ea366004611a48565b6001600160a01b03166000908152600b602052604090205490565b6005546001600160a01b0316610380565b610213610cbd565b61025f61042c36600461195b565b610ccc565b61028760075481565b61023c61044836600461192f565b610cfb565b610380730191c41dbceb20a612b25137133ca719e84f793381565b61023c61047636600461192f565b610d8d565b61025f61048936600461198a565b610d9b565b61025f61102c565b60085461023c9060ff1681565b6102876104b1366004611aea565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61025f6104ea366004611a48565b611172565b6060600380546104fe90611b23565b80601f016020809104026020016040519081016040528092919081815260200182805461052a90611b23565b80156105775780601f1061054c57610100808354040283529160200191610577565b820191906000526020600020905b81548152906001019060200180831161055a57829003601f168201915b5050505050905090565b60003361058f81858561120a565b5060019392505050565b6005546001600160a01b031633146105cc5760405162461bcd60e51b81526004016105c390611b5e565b60405180910390fd5b600655565b6000818152600a60205260409020546001600160a01b0316331461062b5760405162461bcd60e51b81526020600482015260116024820152704e4f545f5374616b65645f42595f594f5560781b60448201526064016105c3565b60075460008281526009602052604090205461065c91339161064d9042611ba9565b6106579190611bc0565b61132f565b6000908152600960205260409020429055565b6000818152600a60205260408120546001600160a01b03166106c65760405162461bcd60e51b815260206004820152601060248201526f1513d2d15397d393d517d4dd185ad95960821b60448201526064016105c3565b6000828152600960205260408120546106df9042611ba9565b9050600754816106ef9190611bc0565b9392505050565b6000805b825181101561087057600083828151811061071757610717611bdf565b6020908102919091018101516000818152600a9092526040909120549091506001600160a01b031633146107835760405162461bcd60e51b81526020600482015260136024820152722727aa2fa7a924a3a4a720a62fb9ba30b5b2b960691b60448201526064016105c3565b6040516323b872dd60e01b815230600482015233602482015260448101829052730191c41dbceb20a612b25137133ca719e84f7933906323b872dd90606401600060405180830381600087803b1580156107dc57600080fd5b505af11580156107f0573d6000803e3d6000fd5b5050600754600084815260096020526040902054909250610812915042611ba9565b61081c9190611bc0565b6108269084611bf5565b336000908152600b60205260409020909350610842908261140e565b6000908152600a6020526040902080546001600160a01b03191690558061086881611c0d565b9150506106fa565b5061087b338261132f565b5050565b6001600160a01b0381166000908152600b60209081526040918290208054835181840281018401909452808452606093928301828280156108df57602002820191906000526020600020905b8154815260200190600101908083116108cb575b50505050509050919050565b6000336108f98582856114d3565b61090485858561155f565b506001949350505050565b6005546001600160a01b031633146109395760405162461bcd60e51b81526004016105c390611b5e565b610943338261132f565b50565b336000908152600b6020526040812054116109a35760405162461bcd60e51b815260206004820152601b60248201527f4d5553545f41544c454153545f42455f5374616b65645f4f4e4345000000000060448201526064016105c3565b336000908152600b60205260408120545b8015610aff57336000908152600b602052604081206109d4600184611ba9565b815481106109e4576109e4611bdf565b6000918252602090912001546040516323b872dd60e01b815230600482015233602482015260448101829052909150730191c41dbceb20a612b25137133ca719e84f7933906323b872dd90606401600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b5050600754600084815260096020526040902054909250610a82915042611ba9565b610a8c9190611bc0565b610a969084611bf5565b336000908152600b6020526040902080549194509080610ab857610ab8611c28565b600082815260208082208301600019908101839055909201909255918152600a9091526040902080546001600160a01b031916905580610af781611c3e565b9150506109b4565b50610943338261132f565b6001600160a01b0381166000908152600b60209081526040808320805482518185028101850190935280835284938493929190830182828015610b6c57602002820191906000526020600020905b815481526020019060010190808311610b58575b5050505050905060005b8151811015610be25760075460096000848481518110610b9857610b98611bdf565b602002602001015181526020019081526020016000205442610bba9190611ba9565b610bc49190611bc0565b610bce9084611bf5565b925080610bda81611c0d565b915050610b76565b50909392505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061058f9082908690610c25908790611bf5565b61120a565b6005546001600160a01b03163314610c545760405162461bcd60e51b81526004016105c390611b5e565b6008805460ff19811660ff90911615179055565b610943338261172d565b6005546001600160a01b03163314610c9c5760405162461bcd60e51b81526004016105c390611b5e565b610ca66000611873565b565b610cb38233836114d3565b61087b828261172d565b6060600480546104fe90611b23565b6005546001600160a01b03163314610cf65760405162461bcd60e51b81526004016105c390611b5e565b600755565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610d805760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105c3565b610904828686840361120a565b60003361058f81858561155f565b60085460ff16610de05760405162461bcd60e51b815260206004820152601060248201526f5354414b494e475f4e4f545f4c49564560801b60448201526064016105c3565b6006548151336000908152600b6020526040902054610dff9190611bf5565b1115610e4d5760405162461bcd60e51b815260206004820152601d60248201527f4d41585f544f4b454e535f425552524945445f5045525f57414c4c455400000060448201526064016105c3565b60005b815181101561087b576000828281518110610e6d57610e6d611bdf565b60209081029190910101516040516331a9108f60e11b8152600481018290529091503390730191c41dbceb20a612b25137133ca719e84f793390636352211e90602401602060405180830381865afa158015610ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef19190611c55565b6001600160a01b0316148015610f1c57506000818152600a60205260409020546001600160a01b0316155b610f5d5760405162461bcd60e51b8152602060048201526012602482015271544f4b454e5f49535f4e4f545f594f55525360701b60448201526064016105c3565b6040516323b872dd60e01b815233600482015230602482015260448101829052730191c41dbceb20a612b25137133ca719e84f7933906323b872dd90606401600060405180830381600087803b158015610fb657600080fd5b505af1158015610fca573d6000803e3d6000fd5b5050336000818152600b6020908152604080832080546001810182559084528284200187905595825260098152858220429055600a90529390932080546001600160a01b0319169093179092555081905061102481611c0d565b915050610e50565b336000908152600b602090815260408083208054825181850281018501909352808352849383018282801561108057602002820191906000526020600020905b81548152602001906001019080831161106c575b5050505050905060005b81518110156111675760008282815181106110a7576110a7611bdf565b6020908102919091018101516000818152600a9092526040909120549091506001600160a01b031633146111115760405162461bcd60e51b81526020600482015260116024820152704e4f545f5374616b65645f42595f594f5560781b60448201526064016105c3565b60075460008281526009602052604090205461112d9042611ba9565b6111379190611bc0565b6111419085611bf5565b60009182526009602052604090912042905592508061115f81611c0d565b91505061108a565b5061087b338361132f565b6005546001600160a01b0316331461119c5760405162461bcd60e51b81526004016105c390611b5e565b6001600160a01b0381166112015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105c3565b61094381611873565b6001600160a01b03831661126c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105c3565b6001600160a01b0382166112cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105c3565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0382166113855760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105c3565b80600260008282546113979190611bf5565b90915550506001600160a01b038216600090815260208190526040812080548392906113c4908490611bf5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b815460005b818110156114cd578284828154811061142e5761142e611bdf565b906000526020600020015414156114bb578161144981611c3e565b925050818110156114905783828154811061146657611466611bdf565b906000526020600020015484828154811061148357611483611bdf565b6000918252602090912001555b838054806114a0576114a0611c28565b600190038181906000526020600020016000905590556114cd565b806114c581611c0d565b915050611413565b50505050565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205460001981146114cd57818110156115525760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105c3565b6114cd848484840361120a565b6001600160a01b0383166115c35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105c3565b6001600160a01b0382166116255760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105c3565b6001600160a01b0383166000908152602081905260409020548181101561169d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105c3565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906116d4908490611bf5565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161172091815260200190565b60405180910390a36114cd565b6001600160a01b03821661178d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105c3565b6001600160a01b038216600090815260208190526040902054818110156118015760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105c3565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611830908490611ba9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611322565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208083528351808285015260005b818110156118f2578581018301518582016040015282016118d6565b81811115611904576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461094357600080fd5b6000806040838503121561194257600080fd5b823561194d8161191a565b946020939093013593505050565b60006020828403121561196d57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561199d57600080fd5b823567ffffffffffffffff808211156119b557600080fd5b818501915085601f8301126119c957600080fd5b8135818111156119db576119db611974565b8060051b604051601f19603f83011681018181108582111715611a0057611a00611974565b604052918252848201925083810185019188831115611a1e57600080fd5b938501935b82851015611a3c57843584529385019392850192611a23565b98975050505050505050565b600060208284031215611a5a57600080fd5b81356106ef8161191a565b6020808252825182820181905260009190848201906040850190845b81811015611a9d57835183529284019291840191600101611a81565b50909695505050505050565b600080600060608486031215611abe57600080fd5b8335611ac98161191a565b92506020840135611ad98161191a565b929592945050506040919091013590565b60008060408385031215611afd57600080fd5b8235611b088161191a565b91506020830135611b188161191a565b809150509250929050565b600181811c90821680611b3757607f821691505b60208210811415611b5857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015611bbb57611bbb611b93565b500390565b6000816000190483118215151615611bda57611bda611b93565b500290565b634e487b7160e01b600052603260045260246000fd5b60008219821115611c0857611c08611b93565b500190565b6000600019821415611c2157611c21611b93565b5060010190565b634e487b7160e01b600052603160045260246000fd5b600081611c4d57611c4d611b93565b506000190190565b600060208284031215611c6757600080fd5b81516106ef8161191a56fea2646970667358221220b0ec7765abf4eaf485716c359e0b24ac840a8fd30bcb7f7ba298b5f24a6e218b64736f6c634300080a0033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102065760003560e01c80635bd7e11a1161011a578063a34fd32a116100ad578063b2eefc971161007c578063b2eefc971461047b578063d1058e591461048e578063d92656a714610496578063dd62ed3e146104a3578063f2fde38b146104dc57600080fd5b8063a34fd32a14610431578063a457c2d71461043a578063a8fff0f21461044d578063a9059cbb1461046857600080fd5b806383c13db2116100e957806383c13db2146103dc5780638da5cb5b1461040557806395d89b4114610416578063a1bdb15e1461041e57600080fd5b80635bd7e11a1461035757806370a0823114610398578063715018a6146103c157806379cc6790146103c957600080fd5b806323b872dd1161019d578063362a3fad1161016c578063362a3fad1461030d578063395093511461032057806340a3d2461461033357806342966c681461033b5780634ead49b01461034e57600080fd5b806323b872dd146102d05780632a944b19146102e3578063313ce567146102f657806335322f371461030557600080fd5b8063154d5d19116101d9578063154d5d1914610274578063164620b81461029557806318160ddd146102a8578063183e1861146102b057600080fd5b806306fdde031461020b578063095ea7b314610229578063095feb801461024c578063106da5ba14610261575b600080fd5b6102136104ef565b60405161022091906118c5565b60405180910390f35b61023c61023736600461192f565b610581565b6040519015158152602001610220565b61025f61025a36600461195b565b610599565b005b61025f61026f36600461195b565b6105d1565b61028761028236600461195b565b61066f565b604051908152602001610220565b61025f6102a336600461198a565b6106f6565b600254610287565b6102c36102be366004611a48565b61087f565b6040516102209190611a65565b61023c6102de366004611aa9565b6108eb565b61025f6102f136600461195b565b61090f565b60405160128152602001610220565b61025f610946565b61028761031b366004611a48565b610b0a565b61023c61032e36600461192f565b610beb565b61025f610c2a565b61025f61034936600461195b565b610c68565b61028760065481565b61038061036536600461195b565b6000908152600a60205260409020546001600160a01b031690565b6040516001600160a01b039091168152602001610220565b6102876103a6366004611a48565b6001600160a01b031660009081526020819052604090205490565b61025f610c72565b61025f6103d736600461192f565b610ca8565b6102876103ea366004611a48565b6001600160a01b03166000908152600b602052604090205490565b6005546001600160a01b0316610380565b610213610cbd565b61025f61042c36600461195b565b610ccc565b61028760075481565b61023c61044836600461192f565b610cfb565b610380730191c41dbceb20a612b25137133ca719e84f793381565b61023c61047636600461192f565b610d8d565b61025f61048936600461198a565b610d9b565b61025f61102c565b60085461023c9060ff1681565b6102876104b1366004611aea565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205490565b61025f6104ea366004611a48565b611172565b6060600380546104fe90611b23565b80601f016020809104026020016040519081016040528092919081815260200182805461052a90611b23565b80156105775780601f1061054c57610100808354040283529160200191610577565b820191906000526020600020905b81548152906001019060200180831161055a57829003601f168201915b5050505050905090565b60003361058f81858561120a565b5060019392505050565b6005546001600160a01b031633146105cc5760405162461bcd60e51b81526004016105c390611b5e565b60405180910390fd5b600655565b6000818152600a60205260409020546001600160a01b0316331461062b5760405162461bcd60e51b81526020600482015260116024820152704e4f545f5374616b65645f42595f594f5560781b60448201526064016105c3565b60075460008281526009602052604090205461065c91339161064d9042611ba9565b6106579190611bc0565b61132f565b6000908152600960205260409020429055565b6000818152600a60205260408120546001600160a01b03166106c65760405162461bcd60e51b815260206004820152601060248201526f1513d2d15397d393d517d4dd185ad95960821b60448201526064016105c3565b6000828152600960205260408120546106df9042611ba9565b9050600754816106ef9190611bc0565b9392505050565b6000805b825181101561087057600083828151811061071757610717611bdf565b6020908102919091018101516000818152600a9092526040909120549091506001600160a01b031633146107835760405162461bcd60e51b81526020600482015260136024820152722727aa2fa7a924a3a4a720a62fb9ba30b5b2b960691b60448201526064016105c3565b6040516323b872dd60e01b815230600482015233602482015260448101829052730191c41dbceb20a612b25137133ca719e84f7933906323b872dd90606401600060405180830381600087803b1580156107dc57600080fd5b505af11580156107f0573d6000803e3d6000fd5b5050600754600084815260096020526040902054909250610812915042611ba9565b61081c9190611bc0565b6108269084611bf5565b336000908152600b60205260409020909350610842908261140e565b6000908152600a6020526040902080546001600160a01b03191690558061086881611c0d565b9150506106fa565b5061087b338261132f565b5050565b6001600160a01b0381166000908152600b60209081526040918290208054835181840281018401909452808452606093928301828280156108df57602002820191906000526020600020905b8154815260200190600101908083116108cb575b50505050509050919050565b6000336108f98582856114d3565b61090485858561155f565b506001949350505050565b6005546001600160a01b031633146109395760405162461bcd60e51b81526004016105c390611b5e565b610943338261132f565b50565b336000908152600b6020526040812054116109a35760405162461bcd60e51b815260206004820152601b60248201527f4d5553545f41544c454153545f42455f5374616b65645f4f4e4345000000000060448201526064016105c3565b336000908152600b60205260408120545b8015610aff57336000908152600b602052604081206109d4600184611ba9565b815481106109e4576109e4611bdf565b6000918252602090912001546040516323b872dd60e01b815230600482015233602482015260448101829052909150730191c41dbceb20a612b25137133ca719e84f7933906323b872dd90606401600060405180830381600087803b158015610a4c57600080fd5b505af1158015610a60573d6000803e3d6000fd5b5050600754600084815260096020526040902054909250610a82915042611ba9565b610a8c9190611bc0565b610a969084611bf5565b336000908152600b6020526040902080549194509080610ab857610ab8611c28565b600082815260208082208301600019908101839055909201909255918152600a9091526040902080546001600160a01b031916905580610af781611c3e565b9150506109b4565b50610943338261132f565b6001600160a01b0381166000908152600b60209081526040808320805482518185028101850190935280835284938493929190830182828015610b6c57602002820191906000526020600020905b815481526020019060010190808311610b58575b5050505050905060005b8151811015610be25760075460096000848481518110610b9857610b98611bdf565b602002602001015181526020019081526020016000205442610bba9190611ba9565b610bc49190611bc0565b610bce9084611bf5565b925080610bda81611c0d565b915050610b76565b50909392505050565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919061058f9082908690610c25908790611bf5565b61120a565b6005546001600160a01b03163314610c545760405162461bcd60e51b81526004016105c390611b5e565b6008805460ff19811660ff90911615179055565b610943338261172d565b6005546001600160a01b03163314610c9c5760405162461bcd60e51b81526004016105c390611b5e565b610ca66000611873565b565b610cb38233836114d3565b61087b828261172d565b6060600480546104fe90611b23565b6005546001600160a01b03163314610cf65760405162461bcd60e51b81526004016105c390611b5e565b600755565b3360008181526001602090815260408083206001600160a01b038716845290915281205490919083811015610d805760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b60648201526084016105c3565b610904828686840361120a565b60003361058f81858561155f565b60085460ff16610de05760405162461bcd60e51b815260206004820152601060248201526f5354414b494e475f4e4f545f4c49564560801b60448201526064016105c3565b6006548151336000908152600b6020526040902054610dff9190611bf5565b1115610e4d5760405162461bcd60e51b815260206004820152601d60248201527f4d41585f544f4b454e535f425552524945445f5045525f57414c4c455400000060448201526064016105c3565b60005b815181101561087b576000828281518110610e6d57610e6d611bdf565b60209081029190910101516040516331a9108f60e11b8152600481018290529091503390730191c41dbceb20a612b25137133ca719e84f793390636352211e90602401602060405180830381865afa158015610ecd573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef19190611c55565b6001600160a01b0316148015610f1c57506000818152600a60205260409020546001600160a01b0316155b610f5d5760405162461bcd60e51b8152602060048201526012602482015271544f4b454e5f49535f4e4f545f594f55525360701b60448201526064016105c3565b6040516323b872dd60e01b815233600482015230602482015260448101829052730191c41dbceb20a612b25137133ca719e84f7933906323b872dd90606401600060405180830381600087803b158015610fb657600080fd5b505af1158015610fca573d6000803e3d6000fd5b5050336000818152600b6020908152604080832080546001810182559084528284200187905595825260098152858220429055600a90529390932080546001600160a01b0319169093179092555081905061102481611c0d565b915050610e50565b336000908152600b602090815260408083208054825181850281018501909352808352849383018282801561108057602002820191906000526020600020905b81548152602001906001019080831161106c575b5050505050905060005b81518110156111675760008282815181106110a7576110a7611bdf565b6020908102919091018101516000818152600a9092526040909120549091506001600160a01b031633146111115760405162461bcd60e51b81526020600482015260116024820152704e4f545f5374616b65645f42595f594f5560781b60448201526064016105c3565b60075460008281526009602052604090205461112d9042611ba9565b6111379190611bc0565b6111419085611bf5565b60009182526009602052604090912042905592508061115f81611c0d565b91505061108a565b5061087b338361132f565b6005546001600160a01b0316331461119c5760405162461bcd60e51b81526004016105c390611b5e565b6001600160a01b0381166112015760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016105c3565b61094381611873565b6001600160a01b03831661126c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b60648201526084016105c3565b6001600160a01b0382166112cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b60648201526084016105c3565b6001600160a01b0383811660008181526001602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b6001600160a01b0382166113855760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f20616464726573730060448201526064016105c3565b80600260008282546113979190611bf5565b90915550506001600160a01b038216600090815260208190526040812080548392906113c4908490611bf5565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b815460005b818110156114cd578284828154811061142e5761142e611bdf565b906000526020600020015414156114bb578161144981611c3e565b925050818110156114905783828154811061146657611466611bdf565b906000526020600020015484828154811061148357611483611bdf565b6000918252602090912001555b838054806114a0576114a0611c28565b600190038181906000526020600020016000905590556114cd565b806114c581611c0d565b915050611413565b50505050565b6001600160a01b0383811660009081526001602090815260408083209386168352929052205460001981146114cd57818110156115525760405162461bcd60e51b815260206004820152601d60248201527f45524332303a20696e73756666696369656e7420616c6c6f77616e636500000060448201526064016105c3565b6114cd848484840361120a565b6001600160a01b0383166115c35760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b60648201526084016105c3565b6001600160a01b0382166116255760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b60648201526084016105c3565b6001600160a01b0383166000908152602081905260409020548181101561169d5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b60648201526084016105c3565b6001600160a01b038085166000908152602081905260408082208585039055918516815290812080548492906116d4908490611bf5565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161172091815260200190565b60405180910390a36114cd565b6001600160a01b03821661178d5760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b60648201526084016105c3565b6001600160a01b038216600090815260208190526040902054818110156118015760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b60648201526084016105c3565b6001600160a01b0383166000908152602081905260408120838303905560028054849290611830908490611ba9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611322565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600060208083528351808285015260005b818110156118f2578581018301518582016040015282016118d6565b81811115611904576000604083870101525b50601f01601f1916929092016040019392505050565b6001600160a01b038116811461094357600080fd5b6000806040838503121561194257600080fd5b823561194d8161191a565b946020939093013593505050565b60006020828403121561196d57600080fd5b5035919050565b634e487b7160e01b600052604160045260246000fd5b6000602080838503121561199d57600080fd5b823567ffffffffffffffff808211156119b557600080fd5b818501915085601f8301126119c957600080fd5b8135818111156119db576119db611974565b8060051b604051601f19603f83011681018181108582111715611a0057611a00611974565b604052918252848201925083810185019188831115611a1e57600080fd5b938501935b82851015611a3c57843584529385019392850192611a23565b98975050505050505050565b600060208284031215611a5a57600080fd5b81356106ef8161191a565b6020808252825182820181905260009190848201906040850190845b81811015611a9d57835183529284019291840191600101611a81565b50909695505050505050565b600080600060608486031215611abe57600080fd5b8335611ac98161191a565b92506020840135611ad98161191a565b929592945050506040919091013590565b60008060408385031215611afd57600080fd5b8235611b088161191a565b91506020830135611b188161191a565b809150509250929050565b600181811c90821680611b3757607f821691505b60208210811415611b5857634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082821015611bbb57611bbb611b93565b500390565b6000816000190483118215151615611bda57611bda611b93565b500290565b634e487b7160e01b600052603260045260246000fd5b60008219821115611c0857611c08611b93565b500190565b6000600019821415611c2157611c21611b93565b5060010190565b634e487b7160e01b600052603160045260246000fd5b600081611c4d57611c4d611b93565b506000190190565b600060208284031215611c6757600080fd5b81516106ef8161191a56fea2646970667358221220b0ec7765abf4eaf485716c359e0b24ac840a8fd30bcb7f7ba298b5f24a6e218b64736f6c634300080a0033

Deployed Bytecode Sourcemap

28070:5730:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16042:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18393:201;;;;;;:::i;:::-;;:::i;:::-;;;1237:14:1;;1230:22;1212:41;;1200:2;1185:18;18393:201:0;1072:187:1;33606:101:0;;;;;;:::i;:::-;;:::i;:::-;;31643:306;;;;;;:::i;:::-;;:::i;32933:308::-;;;;;;:::i;:::-;;:::i;:::-;;;1595:25:1;;;1583:2;1568:18;32933:308:0;1449:177:1;30982:651:0;;;;;;:::i;:::-;;:::i;17162:108::-;17250:12;;17162:108;;28881:132;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;19174:295::-;;;;;;:::i;:::-;;:::i;33384:100::-;;;;;;:::i;:::-;;:::i;17004:93::-;;;17087:2;4375:36:1;;4363:2;4348:18;17004:93:0;4233:184:1;30301:673:0;;;:::i;32523:402::-;;;;;;:::i;:::-;;:::i;19878:240::-;;;;;;:::i;:::-;;:::i;33715:82::-;;;:::i;27420:91::-;;;;;;:::i;:::-;;:::i;28122:37::-;;;;;;33253:123;;;;;;:::i;:::-;33313:7;33340:28;;;:19;:28;;;;;;-1:-1:-1;;;;;33340:28:0;;33253:123;;;;-1:-1:-1;;;;;4586:32:1;;;4568:51;;4556:2;4541:18;33253:123:0;4422:203:1;17333:127:0;;;;;;:::i;:::-;-1:-1:-1;;;;;17434:18:0;17407:7;17434:18;;;;;;;;;;;;17333:127;9465:103;;;:::i;27830:164::-;;;;;;:::i;:::-;;:::i;29025:132::-;;;;;;:::i;:::-;-1:-1:-1;;;;;29113:28:0;29086:7;29113:28;;;:20;:28;;;;;:35;;29025:132;8814:87;8887:6;;-1:-1:-1;;;;;8887:6:0;8814:87;;16261:104;;;:::i;33490:::-;;;;;;:::i;:::-;;:::i;28166:51::-;;;;;;20621:438;;;;;;:::i;:::-;;:::i;28237:81::-;;28276:42;28237:81;;17666:193;;;;;;:::i;:::-;;:::i;29600:691::-;;;;;;:::i;:::-;;:::i;31963:552::-;;;:::i;28325:31::-;;;;;;;;;17922:151;;;;;;:::i;:::-;-1:-1:-1;;;;;18038:18:0;;;18011:7;18038:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;17922:151;9723:201;;;;;;:::i;:::-;;:::i;16042:100::-;16096:13;16129:5;16122:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16042:100;:::o;18393:201::-;18476:4;7618:10;18532:32;7618:10;18548:7;18557:6;18532:8;:32::i;:::-;-1:-1:-1;18582:4:0;;18393:201;-1:-1:-1;;;18393:201:0:o;33606:101::-;8887:6;;-1:-1:-1;;;;;8887:6:0;7618:10;9034:23;9026:68;;;;-1:-1:-1;;;9026:68:0;;;;;;;:::i;:::-;;;;;;;;;33675:17:::1;:24:::0;33606:101::o;31643:306::-;31714:28;;;;:19;:28;;;;;;-1:-1:-1;;;;;31714:28:0;31746:10;31714:42;31706:72;;;;-1:-1:-1;;;31706:72:0;;5971:2:1;31706:72:0;;;5953:21:1;6010:2;5990:18;;;5983:30;-1:-1:-1;;;6029:18:1;;;6022:47;6086:18;;31706:72:0;5769:341:1;31706:72:0;31861:19;;31827:30;;;;:21;:30;;;;;;31789:93;;31795:10;;31809:48;;:15;:48;:::i;:::-;31808:72;;;;:::i;:::-;31789:5;:93::i;:::-;31893:30;;;;:21;:30;;;;;31926:15;31893:48;;31643:306::o;32933:308::-;33004:7;33032:28;;;:19;:28;;;;;;-1:-1:-1;;;;;33032:28:0;33024:71;;;;-1:-1:-1;;;33024:71:0;;6752:2:1;33024:71:0;;;6734:21:1;6791:2;6771:18;;;6764:30;-1:-1:-1;;;6810:18:1;;;6803:46;6866:18;;33024:71:0;6550:340:1;33024:71:0;33108:21;33150:30;;;:21;:30;;;;;;33132:48;;:15;:48;:::i;:::-;33108:72;;33214:19;;33198:13;:35;;;;:::i;:::-;33191:42;32933:308;-1:-1:-1;;;32933:308:0:o;30982:651::-;31053:20;31095:9;31090:492;31114:8;:15;31110:1;:19;31090:492;;;31151:10;31164:8;31173:1;31164:11;;;;;;;;:::i;:::-;;;;;;;;;;;;31198:23;;;;:19;:23;;;;;;;;31164:11;;-1:-1:-1;;;;;;31198:23:0;31225:10;31198:37;31190:69;;;;-1:-1:-1;;;31190:69:0;;7229:2:1;31190:69:0;;;7211:21:1;7268:2;7248:18;;;7241:30;-1:-1:-1;;;7287:18:1;;;7280:49;7346:18;;31190:69:0;7027:343:1;31190:69:0;31276:66;;-1:-1:-1;;;31276:66:0;;31320:4;31276:66;;;7615:34:1;31327:10:0;7665:18:1;;;7658:43;7717:18;;;7710:34;;;28276:42:0;;31276:35;;7550:18:1;;31276:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;31422:19:0;;31393:25;;;;:21;:25;;;;;;31422:19;;-1:-1:-1;31375:43:0;;-1:-1:-1;31375:15:0;:43;:::i;:::-;31374:67;;;;:::i;:::-;31357:85;;;;:::i;:::-;31503:10;31482:32;;;;:20;:32;;;;;31357:85;;-1:-1:-1;31459:60:0;;31516:2;31459:22;:60::i;:::-;31568:1;31534:23;;;:19;:23;;;;;:36;;-1:-1:-1;;;;;;31534:36:0;;;31131:3;;;;:::i;:::-;;;;31090:492;;;;31594:31;31600:10;31612:12;31594:5;:31::i;:::-;31042:591;30982:651;:::o;28881:132::-;-1:-1:-1;;;;;28977:28:0;;;;;;:20;:28;;;;;;;;;28970:35;;;;;;;;;;;;;;;;;28941:16;;28970:35;;;28977:28;28970:35;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28881:132;;;:::o;19174:295::-;19305:4;7618:10;19363:38;19379:4;7618:10;19394:6;19363:15;:38::i;:::-;19412:27;19422:4;19428:2;19432:6;19412:9;:27::i;:::-;-1:-1:-1;19457:4:0;;19174:295;-1:-1:-1;;;;19174:295:0:o;33384:100::-;8887:6;;-1:-1:-1;;;;;8887:6:0;7618:10;9034:23;9026:68;;;;-1:-1:-1;;;9026:68:0;;;;;;;:::i;:::-;33451:25:::1;33457:10;33469:6;33451:5;:25::i;:::-;33384:100:::0;:::o;30301:673::-;30364:10;30378:1;29113:28;;;:20;:28;;;;;:35;30349:30;30341:70;;;;-1:-1:-1;;;30341:70:0;;8230:2:1;30341:70:0;;;8212:21:1;8269:2;8249:18;;;8242:30;8308:29;8288:18;;;8281:57;8355:18;;30341:70:0;8028:351:1;30341:70:0;30497:10;30422:20;30476:32;;;:20;:32;;;;;:39;30459:456;30517:5;;30459:456;;30583:10;30544:15;30562:32;;;:20;:32;;;;;30595:5;30599:1;30595;:5;:::i;:::-;30562:39;;;;;;;;:::i;:::-;;;;;;;;;;;30618:71;;-1:-1:-1;;;30618:71:0;;30662:4;30618:71;;;7615:34:1;30669:10:0;7665:18:1;;;7658:43;7717:18;;;7710:34;;;30562:39:0;;-1:-1:-1;28276:42:0;;30618:35;;7550:18:1;;30618:71:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;30774:19:0;;30740:30;;;;:21;:30;;;;;;30774:19;;-1:-1:-1;30722:48:0;;-1:-1:-1;30722:15:0;:48;:::i;:::-;30721:72;;;;:::i;:::-;30704:90;;;;:::i;:::-;30830:10;30809:32;;;;:20;:32;;;;;:38;;30704:90;;-1:-1:-1;30809:32:0;:38;;;;;:::i;:::-;;;;;;;;;;;-1:-1:-1;;30809:38:0;;;;;;;;;;;;30862:28;;;:19;:28;;;;;;:41;;-1:-1:-1;;;;;;30862:41:0;;;30524:3;;;;:::i;:::-;;;;30459:456;;;;30935:31;30941:10;30953:12;30935:5;:31::i;32523:402::-;-1:-1:-1;;;;;32672:28:0;;32583:7;32672:28;;;:20;:28;;;;;;;;32640:60;;;;;;;;;;;;;;;;;32583:7;;;;32640:60;32672:28;32640:60;;;32672:28;32640:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32716:9;32711:175;32735:12;:19;32731:1;:23;32711:175;;;32854:19;;32812:21;:38;32834:12;32847:1;32834:15;;;;;;;;:::i;:::-;;;;;;;32812:38;;;;;;;;;;;;32794:15;:56;;;;:::i;:::-;32793:80;;;;:::i;:::-;32776:98;;;;:::i;:::-;;-1:-1:-1;32756:3:0;;;;:::i;:::-;;;;32711:175;;;-1:-1:-1;32905:12:0;;32523:402;-1:-1:-1;;;32523:402:0:o;19878:240::-;7618:10;19966:4;20047:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;20047:27:0;;;;;;;;;;19966:4;;7618:10;20022:66;;7618:10;;20047:27;;:40;;20077:10;;20047:40;:::i;:::-;20022:8;:66::i;33715:82::-;8887:6;;-1:-1:-1;;;;;8887:6:0;7618:10;9034:23;9026:68;;;;-1:-1:-1;;;9026:68:0;;;;;;;:::i;:::-;33778:11:::1;::::0;;-1:-1:-1;;33763:26:0;::::1;33778:11;::::0;;::::1;33777:12;33763:26;::::0;;33715:82::o;27420:91::-;27476:27;7618:10;27496:6;27476:5;:27::i;9465:103::-;8887:6;;-1:-1:-1;;;;;8887:6:0;7618:10;9034:23;9026:68;;;;-1:-1:-1;;;9026:68:0;;;;;;;:::i;:::-;9530:30:::1;9557:1;9530:18;:30::i;:::-;9465:103::o:0;27830:164::-;27907:46;27923:7;7618:10;27946:6;27907:15;:46::i;:::-;27964:22;27970:7;27979:6;27964:5;:22::i;16261:104::-;16317:13;16350:7;16343:14;;;;;:::i;33490:104::-;8887:6;;-1:-1:-1;;;;;8887:6:0;7618:10;9034:23;9026:68;;;;-1:-1:-1;;;9026:68:0;;;;;;;:::i;:::-;33561:19:::1;:25:::0;33490:104::o;20621:438::-;7618:10;20714:4;20797:18;;;:11;:18;;;;;;;;-1:-1:-1;;;;;20797:27:0;;;;;;;;;;20714:4;;7618:10;20843:35;;;;20835:85;;;;-1:-1:-1;;;20835:85:0;;8859:2:1;20835:85:0;;;8841:21:1;8898:2;8878:18;;;8871:30;8937:34;8917:18;;;8910:62;-1:-1:-1;;;8988:18:1;;;8981:35;9033:19;;20835:85:0;8657:401:1;20835:85:0;20956:60;20965:5;20972:7;21000:15;20981:16;:34;20956:8;:60::i;17666:193::-;17745:4;7618:10;17801:28;7618:10;17818:2;17822:6;17801:9;:28::i;29600:691::-;28821:11;;;;28813:40;;;;-1:-1:-1;;;28813:40:0;;9265:2:1;28813:40:0;;;9247:21:1;9304:2;9284:18;;;9277:30;-1:-1:-1;;;9323:18:1;;;9316:46;9379:18;;28813:40:0;9063:340:1;28813:40:0;29740:17:::1;::::0;29721:15;;29707:10:::1;29086:7:::0;29113:28;;;:20;:28;;;;;:35;29692:44:::1;;;;:::i;:::-;:65;;29684:107;;;::::0;-1:-1:-1;;;29684:107:0;;9610:2:1;29684:107:0::1;::::0;::::1;9592:21:1::0;9649:2;9629:18;;;9622:30;9688:31;9668:18;;;9661:59;9737:18;;29684:107:0::1;9408:353:1::0;29684:107:0::1;29809:9;29804:480;29828:8;:15;29824:1;:19;29804:480;;;29865:10;29878:8;29887:1;29878:11;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;29912:34:::1;::::0;-1:-1:-1;;;29912:34:0;;::::1;::::0;::::1;1595:25:1::0;;;29878:11:0;;-1:-1:-1;29950:10:0::1;::::0;28276:42:::1;::::0;29912:30:::1;::::0;1568:18:1;;29912:34:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;29912:48:0::1;;:89;;;;-1:-1:-1::0;29999:1:0::1;29964:23:::0;;;:19:::1;:23;::::0;;;;;-1:-1:-1;;;;;29964:23:0::1;:37:::0;29912:89:::1;29904:120;;;::::0;-1:-1:-1;;;29904:120:0;;10224:2:1;29904:120:0::1;::::0;::::1;10206:21:1::0;10263:2;10243:18;;;10236:30;-1:-1:-1;;;10282:18:1;;;10275:48;10340:18;;29904:120:0::1;10022:342:1::0;29904:120:0::1;30039:66;::::0;-1:-1:-1;;;30039:66:0;;30075:10:::1;30039:66;::::0;::::1;7615:34:1::0;30095:4:0::1;7665:18:1::0;;;7658:43;7717:18;;;7710:34;;;28276:42:0::1;::::0;30039:35:::1;::::0;7550:18:1;;30039:66:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;-1:-1:-1::0;;30143:10:0::1;30122:32;::::0;;;:20:::1;:32;::::0;;;;;;;:41;;::::1;::::0;::::1;::::0;;;;;;;;::::1;::::0;;;30178:25;;;:21:::1;:25:::0;;;;;30206:15:::1;30178:43:::0;;30236:19:::1;:23:::0;;;;;;:36;;-1:-1:-1;;;;;;30236:36:0::1;::::0;;::::1;::::0;;;-1:-1:-1;29845:3:0;;-1:-1:-1;29845:3:0::1;::::0;::::1;:::i;:::-;;;;29804:480;;31963:552:::0;32091:10;32001:20;32070:32;;;:20;:32;;;;;;;;32038:64;;;;;;;;;;;;;;;;;32001:20;;32038:64;;32070:32;32038:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32118:9;32113:345;32137:12;:19;32133:1;:23;32113:345;;;32178:10;32191:12;32204:1;32191:15;;;;;;;;:::i;:::-;;;;;;;;;;;;32229:23;;;;:19;:23;;;;;;;;32191:15;;-1:-1:-1;;;;;;32229:23:0;32256:10;32229:37;32221:67;;;;-1:-1:-1;;;32221:67:0;;5971:2:1;32221:67:0;;;5953:21:1;6010:2;5990:18;;;5983:30;-1:-1:-1;;;6029:18:1;;;6022:47;6086:18;;32221:67:0;5769:341:1;32221:67:0;32368:19;;32339:25;;;;:21;:25;;;;;;32321:43;;:15;:43;:::i;:::-;32320:67;;;;:::i;:::-;32303:85;;;;:::i;:::-;32403:25;;;;:21;:25;;;;;;32431:15;32403:43;;32303:85;-1:-1:-1;32158:3:0;;;;:::i;:::-;;;;32113:345;;;;32476:31;32482:10;32494:12;32476:5;:31::i;9723:201::-;8887:6;;-1:-1:-1;;;;;8887:6:0;7618:10;9034:23;9026:68;;;;-1:-1:-1;;;9026:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;9812:22:0;::::1;9804:73;;;::::0;-1:-1:-1;;;9804:73:0;;10571:2:1;9804:73:0::1;::::0;::::1;10553:21:1::0;10610:2;10590:18;;;10583:30;10649:34;10629:18;;;10622:62;-1:-1:-1;;;10700:18:1;;;10693:36;10746:19;;9804:73:0::1;10369:402:1::0;9804:73:0::1;9888:28;9907:8;9888:18;:28::i;24257:380::-:0;-1:-1:-1;;;;;24393:19:0;;24385:68;;;;-1:-1:-1;;;24385:68:0;;10978:2:1;24385:68:0;;;10960:21:1;11017:2;10997:18;;;10990:30;11056:34;11036:18;;;11029:62;-1:-1:-1;;;11107:18:1;;;11100:34;11151:19;;24385:68:0;10776:400:1;24385:68:0;-1:-1:-1;;;;;24472:21:0;;24464:68;;;;-1:-1:-1;;;24464:68:0;;11383:2:1;24464:68:0;;;11365:21:1;11422:2;11402:18;;;11395:30;11461:34;11441:18;;;11434:62;-1:-1:-1;;;11512:18:1;;;11505:32;11554:19;;24464:68:0;11181:398:1;24464:68:0;-1:-1:-1;;;;;24545:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;24597:32;;1595:25:1;;;24597:32:0;;1568:18:1;24597:32:0;;;;;;;;24257:380;;;:::o;22496:399::-;-1:-1:-1;;;;;22580:21:0;;22572:65;;;;-1:-1:-1;;;22572:65:0;;11786:2:1;22572:65:0;;;11768:21:1;11825:2;11805:18;;;11798:30;11864:33;11844:18;;;11837:61;11915:18;;22572:65:0;11584:355:1;22572:65:0;22728:6;22712:12;;:22;;;;;;;:::i;:::-;;;;-1:-1:-1;;;;;;;22745:18:0;;:9;:18;;;;;;;;;;:28;;22767:6;;22745:9;:28;;22767:6;;22745:28;:::i;:::-;;;;-1:-1:-1;;22789:37:0;;1595:25:1;;;-1:-1:-1;;;;;22789:37:0;;;22806:1;;22789:37;;1583:2:1;1568:18;22789:37:0;;;;;;;31042:591;30982:651;:::o;29165:427::-;29276:12;;29259:14;29299:286;29323:6;29319:1;:10;29299:286;;;29367:7;29355:5;29361:1;29355:8;;;;;;;;:::i;:::-;;;;;;;;;:19;29351:223;;;29395:8;;;;:::i;:::-;;;;29430:6;29426:1;:10;29422:83;;;29472:5;29478:6;29472:13;;;;;;;;:::i;:::-;;;;;;;;;29461:5;29467:1;29461:8;;;;;;;;:::i;:::-;;;;;;;;;;:24;29422:83;29523:5;:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;29553:5;;29351:223;29331:3;;;;:::i;:::-;;;;29299:286;;;;29248:344;29165:427;;:::o;24924:453::-;-1:-1:-1;;;;;18038:18:0;;;25059:24;18038:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;-1:-1:-1;;25126:37:0;;25122:248;;25208:6;25188:16;:26;;25180:68;;;;-1:-1:-1;;;25180:68:0;;12146:2:1;25180:68:0;;;12128:21:1;12185:2;12165:18;;;12158:30;12224:31;12204:18;;;12197:59;12273:18;;25180:68:0;11944:353:1;25180:68:0;25292:51;25301:5;25308:7;25336:6;25317:16;:25;25292:8;:51::i;21538:671::-;-1:-1:-1;;;;;21669:18:0;;21661:68;;;;-1:-1:-1;;;21661:68:0;;12504:2:1;21661:68:0;;;12486:21:1;12543:2;12523:18;;;12516:30;12582:34;12562:18;;;12555:62;-1:-1:-1;;;12633:18:1;;;12626:35;12678:19;;21661:68:0;12302:401:1;21661:68:0;-1:-1:-1;;;;;21748:16:0;;21740:64;;;;-1:-1:-1;;;21740:64:0;;12910:2:1;21740:64:0;;;12892:21:1;12949:2;12929:18;;;12922:30;12988:34;12968:18;;;12961:62;-1:-1:-1;;;13039:18:1;;;13032:33;13082:19;;21740:64:0;12708:399:1;21740:64:0;-1:-1:-1;;;;;21890:15:0;;21868:19;21890:15;;;;;;;;;;;21924:21;;;;21916:72;;;;-1:-1:-1;;;21916:72:0;;13314:2:1;21916:72:0;;;13296:21:1;13353:2;13333:18;;;13326:30;13392:34;13372:18;;;13365:62;-1:-1:-1;;;13443:18:1;;;13436:36;13489:19;;21916:72:0;13112:402:1;21916:72:0;-1:-1:-1;;;;;22024:15:0;;;:9;:15;;;;;;;;;;;22042:20;;;22024:38;;22084:13;;;;;;;;:23;;22056:6;;22024:9;22084:23;;22056:6;;22084:23;:::i;:::-;;;;;;;;22140:2;-1:-1:-1;;;;;22125:26:0;22134:4;-1:-1:-1;;;;;22125:26:0;;22144:6;22125:26;;;;1595:25:1;;1583:2;1568:18;;1449:177;22125:26:0;;;;;;;;22164:37;23228:591;;-1:-1:-1;;;;;23312:21:0;;23304:67;;;;-1:-1:-1;;;23304:67:0;;13721:2:1;23304:67:0;;;13703:21:1;13760:2;13740:18;;;13733:30;13799:34;13779:18;;;13772:62;-1:-1:-1;;;13850:18:1;;;13843:31;13891:19;;23304:67:0;13519:397:1;23304:67:0;-1:-1:-1;;;;;23471:18:0;;23446:22;23471:18;;;;;;;;;;;23508:24;;;;23500:71;;;;-1:-1:-1;;;23500:71:0;;14123:2:1;23500:71:0;;;14105:21:1;14162:2;14142:18;;;14135:30;14201:34;14181:18;;;14174:62;-1:-1:-1;;;14252:18:1;;;14245:32;14294:19;;23500:71:0;13921:398:1;23500:71:0;-1:-1:-1;;;;;23607:18:0;;:9;:18;;;;;;;;;;23628:23;;;23607:44;;23673:12;:22;;23645:6;;23607:9;23673:22;;23645:6;;23673:22;:::i;:::-;;;;-1:-1:-1;;23713:37:0;;1595:25:1;;;23739:1:0;;-1:-1:-1;;;;;23713:37:0;;;;;1583:2:1;1568:18;23713:37:0;1449:177:1;10084:191:0;10177:6;;;-1:-1:-1;;;;;10194:17:0;;;-1:-1:-1;;;;;;10194:17:0;;;;;;;10227:40;;10177:6;;;10194:17;10177:6;;10227:40;;10158:16;;10227:40;10147:128;10084:191;:::o;14:597:1:-;126:4;155:2;184;173:9;166:21;216:6;210:13;259:6;254:2;243:9;239:18;232:34;284:1;294:140;308:6;305:1;302:13;294:140;;;403:14;;;399:23;;393:30;369:17;;;388:2;365:26;358:66;323:10;;294:140;;;452:6;449:1;446:13;443:91;;;522:1;517:2;508:6;497:9;493:22;489:31;482:42;443:91;-1:-1:-1;595:2:1;574:15;-1:-1:-1;;570:29:1;555:45;;;;602:2;551:54;;14:597;-1:-1:-1;;;14:597:1:o;616:131::-;-1:-1:-1;;;;;691:31:1;;681:42;;671:70;;737:1;734;727:12;752:315;820:6;828;881:2;869:9;860:7;856:23;852:32;849:52;;;897:1;894;887:12;849:52;936:9;923:23;955:31;980:5;955:31;:::i;:::-;1005:5;1057:2;1042:18;;;;1029:32;;-1:-1:-1;;;752:315:1:o;1264:180::-;1323:6;1376:2;1364:9;1355:7;1351:23;1347:32;1344:52;;;1392:1;1389;1382:12;1344:52;-1:-1:-1;1415:23:1;;1264:180;-1:-1:-1;1264:180:1:o;1631:127::-;1692:10;1687:3;1683:20;1680:1;1673:31;1723:4;1720:1;1713:15;1747:4;1744:1;1737:15;1763:1115;1847:6;1878:2;1921;1909:9;1900:7;1896:23;1892:32;1889:52;;;1937:1;1934;1927:12;1889:52;1977:9;1964:23;2006:18;2047:2;2039:6;2036:14;2033:34;;;2063:1;2060;2053:12;2033:34;2101:6;2090:9;2086:22;2076:32;;2146:7;2139:4;2135:2;2131:13;2127:27;2117:55;;2168:1;2165;2158:12;2117:55;2204:2;2191:16;2226:2;2222;2219:10;2216:36;;;2232:18;;:::i;:::-;2278:2;2275:1;2271:10;2310:2;2304:9;2373:2;2369:7;2364:2;2360;2356:11;2352:25;2344:6;2340:38;2428:6;2416:10;2413:22;2408:2;2396:10;2393:18;2390:46;2387:72;;;2439:18;;:::i;:::-;2475:2;2468:22;2525:18;;;2559:15;;;;-1:-1:-1;2601:11:1;;;2597:20;;;2629:19;;;2626:39;;;2661:1;2658;2651:12;2626:39;2685:11;;;;2705:142;2721:6;2716:3;2713:15;2705:142;;;2787:17;;2775:30;;2738:12;;;;2825;;;;2705:142;;;2866:6;1763:1115;-1:-1:-1;;;;;;;;1763:1115:1:o;2883:247::-;2942:6;2995:2;2983:9;2974:7;2970:23;2966:32;2963:52;;;3011:1;3008;3001:12;2963:52;3050:9;3037:23;3069:31;3094:5;3069:31;:::i;3135:632::-;3306:2;3358:21;;;3428:13;;3331:18;;;3450:22;;;3277:4;;3306:2;3529:15;;;;3503:2;3488:18;;;3277:4;3572:169;3586:6;3583:1;3580:13;3572:169;;;3647:13;;3635:26;;3716:15;;;;3681:12;;;;3608:1;3601:9;3572:169;;;-1:-1:-1;3758:3:1;;3135:632;-1:-1:-1;;;;;;3135:632:1:o;3772:456::-;3849:6;3857;3865;3918:2;3906:9;3897:7;3893:23;3889:32;3886:52;;;3934:1;3931;3924:12;3886:52;3973:9;3960:23;3992:31;4017:5;3992:31;:::i;:::-;4042:5;-1:-1:-1;4099:2:1;4084:18;;4071:32;4112:33;4071:32;4112:33;:::i;:::-;3772:456;;4164:7;;-1:-1:-1;;;4218:2:1;4203:18;;;;4190:32;;3772:456::o;4630:388::-;4698:6;4706;4759:2;4747:9;4738:7;4734:23;4730:32;4727:52;;;4775:1;4772;4765:12;4727:52;4814:9;4801:23;4833:31;4858:5;4833:31;:::i;:::-;4883:5;-1:-1:-1;4940:2:1;4925:18;;4912:32;4953:33;4912:32;4953:33;:::i;:::-;5005:7;4995:17;;;4630:388;;;;;:::o;5023:380::-;5102:1;5098:12;;;;5145;;;5166:61;;5220:4;5212:6;5208:17;5198:27;;5166:61;5273:2;5265:6;5262:14;5242:18;5239:38;5236:161;;;5319:10;5314:3;5310:20;5307:1;5300:31;5354:4;5351:1;5344:15;5382:4;5379:1;5372:15;5236:161;;5023:380;;;:::o;5408:356::-;5610:2;5592:21;;;5629:18;;;5622:30;5688:34;5683:2;5668:18;;5661:62;5755:2;5740:18;;5408:356::o;6115:127::-;6176:10;6171:3;6167:20;6164:1;6157:31;6207:4;6204:1;6197:15;6231:4;6228:1;6221:15;6247:125;6287:4;6315:1;6312;6309:8;6306:34;;;6320:18;;:::i;:::-;-1:-1:-1;6357:9:1;;6247:125::o;6377:168::-;6417:7;6483:1;6479;6475:6;6471:14;6468:1;6465:21;6460:1;6453:9;6446:17;6442:45;6439:71;;;6490:18;;:::i;:::-;-1:-1:-1;6530:9:1;;6377:168::o;6895:127::-;6956:10;6951:3;6947:20;6944:1;6937:31;6987:4;6984:1;6977:15;7011:4;7008:1;7001:15;7755:128;7795:3;7826:1;7822:6;7819:1;7816:13;7813:39;;;7832:18;;:::i;:::-;-1:-1:-1;7868:9:1;;7755:128::o;7888:135::-;7927:3;-1:-1:-1;;7948:17:1;;7945:43;;;7968:18;;:::i;:::-;-1:-1:-1;8015:1:1;8004:13;;7888:135::o;8384:127::-;8445:10;8440:3;8436:20;8433:1;8426:31;8476:4;8473:1;8466:15;8500:4;8497:1;8490:15;8516:136;8555:3;8583:5;8573:39;;8592:18;;:::i;:::-;-1:-1:-1;;;8628:18:1;;8516:136::o;9766:251::-;9836:6;9889:2;9877:9;9868:7;9864:23;9860:32;9857:52;;;9905:1;9902;9895:12;9857:52;9937:9;9931:16;9956:31;9981:5;9956:31;:::i

Swarm Source

ipfs://b0ec7765abf4eaf485716c359e0b24ac840a8fd30bcb7f7ba298b5f24a6e218b
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.