ETH Price: $3,024.16 (+2.19%)
Gas: 2 Gwei

Token

Neuro Credits (NEURO)
 

Overview

Max Total Supply

83,000,000 NEURO

Holders

700

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-

Other Info

Token Contract (WITH 18 Decimals)

Balance
75,000 NEURO

Value
$0.00
0x2cc39b5d1458e0991fb826bd518cc279597758ec
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:
NeuroCredit

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**
 *Submitted for verification at Etherscan.io on 2021-09-04
*/

/**
 *Submitted for verification at Etherscan.io on 2021-09-01
*/

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

/**
 * @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.
 *
 * _Available since v4.1._
 */
interface IERC20Metadata is IERC20 {
    /**
     * @dev Returns the name of the token.
     */
    function name() external view returns (string memory);

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

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

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

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

    uint256 private _totalSupply;

    string private _name;
    string private _symbol;

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

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

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

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

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

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

    /**
     * @dev See {IERC20-transfer}.
     *
     * Requirements:
     *
     * - `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"
        );
        unchecked {
            _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"
        );
        unchecked {
            _approve(_msgSender(), spender, currentAllowance - subtractedValue);
        }

        return true;
    }

    /**
     * @dev Moves `amount` of tokens from `sender` to `recipient`.
     *
     * This internal function is equivalent to {transfer}, and can be used to
     * e.g. implement automatic token fees, slashing mechanisms, etc.
     *
     * Emits a {Transfer} event.
     *
     * Requirements:
     *
     * - `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"
        );
        unchecked {
            _balances[sender] = senderBalance - amount;
        }
        _balances[recipient] += amount;

        emit Transfer(sender, recipient, amount);

        _afterTokenTransfer(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:
     *
     * - `account` cannot be the zero address.
     */
    function _mint(address account, uint256 amount) internal virtual {
        require(account != address(0), "ERC20: mint to the zero address");

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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

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

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

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

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

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

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

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

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

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

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

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


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

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

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

/// @title Neuro Credits for gear holders!
/// Original author: Will Papper <https://twitter.com/WillPapper>
/// @notice This contract mints Neuro Credits for gear holders and provides
/// administrative functions to the gear DAO. It allows:
/// * gear holders to claim Neuro Credits
/// * A DAO to set seasons for new opportunities to claim Neuro Credits
/// * A DAO to mint Neuro Credits for use within the gear ecosystem
/// @custom:unaudited This contract has not been audited. Use at your own risk.
contract NeuroCredit is Context, Ownable, ERC20 {
    // gear contract is available at https://etherscan.io/address/0xff796cbbe32b2150a4585a3791cadb213d0f35a3
    address public gearContractAddress =
        0xFf796cbbe32B2150A4585a3791CADb213D0F35A3;
    IERC721Enumerable public gearContract;

    // Give out 25,000 Neuro Credit for every gear Bag that a user holds
    uint256 public NeuroCreditPerTokenId = 25000 * (10**decimals());

    // tokenIdStart of 1 is based on the following lines in the gear contract:
    /** 
    function claim(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId < 7778, "Token ID invalid");
        _safeMint(_msgSender(), tokenId);
    }
    */
    uint256 public tokenIdStart = 1;

    // tokenIdEnd of 7777 is based on the following lines in the gear contract:
    /**
        function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId > 7777 && tokenId < 8001, "Token ID invalid");
        _safeMint(owner(), tokenId);
    }
    */
    uint256 public tokenIdEnd = 7777;

    // Seasons are used to allow users to claim tokens regularly. Seasons are
    // decided by the DAO.
    uint256 public season = 0;

    // Track claimed tokens within a season
    // IMPORTANT: The format of the mapping is:
    // claimedForSeason[season][tokenId][claimed]
    mapping(uint256 => mapping(uint256 => bool)) public seasonClaimedByTokenId;

    constructor() Ownable() ERC20("Neuro Credits", "NEURO") {
        // Transfer ownership to the gear DAO
        // Ownable by OpenZeppelin automatically sets owner to msg.sender, but
        // we're going to be using a separate wallet for deployment
        transferOwnership(_msgSender());
        gearContract = IERC721Enumerable(gearContractAddress);
    }

    /// @notice Claim Neuro Credits for a given gear ID
    /// @param tokenId The tokenId of the gear NFT
    function claimById(uint256 tokenId) external {
        // Follow the Checks-Effects-Interactions pattern to prevent reentrancy
        // attacks

        // Checks

        // Check that the msgSender owns the token that is being claimed
        require(
            _msgSender() == gearContract.ownerOf(tokenId),
            "MUST_OWN_TOKEN_ID"
        );

        // Further Checks, Effects, and Interactions are contained within the
        // _claim() function
        _claim(tokenId, _msgSender());
    }

    /// @notice Claim Neuro Credits for all tokens owned by the sender
    /// @notice This function will run out of gas if you have too much gear! If
    /// this is a concern, you should use claimRangeForOwner and claim Neuro
    /// Credits in batches.
    function claimAllForOwner() external {
        uint256 tokenBalanceOwner = gearContract.balanceOf(_msgSender());

        // Checks
        require(tokenBalanceOwner > 0, "NO_TOKENS_OWNED");

        // i < tokenBalanceOwner because tokenBalanceOwner is 1-indexed
        for (uint256 i = 0; i < tokenBalanceOwner; i++) {
            // Further Checks, Effects, and Interactions are contained within
            // the _claim() function
            _claim(
                gearContract.tokenOfOwnerByIndex(_msgSender(), i),
                _msgSender()
            );
        }
    }

    /// @notice Claim Neuro Credits for all tokens owned by the sender within a
    /// given range
    /// @notice This function is useful if you own too much gear to claim all at
    /// once or if you want to leave some gear unclaimed. If you leave gear
    /// unclaimed, however, you cannot claim it once the next season starts.
    function claimRangeForOwner(uint256 ownerIndexStart, uint256 ownerIndexEnd)
        external
    {
        uint256 tokenBalanceOwner = gearContract.balanceOf(_msgSender());

        // Checks
        require(tokenBalanceOwner > 0, "NO_TOKENS_OWNED");

        // We use < for ownerIndexEnd and tokenBalanceOwner because
        // tokenOfOwnerByIndex is 0-indexed while the token balance is 1-indexed
        require(
            ownerIndexStart >= 0 && ownerIndexEnd < tokenBalanceOwner,
            "INDEX_OUT_OF_RANGE"
        );

        // i <= ownerIndexEnd because ownerIndexEnd is 0-indexed
        for (uint256 i = ownerIndexStart; i <= ownerIndexEnd; i++) {
            // Further Checks, Effects, and Interactions are contained within
            // the _claim() function
            _claim(
                gearContract.tokenOfOwnerByIndex(_msgSender(), i),
                _msgSender()
            );
        }
    }

    /// @dev Internal function to mint gear upon claiming
    function _claim(uint256 tokenId, address tokenOwner) internal {
        // Checks
        // Check that the token ID is in range
        // We use >= and <= to here because all of the token IDs are 0-indexed
        require(
            tokenId >= tokenIdStart && tokenId <= tokenIdEnd,
            "TOKEN_ID_OUT_OF_RANGE"
        );

        // Check that Neuro Credits have not already been claimed this season
        // for a given tokenId
        require(
            !seasonClaimedByTokenId[season][tokenId],
            "CREDIT_CLAIMED_FOR_TOKEN_ID"
        );

        // Effects

        // Mark that Neuro Credits has been claimed for this season for the
        // given tokenId
        seasonClaimedByTokenId[season][tokenId] = true;

        // Interactions

        // Send Neuro Credits to the owner of the token ID
        _mint(tokenOwner, NeuroCreditPerTokenId);
    }

    /// @notice Allows the DAO to mint new tokens for use within the gear
    /// Ecosystem
    /// @param amountDisplayValue The amount of gear to mint. This should be
    /// input as the display value, not in raw decimals. If you want to mint
    /// 100 gear, you should enter "100" rather than the value of 100 * 10^18.
    function daoMint(uint256 amountDisplayValue) external onlyOwner {
        _mint(owner(), amountDisplayValue * (10**decimals()));
    }

    /// @notice Allows the DAO to set a new contract address for gear. This is
    /// relevant in the event that gear migrates to a new contract.
    /// @param gearContractAddress_ The new contract address for gear
    function daoSetgearContractAddress(address gearContractAddress_)
        external
        onlyOwner
    {
        gearContractAddress = gearContractAddress_;
        gearContract = IERC721Enumerable(gearContractAddress);
    }

    /// @notice Allows the DAO to set the token IDs that are eligible to claim
    /// gear
    /// @param tokenIdStart_ The start of the eligible token range
    /// @param tokenIdEnd_ The end of the eligible token range
    /// @dev This is relevant in case a future gear contract has a different
    /// total supply of gear
    function daoSetTokenIdRange(uint256 tokenIdStart_, uint256 tokenIdEnd_)
        external
        onlyOwner
    {
        tokenIdStart = tokenIdStart_;
        tokenIdEnd = tokenIdEnd_;
    }

    /// @notice Allows the DAO to set a season for new Neuro Credits claims
    /// @param season_ The season to use for claiming gear
    function daoSetSeason(uint256 season_) public onlyOwner {
        season = season_;
    }

    /// @notice Allows the DAO to set the amount of Neuro Credits that is
    /// claimed per token ID
    /// @param NeuroCreditDisplayValue The amount of gear a user can claim.
    /// This should be input as the display value, not in raw decimals. If you
    /// want to mint 100 gear, you should enter "100" rather than the value of
    /// 100 * 10^18.
    function daoSetNeuroCreditPerTokenId(uint256 NeuroCreditDisplayValue)
        public
        onlyOwner
    {
        NeuroCreditPerTokenId = NeuroCreditDisplayValue * (10**decimals());
    }

    /// @notice Allows the DAO to set the season and Neuro Credits per token ID
    /// in one transaction. This ensures that there is not a gap where a user
    /// can claim more Neuro Credits than others
    /// @param season_ The season to use for claiming gear
    /// @param NeuroCreditDisplayValue The amount of gear a user can claim.
    /// This should be input as the display value, not in raw decimals. If you
    /// want to mint 100 gear, you should enter "100" rather than the value of
    /// 100 * 10^18.
    /// @dev We would save a tiny amount of gas by modifying the season and
    /// NeuroCredit variables directly. It is better practice for security,
    /// however, to avoid repeating code. This function is so rarely used that
    /// it's not worth moving these values into their own internal function to
    /// skip the gas used on the modifier check.
    function daoSetSeasonAndNeuroCreditPerTokenID(
        uint256 season_,
        uint256 NeuroCreditDisplayValue
    ) external onlyOwner {
        daoSetSeason(season_);
        daoSetNeuroCreditPerTokenId(NeuroCreditDisplayValue);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"spender","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"NeuroCreditPerTokenId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"spender","type":"address"}],"name":"allowance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"spender","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"approve","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimAllForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimById","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"ownerIndexStart","type":"uint256"},{"internalType":"uint256","name":"ownerIndexEnd","type":"uint256"}],"name":"claimRangeForOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"amountDisplayValue","type":"uint256"}],"name":"daoMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"NeuroCreditDisplayValue","type":"uint256"}],"name":"daoSetNeuroCreditPerTokenId","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"season_","type":"uint256"}],"name":"daoSetSeason","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"season_","type":"uint256"},{"internalType":"uint256","name":"NeuroCreditDisplayValue","type":"uint256"}],"name":"daoSetSeasonAndNeuroCreditPerTokenID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenIdStart_","type":"uint256"},{"internalType":"uint256","name":"tokenIdEnd_","type":"uint256"}],"name":"daoSetTokenIdRange","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"gearContractAddress_","type":"address"}],"name":"daoSetgearContractAddress","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":[],"name":"gearContract","outputs":[{"internalType":"contract IERC721Enumerable","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gearContractAddress","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":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"season","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"uint256","name":"","type":"uint256"}],"name":"seasonClaimedByTokenId","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIdEnd","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"tokenIdStart","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"transfer","outputs":[{"internalType":"bool","name":"","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":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405273ff796cbbe32b2150a4585a3791cadb213d0f35a3600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000069620001f060201b60201c565b600a620000779190620005b2565b6161a8620000869190620006ef565b6008556001600955611e61600a556000600b55348015620000a657600080fd5b506040518060400160405280600d81526020017f4e6575726f2043726564697473000000000000000000000000000000000000008152506040518060400160405280600581526020017f4e4555524f0000000000000000000000000000000000000000000000000000008152506200013362000127620001f960201b60201c565b6200020160201b60201c565b81600490805190602001906200014b92919062000404565b5080600590805190602001906200016492919062000404565b505050620001876200017b620001f960201b60201c565b620002c560201b60201c565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000880565b60006012905090565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002d5620001f960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002fb620003db60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000354576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200034b9062000524565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415620003c7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003be9062000502565b60405180910390fd5b620003d8816200020160201b60201c565b50565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620004129062000767565b90600052602060002090601f01602090048101928262000436576000855562000482565b82601f106200045157805160ff191683800117855562000482565b8280016001018555821562000482579182015b828111156200048157825182559160200191906001019062000464565b5b50905062000491919062000495565b5090565b5b80821115620004b057600081600090555060010162000496565b5090565b6000620004c360268362000546565b9150620004d08262000808565b604082019050919050565b6000620004ea60208362000546565b9150620004f78262000857565b602082019050919050565b600060208201905081810360008301526200051d81620004b4565b9050919050565b600060208201905081810360008301526200053f81620004db565b9050919050565b600082825260208201905092915050565b6000808291508390505b6001851115620005a9578086048111156200058157620005806200079d565b5b6001851615620005915780820291505b8081029050620005a185620007fb565b945062000561565b94509492505050565b6000620005bf8262000750565b9150620005cc836200075a565b9250620005fb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff848462000603565b905092915050565b600082620006155760019050620006e8565b81620006255760009050620006e8565b81600181146200063e576002811462000649576200067f565b6001915050620006e8565b60ff8411156200065e576200065d6200079d565b5b8360020a9150848211156200067857620006776200079d565b5b50620006e8565b5060208310610133831016604e8410600b8410161715620006b95782820a905083811115620006b357620006b26200079d565b5b620006e8565b620006c8848484600162000557565b92509050818404811115620006e257620006e16200079d565b5b81810290505b9392505050565b6000620006fc8262000750565b9150620007098362000750565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156200074557620007446200079d565b5b828202905092915050565b6000819050919050565b600060ff82169050919050565b600060028204905060018216806200078057607f821691505b60208210811415620007975762000796620007cc565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60008160011c9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b612cdb80620008906000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c8063715018a611610104578063ab46966c116100a2578063dd62ed3e11610071578063dd62ed3e14610521578063e5e808cb14610551578063e91b090414610581578063f2fde38b1461059d576101da565b8063ab46966c146104bf578063becf7741146104dd578063c50b0fb0146104f9578063cbf0b27614610517576101da565b80638da5cb5b116100de5780638da5cb5b1461042357806395d89b4114610441578063a457c2d71461045f578063a9059cbb1461048f576101da565b8063715018a6146103e15780637cb14e4b146103eb578063878e7ea514610407576101da565b8063395093511161017c578063446d756c1161014b578063446d756c1461035b5780634da7808a1461037957806362759f6c1461039557806370a08231146103b1576101da565b806339509351146102d55780633da54e841461030557806342e473151461032157806343f428021461033d576101da565b806323b872dd116101b857806323b872dd1461024b57806325f04af01461027b5780632a38906214610299578063313ce567146102b7576101da565b806306fdde03146101df578063095ea7b3146101fd57806318160ddd1461022d575b600080fd5b6101e76105b9565b6040516101f491906122c8565b60405180910390f35b61021760048036038101906102129190611ef3565b61064b565b6040516102249190612292565b60405180910390f35b610235610669565b60405161024291906124ca565b60405180910390f35b61026560048036038101906102609190611ea4565b610673565b6040516102729190612292565b60405180910390f35b61028361076b565b60405161029091906122ad565b60405180910390f35b6102a1610791565b6040516102ae91906124ca565b60405180910390f35b6102bf610797565b6040516102cc91906124e5565b60405180910390f35b6102ef60048036038101906102ea9190611ef3565b6107a0565b6040516102fc9190612292565b60405180910390f35b61031f600480360381019061031a9190611e16565b61084c565b005b61033b60048036038101906103369190611f2f565b61096f565b005b6103456109f5565b60405161035291906124ca565b60405180910390f35b6103636109fb565b60405161037091906124ca565b60405180910390f35b610393600480360381019061038e9190611f81565b610a01565b005b6103af60048036038101906103aa9190611f2f565b610a8f565b005b6103cb60048036038101906103c69190611e16565b610b3d565b6040516103d891906124ca565b60405180910390f35b6103e9610b86565b005b61040560048036038101906104009190611f2f565b610c0e565b005b610421600480360381019061041c9190611f81565b610cb2565b005b61042b610ee4565b604051610438919061224e565b60405180910390f35b610449610f0d565b60405161045691906122c8565b60405180910390f35b61047960048036038101906104749190611ef3565b610f9f565b6040516104869190612292565b60405180910390f35b6104a960048036038101906104a49190611ef3565b61108a565b6040516104b69190612292565b60405180910390f35b6104c76110a8565b6040516104d4919061224e565b60405180910390f35b6104f760048036038101906104f29190611f2f565b6110ce565b005b610501611201565b60405161050e91906124ca565b60405180910390f35b61051f611207565b005b61053b60048036038101906105369190611e68565b6113e6565b60405161054891906124ca565b60405180910390f35b61056b60048036038101906105669190611f81565b61146d565b6040516105789190612292565b60405180910390f35b61059b60048036038101906105969190611f81565b61149c565b005b6105b760048036038101906105b29190611e16565b61152e565b005b6060600480546105c8906127e9565b80601f01602080910402602001604051908101604052809291908181526020018280546105f4906127e9565b80156106415780601f1061061657610100808354040283529160200191610641565b820191906000526020600020905b81548152906001019060200180831161062457829003601f168201915b5050505050905090565b600061065f610658611626565b848461162e565b6001905092915050565b6000600354905090565b60006106808484846117f9565b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006106cb611626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561074b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610742906123ca565b60405180910390fd5b61075f85610757611626565b85840361162e565b60019150509392505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b60006012905090565b60006108426107ad611626565b8484600260006107bb611626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461083d919061251c565b61162e565b6001905092915050565b610854611626565b73ffffffffffffffffffffffffffffffffffffffff16610872610ee4565b73ffffffffffffffffffffffffffffffffffffffff16146108c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bf906123ea565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610977611626565b73ffffffffffffffffffffffffffffffffffffffff16610995610ee4565b73ffffffffffffffffffffffffffffffffffffffff16146109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e2906123ea565b60405180910390fd5b80600b8190555050565b600a5481565b60085481565b610a09611626565b73ffffffffffffffffffffffffffffffffffffffff16610a27610ee4565b73ffffffffffffffffffffffffffffffffffffffff1614610a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a74906123ea565b60405180910390fd5b8160098190555080600a819055505050565b610a97611626565b73ffffffffffffffffffffffffffffffffffffffff16610ab5610ee4565b73ffffffffffffffffffffffffffffffffffffffff1614610b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b02906123ea565b60405180910390fd5b610b3a610b16610ee4565b610b1e610797565b600a610b2a91906125c5565b83610b3591906126e3565b611a7d565b50565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b8e611626565b73ffffffffffffffffffffffffffffffffffffffff16610bac610ee4565b73ffffffffffffffffffffffffffffffffffffffff1614610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf9906123ea565b60405180910390fd5b610c0c6000611bde565b565b610c16611626565b73ffffffffffffffffffffffffffffffffffffffff16610c34610ee4565b73ffffffffffffffffffffffffffffffffffffffff1614610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c81906123ea565b60405180910390fd5b610c92610797565b600a610c9e91906125c5565b81610ca991906126e3565b60088190555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610cfa611626565b6040518263ffffffff1660e01b8152600401610d16919061224e565b60206040518083038186803b158015610d2e57600080fd5b505afa158015610d42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d669190611f58565b905060008111610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da29061246a565b60405180910390fd5b60008310158015610dbb57508082105b610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df19061230a565b60405180910390fd5b60008390505b828111610ede57610ecb600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59610e50611626565b846040518363ffffffff1660e01b8152600401610e6e929190612269565b60206040518083038186803b158015610e8657600080fd5b505afa158015610e9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebe9190611f58565b610ec6611626565b611ca2565b8080610ed69061281b565b915050610e00565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060058054610f1c906127e9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f48906127e9565b8015610f955780601f10610f6a57610100808354040283529160200191610f95565b820191906000526020600020905b815481529060010190602001808311610f7857829003601f168201915b5050505050905090565b60008060026000610fae611626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561106b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110629061248a565b60405180910390fd5b61107f611076611626565b8585840361162e565b600191505092915050565b600061109e611097611626565b84846117f9565b6001905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b815260040161112991906124ca565b60206040518083038186803b15801561114157600080fd5b505afa158015611155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111799190611e3f565b73ffffffffffffffffffffffffffffffffffffffff16611197611626565b73ffffffffffffffffffffffffffffffffffffffff16146111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e49061238a565b60405180910390fd5b6111fe816111f9611626565b611ca2565b50565b600b5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823161124f611626565b6040518263ffffffff1660e01b815260040161126b919061224e565b60206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bb9190611f58565b905060008111611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f79061246a565b60405180910390fd5b60005b818110156113e2576113cf600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59611354611626565b846040518363ffffffff1660e01b8152600401611372929190612269565b60206040518083038186803b15801561138a57600080fd5b505afa15801561139e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c29190611f58565b6113ca611626565b611ca2565b80806113da9061281b565b915050611303565b5050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6114a4611626565b73ffffffffffffffffffffffffffffffffffffffff166114c2610ee4565b73ffffffffffffffffffffffffffffffffffffffff1614611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f906123ea565b60405180910390fd5b6115218261096f565b61152a81610c0e565b5050565b611536611626565b73ffffffffffffffffffffffffffffffffffffffff16611554610ee4565b73ffffffffffffffffffffffffffffffffffffffff16146115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a1906123ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116119061232a565b60405180910390fd5b61162381611bde565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561169e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116959061242a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561170e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117059061234a565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117ec91906124ca565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611869576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118609061240a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d0906122ea565b60405180910390fd5b6118e4838383611db8565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561196b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119629061236a565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a00919061251c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a6491906124ca565b60405180910390a3611a77848484611dbd565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae4906124aa565b60405180910390fd5b611af960008383611db8565b8060036000828254611b0b919061251c565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b61919061251c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611bc691906124ca565b60405180910390a3611bda60008383611dbd565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6009548210158015611cb65750600a548211155b611cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cec9061244a565b60405180910390fd5b600c6000600b548152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff1615611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d60906123aa565b60405180910390fd5b6001600c6000600b548152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff021916908315150217905550611db481600854611a7d565b5050565b505050565b505050565b600081359050611dd181612c77565b92915050565b600081519050611de681612c77565b92915050565b600081359050611dfb81612c8e565b92915050565b600081519050611e1081612c8e565b92915050565b600060208284031215611e2857600080fd5b6000611e3684828501611dc2565b91505092915050565b600060208284031215611e5157600080fd5b6000611e5f84828501611dd7565b91505092915050565b60008060408385031215611e7b57600080fd5b6000611e8985828601611dc2565b9250506020611e9a85828601611dc2565b9150509250929050565b600080600060608486031215611eb957600080fd5b6000611ec786828701611dc2565b9350506020611ed886828701611dc2565b9250506040611ee986828701611dec565b9150509250925092565b60008060408385031215611f0657600080fd5b6000611f1485828601611dc2565b9250506020611f2585828601611dec565b9150509250929050565b600060208284031215611f4157600080fd5b6000611f4f84828501611dec565b91505092915050565b600060208284031215611f6a57600080fd5b6000611f7884828501611e01565b91505092915050565b60008060408385031215611f9457600080fd5b6000611fa285828601611dec565b9250506020611fb385828601611dec565b9150509250929050565b611fc68161273d565b82525050565b611fd58161274f565b82525050565b611fe481612792565b82525050565b6000611ff582612500565b611fff818561250b565b935061200f8185602086016127b6565b612018816128c2565b840191505092915050565b600061203060238361250b565b915061203b826128e0565b604082019050919050565b600061205360128361250b565b915061205e8261292f565b602082019050919050565b600061207660268361250b565b915061208182612958565b604082019050919050565b600061209960228361250b565b91506120a4826129a7565b604082019050919050565b60006120bc60268361250b565b91506120c7826129f6565b604082019050919050565b60006120df60118361250b565b91506120ea82612a45565b602082019050919050565b6000612102601b8361250b565b915061210d82612a6e565b602082019050919050565b600061212560288361250b565b915061213082612a97565b604082019050919050565b600061214860208361250b565b915061215382612ae6565b602082019050919050565b600061216b60258361250b565b915061217682612b0f565b604082019050919050565b600061218e60248361250b565b915061219982612b5e565b604082019050919050565b60006121b160158361250b565b91506121bc82612bad565b602082019050919050565b60006121d4600f8361250b565b91506121df82612bd6565b602082019050919050565b60006121f760258361250b565b915061220282612bff565b604082019050919050565b600061221a601f8361250b565b915061222582612c4e565b602082019050919050565b6122398161277b565b82525050565b61224881612785565b82525050565b60006020820190506122636000830184611fbd565b92915050565b600060408201905061227e6000830185611fbd565b61228b6020830184612230565b9392505050565b60006020820190506122a76000830184611fcc565b92915050565b60006020820190506122c26000830184611fdb565b92915050565b600060208201905081810360008301526122e28184611fea565b905092915050565b6000602082019050818103600083015261230381612023565b9050919050565b6000602082019050818103600083015261232381612046565b9050919050565b6000602082019050818103600083015261234381612069565b9050919050565b600060208201905081810360008301526123638161208c565b9050919050565b60006020820190508181036000830152612383816120af565b9050919050565b600060208201905081810360008301526123a3816120d2565b9050919050565b600060208201905081810360008301526123c3816120f5565b9050919050565b600060208201905081810360008301526123e381612118565b9050919050565b600060208201905081810360008301526124038161213b565b9050919050565b600060208201905081810360008301526124238161215e565b9050919050565b6000602082019050818103600083015261244381612181565b9050919050565b60006020820190508181036000830152612463816121a4565b9050919050565b60006020820190508181036000830152612483816121c7565b9050919050565b600060208201905081810360008301526124a3816121ea565b9050919050565b600060208201905081810360008301526124c38161220d565b9050919050565b60006020820190506124df6000830184612230565b92915050565b60006020820190506124fa600083018461223f565b92915050565b600081519050919050565b600082825260208201905092915050565b60006125278261277b565b91506125328361277b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561256757612566612864565b5b828201905092915050565b6000808291508390505b60018511156125bc5780860481111561259857612597612864565b5b60018516156125a75780820291505b80810290506125b5856128d3565b945061257c565b94509492505050565b60006125d08261277b565b91506125db83612785565b92506126087fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612610565b905092915050565b60008261262057600190506126dc565b8161262e57600090506126dc565b8160018114612644576002811461264e5761267d565b60019150506126dc565b60ff8411156126605761265f612864565b5b8360020a91508482111561267757612676612864565b5b506126dc565b5060208310610133831016604e8410600b84101617156126b25782820a9050838111156126ad576126ac612864565b5b6126dc565b6126bf8484846001612572565b925090508184048111156126d6576126d5612864565b5b81810290505b9392505050565b60006126ee8261277b565b91506126f98361277b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561273257612731612864565b5b828202905092915050565b60006127488261275b565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061279d826127a4565b9050919050565b60006127af8261275b565b9050919050565b60005b838110156127d45780820151818401526020810190506127b9565b838111156127e3576000848401525b50505050565b6000600282049050600182168061280157607f821691505b6020821081141561281557612814612893565b5b50919050565b60006128268261277b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561285957612858612864565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f494e4445585f4f55545f4f465f52414e47450000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4d5553545f4f574e5f544f4b454e5f4944000000000000000000000000000000600082015250565b7f4352454449545f434c41494d45445f464f525f544f4b454e5f49440000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f544f4b454e5f49445f4f55545f4f465f52414e47450000000000000000000000600082015250565b7f4e4f5f544f4b454e535f4f574e45440000000000000000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b612c808161273d565b8114612c8b57600080fd5b50565b612c978161277b565b8114612ca257600080fd5b5056fea2646970667358221220b5a494a95e6555731d9ab6e3a1f948a721cd657199afeb37665fad4a104f666464736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c8063715018a611610104578063ab46966c116100a2578063dd62ed3e11610071578063dd62ed3e14610521578063e5e808cb14610551578063e91b090414610581578063f2fde38b1461059d576101da565b8063ab46966c146104bf578063becf7741146104dd578063c50b0fb0146104f9578063cbf0b27614610517576101da565b80638da5cb5b116100de5780638da5cb5b1461042357806395d89b4114610441578063a457c2d71461045f578063a9059cbb1461048f576101da565b8063715018a6146103e15780637cb14e4b146103eb578063878e7ea514610407576101da565b8063395093511161017c578063446d756c1161014b578063446d756c1461035b5780634da7808a1461037957806362759f6c1461039557806370a08231146103b1576101da565b806339509351146102d55780633da54e841461030557806342e473151461032157806343f428021461033d576101da565b806323b872dd116101b857806323b872dd1461024b57806325f04af01461027b5780632a38906214610299578063313ce567146102b7576101da565b806306fdde03146101df578063095ea7b3146101fd57806318160ddd1461022d575b600080fd5b6101e76105b9565b6040516101f491906122c8565b60405180910390f35b61021760048036038101906102129190611ef3565b61064b565b6040516102249190612292565b60405180910390f35b610235610669565b60405161024291906124ca565b60405180910390f35b61026560048036038101906102609190611ea4565b610673565b6040516102729190612292565b60405180910390f35b61028361076b565b60405161029091906122ad565b60405180910390f35b6102a1610791565b6040516102ae91906124ca565b60405180910390f35b6102bf610797565b6040516102cc91906124e5565b60405180910390f35b6102ef60048036038101906102ea9190611ef3565b6107a0565b6040516102fc9190612292565b60405180910390f35b61031f600480360381019061031a9190611e16565b61084c565b005b61033b60048036038101906103369190611f2f565b61096f565b005b6103456109f5565b60405161035291906124ca565b60405180910390f35b6103636109fb565b60405161037091906124ca565b60405180910390f35b610393600480360381019061038e9190611f81565b610a01565b005b6103af60048036038101906103aa9190611f2f565b610a8f565b005b6103cb60048036038101906103c69190611e16565b610b3d565b6040516103d891906124ca565b60405180910390f35b6103e9610b86565b005b61040560048036038101906104009190611f2f565b610c0e565b005b610421600480360381019061041c9190611f81565b610cb2565b005b61042b610ee4565b604051610438919061224e565b60405180910390f35b610449610f0d565b60405161045691906122c8565b60405180910390f35b61047960048036038101906104749190611ef3565b610f9f565b6040516104869190612292565b60405180910390f35b6104a960048036038101906104a49190611ef3565b61108a565b6040516104b69190612292565b60405180910390f35b6104c76110a8565b6040516104d4919061224e565b60405180910390f35b6104f760048036038101906104f29190611f2f565b6110ce565b005b610501611201565b60405161050e91906124ca565b60405180910390f35b61051f611207565b005b61053b60048036038101906105369190611e68565b6113e6565b60405161054891906124ca565b60405180910390f35b61056b60048036038101906105669190611f81565b61146d565b6040516105789190612292565b60405180910390f35b61059b60048036038101906105969190611f81565b61149c565b005b6105b760048036038101906105b29190611e16565b61152e565b005b6060600480546105c8906127e9565b80601f01602080910402602001604051908101604052809291908181526020018280546105f4906127e9565b80156106415780601f1061061657610100808354040283529160200191610641565b820191906000526020600020905b81548152906001019060200180831161062457829003601f168201915b5050505050905090565b600061065f610658611626565b848461162e565b6001905092915050565b6000600354905090565b60006106808484846117f9565b6000600260008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006106cb611626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561074b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610742906123ca565b60405180910390fd5b61075f85610757611626565b85840361162e565b60019150509392505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60095481565b60006012905090565b60006108426107ad611626565b8484600260006107bb611626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461083d919061251c565b61162e565b6001905092915050565b610854611626565b73ffffffffffffffffffffffffffffffffffffffff16610872610ee4565b73ffffffffffffffffffffffffffffffffffffffff16146108c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108bf906123ea565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b610977611626565b73ffffffffffffffffffffffffffffffffffffffff16610995610ee4565b73ffffffffffffffffffffffffffffffffffffffff16146109eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109e2906123ea565b60405180910390fd5b80600b8190555050565b600a5481565b60085481565b610a09611626565b73ffffffffffffffffffffffffffffffffffffffff16610a27610ee4565b73ffffffffffffffffffffffffffffffffffffffff1614610a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a74906123ea565b60405180910390fd5b8160098190555080600a819055505050565b610a97611626565b73ffffffffffffffffffffffffffffffffffffffff16610ab5610ee4565b73ffffffffffffffffffffffffffffffffffffffff1614610b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b02906123ea565b60405180910390fd5b610b3a610b16610ee4565b610b1e610797565b600a610b2a91906125c5565b83610b3591906126e3565b611a7d565b50565b6000600160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b8e611626565b73ffffffffffffffffffffffffffffffffffffffff16610bac610ee4565b73ffffffffffffffffffffffffffffffffffffffff1614610c02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bf9906123ea565b60405180910390fd5b610c0c6000611bde565b565b610c16611626565b73ffffffffffffffffffffffffffffffffffffffff16610c34610ee4565b73ffffffffffffffffffffffffffffffffffffffff1614610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c81906123ea565b60405180910390fd5b610c92610797565b600a610c9e91906125c5565b81610ca991906126e3565b60088190555050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231610cfa611626565b6040518263ffffffff1660e01b8152600401610d16919061224e565b60206040518083038186803b158015610d2e57600080fd5b505afa158015610d42573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d669190611f58565b905060008111610dab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da29061246a565b60405180910390fd5b60008310158015610dbb57508082105b610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df19061230a565b60405180910390fd5b60008390505b828111610ede57610ecb600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59610e50611626565b846040518363ffffffff1660e01b8152600401610e6e929190612269565b60206040518083038186803b158015610e8657600080fd5b505afa158015610e9a573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ebe9190611f58565b610ec6611626565b611ca2565b8080610ed69061281b565b915050610e00565b50505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060058054610f1c906127e9565b80601f0160208091040260200160405190810160405280929190818152602001828054610f48906127e9565b8015610f955780601f10610f6a57610100808354040283529160200191610f95565b820191906000526020600020905b815481529060010190602001808311610f7857829003601f168201915b5050505050905090565b60008060026000610fae611626565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508281101561106b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110629061248a565b60405180910390fd5b61107f611076611626565b8585840361162e565b600191505092915050565b600061109e611097611626565b84846117f9565b6001905092915050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e826040518263ffffffff1660e01b815260040161112991906124ca565b60206040518083038186803b15801561114157600080fd5b505afa158015611155573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111799190611e3f565b73ffffffffffffffffffffffffffffffffffffffff16611197611626565b73ffffffffffffffffffffffffffffffffffffffff16146111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e49061238a565b60405180910390fd5b6111fe816111f9611626565b611ca2565b50565b600b5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a0823161124f611626565b6040518263ffffffff1660e01b815260040161126b919061224e565b60206040518083038186803b15801561128357600080fd5b505afa158015611297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906112bb9190611f58565b905060008111611300576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112f79061246a565b60405180910390fd5b60005b818110156113e2576113cf600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16632f745c59611354611626565b846040518363ffffffff1660e01b8152600401611372929190612269565b60206040518083038186803b15801561138a57600080fd5b505afa15801561139e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113c29190611f58565b6113ca611626565b611ca2565b80806113da9061281b565b915050611303565b5050565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b600c6020528160005260406000206020528060005260406000206000915091509054906101000a900460ff1681565b6114a4611626565b73ffffffffffffffffffffffffffffffffffffffff166114c2610ee4565b73ffffffffffffffffffffffffffffffffffffffff1614611518576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150f906123ea565b60405180910390fd5b6115218261096f565b61152a81610c0e565b5050565b611536611626565b73ffffffffffffffffffffffffffffffffffffffff16611554610ee4565b73ffffffffffffffffffffffffffffffffffffffff16146115aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115a1906123ea565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561161a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116119061232a565b60405180910390fd5b61162381611bde565b50565b600033905090565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561169e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116959061242a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561170e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117059061234a565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b925836040516117ec91906124ca565b60405180910390a3505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611869576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118609061240a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156118d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118d0906122ea565b60405180910390fd5b6118e4838383611db8565b6000600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205490508181101561196b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119629061236a565b60405180910390fd5b818103600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555081600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a00919061251c565b925050819055508273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef84604051611a6491906124ca565b60405180910390a3611a77848484611dbd565b50505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611aed576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae4906124aa565b60405180910390fd5b611af960008383611db8565b8060036000828254611b0b919061251c565b9250508190555080600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b61919061251c565b925050819055508173ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef83604051611bc691906124ca565b60405180910390a3611bda60008383611dbd565b5050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6009548210158015611cb65750600a548211155b611cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cec9061244a565b60405180910390fd5b600c6000600b548152602001908152602001600020600083815260200190815260200160002060009054906101000a900460ff1615611d69576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d60906123aa565b60405180910390fd5b6001600c6000600b548152602001908152602001600020600084815260200190815260200160002060006101000a81548160ff021916908315150217905550611db481600854611a7d565b5050565b505050565b505050565b600081359050611dd181612c77565b92915050565b600081519050611de681612c77565b92915050565b600081359050611dfb81612c8e565b92915050565b600081519050611e1081612c8e565b92915050565b600060208284031215611e2857600080fd5b6000611e3684828501611dc2565b91505092915050565b600060208284031215611e5157600080fd5b6000611e5f84828501611dd7565b91505092915050565b60008060408385031215611e7b57600080fd5b6000611e8985828601611dc2565b9250506020611e9a85828601611dc2565b9150509250929050565b600080600060608486031215611eb957600080fd5b6000611ec786828701611dc2565b9350506020611ed886828701611dc2565b9250506040611ee986828701611dec565b9150509250925092565b60008060408385031215611f0657600080fd5b6000611f1485828601611dc2565b9250506020611f2585828601611dec565b9150509250929050565b600060208284031215611f4157600080fd5b6000611f4f84828501611dec565b91505092915050565b600060208284031215611f6a57600080fd5b6000611f7884828501611e01565b91505092915050565b60008060408385031215611f9457600080fd5b6000611fa285828601611dec565b9250506020611fb385828601611dec565b9150509250929050565b611fc68161273d565b82525050565b611fd58161274f565b82525050565b611fe481612792565b82525050565b6000611ff582612500565b611fff818561250b565b935061200f8185602086016127b6565b612018816128c2565b840191505092915050565b600061203060238361250b565b915061203b826128e0565b604082019050919050565b600061205360128361250b565b915061205e8261292f565b602082019050919050565b600061207660268361250b565b915061208182612958565b604082019050919050565b600061209960228361250b565b91506120a4826129a7565b604082019050919050565b60006120bc60268361250b565b91506120c7826129f6565b604082019050919050565b60006120df60118361250b565b91506120ea82612a45565b602082019050919050565b6000612102601b8361250b565b915061210d82612a6e565b602082019050919050565b600061212560288361250b565b915061213082612a97565b604082019050919050565b600061214860208361250b565b915061215382612ae6565b602082019050919050565b600061216b60258361250b565b915061217682612b0f565b604082019050919050565b600061218e60248361250b565b915061219982612b5e565b604082019050919050565b60006121b160158361250b565b91506121bc82612bad565b602082019050919050565b60006121d4600f8361250b565b91506121df82612bd6565b602082019050919050565b60006121f760258361250b565b915061220282612bff565b604082019050919050565b600061221a601f8361250b565b915061222582612c4e565b602082019050919050565b6122398161277b565b82525050565b61224881612785565b82525050565b60006020820190506122636000830184611fbd565b92915050565b600060408201905061227e6000830185611fbd565b61228b6020830184612230565b9392505050565b60006020820190506122a76000830184611fcc565b92915050565b60006020820190506122c26000830184611fdb565b92915050565b600060208201905081810360008301526122e28184611fea565b905092915050565b6000602082019050818103600083015261230381612023565b9050919050565b6000602082019050818103600083015261232381612046565b9050919050565b6000602082019050818103600083015261234381612069565b9050919050565b600060208201905081810360008301526123638161208c565b9050919050565b60006020820190508181036000830152612383816120af565b9050919050565b600060208201905081810360008301526123a3816120d2565b9050919050565b600060208201905081810360008301526123c3816120f5565b9050919050565b600060208201905081810360008301526123e381612118565b9050919050565b600060208201905081810360008301526124038161213b565b9050919050565b600060208201905081810360008301526124238161215e565b9050919050565b6000602082019050818103600083015261244381612181565b9050919050565b60006020820190508181036000830152612463816121a4565b9050919050565b60006020820190508181036000830152612483816121c7565b9050919050565b600060208201905081810360008301526124a3816121ea565b9050919050565b600060208201905081810360008301526124c38161220d565b9050919050565b60006020820190506124df6000830184612230565b92915050565b60006020820190506124fa600083018461223f565b92915050565b600081519050919050565b600082825260208201905092915050565b60006125278261277b565b91506125328361277b565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561256757612566612864565b5b828201905092915050565b6000808291508390505b60018511156125bc5780860481111561259857612597612864565b5b60018516156125a75780820291505b80810290506125b5856128d3565b945061257c565b94509492505050565b60006125d08261277b565b91506125db83612785565b92506126087fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8484612610565b905092915050565b60008261262057600190506126dc565b8161262e57600090506126dc565b8160018114612644576002811461264e5761267d565b60019150506126dc565b60ff8411156126605761265f612864565b5b8360020a91508482111561267757612676612864565b5b506126dc565b5060208310610133831016604e8410600b84101617156126b25782820a9050838111156126ad576126ac612864565b5b6126dc565b6126bf8484846001612572565b925090508184048111156126d6576126d5612864565b5b81810290505b9392505050565b60006126ee8261277b565b91506126f98361277b565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561273257612731612864565b5b828202905092915050565b60006127488261275b565b9050919050565b60008115159050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b600061279d826127a4565b9050919050565b60006127af8261275b565b9050919050565b60005b838110156127d45780820151818401526020810190506127b9565b838111156127e3576000848401525b50505050565b6000600282049050600182168061280157607f821691505b6020821081141561281557612814612893565b5b50919050565b60006128268261277b565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561285957612858612864565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b60008160011c9050919050565b7f45524332303a207472616e7366657220746f20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f494e4445585f4f55545f4f465f52414e47450000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f766520746f20746865207a65726f20616464726560008201527f7373000000000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206260008201527f616c616e63650000000000000000000000000000000000000000000000000000602082015250565b7f4d5553545f4f574e5f544f4b454e5f4944000000000000000000000000000000600082015250565b7f4352454449545f434c41494d45445f464f525f544f4b454e5f49440000000000600082015250565b7f45524332303a207472616e7366657220616d6f756e742065786365656473206160008201527f6c6c6f77616e6365000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f45524332303a207472616e736665722066726f6d20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a20617070726f76652066726f6d20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f544f4b454e5f49445f4f55545f4f465f52414e47450000000000000000000000600082015250565b7f4e4f5f544f4b454e535f4f574e45440000000000000000000000000000000000600082015250565b7f45524332303a2064656372656173656420616c6c6f77616e63652062656c6f7760008201527f207a65726f000000000000000000000000000000000000000000000000000000602082015250565b7f45524332303a206d696e7420746f20746865207a65726f206164647265737300600082015250565b612c808161273d565b8114612c8b57600080fd5b50565b612c978161277b565b8114612ca257600080fd5b5056fea2646970667358221220b5a494a95e6555731d9ab6e3a1f948a721cd657199afeb37665fad4a104f666464736f6c63430008040033

Deployed Bytecode Sourcemap

26698:9046:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8567:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10875:210;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9687:108;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;11567:529;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26958:37;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27426:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9529:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12505:297;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33024:232;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33939:91;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27759:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27078:63;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33598:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32660:136;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9858:177;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2551:94;;;:::i;:::-;;34402:195;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30390:953;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1900:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8786:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13305:482;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10248:216;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26863:88;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28652:525;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27907:25;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29445:598;;;:::i;:::-;;10527:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28086:74;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35498:243;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2800:229;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8567:100;8621:13;8654:5;8647:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8567:100;:::o;10875:210::-;10994:4;11016:39;11025:12;:10;:12::i;:::-;11039:7;11048:6;11016:8;:39::i;:::-;11073:4;11066:11;;10875:210;;;;:::o;9687:108::-;9748:7;9775:12;;9768:19;;9687:108;:::o;11567:529::-;11707:4;11724:36;11734:6;11742:9;11753:6;11724:9;:36::i;:::-;11773:24;11800:11;:19;11812:6;11800:19;;;;;;;;;;;;;;;:33;11820:12;:10;:12::i;:::-;11800:33;;;;;;;;;;;;;;;;11773:60;;11886:6;11866:16;:26;;11844:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;11996:57;12005:6;12013:12;:10;:12::i;:::-;12046:6;12027:16;:25;11996:8;:57::i;:::-;12084:4;12077:11;;;11567:529;;;;;:::o;26958:37::-;;;;;;;;;;;;;:::o;27426:31::-;;;;:::o;9529:93::-;9587:5;9612:2;9605:9;;9529:93;:::o;12505:297::-;12620:4;12642:130;12665:12;:10;:12::i;:::-;12692:7;12751:10;12714:11;:25;12726:12;:10;:12::i;:::-;12714:25;;;;;;;;;;;;;;;:34;12740:7;12714:34;;;;;;;;;;;;;;;;:47;;;;:::i;:::-;12642:8;:130::i;:::-;12790:4;12783:11;;12505:297;;;;:::o;33024:232::-;2131:12;:10;:12::i;:::-;2120:23;;:7;:5;:7::i;:::-;:23;;;2112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33164:20:::1;33142:19;;:42;;;;;;;;;;;;;;;;;;33228:19;;;;;;;;;;;33195:12;;:53;;;;;;;;;;;;;;;;;;33024:232:::0;:::o;33939:91::-;2131:12;:10;:12::i;:::-;2120:23;;:7;:5;:7::i;:::-;:23;;;2112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34015:7:::1;34006:6;:16;;;;33939:91:::0;:::o;27759:32::-;;;;:::o;27078:63::-;;;;:::o;33598:196::-;2131:12;:10;:12::i;:::-;2120:23;;:7;:5;:7::i;:::-;:23;;;2112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;33738:13:::1;33723:12;:28;;;;33775:11;33762:10;:24;;;;33598:196:::0;;:::o;32660:136::-;2131:12;:10;:12::i;:::-;2120:23;;:7;:5;:7::i;:::-;:23;;;2112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;32735:53:::1;32741:7;:5;:7::i;:::-;32776:10;:8;:10::i;:::-;32772:2;:14;;;;:::i;:::-;32750:18;:37;;;;:::i;:::-;32735:5;:53::i;:::-;32660:136:::0;:::o;9858:177::-;9977:7;10009:9;:18;10019:7;10009:18;;;;;;;;;;;;;;;;10002:25;;9858:177;;;:::o;2551:94::-;2131:12;:10;:12::i;:::-;2120:23;;:7;:5;:7::i;:::-;:23;;;2112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2616:21:::1;2634:1;2616:9;:21::i;:::-;2551:94::o:0;34402:195::-;2131:12;:10;:12::i;:::-;2120:23;;:7;:5;:7::i;:::-;:23;;;2112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;34578:10:::1;:8;:10::i;:::-;34574:2;:14;;;;:::i;:::-;34547:23;:42;;;;:::i;:::-;34523:21;:66;;;;34402:195:::0;:::o;30390:953::-;30500:25;30528:12;;;;;;;;;;;:22;;;30551:12;:10;:12::i;:::-;30528:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;30500:64;;30624:1;30604:17;:21;30596:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;30850:1;30831:15;:20;;:57;;;;;30871:17;30855:13;:33;30831:57;30809:125;;;;;;;;;;;;:::i;:::-;;;;;;;;;31018:9;31030:15;31018:27;;31013:323;31052:13;31047:1;:18;31013:323;;31204:120;31229:12;;;;;;;;;;;:32;;;31262:12;:10;:12::i;:::-;31276:1;31229:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;31297:12;:10;:12::i;:::-;31204:6;:120::i;:::-;31067:3;;;;;:::i;:::-;;;;31013:323;;;;30390:953;;;:::o;1900:87::-;1946:7;1973:6;;;;;;;;;;;1966:13;;1900:87;:::o;8786:104::-;8842:13;8875:7;8868:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8786:104;:::o;13305:482::-;13425:4;13447:24;13474:11;:25;13486:12;:10;:12::i;:::-;13474:25;;;;;;;;;;;;;;;:34;13500:7;13474:34;;;;;;;;;;;;;;;;13447:61;;13561:15;13541:16;:35;;13519:122;;;;;;;;;;;;:::i;:::-;;;;;;;;;13677:67;13686:12;:10;:12::i;:::-;13700:7;13728:15;13709:16;:34;13677:8;:67::i;:::-;13775:4;13768:11;;;13305:482;;;;:::o;10248:216::-;10370:4;10392:42;10402:12;:10;:12::i;:::-;10416:9;10427:6;10392:9;:42::i;:::-;10452:4;10445:11;;10248:216;;;;:::o;26863:88::-;;;;;;;;;;;;;:::o;28652:525::-;28944:12;;;;;;;;;;;:20;;;28965:7;28944:29;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;28928:45;;:12;:10;:12::i;:::-;:45;;;28906:112;;;;;;;;;;;;:::i;:::-;;;;;;;;;29140:29;29147:7;29156:12;:10;:12::i;:::-;29140:6;:29::i;:::-;28652:525;:::o;27907:25::-;;;;:::o;29445:598::-;29493:25;29521:12;;;;;;;;;;;:22;;;29544:12;:10;:12::i;:::-;29521:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29493:64;;29617:1;29597:17;:21;29589:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;29729:9;29724:312;29748:17;29744:1;:21;29724:312;;;29904:120;29929:12;;;;;;;;;;;:32;;;29962:12;:10;:12::i;:::-;29976:1;29929:49;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;29997:12;:10;:12::i;:::-;29904:6;:120::i;:::-;29767:3;;;;;:::i;:::-;;;;29724:312;;;;29445:598;:::o;10527:201::-;10661:7;10693:11;:18;10705:5;10693:18;;;;;;;;;;;;;;;:27;10712:7;10693:27;;;;;;;;;;;;;;;;10686:34;;10527:201;;;;:::o;28086:74::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;35498:243::-;2131:12;:10;:12::i;:::-;2120:23;;:7;:5;:7::i;:::-;:23;;;2112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;35649:21:::1;35662:7;35649:12;:21::i;:::-;35681:52;35709:23;35681:27;:52::i;:::-;35498:243:::0;;:::o;2800:229::-;2131:12;:10;:12::i;:::-;2120:23;;:7;:5;:7::i;:::-;:23;;;2112:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2923:1:::1;2903:22;;:8;:22;;;;2881:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;3002:19;3012:8;3002:9;:19::i;:::-;2800:229:::0;:::o;751:98::-;804:7;831:10;824:17;;751:98;:::o;17095:380::-;17248:1;17231:19;;:5;:19;;;;17223:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17329:1;17310:21;;:7;:21;;;;17302:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17413:6;17383:11;:18;17395:5;17383:18;;;;;;;;;;;;;;;:27;17402:7;17383:27;;;;;;;;;;;;;;;:36;;;;17451:7;17435:32;;17444:5;17435:32;;;17460:6;17435:32;;;;;;:::i;:::-;;;;;;;;17095:380;;;:::o;14277:770::-;14435:1;14417:20;;:6;:20;;;;14409:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;14519:1;14498:23;;:9;:23;;;;14490:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;14574:47;14595:6;14603:9;14614:6;14574:20;:47::i;:::-;14634:21;14658:9;:17;14668:6;14658:17;;;;;;;;;;;;;;;;14634:41;;14725:6;14708:13;:23;;14686:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;14869:6;14853:13;:22;14833:9;:17;14843:6;14833:17;;;;;;;;;;;;;;;:42;;;;14921:6;14897:9;:20;14907:9;14897:20;;;;;;;;;;;;;;;;:30;;;;;;;:::i;:::-;;;;;;;;14962:9;14945:35;;14954:6;14945:35;;;14973:6;14945:35;;;;;;:::i;:::-;;;;;;;;14993:46;15013:6;15021:9;15032:6;14993:19;:46::i;:::-;14277:770;;;;:::o;15334:399::-;15437:1;15418:21;;:7;:21;;;;15410:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;15488:49;15517:1;15521:7;15530:6;15488:20;:49::i;:::-;15566:6;15550:12;;:22;;;;;;;:::i;:::-;;;;;;;;15605:6;15583:9;:18;15593:7;15583:18;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;15648:7;15627:37;;15644:1;15627:37;;;15657:6;15627:37;;;;;;:::i;:::-;;;;;;;;15677:48;15705:1;15709:7;15718:6;15677:19;:48::i;:::-;15334:399;;:::o;3037:173::-;3093:16;3112:6;;;;;;;;;;;3093:25;;3138:8;3129:6;;:17;;;;;;;;;;;;;;;;;;3193:8;3162:40;;3183:8;3162:40;;;;;;;;;;;;3037:173;;:::o;31410:912::-;31663:12;;31652:7;:23;;:48;;;;;31690:10;;31679:7;:21;;31652:48;31630:119;;;;;;;;;;;;:::i;:::-;;;;;;;;;31896:22;:30;31919:6;;31896:30;;;;;;;;;;;:39;31927:7;31896:39;;;;;;;;;;;;;;;;;;;;;31895:40;31873:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;32170:4;32128:22;:30;32151:6;;32128:30;;;;;;;;;;;:39;32159:7;32128:39;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;32274:40;32280:10;32292:21;;32274:5;:40::i;:::-;31410:912;;:::o;18075:125::-;;;;:::o;18804:124::-;;;;:::o;7:139:1:-;53:5;91:6;78:20;69:29;;107:33;134:5;107:33;:::i;:::-;59:87;;;;:::o;152:143::-;209:5;240:6;234:13;225:22;;256:33;283:5;256:33;:::i;:::-;215:80;;;;:::o;301:139::-;347:5;385:6;372:20;363:29;;401:33;428:5;401:33;:::i;:::-;353:87;;;;:::o;446:143::-;503:5;534:6;528:13;519:22;;550:33;577:5;550:33;:::i;:::-;509:80;;;;:::o;595:262::-;654:6;703:2;691:9;682:7;678:23;674:32;671:2;;;719:1;716;709:12;671:2;762:1;787:53;832:7;823:6;812:9;808:22;787:53;:::i;:::-;777:63;;733:117;661:196;;;;:::o;863:284::-;933:6;982:2;970:9;961:7;957:23;953:32;950:2;;;998:1;995;988:12;950:2;1041:1;1066:64;1122:7;1113:6;1102:9;1098:22;1066:64;:::i;:::-;1056:74;;1012:128;940:207;;;;:::o;1153:407::-;1221:6;1229;1278:2;1266:9;1257:7;1253:23;1249:32;1246:2;;;1294:1;1291;1284:12;1246:2;1337:1;1362:53;1407:7;1398:6;1387:9;1383:22;1362:53;:::i;:::-;1352:63;;1308:117;1464:2;1490:53;1535:7;1526:6;1515:9;1511:22;1490:53;:::i;:::-;1480:63;;1435:118;1236:324;;;;;:::o;1566:552::-;1643:6;1651;1659;1708:2;1696:9;1687:7;1683:23;1679:32;1676:2;;;1724:1;1721;1714:12;1676:2;1767:1;1792:53;1837:7;1828:6;1817:9;1813:22;1792:53;:::i;:::-;1782:63;;1738:117;1894:2;1920:53;1965:7;1956:6;1945:9;1941:22;1920:53;:::i;:::-;1910:63;;1865:118;2022:2;2048:53;2093:7;2084:6;2073:9;2069:22;2048:53;:::i;:::-;2038:63;;1993:118;1666:452;;;;;:::o;2124:407::-;2192:6;2200;2249:2;2237:9;2228:7;2224:23;2220:32;2217:2;;;2265:1;2262;2255:12;2217:2;2308:1;2333:53;2378:7;2369:6;2358:9;2354:22;2333:53;:::i;:::-;2323:63;;2279:117;2435:2;2461:53;2506:7;2497:6;2486:9;2482:22;2461:53;:::i;:::-;2451:63;;2406:118;2207:324;;;;;:::o;2537:262::-;2596:6;2645:2;2633:9;2624:7;2620:23;2616:32;2613:2;;;2661:1;2658;2651:12;2613:2;2704:1;2729:53;2774:7;2765:6;2754:9;2750:22;2729:53;:::i;:::-;2719:63;;2675:117;2603:196;;;;:::o;2805:284::-;2875:6;2924:2;2912:9;2903:7;2899:23;2895:32;2892:2;;;2940:1;2937;2930:12;2892:2;2983:1;3008:64;3064:7;3055:6;3044:9;3040:22;3008:64;:::i;:::-;2998:74;;2954:128;2882:207;;;;:::o;3095:407::-;3163:6;3171;3220:2;3208:9;3199:7;3195:23;3191:32;3188:2;;;3236:1;3233;3226:12;3188:2;3279:1;3304:53;3349:7;3340:6;3329:9;3325:22;3304:53;:::i;:::-;3294:63;;3250:117;3406:2;3432:53;3477:7;3468:6;3457:9;3453:22;3432:53;:::i;:::-;3422:63;;3377:118;3178:324;;;;;:::o;3508:118::-;3595:24;3613:5;3595:24;:::i;:::-;3590:3;3583:37;3573:53;;:::o;3632:109::-;3713:21;3728:5;3713:21;:::i;:::-;3708:3;3701:34;3691:50;;:::o;3747:181::-;3859:62;3915:5;3859:62;:::i;:::-;3854:3;3847:75;3837:91;;:::o;3934:364::-;4022:3;4050:39;4083:5;4050:39;:::i;:::-;4105:71;4169:6;4164:3;4105:71;:::i;:::-;4098:78;;4185:52;4230:6;4225:3;4218:4;4211:5;4207:16;4185:52;:::i;:::-;4262:29;4284:6;4262:29;:::i;:::-;4257:3;4253:39;4246:46;;4026:272;;;;;:::o;4304:366::-;4446:3;4467:67;4531:2;4526:3;4467:67;:::i;:::-;4460:74;;4543:93;4632:3;4543:93;:::i;:::-;4661:2;4656:3;4652:12;4645:19;;4450:220;;;:::o;4676:366::-;4818:3;4839:67;4903:2;4898:3;4839:67;:::i;:::-;4832:74;;4915:93;5004:3;4915:93;:::i;:::-;5033:2;5028:3;5024:12;5017:19;;4822:220;;;:::o;5048:366::-;5190:3;5211:67;5275:2;5270:3;5211:67;:::i;:::-;5204:74;;5287:93;5376:3;5287:93;:::i;:::-;5405:2;5400:3;5396:12;5389:19;;5194:220;;;:::o;5420:366::-;5562:3;5583:67;5647:2;5642:3;5583:67;:::i;:::-;5576:74;;5659:93;5748:3;5659:93;:::i;:::-;5777:2;5772:3;5768:12;5761:19;;5566:220;;;:::o;5792:366::-;5934:3;5955:67;6019:2;6014:3;5955:67;:::i;:::-;5948:74;;6031:93;6120:3;6031:93;:::i;:::-;6149:2;6144:3;6140:12;6133:19;;5938:220;;;:::o;6164:366::-;6306:3;6327:67;6391:2;6386:3;6327:67;:::i;:::-;6320:74;;6403:93;6492:3;6403:93;:::i;:::-;6521:2;6516:3;6512:12;6505:19;;6310:220;;;:::o;6536:366::-;6678:3;6699:67;6763:2;6758:3;6699:67;:::i;:::-;6692:74;;6775:93;6864:3;6775:93;:::i;:::-;6893:2;6888:3;6884:12;6877:19;;6682:220;;;:::o;6908:366::-;7050:3;7071:67;7135:2;7130:3;7071:67;:::i;:::-;7064:74;;7147:93;7236:3;7147:93;:::i;:::-;7265:2;7260:3;7256:12;7249:19;;7054:220;;;:::o;7280:366::-;7422:3;7443:67;7507:2;7502:3;7443:67;:::i;:::-;7436:74;;7519:93;7608:3;7519:93;:::i;:::-;7637:2;7632:3;7628:12;7621:19;;7426:220;;;:::o;7652:366::-;7794:3;7815:67;7879:2;7874:3;7815:67;:::i;:::-;7808:74;;7891:93;7980:3;7891:93;:::i;:::-;8009:2;8004:3;8000:12;7993:19;;7798:220;;;:::o;8024:366::-;8166:3;8187:67;8251:2;8246:3;8187:67;:::i;:::-;8180:74;;8263:93;8352:3;8263:93;:::i;:::-;8381:2;8376:3;8372:12;8365:19;;8170:220;;;:::o;8396:366::-;8538:3;8559:67;8623:2;8618:3;8559:67;:::i;:::-;8552:74;;8635:93;8724:3;8635:93;:::i;:::-;8753:2;8748:3;8744:12;8737:19;;8542:220;;;:::o;8768:366::-;8910:3;8931:67;8995:2;8990:3;8931:67;:::i;:::-;8924:74;;9007:93;9096:3;9007:93;:::i;:::-;9125:2;9120:3;9116:12;9109:19;;8914:220;;;:::o;9140:366::-;9282:3;9303:67;9367:2;9362:3;9303:67;:::i;:::-;9296:74;;9379:93;9468:3;9379:93;:::i;:::-;9497:2;9492:3;9488:12;9481:19;;9286:220;;;:::o;9512:366::-;9654:3;9675:67;9739:2;9734:3;9675:67;:::i;:::-;9668:74;;9751:93;9840:3;9751:93;:::i;:::-;9869:2;9864:3;9860:12;9853:19;;9658:220;;;:::o;9884:118::-;9971:24;9989:5;9971:24;:::i;:::-;9966:3;9959:37;9949:53;;:::o;10008:112::-;10091:22;10107:5;10091:22;:::i;:::-;10086:3;10079:35;10069:51;;:::o;10126:222::-;10219:4;10257:2;10246:9;10242:18;10234:26;;10270:71;10338:1;10327:9;10323:17;10314:6;10270:71;:::i;:::-;10224:124;;;;:::o;10354:332::-;10475:4;10513:2;10502:9;10498:18;10490:26;;10526:71;10594:1;10583:9;10579:17;10570:6;10526:71;:::i;:::-;10607:72;10675:2;10664:9;10660:18;10651:6;10607:72;:::i;:::-;10480:206;;;;;:::o;10692:210::-;10779:4;10817:2;10806:9;10802:18;10794:26;;10830:65;10892:1;10881:9;10877:17;10868:6;10830:65;:::i;:::-;10784:118;;;;:::o;10908:272::-;11026:4;11064:2;11053:9;11049:18;11041:26;;11077:96;11170:1;11159:9;11155:17;11146:6;11077:96;:::i;:::-;11031:149;;;;:::o;11186:313::-;11299:4;11337:2;11326:9;11322:18;11314:26;;11386:9;11380:4;11376:20;11372:1;11361:9;11357:17;11350:47;11414:78;11487:4;11478:6;11414:78;:::i;:::-;11406:86;;11304:195;;;;:::o;11505:419::-;11671:4;11709:2;11698:9;11694:18;11686:26;;11758:9;11752:4;11748:20;11744:1;11733:9;11729:17;11722:47;11786:131;11912:4;11786:131;:::i;:::-;11778:139;;11676:248;;;:::o;11930:419::-;12096:4;12134:2;12123:9;12119:18;12111:26;;12183:9;12177:4;12173:20;12169:1;12158:9;12154:17;12147:47;12211:131;12337:4;12211:131;:::i;:::-;12203:139;;12101:248;;;:::o;12355:419::-;12521:4;12559:2;12548:9;12544:18;12536:26;;12608:9;12602:4;12598:20;12594:1;12583:9;12579:17;12572:47;12636:131;12762:4;12636:131;:::i;:::-;12628:139;;12526:248;;;:::o;12780:419::-;12946:4;12984:2;12973:9;12969:18;12961:26;;13033:9;13027:4;13023:20;13019:1;13008:9;13004:17;12997:47;13061:131;13187:4;13061:131;:::i;:::-;13053:139;;12951:248;;;:::o;13205:419::-;13371:4;13409:2;13398:9;13394:18;13386:26;;13458:9;13452:4;13448:20;13444:1;13433:9;13429:17;13422:47;13486:131;13612:4;13486:131;:::i;:::-;13478:139;;13376:248;;;:::o;13630:419::-;13796:4;13834:2;13823:9;13819:18;13811:26;;13883:9;13877:4;13873:20;13869:1;13858:9;13854:17;13847:47;13911:131;14037:4;13911:131;:::i;:::-;13903:139;;13801:248;;;:::o;14055:419::-;14221:4;14259:2;14248:9;14244:18;14236:26;;14308:9;14302:4;14298:20;14294:1;14283:9;14279:17;14272:47;14336:131;14462:4;14336:131;:::i;:::-;14328:139;;14226:248;;;:::o;14480:419::-;14646:4;14684:2;14673:9;14669:18;14661:26;;14733:9;14727:4;14723:20;14719:1;14708:9;14704:17;14697:47;14761:131;14887:4;14761:131;:::i;:::-;14753:139;;14651:248;;;:::o;14905:419::-;15071:4;15109:2;15098:9;15094:18;15086:26;;15158:9;15152:4;15148:20;15144:1;15133:9;15129:17;15122:47;15186:131;15312:4;15186:131;:::i;:::-;15178:139;;15076:248;;;:::o;15330:419::-;15496:4;15534:2;15523:9;15519:18;15511:26;;15583:9;15577:4;15573:20;15569:1;15558:9;15554:17;15547:47;15611:131;15737:4;15611:131;:::i;:::-;15603:139;;15501:248;;;:::o;15755:419::-;15921:4;15959:2;15948:9;15944:18;15936:26;;16008:9;16002:4;15998:20;15994:1;15983:9;15979:17;15972:47;16036:131;16162:4;16036:131;:::i;:::-;16028:139;;15926:248;;;:::o;16180:419::-;16346:4;16384:2;16373:9;16369:18;16361:26;;16433:9;16427:4;16423:20;16419:1;16408:9;16404:17;16397:47;16461:131;16587:4;16461:131;:::i;:::-;16453:139;;16351:248;;;:::o;16605:419::-;16771:4;16809:2;16798:9;16794:18;16786:26;;16858:9;16852:4;16848:20;16844:1;16833:9;16829:17;16822:47;16886:131;17012:4;16886:131;:::i;:::-;16878:139;;16776:248;;;:::o;17030:419::-;17196:4;17234:2;17223:9;17219:18;17211:26;;17283:9;17277:4;17273:20;17269:1;17258:9;17254:17;17247:47;17311:131;17437:4;17311:131;:::i;:::-;17303:139;;17201:248;;;:::o;17455:419::-;17621:4;17659:2;17648:9;17644:18;17636:26;;17708:9;17702:4;17698:20;17694:1;17683:9;17679:17;17672:47;17736:131;17862:4;17736:131;:::i;:::-;17728:139;;17626:248;;;:::o;17880:222::-;17973:4;18011:2;18000:9;17996:18;17988:26;;18024:71;18092:1;18081:9;18077:17;18068:6;18024:71;:::i;:::-;17978:124;;;;:::o;18108:214::-;18197:4;18235:2;18224:9;18220:18;18212:26;;18248:67;18312:1;18301:9;18297:17;18288:6;18248:67;:::i;:::-;18202:120;;;;:::o;18328:99::-;18380:6;18414:5;18408:12;18398:22;;18387:40;;;:::o;18433:169::-;18517:11;18551:6;18546:3;18539:19;18591:4;18586:3;18582:14;18567:29;;18529:73;;;;:::o;18608:305::-;18648:3;18667:20;18685:1;18667:20;:::i;:::-;18662:25;;18701:20;18719:1;18701:20;:::i;:::-;18696:25;;18855:1;18787:66;18783:74;18780:1;18777:81;18774:2;;;18861:18;;:::i;:::-;18774:2;18905:1;18902;18898:9;18891:16;;18652:261;;;;:::o;18919:848::-;18980:5;18987:4;19011:6;19002:15;;19035:5;19026:14;;19049:712;19070:1;19060:8;19057:15;19049:712;;;19165:4;19160:3;19156:14;19150:4;19147:24;19144:2;;;19174:18;;:::i;:::-;19144:2;19224:1;19214:8;19210:16;19207:2;;;19639:4;19632:5;19628:16;19619:25;;19207:2;19689:4;19683;19679:15;19671:23;;19719:32;19742:8;19719:32;:::i;:::-;19707:44;;19049:712;;;18992:775;;;;;;;:::o;19773:281::-;19831:5;19855:23;19873:4;19855:23;:::i;:::-;19847:31;;19899:25;19915:8;19899:25;:::i;:::-;19887:37;;19943:104;19980:66;19970:8;19964:4;19943:104;:::i;:::-;19934:113;;19837:217;;;;:::o;20060:1073::-;20114:5;20305:8;20295:2;;20326:1;20317:10;;20328:5;;20295:2;20354:4;20344:2;;20371:1;20362:10;;20373:5;;20344:2;20440:4;20488:1;20483:27;;;;20524:1;20519:191;;;;20433:277;;20483:27;20501:1;20492:10;;20503:5;;;20519:191;20564:3;20554:8;20551:17;20548:2;;;20571:18;;:::i;:::-;20548:2;20620:8;20617:1;20613:16;20604:25;;20655:3;20648:5;20645:14;20642:2;;;20662:18;;:::i;:::-;20642:2;20695:5;;;20433:277;;20819:2;20809:8;20806:16;20800:3;20794:4;20791:13;20787:36;20769:2;20759:8;20756:16;20751:2;20745:4;20742:12;20738:35;20722:111;20719:2;;;20875:8;20869:4;20865:19;20856:28;;20910:3;20903:5;20900:14;20897:2;;;20917:18;;:::i;:::-;20897:2;20950:5;;20719:2;20990:42;21028:3;21018:8;21012:4;21009:1;20990:42;:::i;:::-;20975:57;;;;21064:4;21059:3;21055:14;21048:5;21045:25;21042:2;;;21073:18;;:::i;:::-;21042:2;21122:4;21115:5;21111:16;21102:25;;20120:1013;;;;;;:::o;21139:348::-;21179:7;21202:20;21220:1;21202:20;:::i;:::-;21197:25;;21236:20;21254:1;21236:20;:::i;:::-;21231:25;;21424:1;21356:66;21352:74;21349:1;21346:81;21341:1;21334:9;21327:17;21323:105;21320:2;;;21431:18;;:::i;:::-;21320:2;21479:1;21476;21472:9;21461:20;;21187:300;;;;:::o;21493:96::-;21530:7;21559:24;21577:5;21559:24;:::i;:::-;21548:35;;21538:51;;;:::o;21595:90::-;21629:7;21672:5;21665:13;21658:21;21647:32;;21637:48;;;:::o;21691:126::-;21728:7;21768:42;21761:5;21757:54;21746:65;;21736:81;;;:::o;21823:77::-;21860:7;21889:5;21878:16;;21868:32;;;:::o;21906:86::-;21941:7;21981:4;21974:5;21970:16;21959:27;;21949:43;;;:::o;21998:176::-;22073:9;22106:62;22162:5;22106:62;:::i;:::-;22093:75;;22083:91;;;:::o;22180:138::-;22255:9;22288:24;22306:5;22288:24;:::i;:::-;22275:37;;22265:53;;;:::o;22324:307::-;22392:1;22402:113;22416:6;22413:1;22410:13;22402:113;;;22501:1;22496:3;22492:11;22486:18;22482:1;22477:3;22473:11;22466:39;22438:2;22435:1;22431:10;22426:15;;22402:113;;;22533:6;22530:1;22527:13;22524:2;;;22613:1;22604:6;22599:3;22595:16;22588:27;22524:2;22373:258;;;;:::o;22637:320::-;22681:6;22718:1;22712:4;22708:12;22698:22;;22765:1;22759:4;22755:12;22786:18;22776:2;;22842:4;22834:6;22830:17;22820:27;;22776:2;22904;22896:6;22893:14;22873:18;22870:38;22867:2;;;22923:18;;:::i;:::-;22867:2;22688:269;;;;:::o;22963:233::-;23002:3;23025:24;23043:5;23025:24;:::i;:::-;23016:33;;23071:66;23064:5;23061:77;23058:2;;;23141:18;;:::i;:::-;23058:2;23188:1;23181:5;23177:13;23170:20;;23006:190;;;:::o;23202:180::-;23250:77;23247:1;23240:88;23347:4;23344:1;23337:15;23371:4;23368:1;23361:15;23388:180;23436:77;23433:1;23426:88;23533:4;23530:1;23523:15;23557:4;23554:1;23547:15;23574:102;23615:6;23666:2;23662:7;23657:2;23650:5;23646:14;23642:28;23632:38;;23622:54;;;:::o;23682:102::-;23724:8;23771:5;23768:1;23764:13;23743:34;;23733:51;;;:::o;23790:222::-;23930:34;23926:1;23918:6;23914:14;23907:58;23999:5;23994:2;23986:6;23982:15;23975:30;23896:116;:::o;24018:168::-;24158:20;24154:1;24146:6;24142:14;24135:44;24124:62;:::o;24192:225::-;24332:34;24328:1;24320:6;24316:14;24309:58;24401:8;24396:2;24388:6;24384:15;24377:33;24298:119;:::o;24423:221::-;24563:34;24559:1;24551:6;24547:14;24540:58;24632:4;24627:2;24619:6;24615:15;24608:29;24529:115;:::o;24650:225::-;24790:34;24786:1;24778:6;24774:14;24767:58;24859:8;24854:2;24846:6;24842:15;24835:33;24756:119;:::o;24881:167::-;25021:19;25017:1;25009:6;25005:14;24998:43;24987:61;:::o;25054:177::-;25194:29;25190:1;25182:6;25178:14;25171:53;25160:71;:::o;25237:227::-;25377:34;25373:1;25365:6;25361:14;25354:58;25446:10;25441:2;25433:6;25429:15;25422:35;25343:121;:::o;25470:182::-;25610:34;25606:1;25598:6;25594:14;25587:58;25576:76;:::o;25658:224::-;25798:34;25794:1;25786:6;25782:14;25775:58;25867:7;25862:2;25854:6;25850:15;25843:32;25764:118;:::o;25888:223::-;26028:34;26024:1;26016:6;26012:14;26005:58;26097:6;26092:2;26084:6;26080:15;26073:31;25994:117;:::o;26117:171::-;26257:23;26253:1;26245:6;26241:14;26234:47;26223:65;:::o;26294:165::-;26434:17;26430:1;26422:6;26418:14;26411:41;26400:59;:::o;26465:224::-;26605:34;26601:1;26593:6;26589:14;26582:58;26674:7;26669:2;26661:6;26657:15;26650:32;26571:118;:::o;26695:181::-;26835:33;26831:1;26823:6;26819:14;26812:57;26801:75;:::o;26882:122::-;26955:24;26973:5;26955:24;:::i;:::-;26948:5;26945:35;26935:2;;26994:1;26991;26984:12;26935:2;26925:79;:::o;27010:122::-;27083:24;27101:5;27083:24;:::i;:::-;27076:5;27073:35;27063:2;;27122:1;27119;27112:12;27063:2;27053:79;:::o

Swarm Source

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