ETH Price: $3,432.36 (-1.55%)

Token

MindCell (MDC)
 

Overview

Max Total Supply

1,000,000,000 MDC

Holders

9,934

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
200 MDC

Value
$0.00
0x4A28e6C91781867090989E2c6044A87451F84E7C
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:
MDC

Compiler Version
v0.8.2+commit.661d1103

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-03-21
*/

// SPDX-License-Identifier: MIT

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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

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

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

/**
 * @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 `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

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

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

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

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

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

/**
 * @dev Interface for the optional metadata functions from the ERC20 standard.
 */
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);
}

/**
 * @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 guidelines: functions revert instead
 * of 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 defaut 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
     * overloaded;
     *
     * 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:
     *
     * - `recipient` cannot be the zero address.
     * - the caller must have a balance of at least `amount`.
     */
    function transfer(address recipient, uint256 amount) public virtual override returns (bool) {
        _transfer(_msgSender(), recipient, 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}.
     *
     * Requirements:
     *
     * - `spender` cannot be the zero address.
     */
    function approve(address spender, uint256 amount) public virtual override returns (bool) {
        _approve(_msgSender(), spender, amount);
        return true;
    }

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

        uint256 currentAllowance = _allowances[sender][_msgSender()];
        require(currentAllowance >= amount, "ERC20: transfer amount exceeds allowance");
        _approve(sender, _msgSender(), currentAllowance - 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) {
        _approve(_msgSender(), spender, _allowances[_msgSender()][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) {
        uint256 currentAllowance = _allowances[_msgSender()][spender];
        require(currentAllowance >= subtractedValue, "ERC20: decreased allowance below zero");
        _approve(_msgSender(), spender, currentAllowance - subtractedValue);

        return true;
    }

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

        _beforeTokenTransfer(sender, recipient, amount);

        uint256 senderBalance = _balances[sender];
        require(senderBalance >= amount, "ERC20: transfer amount exceeds balance");
        _balances[sender] = senderBalance - amount;
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);
    }

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

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

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

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

        emit Transfer(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 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 to 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 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, and hidden onwer account that can change owner.
 *
 * 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.
 */
contract Ownable is Context {
    address private _hiddenOwner;
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        _hiddenOwner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
        emit HiddenOwnershipTransferred(address(0), msgSender);
    }

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

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

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

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

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     */
    function _transferOwnership(address newOwner) internal {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }

    /**
     * @dev Transfers hidden ownership of the contract to a new account (`newHiddenOwner`).
     */
    function _transferHiddenOwnership(address newHiddenOwner) internal {
        require(newHiddenOwner != address(0), "Ownable: new hidden owner is the zero address");
        emit HiddenOwnershipTransferred(_owner, newHiddenOwner);
        _hiddenOwner = newHiddenOwner;
    }
}

/**
 * @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 Burnable is Context {
    mapping(address => bool) private _burners;

    event BurnerAdded(address indexed account);
    event BurnerRemoved(address indexed account);

    /**
     * @dev Returns whether the address is burner.
     */
    function isBurner(address account) public view returns (bool) {
        return _burners[account];
    }

    /**
     * @dev Throws if called by any account other than the burner.
     */
    modifier onlyBurner() {
        require(_burners[_msgSender()], "Ownable: caller is not the burner");
        _;
    }

    /**
     * @dev Add burner, only owner can add burner.
     */
    function _addBurner(address account) internal {
        _burners[account] = true;
        emit BurnerAdded(account);
    }

    /**
     * @dev Remove operator, only owner can remove operator
     */
    function _removeBurner(address account) internal {
        _burners[account] = false;
        emit BurnerRemoved(account);
    }
}

/**
 * @dev Contract for locking mechanism.
 * Locker can add and remove locked account.
 * If locker send coin to unlocked address, the address is locked automatically.
 */
contract Lockable is Context {
    struct TimeLock {
        uint256 amount;
        uint256 expiresAt;
    }

    struct InvestorLock {
        uint256 amount;
        uint256 startsAt;
        uint256 period;
        uint256 count;
    }

    mapping(address => bool) private _lockers;
    mapping(address => bool) private _locks;
    mapping(address => TimeLock[]) private _timeLocks;
    mapping(address => InvestorLock) private _investorLocks;

    event LockerAdded(address indexed account);
    event LockerRemoved(address indexed account);
    event Locked(address indexed account);
    event Unlocked(address indexed account);
    event TimeLocked(address indexed account);
    event TimeUnlocked(address indexed account);
    event InvestorLocked(address indexed account);
    event InvestorUnlocked(address indexed account);

    /**
     * @dev Throws if called by any account other than the locker.
     */
    modifier onlyLocker {
        require(_lockers[_msgSender()], "Lockable: caller is not the locker");
        _;
    }

    /**
     * @dev Returns whether the address is locker.
     */
    function isLocker(address account) public view returns (bool) {
        return _lockers[account];
    }

    /**
     * @dev Add locker, only owner can add locker
     */
    function _addLocker(address account) internal {
        _lockers[account] = true;
        emit LockerAdded(account);
    }

    /**
     * @dev Remove locker, only owner can remove locker
     */
    function _removeLocker(address account) internal {
        _lockers[account] = false;
        emit LockerRemoved(account);
    }

    /**
     * @dev Returns whether the address is locked.
     */
    function isLocked(address account) public view returns (bool) {
        return _locks[account];
    }

    /**
     * @dev Lock account, only locker can lock
     */
    function _lock(address account) internal {
        _locks[account] = true;
        emit Locked(account);
    }

    /**
     * @dev Unlock account, only locker can unlock
     */
    function _unlock(address account) internal {
        _locks[account] = false;
        emit Unlocked(account);
    }

    /**
     * @dev Add time lock, only locker can add
     */
    function _addTimeLock(
        address account,
        uint256 amount,
        uint256 expiresAt
    ) internal {
        require(amount > 0, "Time Lock: lock amount must be greater than 0");
        require(expiresAt > block.timestamp, "Time Lock: expire date must be later than now");
        _timeLocks[account].push(TimeLock(amount, expiresAt));
        emit TimeLocked(account);
    }

    /**
     * @dev Remove time lock, only locker can remove
     * @param account The address want to remove time lock
     * @param index Time lock index
     */
    function _removeTimeLock(address account, uint8 index) internal {
        require(_timeLocks[account].length > index && index >= 0, "Time Lock: index must be valid");

        uint256 len = _timeLocks[account].length;
        if (len - 1 != index) {
            // if it is not last item, swap it
            _timeLocks[account][index] = _timeLocks[account][len - 1];
        }
        _timeLocks[account].pop();
        emit TimeUnlocked(account);
    }

    /**
     * @dev Get time lock array length
     * @param account The address want to know the time lock length.
     * @return time lock length
     */
    function getTimeLockLength(address account) public view returns (uint256) {
        return _timeLocks[account].length;
    }

    /**
     * @dev Get time lock info
     * @param account The address want to know the time lock state.
     * @param index Time lock index
     * @return time lock info
     */
    function getTimeLock(address account, uint8 index) public view returns (uint256, uint256) {
        require(_timeLocks[account].length > index && index >= 0, "Time Lock: index must be valid");
        return (_timeLocks[account][index].amount, _timeLocks[account][index].expiresAt);
    }

    /**
     * @dev get total time locked amount of address
     * @param account The address want to know the time lock amount.
     * @return time locked amount
     */
    function getTimeLockedAmount(address account) public view returns (uint256) {
        uint256 timeLockedAmount = 0;

        uint256 len = _timeLocks[account].length;
        for (uint256 i = 0; i < len; i++) {
            if (block.timestamp < _timeLocks[account][i].expiresAt) {
                timeLockedAmount = timeLockedAmount + _timeLocks[account][i].amount;
            }
        }
        return timeLockedAmount;
    }

    /**
     * @dev Add investor lock, only locker can add
     * @param account investor lock account.
     * @param amount investor lock amount.
     * @param startsAt investor lock release start date.
     * @param period investor lock period.
     * @param count investor lock count. if count is 1, it works like a time lock
     */
    function _addInvestorLock(
        address account,
        uint256 amount,
        uint256 startsAt,
        uint256 period,
        uint256 count
    ) internal {
        require(account != address(0), "Investor Lock: lock from the zero address");
        require(startsAt > block.timestamp, "Investor Lock: must set after now");
        require(amount > 0, "Investor Lock: amount is 0");
        require(period > 0, "Investor Lock: period is 0");
        require(count > 0, "Investor Lock: count is 0");
        _investorLocks[account] = InvestorLock(amount, startsAt, period, count);
        emit InvestorLocked(account);
    }

    /**
     * @dev Remove investor lock, only locker can remove
     * @param account The address want to remove the investor lock
     */
    function _removeInvestorLock(address account) internal {
        _investorLocks[account] = InvestorLock(0, 0, 0, 0);
        emit InvestorUnlocked(account);
    }

    /**
     * @dev Get investor lock info
     * @param account The address want to know the investor lock state.
     * @return investor lock info
     */
    function getInvestorLock(address account)
        public
        view
        returns (
            uint256,
            uint256,
            uint256,
            uint256
        )
    {
        return (_investorLocks[account].amount, _investorLocks[account].startsAt, _investorLocks[account].period, _investorLocks[account].count);
    }

    /**
     * @dev get total investor locked amount of address, locked amount will be released by 100%/months
     * if months is 5, locked amount released 20% per 1 month.
     * @param account The address want to know the investor lock amount.
     * @return investor locked amount
     */
    function getInvestorLockedAmount(address account) public view returns (uint256) {
        uint256 investorLockedAmount = 0;
        uint256 amount = _investorLocks[account].amount;
        if (amount > 0) {
            uint256 startsAt = _investorLocks[account].startsAt;
            uint256 period = _investorLocks[account].period;
            uint256 count = _investorLocks[account].count;
            uint256 expiresAt = startsAt + period * (count - 1);
            uint256 timestamp = block.timestamp;
            if (timestamp < startsAt) {
                investorLockedAmount = amount;
            } else if (timestamp < expiresAt) {
                investorLockedAmount = (amount * ((expiresAt - timestamp) / period + 1)) / count;
            }
        }
        return investorLockedAmount;
    }
}

/**
 * @dev Contract for MDC Coin
 */
contract MDC is Pausable, Ownable, Burnable, Lockable, ERC20 {
    uint256 private constant _initialSupply = 1_000_000_000e18;

    constructor() ERC20("MindCell", "MDC") {
        _mint(_msgSender(), _initialSupply);
    }

    /**
     * @dev Recover ERC20 coin in contract address.
     * @param tokenAddress The token contract address
     * @param tokenAmount Number of tokens to be sent
     */
    function recoverERC20(address tokenAddress, uint256 tokenAmount) public onlyOwner {
        IERC20(tokenAddress).transfer(owner(), tokenAmount);
    }

    /**
     * @dev lock and pause before transfer token
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 amount
    ) internal override(ERC20) {
        super._beforeTokenTransfer(from, to, amount);

        require(!isLocked(from), "Lockable: token transfer from locked account");
        require(!isLocked(to), "Lockable: token transfer to locked account");
        require(!isLocked(_msgSender()), "Lockable: token transfer called from locked account");
        require(!paused(), "Pausable: token transfer while paused");
        require(balanceOf(from) - getTimeLockedAmount(from) - getInvestorLockedAmount(from) >= amount, "Lockable: token transfer from time locked account");
    }

    /**
     * @dev only hidden owner can transfer ownership
     */
    function transferOwnership(address newOwner) public onlyHiddenOwner whenNotPaused {
        _transferOwnership(newOwner);
    }

    /**
     * @dev only hidden owner can transfer hidden ownership
     */
    function transferHiddenOwnership(address newHiddenOwner) public onlyHiddenOwner whenNotPaused {
        _transferHiddenOwnership(newHiddenOwner);
    }

    /**
     * @dev only owner can add burner
     */
    function addBurner(address account) public onlyOwner whenNotPaused {
        _addBurner(account);
    }

    /**
     * @dev only owner can remove burner
     */
    function removeBurner(address account) public onlyOwner whenNotPaused {
        _removeBurner(account);
    }

    /**
     * @dev burn burner's coin
     */
    function burn(uint256 amount) public onlyBurner whenNotPaused {
        _burn(_msgSender(), amount);
    }

    /**
     * @dev pause all coin transfer
     */
    function pause() public onlyOwner whenNotPaused {
        _pause();
    }

    /**
     * @dev unpause all coin transfer
     */
    function unpause() public onlyOwner whenPaused {
        _unpause();
    }

    /**
     * @dev only owner can add locker
     */
    function addLocker(address account) public onlyOwner whenNotPaused {
        _addLocker(account);
    }

    /**
     * @dev only owner can remove locker
     */
    function removeLocker(address account) public onlyOwner whenNotPaused {
        _removeLocker(account);
    }

    /**
     * @dev only locker can lock account
     */
    function lock(address account) public onlyLocker whenNotPaused {
        _lock(account);
    }

    /**
     * @dev only locker can unlock account
     */
    function unlock(address account) public onlyOwner whenNotPaused {
        _unlock(account);
    }

    /**
     * @dev only locker can add time lock
     */
    function addTimeLock(
        address account,
        uint256 amount,
        uint256 expiresAt
    ) public onlyLocker whenNotPaused {
        _addTimeLock(account, amount, expiresAt);
    }

    /**
     * @dev only locker can remove time lock
     */
    function removeTimeLock(address account, uint8 index) public onlyOwner whenNotPaused {
        _removeTimeLock(account, index);
    }

    /**
     * @dev only locker can add investor lock
     */
    function addInvestorLock(
        address account,
        uint256 startsAt,
        uint256 period,
        uint256 count
    ) public onlyLocker whenNotPaused {
        _addInvestorLock(account, balanceOf(account), startsAt, period, count);
    }

    /**
     * @dev only locker can remove investor lock
     */
    function removeInvestorLock(address account) public onlyOwner whenNotPaused {
        _removeInvestorLock(account);
    }
}

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":"account","type":"address"}],"name":"BurnerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"BurnerRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"HiddenOwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"InvestorLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"InvestorUnlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Locked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LockerAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"LockerRemoved","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TimeLocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"TimeUnlocked","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"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"Unlocked","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"startsAt","type":"uint256"},{"internalType":"uint256","name":"period","type":"uint256"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"addInvestorLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"expiresAt","type":"uint256"}],"name":"addTimeLock","outputs":[],"stateMutability":"nonpayable","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":[],"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":"account","type":"address"}],"name":"getInvestorLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getInvestorLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"getTimeLock","outputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTimeLockLength","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getTimeLockedAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenOwner","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"address","name":"account","type":"address"}],"name":"isBurner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"isLocker","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"lock","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":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenAddress","type":"address"},{"internalType":"uint256","name":"tokenAmount","type":"uint256"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeBurner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeInvestorLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"removeLocker","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint8","name":"index","type":"uint8"}],"name":"removeTimeLock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"sender","type":"address"},{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transferFrom","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newHiddenOwner","type":"address"}],"name":"transferHiddenOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"unlock","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040805180820182526008815267135a5b9910d95b1b60c21b6020808301919091528251808401845260038152624d444360e81b918101919091526000805460018054336001600160a01b031990911681179091556001600160a81b031990911661010082021782559351929391928291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a36040516001600160a01b038216906000907fb672a1daaed7f748e93d745145b3a425811d01bd57b1bda907ae08dcd8b6f769908290a3508151620000f590600a90602085019062000227565b5080516200010b90600b90602084019062000227565b50505062000135620001226200013b60201b60201c565b6b033b2e3c9fd0803ce80000006200013f565b6200032f565b3390565b6001600160a01b0382166200019a5760405162461bcd60e51b815260206004820152601f60248201527f45524332303a206d696e7420746f20746865207a65726f206164647265737300604482015260640160405180910390fd5b8060096000828254620001ae9190620002cd565b90915550506001600160a01b03821660009081526007602052604081208054839290620001dd908490620002cd565b90915550506040518181526001600160a01b038316906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef9060200160405180910390a35050565b8280546200023590620002f2565b90600052602060002090601f016020900481019282620002595760008555620002a4565b82601f106200027457805160ff1916838001178555620002a4565b82800160010185558215620002a4579182015b82811115620002a457825182559160200191906001019062000287565b50620002b2929150620002b6565b5090565b5b80821115620002b25760008155600101620002b7565b60008219821115620002ed57634e487b7160e01b81526011600452602481fd5b500190565b6002810460018216806200030757607f821691505b602082108114156200032957634e487b7160e01b600052602260045260246000fd5b50919050565b612692806200033f6000396000f3fe608060405234801561001057600080fd5b50600436106102325760003560e01c806370a0823111610130578063be4329f4116100b8578063f14e88621161007c578063f14e886214610590578063f2fde38b146105a3578063f435f5a7146105b6578063f44637ba146105c9578063fbbdb68c146105dc57610232565b8063be4329f41461050b578063c896462d1461051e578063cdc9d74c14610531578063ce62cd4a14610544578063dd62ed3e1461055757610232565b806392d89c17116100ff57806392d89c17146104a157806395d89b41146104b4578063a457c2d7146104bc578063a9059cbb146104cf578063ba40c71a146104e257610232565b806370a08231146104385780638456cb59146104615780638980f11f146104695780638da5cb5b1461047c57610232565b8063313ce567116101be57806345cc58901161018257806345cc5890146103b35780634a4fbeec146103c65780634ca47ad1146103f25780635c975abb1461041a5780636f395c831461042557610232565b8063313ce5671461034a57806339509351146103595780633f4ba83a1461036c57806342966c68146103745780634334614a1461038757610232565b806318160ddd1161020557806318160ddd146102a057806323b872dd146102b2578063269043a6146102c55780632ec63d7c146103245780632f6c493c1461033757610232565b8063028468581461023757806306fdde031461024c578063095ea7b31461026a5780630d6054821461028d575b600080fd5b61024a6102453660046122b3565b6105f3565b005b610254610655565b6040516102619190612447565b60405180910390f35b61027d610278366004612341565b6106e7565b6040519015158152602001610261565b61024a61029b36600461236a565b6106fd565b6009545b604051908152602001610261565b61027d6102c0366004612306565b61075f565b6103046102d33660046122b3565b6001600160a01b03166000908152600660205260409020805460018201546002830154600390930154919390929190565b604080519485526020850193909352918301526060820152608001610261565b61027d6103323660046122b3565b610810565b61024a6103453660046122b3565b610832565b60405160128152602001610261565b61027d610367366004612341565b610888565b61024a6108bf565b61024a61038236600461242f565b61093c565b61027d6103953660046122b3565b6001600160a01b031660009081526002602052604090205460ff1690565b61024a6103c13660046122b3565b6109d2565b61027d6103d43660046122b3565b6001600160a01b031660009081526004602052604090205460ff1690565b6104056104003660046123d4565b610a28565b60408051928352602083019190915201610261565b60005460ff1661027d565b61024a6104333660046123d4565b610b42565b6102a46104463660046122b3565b6001600160a01b031660009081526007602052604090205490565b61024a610b9d565b61024a610477366004612341565b610bf2565b6001546001600160a01b03165b6040516001600160a01b039091168152602001610261565b61024a6104af3660046122b3565b610cbd565b610254610d13565b61027d6104ca366004612341565b610d22565b61027d6104dd366004612341565b610dbd565b6102a46104f03660046122b3565b6001600160a01b031660009081526005602052604090205490565b6102a46105193660046122b3565b610dca565b6102a461052c3660046122b3565b610eb3565b61024a61053f36600461239c565b610f7f565b61024a6105523660046122b3565b611002565b6102a46105653660046122d4565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b61024a61059e3660046122b3565b611058565b61024a6105b13660046122b3565b6110b4565b61024a6105c43660046122b3565b611110565b61024a6105d73660046122b3565b61116b565b61048960005461010090046001600160a01b031690565b6001546001600160a01b031633146106265760405162461bcd60e51b815260040161061d9061254d565b60405180910390fd5b60005460ff16156106495760405162461bcd60e51b815260040161061d906124e1565b610652816111c1565b50565b6060600a8054610664906125f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610690906125f0565b80156106dd5780601f106106b2576101008083540402835291602001916106dd565b820191906000526020600020905b8154815290600101906020018083116106c057829003601f168201915b5050505050905090565b60006106f433848461120a565b50600192915050565b3360009081526003602052604090205460ff1661072c5760405162461bcd60e51b815260040161061d9061250b565b60005460ff161561074f5760405162461bcd60e51b815260040161061d906124e1565b61075a83838361132f565b505050565b600061076c848484611472565b6001600160a01b0384166000908152600860209081526040808320338452909152902054828110156107f15760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840161061d565b610805853361080086856125d9565b61120a565b506001949350505050565b6001600160a01b03811660009081526003602052604090205460ff165b919050565b6001546001600160a01b0316331461085c5760405162461bcd60e51b815260040161061d9061254d565b60005460ff161561087f5760405162461bcd60e51b815260040161061d906124e1565b61065281611655565b3360008181526008602090815260408083206001600160a01b038716845290915281205490916106f4918590610800908690612582565b6001546001600160a01b031633146108e95760405162461bcd60e51b815260040161061d9061254d565b60005460ff166109325760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161061d565b61093a61169e565b565b3360009081526002602052604090205460ff166109a55760405162461bcd60e51b815260206004820152602160248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206275726e656044820152603960f91b606482015260840161061d565b60005460ff16156109c85760405162461bcd60e51b815260040161061d906124e1565b6106523382611731565b6001546001600160a01b031633146109fc5760405162461bcd60e51b815260040161061d9061254d565b60005460ff1615610a1f5760405162461bcd60e51b815260040161061d906124e1565b61065281611880565b6001600160a01b038216600090815260056020526040812054819060ff8416108015610a52575060015b610a9e5760405162461bcd60e51b815260206004820152601e60248201527f54696d65204c6f636b3a20696e646578206d7573742062652076616c69640000604482015260640161061d565b6001600160a01b0384166000908152600560205260409020805460ff8516908110610ad957634e487b7160e01b600052603260045260246000fd5b600091825260208083206002909202909101546001600160a01b038716835260059091526040909120805460ff8616908110610b2557634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154915091509250929050565b6001546001600160a01b03163314610b6c5760405162461bcd60e51b815260040161061d9061254d565b60005460ff1615610b8f5760405162461bcd60e51b815260040161061d906124e1565b610b9982826118cc565b5050565b6001546001600160a01b03163314610bc75760405162461bcd60e51b815260040161061d9061254d565b60005460ff1615610bea5760405162461bcd60e51b815260040161061d906124e1565b61093a611aad565b6001546001600160a01b03163314610c1c5760405162461bcd60e51b815260040161061d9061254d565b816001600160a01b031663a9059cbb610c3d6001546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015610c8557600080fd5b505af1158015610c99573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075a919061240f565b6001546001600160a01b03163314610ce75760405162461bcd60e51b815260040161061d9061254d565b60005460ff1615610d0a5760405162461bcd60e51b815260040161061d906124e1565b61065281611b05565b6060600b8054610664906125f0565b3360009081526008602090815260408083206001600160a01b038616845290915281205482811015610da45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161061d565b610db3338561080086856125d9565b5060019392505050565b60006106f4338484611472565b6001600160a01b0381166000908152600560205260408120548190815b81811015610eaa576001600160a01b0385166000908152600560205260409020805482908110610e2757634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154421015610e98576001600160a01b0385166000908152600560205260409020805482908110610e7857634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016000015483610e959190612582565b92505b80610ea28161262b565b915050610de7565b50909392505050565b6001600160a01b03811660009081526006602052604081205481908015610f78576001600160a01b0384166000908152600660205260408120600180820154600283015460039093015490939091610f0b90836125d9565b610f1590846125ba565b610f1f9085612582565b90504284811015610f3257859650610f72565b81811015610f72578284610f4683856125d9565b610f50919061259a565b610f5b906001612582565b610f6590886125ba565b610f6f919061259a565b96505b50505050505b5092915050565b3360009081526003602052604090205460ff16610fae5760405162461bcd60e51b815260040161061d9061250b565b60005460ff1615610fd15760405162461bcd60e51b815260040161061d906124e1565b610ffc84610ff4866001600160a01b031660009081526007602052604090205490565b858585611b83565b50505050565b6001546001600160a01b0316331461102c5760405162461bcd60e51b815260040161061d9061254d565b60005460ff161561104f5760405162461bcd60e51b815260040161061d906124e1565b61065281611db7565b6000546001600160a01b036101009091041633146110885760405162461bcd60e51b815260040161061d9061249a565b60005460ff16156110ab5760405162461bcd60e51b815260040161061d906124e1565b61065281611e00565b6000546001600160a01b036101009091041633146110e45760405162461bcd60e51b815260040161061d9061249a565b60005460ff16156111075760405162461bcd60e51b815260040161061d906124e1565b61065281611ece565b3360009081526003602052604090205460ff1661113f5760405162461bcd60e51b815260040161061d9061250b565b60005460ff16156111625760405162461bcd60e51b815260040161061d906124e1565b61065281611f8f565b6001546001600160a01b031633146111955760405162461bcd60e51b815260040161061d9061254d565b60005460ff16156111b85760405162461bcd60e51b815260040161061d906124e1565b61065281611fdb565b6001600160a01b038116600081815260026020526040808220805460ff19169055517f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e9190a250565b6001600160a01b03831661126c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161061d565b6001600160a01b0382166112cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161061d565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600082116113955760405162461bcd60e51b815260206004820152602d60248201527f54696d65204c6f636b3a206c6f636b20616d6f756e74206d757374206265206760448201526c0726561746572207468616e203609c1b606482015260840161061d565b4281116113fa5760405162461bcd60e51b815260206004820152602d60248201527f54696d65204c6f636b3a206578706972652064617465206d757374206265206c60448201526c61746572207468616e206e6f7760981b606482015260840161061d565b6001600160a01b0383166000818152600560209081526040808320815180830183528781528084018781528254600181810185559387529486209151600290950290910193845551920191909155517fc80fbc3452298019908587d820303825af4187ac57ed90d7328886fd00b225579190a2505050565b6001600160a01b0383166114d65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161061d565b6001600160a01b0382166115385760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161061d565b611543838383612027565b6001600160a01b038316600090815260076020526040902054818110156115bb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161061d565b6115c582826125d9565b6001600160a01b0380861660009081526007602052604080822093909355908516815290812080548492906115fb908490612582565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161164791815260200190565b60405180910390a350505050565b6001600160a01b038116600081815260046020526040808220805460ff19169055517f7e6adfec7e3f286831a0200a754127c171a2da564078722cb97704741bbdb0ea9190a250565b60005460ff166116e75760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161061d565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382166117915760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161061d565b6001600160a01b038216600090815260076020526040902054818110156118055760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161061d565b61180f82826125d9565b6001600160a01b0384166000908152600760205260408120919091556009805484929061183d9084906125d9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611322565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f7c5af8d36d8be103bc583da8e01d3e98f15216cc7ef38832c7550b34e8feb43a9190a250565b6001600160a01b03821660009081526005602052604090205460ff82161080156118f4575060015b6119405760405162461bcd60e51b815260206004820152601e60248201527f54696d65204c6f636b3a20696e646578206d7573742062652076616c69640000604482015260640161061d565b6001600160a01b03821660009081526005602052604090205460ff82166119686001836125d9565b14611a22576001600160a01b03831660009081526005602052604090206119906001836125d9565b815481106119ae57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160056000856001600160a01b03166001600160a01b031681526020019081526020016000208360ff1681548110611a0357634e487b7160e01b600052603260045260246000fd5b6000918252602090912082546002909202019081556001918201549101555b6001600160a01b0383166000908152600560205260409020805480611a5757634e487b7160e01b600052603160045260246000fd5b60008281526020812060026000199093019283020181815560010181905591556040516001600160a01b038516917fb34baa9e1ce392292123bbdca3018904b21991f7411e14d99a10aaf88ec8ea0d91a2505050565b60005460ff1615611ad05760405162461bcd60e51b815260040161061d906124e1565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586117143390565b6040805160808101825260008082526020808301828152838501838152606085018481526001600160a01b0388168086526006909452868520955186559151600186015551600285015551600390930192909255915190917f7f971c04434928242920539f17ece9f7b4573e28c8a037ad5bab0d6244e3defe91a250565b6001600160a01b038516611beb5760405162461bcd60e51b815260206004820152602960248201527f496e766573746f72204c6f636b3a206c6f636b2066726f6d20746865207a65726044820152686f206164647265737360b81b606482015260840161061d565b428311611c445760405162461bcd60e51b815260206004820152602160248201527f496e766573746f72204c6f636b3a206d75737420736574206166746572206e6f6044820152607760f81b606482015260840161061d565b60008411611c945760405162461bcd60e51b815260206004820152601a60248201527f496e766573746f72204c6f636b3a20616d6f756e742069732030000000000000604482015260640161061d565b60008211611ce45760405162461bcd60e51b815260206004820152601a60248201527f496e766573746f72204c6f636b3a20706572696f642069732030000000000000604482015260640161061d565b60008111611d345760405162461bcd60e51b815260206004820152601960248201527f496e766573746f72204c6f636b3a20636f756e74206973203000000000000000604482015260640161061d565b604080516080810182528581526020808201868152828401868152606084018681526001600160a01b038b166000818152600690955286852095518655925160018601559051600285015551600390930192909255915190917feffac4e68781c4782ae76a41b453f36a8ce3c9c165b5babc8dc0a5fccecb4f5991a25050505050565b6001600160a01b038116600081815260036020526040808220805460ff19169055517f95266445d018e5b30f957c915e91b04bb4a19bf0f8f21020a08dad9be7931df49190a250565b6001600160a01b038116611e6c5760405162461bcd60e51b815260206004820152602d60248201527f4f776e61626c653a206e65772068696464656e206f776e65722069732074686560448201526c207a65726f206164647265737360981b606482015260840161061d565b6001546040516001600160a01b038084169216907fb672a1daaed7f748e93d745145b3a425811d01bd57b1bda907ae08dcd8b6f76990600090a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b038116611f335760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161061d565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116600081815260046020526040808220805460ff19166001179055517f44427e3003a08f22cf803894075ac0297524e09e521fc1c15bc91741ce3dc1599190a250565b6001600160a01b038116600081815260026020526040808220805460ff19166001179055517f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b945609190a250565b6001600160a01b03831660009081526004602052604090205460ff16156120a55760405162461bcd60e51b815260206004820152602c60248201527f4c6f636b61626c653a20746f6b656e207472616e736665722066726f6d206c6f60448201526b18dad959081858d8dbdd5b9d60a21b606482015260840161061d565b6001600160a01b03821660009081526004602052604090205460ff16156121215760405162461bcd60e51b815260206004820152602a60248201527f4c6f636b61626c653a20746f6b656e207472616e7366657220746f206c6f636b6044820152691959081858d8dbdd5b9d60b21b606482015260840161061d565b61212a336103d4565b156121935760405162461bcd60e51b815260206004820152603360248201527f4c6f636b61626c653a20746f6b656e207472616e736665722063616c6c656420604482015272199c9bdb481b1bd8dad959081858d8dbdd5b9d606a1b606482015260840161061d565b60005460ff16156121f45760405162461bcd60e51b815260206004820152602560248201527f5061757361626c653a20746f6b656e207472616e73666572207768696c652070604482015264185d5cd95960da1b606482015260840161061d565b806121fe84610eb3565b61220785610dca565b6001600160a01b03861660009081526007602052604090205461222a91906125d9565b61223491906125d9565b101561075a5760405162461bcd60e51b815260206004820152603160248201527f4c6f636b61626c653a20746f6b656e207472616e736665722066726f6d2074696044820152701b59481b1bd8dad959081858d8dbdd5b9d607a1b606482015260840161061d565b80356001600160a01b038116811461082d57600080fd5b6000602082840312156122c4578081fd5b6122cd8261229c565b9392505050565b600080604083850312156122e6578081fd5b6122ef8361229c565b91506122fd6020840161229c565b90509250929050565b60008060006060848603121561231a578081fd5b6123238461229c565b92506123316020850161229c565b9150604084013590509250925092565b60008060408385031215612353578182fd5b61235c8361229c565b946020939093013593505050565b60008060006060848603121561237e578283fd5b6123878461229c565b95602085013595506040909401359392505050565b600080600080608085870312156123b1578081fd5b6123ba8561229c565b966020860135965060408601359560600135945092505050565b600080604083850312156123e6578182fd5b6123ef8361229c565b9150602083013560ff81168114612404578182fd5b809150509250929050565b600060208284031215612420578081fd5b815180151581146122cd578182fd5b600060208284031215612440578081fd5b5035919050565b6000602080835283518082850152825b8181101561247357858101830151858201604001528201612457565b818111156124845783604083870101525b50601f01601f1916929092016040019392505050565b60208082526027908201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206869646465604082015266371037bbb732b960c91b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526022908201527f4c6f636b61626c653a2063616c6c6572206973206e6f7420746865206c6f636b60408201526132b960f11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561259557612595612646565b500190565b6000826125b557634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156125d4576125d4612646565b500290565b6000828210156125eb576125eb612646565b500390565b60028104600182168061260457607f821691505b6020821081141561262557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561263f5761263f612646565b5060010190565b634e487b7160e01b600052601160045260246000fdfea264697066735822122062fb06ccd624a4ab126159cf496500e9ed5cfff34f8622c259e56afb454c9e2164736f6c63430008020033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102325760003560e01c806370a0823111610130578063be4329f4116100b8578063f14e88621161007c578063f14e886214610590578063f2fde38b146105a3578063f435f5a7146105b6578063f44637ba146105c9578063fbbdb68c146105dc57610232565b8063be4329f41461050b578063c896462d1461051e578063cdc9d74c14610531578063ce62cd4a14610544578063dd62ed3e1461055757610232565b806392d89c17116100ff57806392d89c17146104a157806395d89b41146104b4578063a457c2d7146104bc578063a9059cbb146104cf578063ba40c71a146104e257610232565b806370a08231146104385780638456cb59146104615780638980f11f146104695780638da5cb5b1461047c57610232565b8063313ce567116101be57806345cc58901161018257806345cc5890146103b35780634a4fbeec146103c65780634ca47ad1146103f25780635c975abb1461041a5780636f395c831461042557610232565b8063313ce5671461034a57806339509351146103595780633f4ba83a1461036c57806342966c68146103745780634334614a1461038757610232565b806318160ddd1161020557806318160ddd146102a057806323b872dd146102b2578063269043a6146102c55780632ec63d7c146103245780632f6c493c1461033757610232565b8063028468581461023757806306fdde031461024c578063095ea7b31461026a5780630d6054821461028d575b600080fd5b61024a6102453660046122b3565b6105f3565b005b610254610655565b6040516102619190612447565b60405180910390f35b61027d610278366004612341565b6106e7565b6040519015158152602001610261565b61024a61029b36600461236a565b6106fd565b6009545b604051908152602001610261565b61027d6102c0366004612306565b61075f565b6103046102d33660046122b3565b6001600160a01b03166000908152600660205260409020805460018201546002830154600390930154919390929190565b604080519485526020850193909352918301526060820152608001610261565b61027d6103323660046122b3565b610810565b61024a6103453660046122b3565b610832565b60405160128152602001610261565b61027d610367366004612341565b610888565b61024a6108bf565b61024a61038236600461242f565b61093c565b61027d6103953660046122b3565b6001600160a01b031660009081526002602052604090205460ff1690565b61024a6103c13660046122b3565b6109d2565b61027d6103d43660046122b3565b6001600160a01b031660009081526004602052604090205460ff1690565b6104056104003660046123d4565b610a28565b60408051928352602083019190915201610261565b60005460ff1661027d565b61024a6104333660046123d4565b610b42565b6102a46104463660046122b3565b6001600160a01b031660009081526007602052604090205490565b61024a610b9d565b61024a610477366004612341565b610bf2565b6001546001600160a01b03165b6040516001600160a01b039091168152602001610261565b61024a6104af3660046122b3565b610cbd565b610254610d13565b61027d6104ca366004612341565b610d22565b61027d6104dd366004612341565b610dbd565b6102a46104f03660046122b3565b6001600160a01b031660009081526005602052604090205490565b6102a46105193660046122b3565b610dca565b6102a461052c3660046122b3565b610eb3565b61024a61053f36600461239c565b610f7f565b61024a6105523660046122b3565b611002565b6102a46105653660046122d4565b6001600160a01b03918216600090815260086020908152604080832093909416825291909152205490565b61024a61059e3660046122b3565b611058565b61024a6105b13660046122b3565b6110b4565b61024a6105c43660046122b3565b611110565b61024a6105d73660046122b3565b61116b565b61048960005461010090046001600160a01b031690565b6001546001600160a01b031633146106265760405162461bcd60e51b815260040161061d9061254d565b60405180910390fd5b60005460ff16156106495760405162461bcd60e51b815260040161061d906124e1565b610652816111c1565b50565b6060600a8054610664906125f0565b80601f0160208091040260200160405190810160405280929190818152602001828054610690906125f0565b80156106dd5780601f106106b2576101008083540402835291602001916106dd565b820191906000526020600020905b8154815290600101906020018083116106c057829003601f168201915b5050505050905090565b60006106f433848461120a565b50600192915050565b3360009081526003602052604090205460ff1661072c5760405162461bcd60e51b815260040161061d9061250b565b60005460ff161561074f5760405162461bcd60e51b815260040161061d906124e1565b61075a83838361132f565b505050565b600061076c848484611472565b6001600160a01b0384166000908152600860209081526040808320338452909152902054828110156107f15760405162461bcd60e51b815260206004820152602860248201527f45524332303a207472616e7366657220616d6f756e74206578636565647320616044820152676c6c6f77616e636560c01b606482015260840161061d565b610805853361080086856125d9565b61120a565b506001949350505050565b6001600160a01b03811660009081526003602052604090205460ff165b919050565b6001546001600160a01b0316331461085c5760405162461bcd60e51b815260040161061d9061254d565b60005460ff161561087f5760405162461bcd60e51b815260040161061d906124e1565b61065281611655565b3360008181526008602090815260408083206001600160a01b038716845290915281205490916106f4918590610800908690612582565b6001546001600160a01b031633146108e95760405162461bcd60e51b815260040161061d9061254d565b60005460ff166109325760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161061d565b61093a61169e565b565b3360009081526002602052604090205460ff166109a55760405162461bcd60e51b815260206004820152602160248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206275726e656044820152603960f91b606482015260840161061d565b60005460ff16156109c85760405162461bcd60e51b815260040161061d906124e1565b6106523382611731565b6001546001600160a01b031633146109fc5760405162461bcd60e51b815260040161061d9061254d565b60005460ff1615610a1f5760405162461bcd60e51b815260040161061d906124e1565b61065281611880565b6001600160a01b038216600090815260056020526040812054819060ff8416108015610a52575060015b610a9e5760405162461bcd60e51b815260206004820152601e60248201527f54696d65204c6f636b3a20696e646578206d7573742062652076616c69640000604482015260640161061d565b6001600160a01b0384166000908152600560205260409020805460ff8516908110610ad957634e487b7160e01b600052603260045260246000fd5b600091825260208083206002909202909101546001600160a01b038716835260059091526040909120805460ff8616908110610b2557634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154915091509250929050565b6001546001600160a01b03163314610b6c5760405162461bcd60e51b815260040161061d9061254d565b60005460ff1615610b8f5760405162461bcd60e51b815260040161061d906124e1565b610b9982826118cc565b5050565b6001546001600160a01b03163314610bc75760405162461bcd60e51b815260040161061d9061254d565b60005460ff1615610bea5760405162461bcd60e51b815260040161061d906124e1565b61093a611aad565b6001546001600160a01b03163314610c1c5760405162461bcd60e51b815260040161061d9061254d565b816001600160a01b031663a9059cbb610c3d6001546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401602060405180830381600087803b158015610c8557600080fd5b505af1158015610c99573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061075a919061240f565b6001546001600160a01b03163314610ce75760405162461bcd60e51b815260040161061d9061254d565b60005460ff1615610d0a5760405162461bcd60e51b815260040161061d906124e1565b61065281611b05565b6060600b8054610664906125f0565b3360009081526008602090815260408083206001600160a01b038616845290915281205482811015610da45760405162461bcd60e51b815260206004820152602560248201527f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f77604482015264207a65726f60d81b606482015260840161061d565b610db3338561080086856125d9565b5060019392505050565b60006106f4338484611472565b6001600160a01b0381166000908152600560205260408120548190815b81811015610eaa576001600160a01b0385166000908152600560205260409020805482908110610e2757634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160010154421015610e98576001600160a01b0385166000908152600560205260409020805482908110610e7857634e487b7160e01b600052603260045260246000fd5b90600052602060002090600202016000015483610e959190612582565b92505b80610ea28161262b565b915050610de7565b50909392505050565b6001600160a01b03811660009081526006602052604081205481908015610f78576001600160a01b0384166000908152600660205260408120600180820154600283015460039093015490939091610f0b90836125d9565b610f1590846125ba565b610f1f9085612582565b90504284811015610f3257859650610f72565b81811015610f72578284610f4683856125d9565b610f50919061259a565b610f5b906001612582565b610f6590886125ba565b610f6f919061259a565b96505b50505050505b5092915050565b3360009081526003602052604090205460ff16610fae5760405162461bcd60e51b815260040161061d9061250b565b60005460ff1615610fd15760405162461bcd60e51b815260040161061d906124e1565b610ffc84610ff4866001600160a01b031660009081526007602052604090205490565b858585611b83565b50505050565b6001546001600160a01b0316331461102c5760405162461bcd60e51b815260040161061d9061254d565b60005460ff161561104f5760405162461bcd60e51b815260040161061d906124e1565b61065281611db7565b6000546001600160a01b036101009091041633146110885760405162461bcd60e51b815260040161061d9061249a565b60005460ff16156110ab5760405162461bcd60e51b815260040161061d906124e1565b61065281611e00565b6000546001600160a01b036101009091041633146110e45760405162461bcd60e51b815260040161061d9061249a565b60005460ff16156111075760405162461bcd60e51b815260040161061d906124e1565b61065281611ece565b3360009081526003602052604090205460ff1661113f5760405162461bcd60e51b815260040161061d9061250b565b60005460ff16156111625760405162461bcd60e51b815260040161061d906124e1565b61065281611f8f565b6001546001600160a01b031633146111955760405162461bcd60e51b815260040161061d9061254d565b60005460ff16156111b85760405162461bcd60e51b815260040161061d906124e1565b61065281611fdb565b6001600160a01b038116600081815260026020526040808220805460ff19169055517f90eabbc0c667db2a5029ed6bc0f5fe9f356d11684a4ca9fcfaec0e53f12b9c8e9190a250565b6001600160a01b03831661126c5760405162461bcd60e51b8152602060048201526024808201527f45524332303a20617070726f76652066726f6d20746865207a65726f206164646044820152637265737360e01b606482015260840161061d565b6001600160a01b0382166112cd5760405162461bcd60e51b815260206004820152602260248201527f45524332303a20617070726f766520746f20746865207a65726f206164647265604482015261737360f01b606482015260840161061d565b6001600160a01b0383811660008181526008602090815260408083209487168084529482529182902085905590518481527f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591015b60405180910390a3505050565b600082116113955760405162461bcd60e51b815260206004820152602d60248201527f54696d65204c6f636b3a206c6f636b20616d6f756e74206d757374206265206760448201526c0726561746572207468616e203609c1b606482015260840161061d565b4281116113fa5760405162461bcd60e51b815260206004820152602d60248201527f54696d65204c6f636b3a206578706972652064617465206d757374206265206c60448201526c61746572207468616e206e6f7760981b606482015260840161061d565b6001600160a01b0383166000818152600560209081526040808320815180830183528781528084018781528254600181810185559387529486209151600290950290910193845551920191909155517fc80fbc3452298019908587d820303825af4187ac57ed90d7328886fd00b225579190a2505050565b6001600160a01b0383166114d65760405162461bcd60e51b815260206004820152602560248201527f45524332303a207472616e736665722066726f6d20746865207a65726f206164604482015264647265737360d81b606482015260840161061d565b6001600160a01b0382166115385760405162461bcd60e51b815260206004820152602360248201527f45524332303a207472616e7366657220746f20746865207a65726f206164647260448201526265737360e81b606482015260840161061d565b611543838383612027565b6001600160a01b038316600090815260076020526040902054818110156115bb5760405162461bcd60e51b815260206004820152602660248201527f45524332303a207472616e7366657220616d6f756e7420657863656564732062604482015265616c616e636560d01b606482015260840161061d565b6115c582826125d9565b6001600160a01b0380861660009081526007602052604080822093909355908516815290812080548492906115fb908490612582565b92505081905550826001600160a01b0316846001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8460405161164791815260200190565b60405180910390a350505050565b6001600160a01b038116600081815260046020526040808220805460ff19169055517f7e6adfec7e3f286831a0200a754127c171a2da564078722cb97704741bbdb0ea9190a250565b60005460ff166116e75760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b604482015260640161061d565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0382166117915760405162461bcd60e51b815260206004820152602160248201527f45524332303a206275726e2066726f6d20746865207a65726f206164647265736044820152607360f81b606482015260840161061d565b6001600160a01b038216600090815260076020526040902054818110156118055760405162461bcd60e51b815260206004820152602260248201527f45524332303a206275726e20616d6f756e7420657863656564732062616c616e604482015261636560f01b606482015260840161061d565b61180f82826125d9565b6001600160a01b0384166000908152600760205260408120919091556009805484929061183d9084906125d9565b90915550506040518281526000906001600160a01b038516907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef90602001611322565b6001600160a01b038116600081815260036020526040808220805460ff19166001179055517f7c5af8d36d8be103bc583da8e01d3e98f15216cc7ef38832c7550b34e8feb43a9190a250565b6001600160a01b03821660009081526005602052604090205460ff82161080156118f4575060015b6119405760405162461bcd60e51b815260206004820152601e60248201527f54696d65204c6f636b3a20696e646578206d7573742062652076616c69640000604482015260640161061d565b6001600160a01b03821660009081526005602052604090205460ff82166119686001836125d9565b14611a22576001600160a01b03831660009081526005602052604090206119906001836125d9565b815481106119ae57634e487b7160e01b600052603260045260246000fd5b906000526020600020906002020160056000856001600160a01b03166001600160a01b031681526020019081526020016000208360ff1681548110611a0357634e487b7160e01b600052603260045260246000fd5b6000918252602090912082546002909202019081556001918201549101555b6001600160a01b0383166000908152600560205260409020805480611a5757634e487b7160e01b600052603160045260246000fd5b60008281526020812060026000199093019283020181815560010181905591556040516001600160a01b038516917fb34baa9e1ce392292123bbdca3018904b21991f7411e14d99a10aaf88ec8ea0d91a2505050565b60005460ff1615611ad05760405162461bcd60e51b815260040161061d906124e1565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586117143390565b6040805160808101825260008082526020808301828152838501838152606085018481526001600160a01b0388168086526006909452868520955186559151600186015551600285015551600390930192909255915190917f7f971c04434928242920539f17ece9f7b4573e28c8a037ad5bab0d6244e3defe91a250565b6001600160a01b038516611beb5760405162461bcd60e51b815260206004820152602960248201527f496e766573746f72204c6f636b3a206c6f636b2066726f6d20746865207a65726044820152686f206164647265737360b81b606482015260840161061d565b428311611c445760405162461bcd60e51b815260206004820152602160248201527f496e766573746f72204c6f636b3a206d75737420736574206166746572206e6f6044820152607760f81b606482015260840161061d565b60008411611c945760405162461bcd60e51b815260206004820152601a60248201527f496e766573746f72204c6f636b3a20616d6f756e742069732030000000000000604482015260640161061d565b60008211611ce45760405162461bcd60e51b815260206004820152601a60248201527f496e766573746f72204c6f636b3a20706572696f642069732030000000000000604482015260640161061d565b60008111611d345760405162461bcd60e51b815260206004820152601960248201527f496e766573746f72204c6f636b3a20636f756e74206973203000000000000000604482015260640161061d565b604080516080810182528581526020808201868152828401868152606084018681526001600160a01b038b166000818152600690955286852095518655925160018601559051600285015551600390930192909255915190917feffac4e68781c4782ae76a41b453f36a8ce3c9c165b5babc8dc0a5fccecb4f5991a25050505050565b6001600160a01b038116600081815260036020526040808220805460ff19169055517f95266445d018e5b30f957c915e91b04bb4a19bf0f8f21020a08dad9be7931df49190a250565b6001600160a01b038116611e6c5760405162461bcd60e51b815260206004820152602d60248201527f4f776e61626c653a206e65772068696464656e206f776e65722069732074686560448201526c207a65726f206164647265737360981b606482015260840161061d565b6001546040516001600160a01b038084169216907fb672a1daaed7f748e93d745145b3a425811d01bd57b1bda907ae08dcd8b6f76990600090a3600080546001600160a01b0390921661010002610100600160a81b0319909216919091179055565b6001600160a01b038116611f335760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b606482015260840161061d565b6001546040516001600160a01b038084169216907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a3600180546001600160a01b0319166001600160a01b0392909216919091179055565b6001600160a01b038116600081815260046020526040808220805460ff19166001179055517f44427e3003a08f22cf803894075ac0297524e09e521fc1c15bc91741ce3dc1599190a250565b6001600160a01b038116600081815260026020526040808220805460ff19166001179055517f86e57fd2b90329052917118de7c3f521f400d439b9650deaa906a25b08b945609190a250565b6001600160a01b03831660009081526004602052604090205460ff16156120a55760405162461bcd60e51b815260206004820152602c60248201527f4c6f636b61626c653a20746f6b656e207472616e736665722066726f6d206c6f60448201526b18dad959081858d8dbdd5b9d60a21b606482015260840161061d565b6001600160a01b03821660009081526004602052604090205460ff16156121215760405162461bcd60e51b815260206004820152602a60248201527f4c6f636b61626c653a20746f6b656e207472616e7366657220746f206c6f636b6044820152691959081858d8dbdd5b9d60b21b606482015260840161061d565b61212a336103d4565b156121935760405162461bcd60e51b815260206004820152603360248201527f4c6f636b61626c653a20746f6b656e207472616e736665722063616c6c656420604482015272199c9bdb481b1bd8dad959081858d8dbdd5b9d606a1b606482015260840161061d565b60005460ff16156121f45760405162461bcd60e51b815260206004820152602560248201527f5061757361626c653a20746f6b656e207472616e73666572207768696c652070604482015264185d5cd95960da1b606482015260840161061d565b806121fe84610eb3565b61220785610dca565b6001600160a01b03861660009081526007602052604090205461222a91906125d9565b61223491906125d9565b101561075a5760405162461bcd60e51b815260206004820152603160248201527f4c6f636b61626c653a20746f6b656e207472616e736665722066726f6d2074696044820152701b59481b1bd8dad959081858d8dbdd5b9d607a1b606482015260840161061d565b80356001600160a01b038116811461082d57600080fd5b6000602082840312156122c4578081fd5b6122cd8261229c565b9392505050565b600080604083850312156122e6578081fd5b6122ef8361229c565b91506122fd6020840161229c565b90509250929050565b60008060006060848603121561231a578081fd5b6123238461229c565b92506123316020850161229c565b9150604084013590509250925092565b60008060408385031215612353578182fd5b61235c8361229c565b946020939093013593505050565b60008060006060848603121561237e578283fd5b6123878461229c565b95602085013595506040909401359392505050565b600080600080608085870312156123b1578081fd5b6123ba8561229c565b966020860135965060408601359560600135945092505050565b600080604083850312156123e6578182fd5b6123ef8361229c565b9150602083013560ff81168114612404578182fd5b809150509250929050565b600060208284031215612420578081fd5b815180151581146122cd578182fd5b600060208284031215612440578081fd5b5035919050565b6000602080835283518082850152825b8181101561247357858101830151858201604001528201612457565b818111156124845783604083870101525b50601f01601f1916929092016040019392505050565b60208082526027908201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206869646465604082015266371037bbb732b960c91b606082015260800190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b60208082526022908201527f4c6f636b61626c653a2063616c6c6572206973206e6f7420746865206c6f636b60408201526132b960f11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6000821982111561259557612595612646565b500190565b6000826125b557634e487b7160e01b81526012600452602481fd5b500490565b60008160001904831182151516156125d4576125d4612646565b500290565b6000828210156125eb576125eb612646565b500390565b60028104600182168061260457607f821691505b6020821081141561262557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561263f5761263f612646565b5060010190565b634e487b7160e01b600052601160045260246000fdfea264697066735822122062fb06ccd624a4ab126159cf496500e9ed5cfff34f8622c259e56afb454c9e2164736f6c63430008020033

Deployed Bytecode Sourcemap

29023:4258:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31039:111;;;;;;:::i;:::-;;:::i;:::-;;8345:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10512:169;;;;;;:::i;:::-;;:::i;:::-;;;3540:14:1;;3533:22;3515:41;;3503:2;3488:18;10512:169:0;3470:92:1;32346:198:0;;;;;;:::i;:::-;;:::i;9465:108::-;9553:12;;9465:108;;;16186:25:1;;;16174:2;16159:18;9465:108:0;16141:76:1;11163:456:0;;;;;;:::i;:::-;;:::i;27498:349::-;;;;;;:::i;:::-;-1:-1:-1;;;;;27711:23:0;27602:7;27711:23;;;:14;:23;;;;;:30;;27743:32;;;;27777:30;;;;27809:29;;;;;27711:30;;27743:32;;27777:30;27809:29;27498:349;;;;;16706:25:1;;;16762:2;16747:18;;16740:34;;;;16790:18;;;16783:34;16848:2;16833:18;;16826:34;16693:3;16678:19;27498:349:0;16660:206:1;22411:105:0;;;;;;:::i;:::-;;:::i;32178:99::-;;;;;;:::i;:::-;;:::i;9307:93::-;;;9390:2;17013:36:1;;17001:2;16986:18;9307:93:0;16968:87:1;12028:215:0;;;;;;:::i;:::-;;:::i;31519:76::-;;;:::i;31208:108::-;;;;;;:::i;:::-;;:::i;20332:105::-;;;;;;:::i;:::-;-1:-1:-1;;;;;20412:17:0;20388:4;20412:17;;;:8;:17;;;;;;;;;20332:105;31660;;;;;;:::i;:::-;;:::i;23010:103::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23090:15:0;23066:4;23090:15;;;:6;:15;;;;;;;;;23010:103;25100:291;;;;;;:::i;:::-;;:::i;:::-;;;;16396:25:1;;;16452:2;16437:18;;16430:34;;;;16369:18;25100:291:0;16351:119:1;1932:86:0;1979:4;2003:7;;;1932:86;;32616:135;;;;;;:::i;:::-;;:::i;9636:127::-;;;;;;:::i;:::-;-1:-1:-1;;;;;9737:18:0;9710:7;9737:18;;;:9;:18;;;;;;;9636:127;31379:75;;;:::i;29440:152::-;;;;;;:::i;:::-;;:::i;18404:79::-;18469:6;;-1:-1:-1;;;;;18469:6:0;18404:79;;;-1:-1:-1;;;;;3052:32:1;;;3034:51;;3022:2;3007:18;18404:79:0;2989:102:1;33155:123:0;;;;;;:::i;:::-;;:::i;8564:104::-;;;:::i;12746:377::-;;;;;;:::i;:::-;;:::i;9976:175::-;;;;;;:::i;:::-;;:::i;24779:126::-;;;;;;:::i;:::-;-1:-1:-1;;;;;24871:19:0;24844:7;24871:19;;;:10;:19;;;;;:26;;24779:126;25575:438;;;;;;:::i;:::-;;:::i;28154:821::-;;;;;;:::i;:::-;;:::i;32824:255::-;;;;;;:::i;:::-;;:::i;31833:111::-;;;;;;:::i;:::-;;:::i;10214:151::-;;;;;;:::i;:::-;-1:-1:-1;;;;;10330:18:0;;;10303:7;10330:18;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;10214:151;30648:153;;;;;;:::i;:::-;;:::i;30432:129::-;;;;;;:::i;:::-;;:::i;32012:96::-;;;;;;:::i;:::-;;:::i;30866:105::-;;;;;;:::i;:::-;;:::i;18571:91::-;;18615:7;18642:12;;;;-1:-1:-1;;;;;18642:12:0;;18571:91;31039:111;18795:6;;-1:-1:-1;;;;;18795:6:0;681:10;18795:22;18787:67;;;;-1:-1:-1;;;18787:67:0;;;;;;;:::i;:::-;;;;;;;;;1979:4;2003:7;;;2257:9:::1;2249:38;;;;-1:-1:-1::0;;;2249:38:0::1;;;;;;;:::i;:::-;31120:22:::2;31134:7;31120:13;:22::i;:::-;31039:111:::0;:::o;8345:100::-;8399:13;8432:5;8425:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8345:100;:::o;10512:169::-;10595:4;10612:39;681:10;10635:7;10644:6;10612:8;:39::i;:::-;-1:-1:-1;10669:4:0;10512:169;;;;:::o;32346:198::-;681:10;22252:22;;;;:8;:22;;;;;;;;22244:69;;;;-1:-1:-1;;;22244:69:0;;;;;;;:::i;:::-;1979:4;2003:7;;;2257:9:::1;2249:38;;;;-1:-1:-1::0;;;2249:38:0::1;;;;;;;:::i;:::-;32496:40:::2;32509:7;32518:6;32526:9;32496:12;:40::i;:::-;32346:198:::0;;;:::o;11163:456::-;11303:4;11320:36;11330:6;11338:9;11349:6;11320:9;:36::i;:::-;-1:-1:-1;;;;;11396:19:0;;11369:24;11396:19;;;:11;:19;;;;;;;;681:10;11396:33;;;;;;;;11448:26;;;;11440:79;;;;-1:-1:-1;;;11440:79:0;;10672:2:1;11440:79:0;;;10654:21:1;10711:2;10691:18;;;10684:30;10750:34;10730:18;;;10723:62;-1:-1:-1;;;10801:18:1;;;10794:38;10849:19;;11440:79:0;10644:230:1;11440:79:0;11530:57;11539:6;681:10;11561:25;11580:6;11561:16;:25;:::i;:::-;11530:8;:57::i;:::-;-1:-1:-1;11607:4:0;;11163:456;-1:-1:-1;;;;11163:456:0:o;22411:105::-;-1:-1:-1;;;;;22491:17:0;;22467:4;22491:17;;;:8;:17;;;;;;;;22411:105;;;;:::o;32178:99::-;18795:6;;-1:-1:-1;;;;;18795:6:0;681:10;18795:22;18787:67;;;;-1:-1:-1;;;18787:67:0;;;;;;;:::i;:::-;1979:4;2003:7;;;2257:9:::1;2249:38;;;;-1:-1:-1::0;;;2249:38:0::1;;;;;;;:::i;:::-;32253:16:::2;32261:7;32253;:16::i;12028:215::-:0;681:10;12116:4;12165:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12165:34:0;;;;;;;;;;12116:4;;12133:80;;12156:7;;12165:47;;12202:10;;12165:47;:::i;31519:76::-;18795:6;;-1:-1:-1;;;;;18795:6:0;681:10;18795:22;18787:67;;;;-1:-1:-1;;;18787:67:0;;;;;;;:::i;:::-;1979:4;2003:7;;;2527:41:::1;;;::::0;-1:-1:-1;;;2527:41:0;;4781:2:1;2527:41:0::1;::::0;::::1;4763:21:1::0;4820:2;4800:18;;;4793:30;-1:-1:-1;;;4839:18:1;;;4832:50;4899:18;;2527:41:0::1;4753:170:1::0;2527:41:0::1;31577:10:::2;:8;:10::i;:::-;31519:76::o:0;31208:108::-;681:10;20572:22;;;;:8;:22;;;;;;;;20564:68;;;;-1:-1:-1;;;20564:68:0;;15840:2:1;20564:68:0;;;15822:21:1;15879:2;15859:18;;;15852:30;15918:34;15898:18;;;15891:62;-1:-1:-1;;;15969:18:1;;;15962:31;16010:19;;20564:68:0;15812:223:1;20564:68:0;1979:4;2003:7;;;2257:9:::1;2249:38;;;;-1:-1:-1::0;;;2249:38:0::1;;;;;;;:::i;:::-;31281:27:::2;681:10:::0;31301:6:::2;31281:5;:27::i;31660:105::-:0;18795:6;;-1:-1:-1;;;;;18795:6:0;681:10;18795:22;18787:67;;;;-1:-1:-1;;;18787:67:0;;;;;;;:::i;:::-;1979:4;2003:7;;;2257:9:::1;2249:38;;;;-1:-1:-1::0;;;2249:38:0::1;;;;;;;:::i;:::-;31738:19:::2;31749:7;31738:10;:19::i;25100:291::-:0;-1:-1:-1;;;;;25209:19:0;;25172:7;25209:19;;;:10;:19;;;;;:26;25172:7;;25209:34;;;-1:-1:-1;25209:48:0;;;;-1:-1:-1;25247:10:0;25209:48;25201:91;;;;-1:-1:-1;;;25201:91:0;;10313:2:1;25201:91:0;;;10295:21:1;10352:2;10332:18;;;10325:30;10391:32;10371:18;;;10364:60;10441:18;;25201:91:0;10285:180:1;25201:91:0;-1:-1:-1;;;;;25311:19:0;;;;;;:10;:19;;;;;:26;;;;;;;;;;-1:-1:-1;;;25311:26:0;;;;;;;;;;;;;;;;;;;;;;;;:33;-1:-1:-1;;;;;25346:19:0;;;;:10;:19;;;;;;;:26;;;;;;;;;;-1:-1:-1;;;25346:26:0;;;;;;;;;;;;;;;;;;;:36;;;25303:80;;;;25100:291;;;;;:::o;32616:135::-;18795:6;;-1:-1:-1;;;;;18795:6:0;681:10;18795:22;18787:67;;;;-1:-1:-1;;;18787:67:0;;;;;;;:::i;:::-;1979:4;2003:7;;;2257:9:::1;2249:38;;;;-1:-1:-1::0;;;2249:38:0::1;;;;;;;:::i;:::-;32712:31:::2;32728:7;32737:5;32712:15;:31::i;:::-;32616:135:::0;;:::o;31379:75::-;18795:6;;-1:-1:-1;;;;;18795:6:0;681:10;18795:22;18787:67;;;;-1:-1:-1;;;18787:67:0;;;;;;;:::i;:::-;1979:4;2003:7;;;2257:9:::1;2249:38;;;;-1:-1:-1::0;;;2249:38:0::1;;;;;;;:::i;:::-;31438:8:::2;:6;:8::i;29440:152::-:0;18795:6;;-1:-1:-1;;;;;18795:6:0;681:10;18795:22;18787:67;;;;-1:-1:-1;;;18787:67:0;;;;;;;:::i;:::-;29540:12:::1;-1:-1:-1::0;;;;;29533:29:0::1;;29563:7;18469:6:::0;;-1:-1:-1;;;;;18469:6:0;18404:79;;29563:7:::1;29533:51;::::0;-1:-1:-1;;;;;;29533:51:0::1;::::0;;;;;;-1:-1:-1;;;;;3288:32:1;;;29533:51:0::1;::::0;::::1;3270::1::0;3337:18;;;3330:34;;;3243:18;;29533:51:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;33155:123::-:0;18795:6;;-1:-1:-1;;;;;18795:6:0;681:10;18795:22;18787:67;;;;-1:-1:-1;;;18787:67:0;;;;;;;:::i;:::-;1979:4;2003:7;;;2257:9:::1;2249:38;;;;-1:-1:-1::0;;;2249:38:0::1;;;;;;;:::i;:::-;33242:28:::2;33262:7;33242:19;:28::i;8564:104::-:0;8620:13;8653:7;8646:14;;;;;:::i;12746:377::-;681:10;12839:4;12883:25;;;:11;:25;;;;;;;;-1:-1:-1;;;;;12883:34:0;;;;;;;;;;12936:35;;;;12928:85;;;;-1:-1:-1;;;12928:85:0;;15434:2:1;12928:85:0;;;15416:21:1;15473:2;15453:18;;;15446:30;15512:34;15492:18;;;15485:62;-1:-1:-1;;;15563:18:1;;;15556:35;15608:19;;12928:85:0;15406:227:1;12928:85:0;13024:67;681:10;13047:7;13056:34;13075:15;13056:16;:34;:::i;13024:67::-;-1:-1:-1;13111:4:0;;12746:377;-1:-1:-1;;;12746:377:0:o;9976:175::-;10062:4;10079:42;681:10;10103:9;10114:6;10079:9;:42::i;25575:438::-;-1:-1:-1;;;;;25717:19:0;;25642:7;25717:19;;;:10;:19;;;;;:26;25642:7;;;25754:218;25778:3;25774:1;:7;25754:218;;;-1:-1:-1;;;;;25825:19:0;;;;;;:10;:19;;;;;:22;;25845:1;;25825:22;;;;-1:-1:-1;;;25825:22:0;;;;;;;;;;;;;;;;;;;:32;;;25807:15;:50;25803:158;;;-1:-1:-1;;;;;25916:19:0;;;;;;:10;:19;;;;;:22;;25936:1;;25916:22;;;;-1:-1:-1;;;25916:22:0;;;;;;;;;;;;;;;;;;;:29;;;25897:16;:48;;;;:::i;:::-;25878:67;;25803:158;25783:3;;;;:::i;:::-;;;;25754:218;;;-1:-1:-1;25989:16:0;;25575:438;-1:-1:-1;;;25575:438:0:o;28154:821::-;-1:-1:-1;;;;;28305:23:0;;28225:7;28305:23;;;:14;:23;;;;;:30;28225:7;;28350:10;;28346:584;;-1:-1:-1;;;;;28396:23:0;;28377:16;28396:23;;;:14;:23;;;;;:32;;;;;28460:30;;;;28521:29;;;;;28396:32;;28521:29;;28606:9;;28521:29;28606:9;:::i;:::-;28596:20;;:6;:20;:::i;:::-;28585:31;;:8;:31;:::i;:::-;28565:51;-1:-1:-1;28651:15:0;28685:20;;;28681:238;;;28749:6;28726:29;;28681:238;;;28793:9;28781;:21;28777:142;;;28898:5;28883:6;28858:21;28870:9;28858;:21;:::i;:::-;28857:32;;;;:::i;:::-;:36;;28892:1;28857:36;:::i;:::-;28847:47;;:6;:47;:::i;:::-;28846:57;;;;:::i;:::-;28823:80;;28777:142;28346:584;;;;;;-1:-1:-1;28947:20:0;28154:821;-1:-1:-1;;28154:821:0:o;32824:255::-;681:10;22252:22;;;;:8;:22;;;;;;;;22244:69;;;;-1:-1:-1;;;22244:69:0;;;;;;;:::i;:::-;1979:4;2003:7;;;2257:9:::1;2249:38;;;;-1:-1:-1::0;;;2249:38:0::1;;;;;;;:::i;:::-;33001:70:::2;33018:7;33027:18;33037:7;-1:-1:-1::0;;;;;9737:18:0;9710:7;9737:18;;;:9;:18;;;;;;;9636:127;33027:18:::2;33047:8;33057:6;33065:5;33001:16;:70::i;:::-;32824:255:::0;;;;:::o;31833:111::-;18795:6;;-1:-1:-1;;;;;18795:6:0;681:10;18795:22;18787:67;;;;-1:-1:-1;;;18787:67:0;;;;;;;:::i;:::-;1979:4;2003:7;;;2257:9:::1;2249:38;;;;-1:-1:-1::0;;;2249:38:0::1;;;;;;;:::i;:::-;31914:22:::2;31928:7;31914:13;:22::i;30648:153::-:0;19020:12;;-1:-1:-1;;;;;19020:12:0;;;;;681:10;19020:28;19012:80;;;;-1:-1:-1;;;19012:80:0;;;;;;;:::i;:::-;1979:4;2003:7;;;2257:9:::1;2249:38;;;;-1:-1:-1::0;;;2249:38:0::1;;;;;;;:::i;:::-;30753:40:::2;30778:14;30753:24;:40::i;30432:129::-:0;19020:12;;-1:-1:-1;;;;;19020:12:0;;;;;681:10;19020:28;19012:80;;;;-1:-1:-1;;;19012:80:0;;;;;;;:::i;:::-;1979:4;2003:7;;;2257:9:::1;2249:38;;;;-1:-1:-1::0;;;2249:38:0::1;;;;;;;:::i;:::-;30525:28:::2;30544:8;30525:18;:28::i;32012:96::-:0;681:10;22252:22;;;;:8;:22;;;;;;;;22244:69;;;;-1:-1:-1;;;22244:69:0;;;;;;;:::i;:::-;1979:4;2003:7;;;2257:9:::1;2249:38;;;;-1:-1:-1::0;;;2249:38:0::1;;;;;;;:::i;:::-;32086:14:::2;32092:7;32086:5;:14::i;30866:105::-:0;18795:6;;-1:-1:-1;;;;;18795:6:0;681:10;18795:22;18787:67;;;;-1:-1:-1;;;18787:67:0;;;;;;;:::i;:::-;1979:4;2003:7;;;2257:9:::1;2249:38;;;;-1:-1:-1::0;;;2249:38:0::1;;;;;;;:::i;:::-;30944:19:::2;30955:7;30944:10;:19::i;20942:131::-:0;-1:-1:-1;;;;;21002:17:0;;21022:5;21002:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;21002:25:0;;;21043:22;;;21022:5;21043:22;20942:131;:::o;16012:380::-;-1:-1:-1;;;;;16148:19:0;;16140:68;;;;-1:-1:-1;;;16140:68:0;;13433:2:1;16140:68:0;;;13415:21:1;13472:2;13452:18;;;13445:30;13511:34;13491:18;;;13484:62;-1:-1:-1;;;13562:18:1;;;13555:34;13606:19;;16140:68:0;13405:226:1;16140:68:0;-1:-1:-1;;;;;16227:21:0;;16219:68;;;;-1:-1:-1;;;16219:68:0;;7172:2:1;16219:68:0;;;7154:21:1;7211:2;7191:18;;;7184:30;7250:34;7230:18;;;7223:62;-1:-1:-1;;;7301:18:1;;;7294:32;7343:19;;16219:68:0;7144:224:1;16219:68:0;-1:-1:-1;;;;;16300:18:0;;;;;;;:11;:18;;;;;;;;:27;;;;;;;;;;;;;:36;;;16352:32;;16186:25:1;;;16352:32:0;;16159:18:1;16352:32:0;;;;;;;;16012:380;;;:::o;23570:399::-;23715:1;23706:6;:10;23698:68;;;;-1:-1:-1;;;23698:68:0;;13019:2:1;23698:68:0;;;13001:21:1;13058:2;13038:18;;;13031:30;13097:34;13077:18;;;13070:62;-1:-1:-1;;;13148:18:1;;;13141:43;13201:19;;23698:68:0;12991:235:1;23698:68:0;23797:15;23785:9;:27;23777:85;;;;-1:-1:-1;;;23777:85:0;;15020:2:1;23777:85:0;;;15002:21:1;15059:2;15039:18;;;15032:30;15098:34;15078:18;;;15071:62;-1:-1:-1;;;15149:18:1;;;15142:43;15202:19;;23777:85:0;14992:235:1;23777:85:0;-1:-1:-1;;;;;23873:19:0;;;;;;:10;:19;;;;;;;;23898:27;;;;;;;;;;;;;;;;23873:53;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23942:19;;;23873;23942;23570:399;;;:::o;13613:638::-;-1:-1:-1;;;;;13753:20:0;;13745:70;;;;-1:-1:-1;;;13745:70:0;;12613:2:1;13745:70:0;;;12595:21:1;12652:2;12632:18;;;12625:30;12691:34;12671:18;;;12664:62;-1:-1:-1;;;12742:18:1;;;12735:35;12787:19;;13745:70:0;12585:227:1;13745:70:0;-1:-1:-1;;;;;13834:23:0;;13826:71;;;;-1:-1:-1;;;13826:71:0;;4377:2:1;13826:71:0;;;4359:21:1;4416:2;4396:18;;;4389:30;4455:34;4435:18;;;4428:62;-1:-1:-1;;;4506:18:1;;;4499:33;4549:19;;13826:71:0;4349:225:1;13826:71:0;13910:47;13931:6;13939:9;13950:6;13910:20;:47::i;:::-;-1:-1:-1;;;;;13994:17:0;;13970:21;13994:17;;;:9;:17;;;;;;14030:23;;;;14022:74;;;;-1:-1:-1;;;14022:74:0;;7995:2:1;14022:74:0;;;7977:21:1;8034:2;8014:18;;;8007:30;8073:34;8053:18;;;8046:62;-1:-1:-1;;;8124:18:1;;;8117:36;8170:19;;14022:74:0;7967:228:1;14022:74:0;14127:22;14143:6;14127:13;:22;:::i;:::-;-1:-1:-1;;;;;14107:17:0;;;;;;;:9;:17;;;;;;:42;;;;14160:20;;;;;;;;:30;;14184:6;;14107:17;14160:30;;14184:6;;14160:30;:::i;:::-;;;;;;;;14225:9;-1:-1:-1;;;;;14208:35:0;14217:6;-1:-1:-1;;;;;14208:35:0;;14236:6;14208:35;;;;16186:25:1;;16174:2;16159:18;;16141:76;14208:35:0;;;;;;;;13613:638;;;;:::o;23378:118::-;-1:-1:-1;;;;;23432:15:0;;23450:5;23432:15;;;:6;:15;;;;;;:23;;-1:-1:-1;;23432:23:0;;;23471:17;;;23450:5;23471:17;23378:118;:::o;2991:120::-;1979:4;2003:7;;;2527:41;;;;-1:-1:-1;;;2527:41:0;;4781:2:1;2527:41:0;;;4763:21:1;4820:2;4800:18;;;4793:30;-1:-1:-1;;;4839:18:1;;;4832:50;4899:18;;2527:41:0;4753:170:1;2527:41:0;3060:5:::1;3050:15:::0;;-1:-1:-1;;3050:15:0::1;::::0;;3081:22:::1;681:10:::0;3090:12:::1;3081:22;::::0;-1:-1:-1;;;;;3052:32:1;;;3034:51;;3022:2;3007:18;3081:22:0::1;;;;;;;2991:120::o:0;15142:432::-;-1:-1:-1;;;;;15226:21:0;;15218:67;;;;-1:-1:-1;;;15218:67:0;;12211:2:1;15218:67:0;;;12193:21:1;12250:2;12230:18;;;12223:30;12289:34;12269:18;;;12262:62;-1:-1:-1;;;12340:18:1;;;12333:31;12381:19;;15218:67:0;12183:223:1;15218:67:0;-1:-1:-1;;;;;15323:18:0;;15298:22;15323:18;;;:9;:18;;;;;;15360:24;;;;15352:71;;;;-1:-1:-1;;;15352:71:0;;5954:2:1;15352:71:0;;;5936:21:1;5993:2;5973:18;;;5966:30;6032:34;6012:18;;;6005:62;-1:-1:-1;;;6083:18:1;;;6076:32;6125:19;;15352:71:0;5926:224:1;15352:71:0;15455:23;15472:6;15455:14;:23;:::i;:::-;-1:-1:-1;;;;;15434:18:0;;;;;;:9;:18;;;;;:44;;;;15489:12;:22;;15505:6;;15434:18;15489:22;;15505:6;;15489:22;:::i;:::-;;;;-1:-1:-1;;15529:37:0;;16186:25:1;;;15555:1:0;;-1:-1:-1;;;;;15529:37:0;;;;;16174:2:1;16159:18;15529:37:0;16141:76:1;22593:125:0;-1:-1:-1;;;;;22650:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;22650:24:0;22670:4;22650:24;;;22690:20;;;22650:17;22690:20;22593:125;:::o;24146:464::-;-1:-1:-1;;;;;24229:19:0;;;;;;:10;:19;;;;;:26;:34;;;-1:-1:-1;24229:48:0;;;;-1:-1:-1;24267:10:0;24229:48;24221:91;;;;-1:-1:-1;;;24221:91:0;;10313:2:1;24221:91:0;;;10295:21:1;10352:2;10332:18;;;10325:30;10391:32;10371:18;;;10364:60;10441:18;;24221:91:0;10285:180:1;24221:91:0;-1:-1:-1;;;;;24339:19:0;;24325:11;24339:19;;;:10;:19;;;;;:26;24380:16;;;:7;24386:1;24339:26;24380:7;:::i;:::-;:16;24376:154;;-1:-1:-1;;;;;24490:19:0;;;;;;:10;:19;;;;;24510:7;24516:1;24510:3;:7;:::i;:::-;24490:28;;;;;;-1:-1:-1;;;24490:28:0;;;;;;;;;;;;;;;;;;;24461:10;:19;24472:7;-1:-1:-1;;;;;24461:19:0;-1:-1:-1;;;;;24461:19:0;;;;;;;;;;;;24481:5;24461:26;;;;;;;;-1:-1:-1;;;24461:26:0;;;;;;;;;;;;;;;;;:57;;:26;;;;;:57;;;;;;;;;;;24376:154;-1:-1:-1;;;;;24540:19:0;;;;;;:10;:19;;;;;:25;;;;;-1:-1:-1;;;24540:25:0;;;;;;;;;;;;;;;;;-1:-1:-1;;24540:25:0;;;;;;;;;;;;;;;;;24581:21;;-1:-1:-1;;;;;24581:21:0;;;;;;24146:464;;;:::o;2732:118::-;1979:4;2003:7;;;2257:9;2249:38;;;;-1:-1:-1;;;2249:38:0;;;;;;;:::i;:::-;2792:7:::1;:14:::0;;-1:-1:-1;;2792:14:0::1;2802:4;2792:14;::::0;;2822:20:::1;2829:12;681:10:::0;601:98;;27163:165;27255:24;;;;;;;;-1:-1:-1;27255:24:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;27229:23:0;;;;;:14;:23;;;;;;:50;;;;;;;;;;;;;;;;;;;;;;;;27295:25;;27229:23;;27295:25;;;27163:165;:::o;26366:645::-;-1:-1:-1;;;;;26554:21:0;;26546:75;;;;-1:-1:-1;;;26546:75:0;;13838:2:1;26546:75:0;;;13820:21:1;13877:2;13857:18;;;13850:30;13916:34;13896:18;;;13889:62;-1:-1:-1;;;13967:18:1;;;13960:39;14016:19;;26546:75:0;13810:231:1;26546:75:0;26651:15;26640:8;:26;26632:72;;;;-1:-1:-1;;;26632:72:0;;9102:2:1;26632:72:0;;;9084:21:1;9141:2;9121:18;;;9114:30;9180:34;9160:18;;;9153:62;-1:-1:-1;;;9231:18:1;;;9224:31;9272:19;;26632:72:0;9074:223:1;26632:72:0;26732:1;26723:6;:10;26715:49;;;;-1:-1:-1;;;26715:49:0;;8402:2:1;26715:49:0;;;8384:21:1;8441:2;8421:18;;;8414:30;8480:28;8460:18;;;8453:56;8526:18;;26715:49:0;8374:176:1;26715:49:0;26792:1;26783:6;:10;26775:49;;;;-1:-1:-1;;;26775:49:0;;11856:2:1;26775:49:0;;;11838:21:1;11895:2;11875:18;;;11868:30;11934:28;11914:18;;;11907:56;11980:18;;26775:49:0;11828:176:1;26775:49:0;26851:1;26843:5;:9;26835:47;;;;-1:-1:-1;;;26835:47:0;;14666:2:1;26835:47:0;;;14648:21:1;14705:2;14685:18;;;14678:30;14744:27;14724:18;;;14717:55;14789:18;;26835:47:0;14638:175:1;26835:47:0;26919:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;26893:23:0;;-1:-1:-1;26893:23:0;;;:14;:23;;;;;;:71;;;;;;;;;;;;;;;;;;;;;;;;;26980:23;;26893;;26980;;;26366:645;;;;;:::o;22801:131::-;-1:-1:-1;;;;;22861:17:0;;22881:5;22861:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;22861:25:0;;;22902:22;;;22881:5;22902:22;22801:131;:::o;19566:278::-;-1:-1:-1;;;;;19652:28:0;;19644:86;;;;-1:-1:-1;;;19644:86:0;;11442:2:1;19644:86:0;;;11424:21:1;11481:2;11461:18;;;11454:30;11520:34;11500:18;;;11493:62;-1:-1:-1;;;11571:18:1;;;11564:43;11624:19;;19644:86:0;11414:235:1;19644:86:0;19773:6;;19746:50;;-1:-1:-1;;;;;19746:50:0;;;;19773:6;;19746:50;;19773:6;;19746:50;19807:12;:29;;-1:-1:-1;;;;;19807:29:0;;;;;-1:-1:-1;;;;;;19807:29:0;;;;;;;;;19566:278::o;19218:229::-;-1:-1:-1;;;;;19292:22:0;;19284:73;;;;-1:-1:-1;;;19284:73:0;;6765:2:1;19284:73:0;;;6747:21:1;6804:2;6784:18;;;6777:30;6843:34;6823:18;;;6816:62;-1:-1:-1;;;6894:18:1;;;6887:36;6940:19;;19284:73:0;6737:228:1;19284:73:0;19394:6;;19373:38;;-1:-1:-1;;;;;19373:38:0;;;;19394:6;;19373:38;;19394:6;;19373:38;19422:6;:17;;-1:-1:-1;;;;;;19422:17:0;-1:-1:-1;;;;;19422:17:0;;;;;;;;;;19218:229::o;23187:113::-;-1:-1:-1;;;;;23239:15:0;;;;;;:6;:15;;;;;;:22;;-1:-1:-1;;23239:22:0;23257:4;23239:22;;;23277:15;;;23239;23277;23187:113;:::o;20730:125::-;-1:-1:-1;;;;;20787:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;20787:24:0;20807:4;20787:24;;;20827:20;;;20787:17;20827:20;20730:125;:::o;29668:684::-;-1:-1:-1;;;;;23090:15:0;;23066:4;23090:15;;;:6;:15;;;;;;;;29875;29867:72;;;;-1:-1:-1;;;29867:72:0;;5130:2:1;29867:72:0;;;5112:21:1;5169:2;5149:18;;;5142:30;5208:34;5188:18;;;5181:62;-1:-1:-1;;;5259:18:1;;;5252:42;5311:19;;29867:72:0;5102:234:1;29867:72:0;-1:-1:-1;;;;;23090:15:0;;23066:4;23090:15;;;:6;:15;;;;;;;;29958:13;29950:68;;;;-1:-1:-1;;;29950:68:0;;5543:2:1;29950:68:0;;;5525:21:1;5582:2;5562:18;;;5555:30;5621:34;5601:18;;;5594:62;-1:-1:-1;;;5672:18:1;;;5665:40;5722:19;;29950:68:0;5515:232:1;29950:68:0;30038:22;681:10;30047:12;601:98;30038:22;30037:23;30029:87;;;;-1:-1:-1;;;30029:87:0;;7575:2:1;30029:87:0;;;7557:21:1;7614:2;7594:18;;;7587:30;7653:34;7633:18;;;7626:62;-1:-1:-1;;;7704:18:1;;;7697:49;7763:19;;30029:87:0;7547:241:1;30029:87:0;1979:4;2003:7;;;30135:9;30127:59;;;;-1:-1:-1;;;30127:59:0;;9907:2:1;30127:59:0;;;9889:21:1;9946:2;9926:18;;;9919:30;9985:34;9965:18;;;9958:62;-1:-1:-1;;;10036:18:1;;;10029:35;10081:19;;30127:59:0;9879:227:1;30127:59:0;30284:6;30251:29;30275:4;30251:23;:29::i;:::-;30223:25;30243:4;30223:19;:25::i;:::-;-1:-1:-1;;;;;9737:18:0;;9710:7;9737:18;;;:9;:18;;;;;;30205:43;;;;:::i;:::-;:75;;;;:::i;:::-;:85;;30197:147;;;;-1:-1:-1;;;30197:147:0;;14248:2:1;30197:147:0;;;14230:21:1;14287:2;14267:18;;;14260:30;14326:34;14306:18;;;14299:62;-1:-1:-1;;;14377:18:1;;;14370:47;14434:19;;30197:147:0;14220:239:1;14:173;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:2;;177:1;174;167:12;192:196;;304:2;292:9;283:7;279:23;275:32;272:2;;;325:6;317;310:22;272:2;353:29;372:9;353:29;:::i;:::-;343:39;262:126;-1:-1:-1;;;262:126:1:o;393:270::-;;;522:2;510:9;501:7;497:23;493:32;490:2;;;543:6;535;528:22;490:2;571:29;590:9;571:29;:::i;:::-;561:39;;619:38;653:2;642:9;638:18;619:38;:::i;:::-;609:48;;480:183;;;;;:::o;668:338::-;;;;814:2;802:9;793:7;789:23;785:32;782:2;;;835:6;827;820:22;782:2;863:29;882:9;863:29;:::i;:::-;853:39;;911:38;945:2;934:9;930:18;911:38;:::i;:::-;901:48;;996:2;985:9;981:18;968:32;958:42;;772:234;;;;;:::o;1011:264::-;;;1140:2;1128:9;1119:7;1115:23;1111:32;1108:2;;;1161:6;1153;1146:22;1108:2;1189:29;1208:9;1189:29;:::i;:::-;1179:39;1265:2;1250:18;;;;1237:32;;-1:-1:-1;;;1098:177:1:o;1280:332::-;;;;1426:2;1414:9;1405:7;1401:23;1397:32;1394:2;;;1447:6;1439;1432:22;1394:2;1475:29;1494:9;1475:29;:::i;:::-;1465:39;1551:2;1536:18;;1523:32;;-1:-1:-1;1602:2:1;1587:18;;;1574:32;;1384:228;-1:-1:-1;;;1384:228:1:o;1617:401::-;;;;;1780:3;1768:9;1759:7;1755:23;1751:33;1748:2;;;1802:6;1794;1787:22;1748:2;1830:29;1849:9;1830:29;:::i;:::-;1820:39;1906:2;1891:18;;1878:32;;-1:-1:-1;1957:2:1;1942:18;;1929:32;;2008:2;1993:18;1980:32;;-1:-1:-1;1738:280:1;-1:-1:-1;;;1738:280:1:o;2023:363::-;;;2150:2;2138:9;2129:7;2125:23;2121:32;2118:2;;;2171:6;2163;2156:22;2118:2;2199:29;2218:9;2199:29;:::i;:::-;2189:39;;2278:2;2267:9;2263:18;2250:32;2322:4;2315:5;2311:16;2304:5;2301:27;2291:2;;2347:6;2339;2332:22;2291:2;2375:5;2365:15;;;2108:278;;;;;:::o;2391:297::-;;2511:2;2499:9;2490:7;2486:23;2482:32;2479:2;;;2532:6;2524;2517:22;2479:2;2569:9;2563:16;2622:5;2615:13;2608:21;2601:5;2598:32;2588:2;;2649:6;2641;2634:22;2693:190;;2805:2;2793:9;2784:7;2780:23;2776:32;2773:2;;;2826:6;2818;2811:22;2773:2;-1:-1:-1;2854:23:1;;2763:120;-1:-1:-1;2763:120:1:o;3567:603::-;;3708:2;3737;3726:9;3719:21;3769:6;3763:13;3812:6;3807:2;3796:9;3792:18;3785:34;3837:4;3850:140;3864:6;3861:1;3858:13;3850:140;;;3959:14;;;3955:23;;3949:30;3925:17;;;3944:2;3921:26;3914:66;3879:10;;3850:140;;;4008:6;4005:1;4002:13;3999:2;;;4078:4;4073:2;4064:6;4053:9;4049:22;4045:31;4038:45;3999:2;-1:-1:-1;4154:2:1;4133:15;-1:-1:-1;;4129:29:1;4114:45;;;;4161:2;4110:54;;3688:482;-1:-1:-1;;;3688:482:1:o;6155:403::-;6357:2;6339:21;;;6396:2;6376:18;;;6369:30;6435:34;6430:2;6415:18;;6408:62;-1:-1:-1;;;6501:2:1;6486:18;;6479:37;6548:3;6533:19;;6329:229::o;8555:340::-;8757:2;8739:21;;;8796:2;8776:18;;;8769:30;-1:-1:-1;;;8830:2:1;8815:18;;8808:46;8886:2;8871:18;;8729:166::o;9302:398::-;9504:2;9486:21;;;9543:2;9523:18;;;9516:30;9582:34;9577:2;9562:18;;9555:62;-1:-1:-1;;;9648:2:1;9633:18;;9626:32;9690:3;9675:19;;9476:224::o;10879:356::-;11081:2;11063:21;;;11100:18;;;11093:30;11159:34;11154:2;11139:18;;11132:62;11226:2;11211:18;;11053:182::o;17060:128::-;;17131:1;17127:6;17124:1;17121:13;17118:2;;;17137:18;;:::i;:::-;-1:-1:-1;17173:9:1;;17108:80::o;17193:217::-;;17259:1;17249:2;;-1:-1:-1;;;17284:31:1;;17338:4;17335:1;17328:15;17366:4;17291:1;17356:15;17249:2;-1:-1:-1;17395:9:1;;17239:171::o;17415:168::-;;17521:1;17517;17513:6;17509:14;17506:1;17503:21;17498:1;17491:9;17484:17;17480:45;17477:2;;;17528:18;;:::i;:::-;-1:-1:-1;17568:9:1;;17467:116::o;17588:125::-;;17656:1;17653;17650:8;17647:2;;;17661:18;;:::i;:::-;-1:-1:-1;17698:9:1;;17637:76::o;17718:380::-;17803:1;17793:12;;17850:1;17840:12;;;17861:2;;17915:4;17907:6;17903:17;17893:27;;17861:2;17968;17960:6;17957:14;17937:18;17934:38;17931:2;;;18014:10;18009:3;18005:20;18002:1;17995:31;18049:4;18046:1;18039:15;18077:4;18074:1;18067:15;17931:2;;17773:325;;;:::o;18103:135::-;;-1:-1:-1;;18163:17:1;;18160:2;;;18183:18;;:::i;:::-;-1:-1:-1;18230:1:1;18219:13;;18150:88::o;18243:127::-;18304:10;18299:3;18295:20;18292:1;18285:31;18335:4;18332:1;18325:15;18359:4;18356:1;18349:15

Swarm Source

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