ETH Price: $3,545.21 (+7.52%)

Token

WickedCraniumsComic (WCCOMIC)
 

Overview

Max Total Supply

2,599 WCCOMIC

Holders

1,071

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 WCCOMIC
0x2b2b623d5b40e8d5d0932abf4bb383b2b42f69c5
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Wicked Craniums Comic is an NFT collection by Wicked Craniums

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
WickedCraniumsComic

Compiler Version
v0.8.0+commit.c7dfd78e

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-25
*/

// Sources flattened with hardhat v2.6.4 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}


// File @openzeppelin/contracts/utils/introspection/[email protected]



pragma solidity ^0.8.0;

/**
 * @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;
    }
}


// File @openzeppelin/contracts/token/ERC721/[email protected]



pragma solidity ^0.8.0;







/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

    // Mapping from token ID to approved address
    mapping(uint256 => address) private _tokenApprovals;

    // Mapping from owner to operator approvals
    mapping(address => mapping(address => bool)) private _operatorApprovals;

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, can be overriden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, "");
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @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.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId);

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.
     * The call is not executed if the target address is not a contract.
     *
     * @param from address representing the previous owner of the given token ID
     * @param to target address that will receive the tokens
     * @param tokenId uint256 ID of the token to be transferred
     * @param _data bytes optional data to send along with the call
     * @return bool whether the call correctly returned the expected magic value
     */
    function _checkOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        if (to.isContract()) {
            try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
                return retval == IERC721Receiver.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` 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 tokenId
    ) internal virtual {}
}


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;

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

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


// File @openzeppelin/contracts/token/ERC721/extensions/[email protected]



pragma solidity ^0.8.0;


/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) {
        return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

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

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}


// File @openzeppelin/contracts/access/[email protected]



pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}


// File @openzeppelin/contracts/access/[email protected]



pragma solidity ^0.8.0;




/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role, _msgSender());
        _;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(uint160(account), 20),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}


// File @openzeppelin/contracts/utils/[email protected]



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}


// File contracts/WickedCraniumsComic.sol


pragma solidity ^0.8.0;


contract WickedCraniumsComic is ERC721, ERC721Enumerable, AccessControl {
    using Counters for Counters.Counter;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    Counters.Counter private _tokenIdCounter;
    string private baseURI;

    constructor() ERC721("WickedCraniumsComic", "WCCOMIC") {
        _setupRole(DEFAULT_ADMIN_ROLE, msg.sender);
        _setupRole(MINTER_ROLE, msg.sender);
    }

    function safeMint(address to) public onlyRole(MINTER_ROLE) {
        _safeMint(to, _tokenIdCounter.current());
        _tokenIdCounter.increment();
    }

    // The following functions are overrides required by Solidity.
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable, AccessControl) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    function grantRoleToStakingContract(address to) public onlyRole(MINTER_ROLE) {
        grantRole(MINTER_ROLE, to);
    }

    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    function setBaseURI(string memory uri) public onlyRole(DEFAULT_ADMIN_ROLE) {
        baseURI = uri;
    }
}

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":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"grantRoleToStakingContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280601381526020017f5769636b65644372616e69756d73436f6d6963000000000000000000000000008152506040518060400160405280600781526020017f5743434f4d4943000000000000000000000000000000000000000000000000008152508160009080519060200190620000969291906200027a565b508060019080519060200190620000af9291906200027a565b505050620000c76000801b33620000ff60201b60201c565b620000f97f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620000ff60201b60201c565b6200038f565b6200011182826200011560201b60201c565b5050565b6200012782826200020760201b60201c565b62000203576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001a86200027260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b82805462000288906200032a565b90600052602060002090601f016020900481019282620002ac5760008555620002f8565b82601f10620002c757805160ff1916838001178555620002f8565b82800160010185558215620002f8579182015b82811115620002f7578251825591602001919060010190620002da565b5b5090506200030791906200030b565b5090565b5b80821115620003265760008160009055506001016200030c565b5090565b600060028204905060018216806200034357607f821691505b602082108114156200035a576200035962000360565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b613d3a806200039f6000396000f3fe608060405234801561001057600080fd5b506004361061018e5760003560e01c806355f804b3116100de578063a22cb46511610097578063c87b56dd11610071578063c87b56dd146104a3578063d5391393146104d3578063d547741f146104f1578063e985e9c51461050d5761018e565b8063a22cb4651461044f578063b88d4fde1461046b578063c654c94f146104875761018e565b806355f804b3146103675780636352211e1461038357806370a08231146103b357806391d14854146103e357806395d89b4114610413578063a217fddf146104315761018e565b8063248a9ca31161014b57806336568abe1161012557806336568abe146102e357806340d097c3146102ff57806342842e0e1461031b5780634f6ccce7146103375761018e565b8063248a9ca3146102675780632f2ff15d146102975780632f745c59146102b35761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806318160ddd1461022d57806323b872dd1461024b575b600080fd5b6101ad60048036038101906101a89190612c1e565b61053d565b6040516101ba9190613592565b60405180910390f35b6101cb61054f565b6040516101d891906135c8565b60405180910390f35b6101fb60048036038101906101f69190612cb1565b6105e1565b604051610208919061352b565b60405180910390f35b61022b60048036038101906102269190612b7d565b610666565b005b61023561077e565b604051610242919061382a565b60405180910390f35b61026560048036038101906102609190612a77565b61078b565b005b610281600480360381019061027c9190612bb9565b6107eb565b60405161028e91906135ad565b60405180910390f35b6102b160048036038101906102ac9190612be2565b61080b565b005b6102cd60048036038101906102c89190612b7d565b610834565b6040516102da919061382a565b60405180910390f35b6102fd60048036038101906102f89190612be2565b6108d9565b005b61031960048036038101906103149190612a12565b61095c565b005b61033560048036038101906103309190612a77565b6109af565b005b610351600480360381019061034c9190612cb1565b6109cf565b60405161035e919061382a565b60405180910390f35b610381600480360381019061037c9190612c70565b610a66565b005b61039d60048036038101906103989190612cb1565b610a96565b6040516103aa919061352b565b60405180910390f35b6103cd60048036038101906103c89190612a12565b610b48565b6040516103da919061382a565b60405180910390f35b6103fd60048036038101906103f89190612be2565b610c00565b60405161040a9190613592565b60405180910390f35b61041b610c6b565b60405161042891906135c8565b60405180910390f35b610439610cfd565b60405161044691906135ad565b60405180910390f35b61046960048036038101906104649190612b41565b610d04565b005b61048560048036038101906104809190612ac6565b610e85565b005b6104a1600480360381019061049c9190612a12565b610ee7565b005b6104bd60048036038101906104b89190612cb1565b610f47565b6040516104ca91906135c8565b60405180910390f35b6104db610fee565b6040516104e891906135ad565b60405180910390f35b61050b60048036038101906105069190612be2565b611012565b005b61052760048036038101906105229190612a3b565b61103b565b6040516105349190613592565b60405180910390f35b6000610548826110cf565b9050919050565b60606000805461055e90613b18565b80601f016020809104026020016040519081016040528092919081815260200182805461058a90613b18565b80156105d75780601f106105ac576101008083540402835291602001916105d7565b820191906000526020600020905b8154815290600101906020018083116105ba57829003601f168201915b5050505050905090565b60006105ec82611149565b61062b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106229061374a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061067182610a96565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d9906137aa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107016111b5565b73ffffffffffffffffffffffffffffffffffffffff161480610730575061072f8161072a6111b5565b61103b565b5b61076f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610766906136ca565b60405180910390fd5b61077983836111bd565b505050565b6000600880549050905090565b61079c6107966111b5565b82611276565b6107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d2906137ca565b60405180910390fd5b6107e6838383611354565b505050565b6000600a6000838152602001908152602001600020600101549050919050565b610814826107eb565b610825816108206111b5565b6115b0565b61082f838361164d565b505050565b600061083f83610b48565b8210610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108779061360a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6108e16111b5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461094e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109459061380a565b60405180910390fd5b610958828261172e565b5050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661098e816109896111b5565b6115b0565b6109a18261099c600b611810565b61181e565b6109ab600b61183c565b5050565b6109ca83838360405180602001604052806000815250610e85565b505050565b60006109d961077e565b8210610a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a11906137ea565b60405180910390fd5b60088281548110610a54577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000801b610a7b81610a766111b5565b6115b0565b81600c9080519060200190610a91929190612821565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b369061370a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb0906136ea565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610c7a90613b18565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca690613b18565b8015610cf35780601f10610cc857610100808354040283529160200191610cf3565b820191906000526020600020905b815481529060010190602001808311610cd657829003601f168201915b5050505050905090565b6000801b81565b610d0c6111b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d719061368a565b60405180910390fd5b8060056000610d876111b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e346111b5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e799190613592565b60405180910390a35050565b610e96610e906111b5565b83611276565b610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc906137ca565b60405180910390fd5b610ee184848484611852565b50505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610f1981610f146111b5565b6115b0565b610f437f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68361080b565b5050565b6060610f5282611149565b610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f889061378a565b60405180910390fd5b6000610f9b6118ae565b90506000815111610fbb5760405180602001604052806000815250610fe6565b80610fc584611940565b604051602001610fd69291906134cd565b6040516020818303038152906040525b915050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61101b826107eb565b61102c816110276111b5565b6115b0565b611036838361172e565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611142575061114182611aed565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661123083610a96565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061128182611149565b6112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b7906136aa565b60405180910390fd5b60006112cb83610a96565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061133a57508373ffffffffffffffffffffffffffffffffffffffff16611322846105e1565b73ffffffffffffffffffffffffffffffffffffffff16145b8061134b575061134a818561103b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661137482610a96565b73ffffffffffffffffffffffffffffffffffffffff16146113ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c19061376a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561143a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114319061366a565b60405180910390fd5b611445838383611b67565b6114506000826111bd565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114a091906139fa565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114f79190613919565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6115ba8282610c00565b611649576115df8173ffffffffffffffffffffffffffffffffffffffff166014611b77565b6115ed8360001c6020611b77565b6040516020016115fe9291906134f1565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164091906135c8565b60405180910390fd5b5050565b6116578282610c00565b61172a576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116cf6111b5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6117388282610c00565b1561180c576000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506117b16111b5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600081600001549050919050565b611838828260405180602001604052806000815250611e71565b5050565b6001816000016000828254019250508190555050565b61185d848484611354565b61186984848484611ecc565b6118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189f9061362a565b60405180910390fd5b50505050565b6060600c80546118bd90613b18565b80601f01602080910402602001604051908101604052809291908181526020018280546118e990613b18565b80156119365780601f1061190b57610100808354040283529160200191611936565b820191906000526020600020905b81548152906001019060200180831161191957829003601f168201915b5050505050905090565b60606000821415611988576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ae8565b600082905060005b600082146119ba5780806119a390613b4a565b915050600a826119b3919061396f565b9150611990565b60008167ffffffffffffffff8111156119fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611a2e5781602001600182028036833780820191505090505b5090505b60008514611ae157600182611a4791906139fa565b9150600a85611a569190613b93565b6030611a629190613919565b60f81b818381518110611a9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ada919061396f565b9450611a32565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b605750611b5f82612063565b5b9050919050565b611b72838383612145565b505050565b606060006002836002611b8a91906139a0565b611b949190613919565b67ffffffffffffffff811115611bd3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c055781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c63577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611ced577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d2d91906139a0565b611d379190613919565b90505b6001811115611e23577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110611ddc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611e1c90613aee565b9050611d3a565b5060008414611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e906135ea565b60405180910390fd5b8091505092915050565b611e7b8383612259565b611e886000848484611ecc565b611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe9061362a565b60405180910390fd5b505050565b6000611eed8473ffffffffffffffffffffffffffffffffffffffff16612427565b15612056578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f166111b5565b8786866040518563ffffffff1660e01b8152600401611f389493929190613546565b602060405180830381600087803b158015611f5257600080fd5b505af1925050508015611f8357506040513d601f19601f82011682018060405250810190611f809190612c47565b60015b612006573d8060008114611fb3576040519150601f19603f3d011682016040523d82523d6000602084013e611fb8565b606091505b50600081511415611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff59061362a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061205b565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061212e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061213e575061213d8261243a565b5b9050919050565b6121508383836124a4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121935761218e816124a9565b6121d2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121d1576121d083826124f2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612215576122108161265f565b612254565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122535761225282826127a2565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c09061372a565b60405180910390fd5b6122d281611149565b15612312576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123099061364a565b60405180910390fd5b61231e60008383611b67565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461236e9190613919565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124ff84610b48565b61250991906139fa565b90506000600760008481526020019081526020016000205490508181146125ee576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061267391906139fa565b90506000600960008481526020019081526020016000205490506000600883815481106126c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612711577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612786577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127ad83610b48565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461282d90613b18565b90600052602060002090601f01602090048101928261284f5760008555612896565b82601f1061286857805160ff1916838001178555612896565b82800160010185558215612896579182015b8281111561289557825182559160200191906001019061287a565b5b5090506128a391906128a7565b5090565b5b808211156128c05760008160009055506001016128a8565b5090565b60006128d76128d284613876565b613845565b9050828152602081018484840111156128ef57600080fd5b6128fa848285613aac565b509392505050565b6000612915612910846138a6565b613845565b90508281526020810184848401111561292d57600080fd5b612938848285613aac565b509392505050565b60008135905061294f81613c91565b92915050565b60008135905061296481613ca8565b92915050565b60008135905061297981613cbf565b92915050565b60008135905061298e81613cd6565b92915050565b6000815190506129a381613cd6565b92915050565b600082601f8301126129ba57600080fd5b81356129ca8482602086016128c4565b91505092915050565b600082601f8301126129e457600080fd5b81356129f4848260208601612902565b91505092915050565b600081359050612a0c81613ced565b92915050565b600060208284031215612a2457600080fd5b6000612a3284828501612940565b91505092915050565b60008060408385031215612a4e57600080fd5b6000612a5c85828601612940565b9250506020612a6d85828601612940565b9150509250929050565b600080600060608486031215612a8c57600080fd5b6000612a9a86828701612940565b9350506020612aab86828701612940565b9250506040612abc868287016129fd565b9150509250925092565b60008060008060808587031215612adc57600080fd5b6000612aea87828801612940565b9450506020612afb87828801612940565b9350506040612b0c878288016129fd565b925050606085013567ffffffffffffffff811115612b2957600080fd5b612b35878288016129a9565b91505092959194509250565b60008060408385031215612b5457600080fd5b6000612b6285828601612940565b9250506020612b7385828601612955565b9150509250929050565b60008060408385031215612b9057600080fd5b6000612b9e85828601612940565b9250506020612baf858286016129fd565b9150509250929050565b600060208284031215612bcb57600080fd5b6000612bd98482850161296a565b91505092915050565b60008060408385031215612bf557600080fd5b6000612c038582860161296a565b9250506020612c1485828601612940565b9150509250929050565b600060208284031215612c3057600080fd5b6000612c3e8482850161297f565b91505092915050565b600060208284031215612c5957600080fd5b6000612c6784828501612994565b91505092915050565b600060208284031215612c8257600080fd5b600082013567ffffffffffffffff811115612c9c57600080fd5b612ca8848285016129d3565b91505092915050565b600060208284031215612cc357600080fd5b6000612cd1848285016129fd565b91505092915050565b612ce381613a2e565b82525050565b612cf281613a40565b82525050565b612d0181613a4c565b82525050565b6000612d12826138d6565b612d1c81856138ec565b9350612d2c818560208601613abb565b612d3581613c80565b840191505092915050565b6000612d4b826138e1565b612d5581856138fd565b9350612d65818560208601613abb565b612d6e81613c80565b840191505092915050565b6000612d84826138e1565b612d8e818561390e565b9350612d9e818560208601613abb565b80840191505092915050565b6000612db76020836138fd565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b6000612df7602b836138fd565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612e5d6032836138fd565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612ec3601c836138fd565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612f036024836138fd565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f696019836138fd565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612fa9602c836138fd565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061300f6038836138fd565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613075602a836138fd565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006130db6029836138fd565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006131416020836138fd565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613181602c836138fd565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006131e76029836138fd565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061324d602f836138fd565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006132b36021836138fd565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133196031836138fd565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061337f602c836138fd565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006133e560178361390e565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b600061342560118361390e565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b6000613465602f836138fd565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b6134c781613aa2565b82525050565b60006134d98285612d79565b91506134e58284612d79565b91508190509392505050565b60006134fc826133d8565b91506135088285612d79565b915061351382613418565b915061351f8284612d79565b91508190509392505050565b60006020820190506135406000830184612cda565b92915050565b600060808201905061355b6000830187612cda565b6135686020830186612cda565b61357560408301856134be565b81810360608301526135878184612d07565b905095945050505050565b60006020820190506135a76000830184612ce9565b92915050565b60006020820190506135c26000830184612cf8565b92915050565b600060208201905081810360008301526135e28184612d40565b905092915050565b6000602082019050818103600083015261360381612daa565b9050919050565b6000602082019050818103600083015261362381612dea565b9050919050565b6000602082019050818103600083015261364381612e50565b9050919050565b6000602082019050818103600083015261366381612eb6565b9050919050565b6000602082019050818103600083015261368381612ef6565b9050919050565b600060208201905081810360008301526136a381612f5c565b9050919050565b600060208201905081810360008301526136c381612f9c565b9050919050565b600060208201905081810360008301526136e381613002565b9050919050565b6000602082019050818103600083015261370381613068565b9050919050565b60006020820190508181036000830152613723816130ce565b9050919050565b6000602082019050818103600083015261374381613134565b9050919050565b6000602082019050818103600083015261376381613174565b9050919050565b60006020820190508181036000830152613783816131da565b9050919050565b600060208201905081810360008301526137a381613240565b9050919050565b600060208201905081810360008301526137c3816132a6565b9050919050565b600060208201905081810360008301526137e38161330c565b9050919050565b6000602082019050818103600083015261380381613372565b9050919050565b6000602082019050818103600083015261382381613458565b9050919050565b600060208201905061383f60008301846134be565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561386c5761386b613c51565b5b8060405250919050565b600067ffffffffffffffff82111561389157613890613c51565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156138c1576138c0613c51565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061392482613aa2565b915061392f83613aa2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561396457613963613bc4565b5b828201905092915050565b600061397a82613aa2565b915061398583613aa2565b92508261399557613994613bf3565b5b828204905092915050565b60006139ab82613aa2565b91506139b683613aa2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139ef576139ee613bc4565b5b828202905092915050565b6000613a0582613aa2565b9150613a1083613aa2565b925082821015613a2357613a22613bc4565b5b828203905092915050565b6000613a3982613a82565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ad9578082015181840152602081019050613abe565b83811115613ae8576000848401525b50505050565b6000613af982613aa2565b91506000821415613b0d57613b0c613bc4565b5b600182039050919050565b60006002820490506001821680613b3057607f821691505b60208210811415613b4457613b43613c22565b5b50919050565b6000613b5582613aa2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8857613b87613bc4565b5b600182019050919050565b6000613b9e82613aa2565b9150613ba983613aa2565b925082613bb957613bb8613bf3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613c9a81613a2e565b8114613ca557600080fd5b50565b613cb181613a40565b8114613cbc57600080fd5b50565b613cc881613a4c565b8114613cd357600080fd5b50565b613cdf81613a56565b8114613cea57600080fd5b50565b613cf681613aa2565b8114613d0157600080fd5b5056fea264697066735822122001aa04c81425ad8ec642a85938528b120dbd7365738cb6891afb7de08a7a6f4264736f6c63430008000033

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061018e5760003560e01c806355f804b3116100de578063a22cb46511610097578063c87b56dd11610071578063c87b56dd146104a3578063d5391393146104d3578063d547741f146104f1578063e985e9c51461050d5761018e565b8063a22cb4651461044f578063b88d4fde1461046b578063c654c94f146104875761018e565b806355f804b3146103675780636352211e1461038357806370a08231146103b357806391d14854146103e357806395d89b4114610413578063a217fddf146104315761018e565b8063248a9ca31161014b57806336568abe1161012557806336568abe146102e357806340d097c3146102ff57806342842e0e1461031b5780634f6ccce7146103375761018e565b8063248a9ca3146102675780632f2ff15d146102975780632f745c59146102b35761018e565b806301ffc9a71461019357806306fdde03146101c3578063081812fc146101e1578063095ea7b31461021157806318160ddd1461022d57806323b872dd1461024b575b600080fd5b6101ad60048036038101906101a89190612c1e565b61053d565b6040516101ba9190613592565b60405180910390f35b6101cb61054f565b6040516101d891906135c8565b60405180910390f35b6101fb60048036038101906101f69190612cb1565b6105e1565b604051610208919061352b565b60405180910390f35b61022b60048036038101906102269190612b7d565b610666565b005b61023561077e565b604051610242919061382a565b60405180910390f35b61026560048036038101906102609190612a77565b61078b565b005b610281600480360381019061027c9190612bb9565b6107eb565b60405161028e91906135ad565b60405180910390f35b6102b160048036038101906102ac9190612be2565b61080b565b005b6102cd60048036038101906102c89190612b7d565b610834565b6040516102da919061382a565b60405180910390f35b6102fd60048036038101906102f89190612be2565b6108d9565b005b61031960048036038101906103149190612a12565b61095c565b005b61033560048036038101906103309190612a77565b6109af565b005b610351600480360381019061034c9190612cb1565b6109cf565b60405161035e919061382a565b60405180910390f35b610381600480360381019061037c9190612c70565b610a66565b005b61039d60048036038101906103989190612cb1565b610a96565b6040516103aa919061352b565b60405180910390f35b6103cd60048036038101906103c89190612a12565b610b48565b6040516103da919061382a565b60405180910390f35b6103fd60048036038101906103f89190612be2565b610c00565b60405161040a9190613592565b60405180910390f35b61041b610c6b565b60405161042891906135c8565b60405180910390f35b610439610cfd565b60405161044691906135ad565b60405180910390f35b61046960048036038101906104649190612b41565b610d04565b005b61048560048036038101906104809190612ac6565b610e85565b005b6104a1600480360381019061049c9190612a12565b610ee7565b005b6104bd60048036038101906104b89190612cb1565b610f47565b6040516104ca91906135c8565b60405180910390f35b6104db610fee565b6040516104e891906135ad565b60405180910390f35b61050b60048036038101906105069190612be2565b611012565b005b61052760048036038101906105229190612a3b565b61103b565b6040516105349190613592565b60405180910390f35b6000610548826110cf565b9050919050565b60606000805461055e90613b18565b80601f016020809104026020016040519081016040528092919081815260200182805461058a90613b18565b80156105d75780601f106105ac576101008083540402835291602001916105d7565b820191906000526020600020905b8154815290600101906020018083116105ba57829003601f168201915b5050505050905090565b60006105ec82611149565b61062b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106229061374a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061067182610a96565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156106e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106d9906137aa565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166107016111b5565b73ffffffffffffffffffffffffffffffffffffffff161480610730575061072f8161072a6111b5565b61103b565b5b61076f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610766906136ca565b60405180910390fd5b61077983836111bd565b505050565b6000600880549050905090565b61079c6107966111b5565b82611276565b6107db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107d2906137ca565b60405180910390fd5b6107e6838383611354565b505050565b6000600a6000838152602001908152602001600020600101549050919050565b610814826107eb565b610825816108206111b5565b6115b0565b61082f838361164d565b505050565b600061083f83610b48565b8210610880576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108779061360a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6108e16111b5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461094e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109459061380a565b60405180910390fd5b610958828261172e565b5050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a661098e816109896111b5565b6115b0565b6109a18261099c600b611810565b61181e565b6109ab600b61183c565b5050565b6109ca83838360405180602001604052806000815250610e85565b505050565b60006109d961077e565b8210610a1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a11906137ea565b60405180910390fd5b60088281548110610a54577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000801b610a7b81610a766111b5565b6115b0565b81600c9080519060200190610a91929190612821565b505050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610b3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b369061370a565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610bb9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bb0906136ea565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060018054610c7a90613b18565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca690613b18565b8015610cf35780601f10610cc857610100808354040283529160200191610cf3565b820191906000526020600020905b815481529060010190602001808311610cd657829003601f168201915b5050505050905090565b6000801b81565b610d0c6111b5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610d7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d719061368a565b60405180910390fd5b8060056000610d876111b5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610e346111b5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610e799190613592565b60405180910390a35050565b610e96610e906111b5565b83611276565b610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc906137ca565b60405180910390fd5b610ee184848484611852565b50505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610f1981610f146111b5565b6115b0565b610f437f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a68361080b565b5050565b6060610f5282611149565b610f91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f889061378a565b60405180910390fd5b6000610f9b6118ae565b90506000815111610fbb5760405180602001604052806000815250610fe6565b80610fc584611940565b604051602001610fd69291906134cd565b6040516020818303038152906040525b915050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b61101b826107eb565b61102c816110276111b5565b6115b0565b611036838361172e565b505050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611142575061114182611aed565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661123083610a96565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061128182611149565b6112c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b7906136aa565b60405180910390fd5b60006112cb83610a96565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061133a57508373ffffffffffffffffffffffffffffffffffffffff16611322846105e1565b73ffffffffffffffffffffffffffffffffffffffff16145b8061134b575061134a818561103b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661137482610a96565b73ffffffffffffffffffffffffffffffffffffffff16146113ca576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c19061376a565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561143a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114319061366a565b60405180910390fd5b611445838383611b67565b6114506000826111bd565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114a091906139fa565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546114f79190613919565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6115ba8282610c00565b611649576115df8173ffffffffffffffffffffffffffffffffffffffff166014611b77565b6115ed8360001c6020611b77565b6040516020016115fe9291906134f1565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164091906135c8565b60405180910390fd5b5050565b6116578282610c00565b61172a576001600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506116cf6111b5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6117388282610c00565b1561180c576000600a600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506117b16111b5565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600081600001549050919050565b611838828260405180602001604052806000815250611e71565b5050565b6001816000016000828254019250508190555050565b61185d848484611354565b61186984848484611ecc565b6118a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189f9061362a565b60405180910390fd5b50505050565b6060600c80546118bd90613b18565b80601f01602080910402602001604051908101604052809291908181526020018280546118e990613b18565b80156119365780601f1061190b57610100808354040283529160200191611936565b820191906000526020600020905b81548152906001019060200180831161191957829003601f168201915b5050505050905090565b60606000821415611988576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611ae8565b600082905060005b600082146119ba5780806119a390613b4a565b915050600a826119b3919061396f565b9150611990565b60008167ffffffffffffffff8111156119fc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611a2e5781602001600182028036833780820191505090505b5090505b60008514611ae157600182611a4791906139fa565b9150600a85611a569190613b93565b6030611a629190613919565b60f81b818381518110611a9e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ada919061396f565b9450611a32565b8093505050505b919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b605750611b5f82612063565b5b9050919050565b611b72838383612145565b505050565b606060006002836002611b8a91906139a0565b611b949190613919565b67ffffffffffffffff811115611bd3577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015611c055781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110611c63577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110611ced577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002611d2d91906139a0565b611d379190613919565b90505b6001811115611e23577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110611d9f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110611ddc577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080611e1c90613aee565b9050611d3a565b5060008414611e67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e5e906135ea565b60405180910390fd5b8091505092915050565b611e7b8383612259565b611e886000848484611ecc565b611ec7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ebe9061362a565b60405180910390fd5b505050565b6000611eed8473ffffffffffffffffffffffffffffffffffffffff16612427565b15612056578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f166111b5565b8786866040518563ffffffff1660e01b8152600401611f389493929190613546565b602060405180830381600087803b158015611f5257600080fd5b505af1925050508015611f8357506040513d601f19601f82011682018060405250810190611f809190612c47565b60015b612006573d8060008114611fb3576040519150601f19603f3d011682016040523d82523d6000602084013e611fb8565b606091505b50600081511415611ffe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff59061362a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061205b565b600190505b949350505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061212e57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061213e575061213d8261243a565b5b9050919050565b6121508383836124a4565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121935761218e816124a9565b6121d2565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146121d1576121d083826124f2565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612215576122108161265f565b612254565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122535761225282826127a2565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122c09061372a565b60405180910390fd5b6122d281611149565b15612312576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123099061364a565b60405180910390fd5b61231e60008383611b67565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461236e9190613919565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016124ff84610b48565b61250991906139fa565b90506000600760008481526020019081526020016000205490508181146125ee576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905061267391906139fa565b90506000600960008481526020019081526020016000205490506000600883815481106126c9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612711577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612786577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127ad83610b48565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461282d90613b18565b90600052602060002090601f01602090048101928261284f5760008555612896565b82601f1061286857805160ff1916838001178555612896565b82800160010185558215612896579182015b8281111561289557825182559160200191906001019061287a565b5b5090506128a391906128a7565b5090565b5b808211156128c05760008160009055506001016128a8565b5090565b60006128d76128d284613876565b613845565b9050828152602081018484840111156128ef57600080fd5b6128fa848285613aac565b509392505050565b6000612915612910846138a6565b613845565b90508281526020810184848401111561292d57600080fd5b612938848285613aac565b509392505050565b60008135905061294f81613c91565b92915050565b60008135905061296481613ca8565b92915050565b60008135905061297981613cbf565b92915050565b60008135905061298e81613cd6565b92915050565b6000815190506129a381613cd6565b92915050565b600082601f8301126129ba57600080fd5b81356129ca8482602086016128c4565b91505092915050565b600082601f8301126129e457600080fd5b81356129f4848260208601612902565b91505092915050565b600081359050612a0c81613ced565b92915050565b600060208284031215612a2457600080fd5b6000612a3284828501612940565b91505092915050565b60008060408385031215612a4e57600080fd5b6000612a5c85828601612940565b9250506020612a6d85828601612940565b9150509250929050565b600080600060608486031215612a8c57600080fd5b6000612a9a86828701612940565b9350506020612aab86828701612940565b9250506040612abc868287016129fd565b9150509250925092565b60008060008060808587031215612adc57600080fd5b6000612aea87828801612940565b9450506020612afb87828801612940565b9350506040612b0c878288016129fd565b925050606085013567ffffffffffffffff811115612b2957600080fd5b612b35878288016129a9565b91505092959194509250565b60008060408385031215612b5457600080fd5b6000612b6285828601612940565b9250506020612b7385828601612955565b9150509250929050565b60008060408385031215612b9057600080fd5b6000612b9e85828601612940565b9250506020612baf858286016129fd565b9150509250929050565b600060208284031215612bcb57600080fd5b6000612bd98482850161296a565b91505092915050565b60008060408385031215612bf557600080fd5b6000612c038582860161296a565b9250506020612c1485828601612940565b9150509250929050565b600060208284031215612c3057600080fd5b6000612c3e8482850161297f565b91505092915050565b600060208284031215612c5957600080fd5b6000612c6784828501612994565b91505092915050565b600060208284031215612c8257600080fd5b600082013567ffffffffffffffff811115612c9c57600080fd5b612ca8848285016129d3565b91505092915050565b600060208284031215612cc357600080fd5b6000612cd1848285016129fd565b91505092915050565b612ce381613a2e565b82525050565b612cf281613a40565b82525050565b612d0181613a4c565b82525050565b6000612d12826138d6565b612d1c81856138ec565b9350612d2c818560208601613abb565b612d3581613c80565b840191505092915050565b6000612d4b826138e1565b612d5581856138fd565b9350612d65818560208601613abb565b612d6e81613c80565b840191505092915050565b6000612d84826138e1565b612d8e818561390e565b9350612d9e818560208601613abb565b80840191505092915050565b6000612db76020836138fd565b91507f537472696e67733a20686578206c656e67746820696e73756666696369656e746000830152602082019050919050565b6000612df7602b836138fd565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b6000612e5d6032836138fd565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b6000612ec3601c836138fd565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000612f036024836138fd565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000612f696019836138fd565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000612fa9602c836138fd565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b600061300f6038836138fd565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613075602a836138fd565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006130db6029836138fd565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b60006131416020836138fd565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000613181602c836138fd565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006131e76029836138fd565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061324d602f836138fd565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006132b36021836138fd565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006133196031836138fd565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b600061337f602c836138fd565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b60006133e560178361390e565b91507f416363657373436f6e74726f6c3a206163636f756e74200000000000000000006000830152601782019050919050565b600061342560118361390e565b91507f206973206d697373696e6720726f6c65200000000000000000000000000000006000830152601182019050919050565b6000613465602f836138fd565b91507f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008301527f20726f6c657320666f722073656c6600000000000000000000000000000000006020830152604082019050919050565b6134c781613aa2565b82525050565b60006134d98285612d79565b91506134e58284612d79565b91508190509392505050565b60006134fc826133d8565b91506135088285612d79565b915061351382613418565b915061351f8284612d79565b91508190509392505050565b60006020820190506135406000830184612cda565b92915050565b600060808201905061355b6000830187612cda565b6135686020830186612cda565b61357560408301856134be565b81810360608301526135878184612d07565b905095945050505050565b60006020820190506135a76000830184612ce9565b92915050565b60006020820190506135c26000830184612cf8565b92915050565b600060208201905081810360008301526135e28184612d40565b905092915050565b6000602082019050818103600083015261360381612daa565b9050919050565b6000602082019050818103600083015261362381612dea565b9050919050565b6000602082019050818103600083015261364381612e50565b9050919050565b6000602082019050818103600083015261366381612eb6565b9050919050565b6000602082019050818103600083015261368381612ef6565b9050919050565b600060208201905081810360008301526136a381612f5c565b9050919050565b600060208201905081810360008301526136c381612f9c565b9050919050565b600060208201905081810360008301526136e381613002565b9050919050565b6000602082019050818103600083015261370381613068565b9050919050565b60006020820190508181036000830152613723816130ce565b9050919050565b6000602082019050818103600083015261374381613134565b9050919050565b6000602082019050818103600083015261376381613174565b9050919050565b60006020820190508181036000830152613783816131da565b9050919050565b600060208201905081810360008301526137a381613240565b9050919050565b600060208201905081810360008301526137c3816132a6565b9050919050565b600060208201905081810360008301526137e38161330c565b9050919050565b6000602082019050818103600083015261380381613372565b9050919050565b6000602082019050818103600083015261382381613458565b9050919050565b600060208201905061383f60008301846134be565b92915050565b6000604051905081810181811067ffffffffffffffff8211171561386c5761386b613c51565b5b8060405250919050565b600067ffffffffffffffff82111561389157613890613c51565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff8211156138c1576138c0613c51565b5b601f19601f8301169050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061392482613aa2565b915061392f83613aa2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561396457613963613bc4565b5b828201905092915050565b600061397a82613aa2565b915061398583613aa2565b92508261399557613994613bf3565b5b828204905092915050565b60006139ab82613aa2565b91506139b683613aa2565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156139ef576139ee613bc4565b5b828202905092915050565b6000613a0582613aa2565b9150613a1083613aa2565b925082821015613a2357613a22613bc4565b5b828203905092915050565b6000613a3982613a82565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ad9578082015181840152602081019050613abe565b83811115613ae8576000848401525b50505050565b6000613af982613aa2565b91506000821415613b0d57613b0c613bc4565b5b600182039050919050565b60006002820490506001821680613b3057607f821691505b60208210811415613b4457613b43613c22565b5b50919050565b6000613b5582613aa2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613b8857613b87613bc4565b5b600182019050919050565b6000613b9e82613aa2565b9150613ba983613aa2565b925082613bb957613bb8613bf3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613c9a81613a2e565b8114613ca557600080fd5b50565b613cb181613a40565b8114613cbc57600080fd5b50565b613cc881613a4c565b8114613cd357600080fd5b50565b613cdf81613a56565b8114613cea57600080fd5b50565b613cf681613aa2565b8114613d0157600080fd5b5056fea264697066735822122001aa04c81425ad8ec642a85938528b120dbd7365738cb6891afb7de08a7a6f4264736f6c63430008000033

Deployed Bytecode Sourcemap

52632:1437:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53527:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21747:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23306:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22829:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35498:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24196:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47925:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48310:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35166:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49358:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53072:156;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24606:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35688:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53959:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21441:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21171:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46810:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21916:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45901:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23599:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24862:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53721:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22091:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52755:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48702:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23965:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53527:186;53645:4;53669:36;53693:11;53669:23;:36::i;:::-;53662:43;;53527:186;;;:::o;21747:100::-;21801:13;21834:5;21827:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21747:100;:::o;23306:221::-;23382:7;23410:16;23418:7;23410;:16::i;:::-;23402:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23495:15;:24;23511:7;23495:24;;;;;;;;;;;;;;;;;;;;;23488:31;;23306:221;;;:::o;22829:411::-;22910:13;22926:23;22941:7;22926:14;:23::i;:::-;22910:39;;22974:5;22968:11;;:2;:11;;;;22960:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23068:5;23052:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23077:37;23094:5;23101:12;:10;:12::i;:::-;23077:16;:37::i;:::-;23052:62;23030:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23211:21;23220:2;23224:7;23211:8;:21::i;:::-;22829:411;;;:::o;35498:113::-;35559:7;35586:10;:17;;;;35579:24;;35498:113;:::o;24196:339::-;24391:41;24410:12;:10;:12::i;:::-;24424:7;24391:18;:41::i;:::-;24383:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24499:28;24509:4;24515:2;24519:7;24499:9;:28::i;:::-;24196:339;;;:::o;47925:123::-;47991:7;48018:6;:12;48025:4;48018:12;;;;;;;;;;;:22;;;48011:29;;47925:123;;;:::o;48310:147::-;48393:18;48406:4;48393:12;:18::i;:::-;46392:30;46403:4;46409:12;:10;:12::i;:::-;46392:10;:30::i;:::-;48424:25:::1;48435:4;48441:7;48424:10;:25::i;:::-;48310:147:::0;;;:::o;35166:256::-;35263:7;35299:23;35316:5;35299:16;:23::i;:::-;35291:5;:31;35283:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35388:12;:19;35401:5;35388:19;;;;;;;;;;;;;;;:26;35408:5;35388:26;;;;;;;;;;;;35381:33;;35166:256;;;;:::o;49358:218::-;49465:12;:10;:12::i;:::-;49454:23;;:7;:23;;;49446:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;49542:26;49554:4;49560:7;49542:11;:26::i;:::-;49358:218;;:::o;53072:156::-;52793:24;46392:30;46403:4;46409:12;:10;:12::i;:::-;46392:10;:30::i;:::-;53142:40:::1;53152:2;53156:25;:15;:23;:25::i;:::-;53142:9;:40::i;:::-;53193:27;:15;:25;:27::i;:::-;53072:156:::0;;:::o;24606:185::-;24744:39;24761:4;24767:2;24771:7;24744:39;;;;;;;;;;;;:16;:39::i;:::-;24606:185;;;:::o;35688:233::-;35763:7;35799:30;:28;:30::i;:::-;35791:5;:38;35783:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35896:10;35907:5;35896:17;;;;;;;;;;;;;;;;;;;;;;;;35889:24;;35688:233;;;:::o;53959:107::-;45946:4;54014:18;;46392:30;46403:4;46409:12;:10;:12::i;:::-;46392:10;:30::i;:::-;54055:3:::1;54045:7;:13;;;;;;;;;;;;:::i;:::-;;53959:107:::0;;:::o;21441:239::-;21513:7;21533:13;21549:7;:16;21557:7;21549:16;;;;;;;;;;;;;;;;;;;;;21533:32;;21601:1;21584:19;;:5;:19;;;;21576:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21667:5;21660:12;;;21441:239;;;:::o;21171:208::-;21243:7;21288:1;21271:19;;:5;:19;;;;21263:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21355:9;:16;21365:5;21355:16;;;;;;;;;;;;;;;;21348:23;;21171:208;;;:::o;46810:139::-;46888:4;46912:6;:12;46919:4;46912:12;;;;;;;;;;;:20;;:29;46933:7;46912:29;;;;;;;;;;;;;;;;;;;;;;;;;46905:36;;46810:139;;;;:::o;21916:104::-;21972:13;22005:7;21998:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21916:104;:::o;45901:49::-;45946:4;45901:49;;;:::o;23599:295::-;23714:12;:10;:12::i;:::-;23702:24;;:8;:24;;;;23694:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23814:8;23769:18;:32;23788:12;:10;:12::i;:::-;23769:32;;;;;;;;;;;;;;;:42;23802:8;23769:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23867:8;23838:48;;23853:12;:10;:12::i;:::-;23838:48;;;23877:8;23838:48;;;;;;:::i;:::-;;;;;;;;23599:295;;:::o;24862:328::-;25037:41;25056:12;:10;:12::i;:::-;25070:7;25037:18;:41::i;:::-;25029:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25143:39;25157:4;25163:2;25167:7;25176:5;25143:13;:39::i;:::-;24862:328;;;;:::o;53721:122::-;52793:24;46392:30;46403:4;46409:12;:10;:12::i;:::-;46392:10;:30::i;:::-;53809:26:::1;52793:24;53832:2;53809:9;:26::i;:::-;53721:122:::0;;:::o;22091:334::-;22164:13;22198:16;22206:7;22198;:16::i;:::-;22190:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22279:21;22303:10;:8;:10::i;:::-;22279:34;;22355:1;22337:7;22331:21;:25;:86;;;;;;;;;;;;;;;;;22383:7;22392:18;:7;:16;:18::i;:::-;22366:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22331:86;22324:93;;;22091:334;;;:::o;52755:62::-;52793:24;52755:62;:::o;48702:149::-;48786:18;48799:4;48786:12;:18::i;:::-;46392:30;46403:4;46409:12;:10;:12::i;:::-;46392:10;:30::i;:::-;48817:26:::1;48829:4;48835:7;48817:11;:26::i;:::-;48702:149:::0;;;:::o;23965:164::-;24062:4;24086:18;:25;24105:5;24086:25;;;;;;;;;;;;;;;:35;24112:8;24086:35;;;;;;;;;;;;;;;;;;;;;;;;;24079:42;;23965:164;;;;:::o;46514:204::-;46599:4;46638:32;46623:47;;;:11;:47;;;;:87;;;;46674:36;46698:11;46674:23;:36::i;:::-;46623:87;46616:94;;46514:204;;;:::o;26700:127::-;26765:4;26817:1;26789:30;;:7;:16;26797:7;26789:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26782:37;;26700:127;;;:::o;16204:98::-;16257:7;16284:10;16277:17;;16204:98;:::o;30682:174::-;30784:2;30757:15;:24;30773:7;30757:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30840:7;30836:2;30802:46;;30811:23;30826:7;30811:14;:23::i;:::-;30802:46;;;;;;;;;;;;30682:174;;:::o;26994:348::-;27087:4;27112:16;27120:7;27112;:16::i;:::-;27104:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27188:13;27204:23;27219:7;27204:14;:23::i;:::-;27188:39;;27257:5;27246:16;;:7;:16;;;:51;;;;27290:7;27266:31;;:20;27278:7;27266:11;:20::i;:::-;:31;;;27246:51;:87;;;;27301:32;27318:5;27325:7;27301:16;:32::i;:::-;27246:87;27238:96;;;26994:348;;;;:::o;29986:578::-;30145:4;30118:31;;:23;30133:7;30118:14;:23::i;:::-;:31;;;30110:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30228:1;30214:16;;:2;:16;;;;30206:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30284:39;30305:4;30311:2;30315:7;30284:20;:39::i;:::-;30388:29;30405:1;30409:7;30388:8;:29::i;:::-;30449:1;30430:9;:15;30440:4;30430:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30478:1;30461:9;:13;30471:2;30461:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30509:2;30490:7;:16;30498:7;30490:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30548:7;30544:2;30529:27;;30538:4;30529:27;;;;;;;;;;;;29986:578;;;:::o;47239:497::-;47320:22;47328:4;47334:7;47320;:22::i;:::-;47315:414;;47508:41;47536:7;47508:41;;47546:2;47508:19;:41::i;:::-;47622:38;47650:4;47642:13;;47657:2;47622:19;:38::i;:::-;47413:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47359:358;;;;;;;;;;;:::i;:::-;;;;;;;;47315:414;47239:497;;:::o;50662:229::-;50737:22;50745:4;50751:7;50737;:22::i;:::-;50732:152;;50808:4;50776:6;:12;50783:4;50776:12;;;;;;;;;;;:20;;:29;50797:7;50776:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;50859:12;:10;:12::i;:::-;50832:40;;50850:7;50832:40;;50844:4;50832:40;;;;;;;;;;50732:152;50662:229;;:::o;50899:230::-;50974:22;50982:4;50988:7;50974;:22::i;:::-;50970:152;;;51045:5;51013:6;:12;51020:4;51013:12;;;;;;;;;;;:20;;:29;51034:7;51013:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;51097:12;:10;:12::i;:::-;51070:40;;51088:7;51070:40;;51082:4;51070:40;;;;;;;;;;50970:152;50899:230;;:::o;51961:114::-;52026:7;52053;:14;;;52046:21;;51961:114;;;:::o;27684:110::-;27760:26;27770:2;27774:7;27760:26;;;;;;;;;;;;:9;:26::i;:::-;27684:110;;:::o;52083:127::-;52190:1;52172:7;:14;;;:19;;;;;;;;;;;52083:127;:::o;26072:315::-;26229:28;26239:4;26245:2;26249:7;26229:9;:28::i;:::-;26276:48;26299:4;26305:2;26309:7;26318:5;26276:22;:48::i;:::-;26268:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26072:315;;;;:::o;53851:100::-;53903:13;53936:7;53929:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53851:100;:::o;16737:723::-;16793:13;17023:1;17014:5;:10;17010:53;;;17041:10;;;;;;;;;;;;;;;;;;;;;17010:53;17073:12;17088:5;17073:20;;17104:14;17129:78;17144:1;17136:4;:9;17129:78;;17162:8;;;;;:::i;:::-;;;;17193:2;17185:10;;;;;:::i;:::-;;;17129:78;;;17217:19;17249:6;17239:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17217:39;;17267:154;17283:1;17274:5;:10;17267:154;;17311:1;17301:11;;;;;:::i;:::-;;;17378:2;17370:5;:10;;;;:::i;:::-;17357:2;:24;;;;:::i;:::-;17344:39;;17327:6;17334;17327:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17407:2;17398:11;;;;;:::i;:::-;;;17267:154;;;17445:6;17431:21;;;;;16737:723;;;;:::o;34858:224::-;34960:4;34999:35;34984:50;;;:11;:50;;;;:90;;;;35038:36;35062:11;35038:23;:36::i;:::-;34984:90;34977:97;;34858:224;;;:::o;53304:215::-;53466:45;53493:4;53499:2;53503:7;53466:26;:45::i;:::-;53304:215;;;:::o;18038:451::-;18113:13;18139:19;18184:1;18175:6;18171:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18161:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18139:47;;18197:15;:6;18204:1;18197:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;18223;:6;18230:1;18223:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;18254:9;18279:1;18270:6;18266:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;18254:26;;18249:135;18286:1;18282;:5;18249:135;;;18321:12;18342:3;18334:5;:11;18321:25;;;;;;;;;;;;;;;;;;18309:6;18316:1;18309:9;;;;;;;;;;;;;;;;;;;:37;;;;;;;;;;;18371:1;18361:11;;;;;18289:3;;;;:::i;:::-;;;18249:135;;;;18411:1;18402:5;:10;18394:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;18474:6;18460:21;;;18038:451;;;;:::o;28021:321::-;28151:18;28157:2;28161:7;28151:5;:18::i;:::-;28202:54;28233:1;28237:2;28241:7;28250:5;28202:22;:54::i;:::-;28180:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28021:321;;;:::o;31421:799::-;31576:4;31597:15;:2;:13;;;:15::i;:::-;31593:620;;;31649:2;31633:36;;;31670:12;:10;:12::i;:::-;31684:4;31690:7;31699:5;31633:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31629:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31892:1;31875:6;:13;:18;31871:272;;;31918:60;;;;;;;;;;:::i;:::-;;;;;;;;31871:272;32093:6;32087:13;32078:6;32074:2;32070:15;32063:38;31629:529;31766:41;;;31756:51;;;:6;:51;;;;31749:58;;;;;31593:620;32197:4;32190:11;;31421:799;;;;;;;:::o;20802:305::-;20904:4;20956:25;20941:40;;;:11;:40;;;;:105;;;;21013:33;20998:48;;;:11;:48;;;;20941:105;:158;;;;21063:36;21087:11;21063:23;:36::i;:::-;20941:158;20921:178;;20802:305;;;:::o;36534:589::-;36678:45;36705:4;36711:2;36715:7;36678:26;:45::i;:::-;36756:1;36740:18;;:4;:18;;;36736:187;;;36775:40;36807:7;36775:31;:40::i;:::-;36736:187;;;36845:2;36837:10;;:4;:10;;;36833:90;;36864:47;36897:4;36903:7;36864:32;:47::i;:::-;36833:90;36736:187;36951:1;36937:16;;:2;:16;;;36933:183;;;36970:45;37007:7;36970:36;:45::i;:::-;36933:183;;;37043:4;37037:10;;:2;:10;;;37033:83;;37064:40;37092:2;37096:7;37064:27;:40::i;:::-;37033:83;36933:183;36534:589;;;:::o;28678:382::-;28772:1;28758:16;;:2;:16;;;;28750:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28831:16;28839:7;28831;:16::i;:::-;28830:17;28822:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28893:45;28922:1;28926:2;28930:7;28893:20;:45::i;:::-;28968:1;28951:9;:13;28961:2;28951:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28999:2;28980:7;:16;28988:7;28980:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29044:7;29040:2;29019:33;;29036:1;29019:33;;;;;;;;;;;;28678:382;;:::o;8240:387::-;8300:4;8508:12;8575:7;8563:20;8555:28;;8618:1;8611:4;:8;8604:15;;;8240:387;;;:::o;19300:157::-;19385:4;19424:25;19409:40;;;:11;:40;;;;19402:47;;19300:157;;;:::o;32792:126::-;;;;:::o;37846:164::-;37950:10;:17;;;;37923:15;:24;37939:7;37923:24;;;;;;;;;;;:44;;;;37978:10;37994:7;37978:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37846:164;:::o;38637:988::-;38903:22;38953:1;38928:22;38945:4;38928:16;:22::i;:::-;:26;;;;:::i;:::-;38903:51;;38965:18;38986:17;:26;39004:7;38986:26;;;;;;;;;;;;38965:47;;39133:14;39119:10;:28;39115:328;;39164:19;39186:12;:18;39199:4;39186:18;;;;;;;;;;;;;;;:34;39205:14;39186:34;;;;;;;;;;;;39164:56;;39270:11;39237:12;:18;39250:4;39237:18;;;;;;;;;;;;;;;:30;39256:10;39237:30;;;;;;;;;;;:44;;;;39387:10;39354:17;:30;39372:11;39354:30;;;;;;;;;;;:43;;;;39115:328;;39539:17;:26;39557:7;39539:26;;;;;;;;;;;39532:33;;;39583:12;:18;39596:4;39583:18;;;;;;;;;;;;;;;:34;39602:14;39583:34;;;;;;;;;;;39576:41;;;38637:988;;;;:::o;39920:1079::-;40173:22;40218:1;40198:10;:17;;;;:21;;;;:::i;:::-;40173:46;;40230:18;40251:15;:24;40267:7;40251:24;;;;;;;;;;;;40230:45;;40602:19;40624:10;40635:14;40624:26;;;;;;;;;;;;;;;;;;;;;;;;40602:48;;40688:11;40663:10;40674;40663:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40799:10;40768:15;:28;40784:11;40768:28;;;;;;;;;;;:41;;;;40940:15;:24;40956:7;40940:24;;;;;;;;;;;40933:31;;;40975:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39920:1079;;;;:::o;37424:221::-;37509:14;37526:20;37543:2;37526:16;:20::i;:::-;37509:37;;37584:7;37557:12;:16;37570:2;37557:16;;;;;;;;;;;;;;;:24;37574:6;37557:24;;;;;;;;;;;:34;;;;37631:6;37602:17;:26;37620:7;37602:26;;;;;;;;;;;:35;;;;37424:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:139::-;;1073:6;1060:20;1051:29;;1089:33;1116:5;1089:33;:::i;:::-;1041:87;;;;:::o;1134:137::-;;1217:6;1204:20;1195:29;;1233:32;1259:5;1233:32;:::i;:::-;1185:86;;;;:::o;1277:141::-;;1364:6;1358:13;1349:22;;1380:32;1406:5;1380:32;:::i;:::-;1339:79;;;;:::o;1437:271::-;;1541:3;1534:4;1526:6;1522:17;1518:27;1508:2;;1559:1;1556;1549:12;1508:2;1599:6;1586:20;1624:78;1698:3;1690:6;1683:4;1675:6;1671:17;1624:78;:::i;:::-;1615:87;;1498:210;;;;;:::o;1728:273::-;;1833:3;1826:4;1818:6;1814:17;1810:27;1800:2;;1851:1;1848;1841:12;1800:2;1891:6;1878:20;1916:79;1991:3;1983:6;1976:4;1968:6;1964:17;1916:79;:::i;:::-;1907:88;;1790:211;;;;;:::o;2007:139::-;;2091:6;2078:20;2069:29;;2107:33;2134:5;2107:33;:::i;:::-;2059:87;;;;:::o;2152:262::-;;2260:2;2248:9;2239:7;2235:23;2231:32;2228:2;;;2276:1;2273;2266:12;2228:2;2319:1;2344:53;2389:7;2380:6;2369:9;2365:22;2344:53;:::i;:::-;2334:63;;2290:117;2218:196;;;;:::o;2420:407::-;;;2545:2;2533:9;2524:7;2520:23;2516:32;2513:2;;;2561:1;2558;2551:12;2513:2;2604:1;2629:53;2674:7;2665:6;2654:9;2650:22;2629:53;:::i;:::-;2619:63;;2575:117;2731:2;2757:53;2802:7;2793:6;2782:9;2778:22;2757:53;:::i;:::-;2747:63;;2702:118;2503:324;;;;;:::o;2833:552::-;;;;2975:2;2963:9;2954:7;2950:23;2946:32;2943:2;;;2991:1;2988;2981:12;2943:2;3034:1;3059:53;3104:7;3095:6;3084:9;3080:22;3059:53;:::i;:::-;3049:63;;3005:117;3161:2;3187:53;3232:7;3223:6;3212:9;3208:22;3187:53;:::i;:::-;3177:63;;3132:118;3289:2;3315:53;3360:7;3351:6;3340:9;3336:22;3315:53;:::i;:::-;3305:63;;3260:118;2933:452;;;;;:::o;3391:809::-;;;;;3559:3;3547:9;3538:7;3534:23;3530:33;3527:2;;;3576:1;3573;3566:12;3527:2;3619:1;3644:53;3689:7;3680:6;3669:9;3665:22;3644:53;:::i;:::-;3634:63;;3590:117;3746:2;3772:53;3817:7;3808:6;3797:9;3793:22;3772:53;:::i;:::-;3762:63;;3717:118;3874:2;3900:53;3945:7;3936:6;3925:9;3921:22;3900:53;:::i;:::-;3890:63;;3845:118;4030:2;4019:9;4015:18;4002:32;4061:18;4053:6;4050:30;4047:2;;;4093:1;4090;4083:12;4047:2;4121:62;4175:7;4166:6;4155:9;4151:22;4121:62;:::i;:::-;4111:72;;3973:220;3517:683;;;;;;;:::o;4206:401::-;;;4328:2;4316:9;4307:7;4303:23;4299:32;4296:2;;;4344:1;4341;4334:12;4296:2;4387:1;4412:53;4457:7;4448:6;4437:9;4433:22;4412:53;:::i;:::-;4402:63;;4358:117;4514:2;4540:50;4582:7;4573:6;4562:9;4558:22;4540:50;:::i;:::-;4530:60;;4485:115;4286:321;;;;;:::o;4613:407::-;;;4738:2;4726:9;4717:7;4713:23;4709:32;4706:2;;;4754:1;4751;4744:12;4706:2;4797:1;4822:53;4867:7;4858:6;4847:9;4843:22;4822:53;:::i;:::-;4812:63;;4768:117;4924:2;4950:53;4995:7;4986:6;4975:9;4971:22;4950:53;:::i;:::-;4940:63;;4895:118;4696:324;;;;;:::o;5026:262::-;;5134:2;5122:9;5113:7;5109:23;5105:32;5102:2;;;5150:1;5147;5140:12;5102:2;5193:1;5218:53;5263:7;5254:6;5243:9;5239:22;5218:53;:::i;:::-;5208:63;;5164:117;5092:196;;;;:::o;5294:407::-;;;5419:2;5407:9;5398:7;5394:23;5390:32;5387:2;;;5435:1;5432;5425:12;5387:2;5478:1;5503:53;5548:7;5539:6;5528:9;5524:22;5503:53;:::i;:::-;5493:63;;5449:117;5605:2;5631:53;5676:7;5667:6;5656:9;5652:22;5631:53;:::i;:::-;5621:63;;5576:118;5377:324;;;;;:::o;5707:260::-;;5814:2;5802:9;5793:7;5789:23;5785:32;5782:2;;;5830:1;5827;5820:12;5782:2;5873:1;5898:52;5942:7;5933:6;5922:9;5918:22;5898:52;:::i;:::-;5888:62;;5844:116;5772:195;;;;:::o;5973:282::-;;6091:2;6079:9;6070:7;6066:23;6062:32;6059:2;;;6107:1;6104;6097:12;6059:2;6150:1;6175:63;6230:7;6221:6;6210:9;6206:22;6175:63;:::i;:::-;6165:73;;6121:127;6049:206;;;;:::o;6261:375::-;;6379:2;6367:9;6358:7;6354:23;6350:32;6347:2;;;6395:1;6392;6385:12;6347:2;6466:1;6455:9;6451:17;6438:31;6496:18;6488:6;6485:30;6482:2;;;6528:1;6525;6518:12;6482:2;6556:63;6611:7;6602:6;6591:9;6587:22;6556:63;:::i;:::-;6546:73;;6409:220;6337:299;;;;:::o;6642:262::-;;6750:2;6738:9;6729:7;6725:23;6721:32;6718:2;;;6766:1;6763;6756:12;6718:2;6809:1;6834:53;6879:7;6870:6;6859:9;6855:22;6834:53;:::i;:::-;6824:63;;6780:117;6708:196;;;;:::o;6910:118::-;6997:24;7015:5;6997:24;:::i;:::-;6992:3;6985:37;6975:53;;:::o;7034:109::-;7115:21;7130:5;7115:21;:::i;:::-;7110:3;7103:34;7093:50;;:::o;7149:118::-;7236:24;7254:5;7236:24;:::i;:::-;7231:3;7224:37;7214:53;;:::o;7273:360::-;;7387:38;7419:5;7387:38;:::i;:::-;7441:70;7504:6;7499:3;7441:70;:::i;:::-;7434:77;;7520:52;7565:6;7560:3;7553:4;7546:5;7542:16;7520:52;:::i;:::-;7597:29;7619:6;7597:29;:::i;:::-;7592:3;7588:39;7581:46;;7363:270;;;;;:::o;7639:364::-;;7755:39;7788:5;7755:39;:::i;:::-;7810:71;7874:6;7869:3;7810:71;:::i;:::-;7803:78;;7890:52;7935:6;7930:3;7923:4;7916:5;7912:16;7890:52;:::i;:::-;7967:29;7989:6;7967:29;:::i;:::-;7962:3;7958:39;7951:46;;7731:272;;;;;:::o;8009:377::-;;8143:39;8176:5;8143:39;:::i;:::-;8198:89;8280:6;8275:3;8198:89;:::i;:::-;8191:96;;8296:52;8341:6;8336:3;8329:4;8322:5;8318:16;8296:52;:::i;:::-;8373:6;8368:3;8364:16;8357:23;;8119:267;;;;;:::o;8392:330::-;;8555:67;8619:2;8614:3;8555:67;:::i;:::-;8548:74;;8652:34;8648:1;8643:3;8639:11;8632:55;8713:2;8708:3;8704:12;8697:19;;8538:184;;;:::o;8728:375::-;;8891:67;8955:2;8950:3;8891:67;:::i;:::-;8884:74;;8988:34;8984:1;8979:3;8975:11;8968:55;9054:13;9049:2;9044:3;9040:12;9033:35;9094:2;9089:3;9085:12;9078:19;;8874:229;;;:::o;9109:382::-;;9272:67;9336:2;9331:3;9272:67;:::i;:::-;9265:74;;9369:34;9365:1;9360:3;9356:11;9349:55;9435:20;9430:2;9425:3;9421:12;9414:42;9482:2;9477:3;9473:12;9466:19;;9255:236;;;:::o;9497:326::-;;9660:67;9724:2;9719:3;9660:67;:::i;:::-;9653:74;;9757:30;9753:1;9748:3;9744:11;9737:51;9814:2;9809:3;9805:12;9798:19;;9643:180;;;:::o;9829:368::-;;9992:67;10056:2;10051:3;9992:67;:::i;:::-;9985:74;;10089:34;10085:1;10080:3;10076:11;10069:55;10155:6;10150:2;10145:3;10141:12;10134:28;10188:2;10183:3;10179:12;10172:19;;9975:222;;;:::o;10203:323::-;;10366:67;10430:2;10425:3;10366:67;:::i;:::-;10359:74;;10463:27;10459:1;10454:3;10450:11;10443:48;10517:2;10512:3;10508:12;10501:19;;10349:177;;;:::o;10532:376::-;;10695:67;10759:2;10754:3;10695:67;:::i;:::-;10688:74;;10792:34;10788:1;10783:3;10779:11;10772:55;10858:14;10853:2;10848:3;10844:12;10837:36;10899:2;10894:3;10890:12;10883:19;;10678:230;;;:::o;10914:388::-;;11077:67;11141:2;11136:3;11077:67;:::i;:::-;11070:74;;11174:34;11170:1;11165:3;11161:11;11154:55;11240:26;11235:2;11230:3;11226:12;11219:48;11293:2;11288:3;11284:12;11277:19;;11060:242;;;:::o;11308:374::-;;11471:67;11535:2;11530:3;11471:67;:::i;:::-;11464:74;;11568:34;11564:1;11559:3;11555:11;11548:55;11634:12;11629:2;11624:3;11620:12;11613:34;11673:2;11668:3;11664:12;11657:19;;11454:228;;;:::o;11688:373::-;;11851:67;11915:2;11910:3;11851:67;:::i;:::-;11844:74;;11948:34;11944:1;11939:3;11935:11;11928:55;12014:11;12009:2;12004:3;12000:12;11993:33;12052:2;12047:3;12043:12;12036:19;;11834:227;;;:::o;12067:330::-;;12230:67;12294:2;12289:3;12230:67;:::i;:::-;12223:74;;12327:34;12323:1;12318:3;12314:11;12307:55;12388:2;12383:3;12379:12;12372:19;;12213:184;;;:::o;12403:376::-;;12566:67;12630:2;12625:3;12566:67;:::i;:::-;12559:74;;12663:34;12659:1;12654:3;12650:11;12643:55;12729:14;12724:2;12719:3;12715:12;12708:36;12770:2;12765:3;12761:12;12754:19;;12549:230;;;:::o;12785:373::-;;12948:67;13012:2;13007:3;12948:67;:::i;:::-;12941:74;;13045:34;13041:1;13036:3;13032:11;13025:55;13111:11;13106:2;13101:3;13097:12;13090:33;13149:2;13144:3;13140:12;13133:19;;12931:227;;;:::o;13164:379::-;;13327:67;13391:2;13386:3;13327:67;:::i;:::-;13320:74;;13424:34;13420:1;13415:3;13411:11;13404:55;13490:17;13485:2;13480:3;13476:12;13469:39;13534:2;13529:3;13525:12;13518:19;;13310:233;;;:::o;13549:365::-;;13712:67;13776:2;13771:3;13712:67;:::i;:::-;13705:74;;13809:34;13805:1;13800:3;13796:11;13789:55;13875:3;13870:2;13865:3;13861:12;13854:25;13905:2;13900:3;13896:12;13889:19;;13695:219;;;:::o;13920:381::-;;14083:67;14147:2;14142:3;14083:67;:::i;:::-;14076:74;;14180:34;14176:1;14171:3;14167:11;14160:55;14246:19;14241:2;14236:3;14232:12;14225:41;14292:2;14287:3;14283:12;14276:19;;14066:235;;;:::o;14307:376::-;;14470:67;14534:2;14529:3;14470:67;:::i;:::-;14463:74;;14567:34;14563:1;14558:3;14554:11;14547:55;14633:14;14628:2;14623:3;14619:12;14612:36;14674:2;14669:3;14665:12;14658:19;;14453:230;;;:::o;14689:357::-;;14870:85;14952:2;14947:3;14870:85;:::i;:::-;14863:92;;14985:25;14981:1;14976:3;14972:11;14965:46;15037:2;15032:3;15028:12;15021:19;;14853:193;;;:::o;15052:351::-;;15233:85;15315:2;15310:3;15233:85;:::i;:::-;15226:92;;15348:19;15344:1;15339:3;15335:11;15328:40;15394:2;15389:3;15385:12;15378:19;;15216:187;;;:::o;15409:379::-;;15572:67;15636:2;15631:3;15572:67;:::i;:::-;15565:74;;15669:34;15665:1;15660:3;15656:11;15649:55;15735:17;15730:2;15725:3;15721:12;15714:39;15779:2;15774:3;15770:12;15763:19;;15555:233;;;:::o;15794:118::-;15881:24;15899:5;15881:24;:::i;:::-;15876:3;15869:37;15859:53;;:::o;15918:435::-;;16120:95;16211:3;16202:6;16120:95;:::i;:::-;16113:102;;16232:95;16323:3;16314:6;16232:95;:::i;:::-;16225:102;;16344:3;16337:10;;16102:251;;;;;:::o;16359:967::-;;16763:148;16907:3;16763:148;:::i;:::-;16756:155;;16928:95;17019:3;17010:6;16928:95;:::i;:::-;16921:102;;17040:148;17184:3;17040:148;:::i;:::-;17033:155;;17205:95;17296:3;17287:6;17205:95;:::i;:::-;17198:102;;17317:3;17310:10;;16745:581;;;;;:::o;17332:222::-;;17463:2;17452:9;17448:18;17440:26;;17476:71;17544:1;17533:9;17529:17;17520:6;17476:71;:::i;:::-;17430:124;;;;:::o;17560:640::-;;17793:3;17782:9;17778:19;17770:27;;17807:71;17875:1;17864:9;17860:17;17851:6;17807:71;:::i;:::-;17888:72;17956:2;17945:9;17941:18;17932:6;17888:72;:::i;:::-;17970;18038:2;18027:9;18023:18;18014:6;17970:72;:::i;:::-;18089:9;18083:4;18079:20;18074:2;18063:9;18059:18;18052:48;18117:76;18188:4;18179:6;18117:76;:::i;:::-;18109:84;;17760:440;;;;;;;:::o;18206:210::-;;18331:2;18320:9;18316:18;18308:26;;18344:65;18406:1;18395:9;18391:17;18382:6;18344:65;:::i;:::-;18298:118;;;;:::o;18422:222::-;;18553:2;18542:9;18538:18;18530:26;;18566:71;18634:1;18623:9;18619:17;18610:6;18566:71;:::i;:::-;18520:124;;;;:::o;18650:313::-;;18801:2;18790:9;18786:18;18778:26;;18850:9;18844:4;18840:20;18836:1;18825:9;18821:17;18814:47;18878:78;18951:4;18942:6;18878:78;:::i;:::-;18870:86;;18768:195;;;;:::o;18969:419::-;;19173:2;19162:9;19158:18;19150:26;;19222:9;19216:4;19212:20;19208:1;19197:9;19193:17;19186:47;19250:131;19376:4;19250:131;:::i;:::-;19242:139;;19140:248;;;:::o;19394:419::-;;19598:2;19587:9;19583:18;19575:26;;19647:9;19641:4;19637:20;19633:1;19622:9;19618:17;19611:47;19675:131;19801:4;19675:131;:::i;:::-;19667:139;;19565:248;;;:::o;19819:419::-;;20023:2;20012:9;20008:18;20000:26;;20072:9;20066:4;20062:20;20058:1;20047:9;20043:17;20036:47;20100:131;20226:4;20100:131;:::i;:::-;20092:139;;19990:248;;;:::o;20244:419::-;;20448:2;20437:9;20433:18;20425:26;;20497:9;20491:4;20487:20;20483:1;20472:9;20468:17;20461:47;20525:131;20651:4;20525:131;:::i;:::-;20517:139;;20415:248;;;:::o;20669:419::-;;20873:2;20862:9;20858:18;20850:26;;20922:9;20916:4;20912:20;20908:1;20897:9;20893:17;20886:47;20950:131;21076:4;20950:131;:::i;:::-;20942:139;;20840:248;;;:::o;21094:419::-;;21298:2;21287:9;21283:18;21275:26;;21347:9;21341:4;21337:20;21333:1;21322:9;21318:17;21311:47;21375:131;21501:4;21375:131;:::i;:::-;21367:139;;21265:248;;;:::o;21519:419::-;;21723:2;21712:9;21708:18;21700:26;;21772:9;21766:4;21762:20;21758:1;21747:9;21743:17;21736:47;21800:131;21926:4;21800:131;:::i;:::-;21792:139;;21690:248;;;:::o;21944:419::-;;22148:2;22137:9;22133:18;22125:26;;22197:9;22191:4;22187:20;22183:1;22172:9;22168:17;22161:47;22225:131;22351:4;22225:131;:::i;:::-;22217:139;;22115:248;;;:::o;22369:419::-;;22573:2;22562:9;22558:18;22550:26;;22622:9;22616:4;22612:20;22608:1;22597:9;22593:17;22586:47;22650:131;22776:4;22650:131;:::i;:::-;22642:139;;22540:248;;;:::o;22794:419::-;;22998:2;22987:9;22983:18;22975:26;;23047:9;23041:4;23037:20;23033:1;23022:9;23018:17;23011:47;23075:131;23201:4;23075:131;:::i;:::-;23067:139;;22965:248;;;:::o;23219:419::-;;23423:2;23412:9;23408:18;23400:26;;23472:9;23466:4;23462:20;23458:1;23447:9;23443:17;23436:47;23500:131;23626:4;23500:131;:::i;:::-;23492:139;;23390:248;;;:::o;23644:419::-;;23848:2;23837:9;23833:18;23825:26;;23897:9;23891:4;23887:20;23883:1;23872:9;23868:17;23861:47;23925:131;24051:4;23925:131;:::i;:::-;23917:139;;23815:248;;;:::o;24069:419::-;;24273:2;24262:9;24258:18;24250:26;;24322:9;24316:4;24312:20;24308:1;24297:9;24293:17;24286:47;24350:131;24476:4;24350:131;:::i;:::-;24342:139;;24240:248;;;:::o;24494:419::-;;24698:2;24687:9;24683:18;24675:26;;24747:9;24741:4;24737:20;24733:1;24722:9;24718:17;24711:47;24775:131;24901:4;24775:131;:::i;:::-;24767:139;;24665:248;;;:::o;24919:419::-;;25123:2;25112:9;25108:18;25100:26;;25172:9;25166:4;25162:20;25158:1;25147:9;25143:17;25136:47;25200:131;25326:4;25200:131;:::i;:::-;25192:139;;25090:248;;;:::o;25344:419::-;;25548:2;25537:9;25533:18;25525:26;;25597:9;25591:4;25587:20;25583:1;25572:9;25568:17;25561:47;25625:131;25751:4;25625:131;:::i;:::-;25617:139;;25515:248;;;:::o;25769:419::-;;25973:2;25962:9;25958:18;25950:26;;26022:9;26016:4;26012:20;26008:1;25997:9;25993:17;25986:47;26050:131;26176:4;26050:131;:::i;:::-;26042:139;;25940:248;;;:::o;26194:419::-;;26398:2;26387:9;26383:18;26375:26;;26447:9;26441:4;26437:20;26433:1;26422:9;26418:17;26411:47;26475:131;26601:4;26475:131;:::i;:::-;26467:139;;26365:248;;;:::o;26619:222::-;;26750:2;26739:9;26735:18;26727:26;;26763:71;26831:1;26820:9;26816:17;26807:6;26763:71;:::i;:::-;26717:124;;;;:::o;26847:283::-;;26913:2;26907:9;26897:19;;26955:4;26947:6;26943:17;27062:6;27050:10;27047:22;27026:18;27014:10;27011:34;27008:62;27005:2;;;27073:18;;:::i;:::-;27005:2;27113:10;27109:2;27102:22;26887:243;;;;:::o;27136:331::-;;27287:18;27279:6;27276:30;27273:2;;;27309:18;;:::i;:::-;27273:2;27394:4;27390:9;27383:4;27375:6;27371:17;27367:33;27359:41;;27455:4;27449;27445:15;27437:23;;27202:265;;;:::o;27473:332::-;;27625:18;27617:6;27614:30;27611:2;;;27647:18;;:::i;:::-;27611:2;27732:4;27728:9;27721:4;27713:6;27709:17;27705:33;27697:41;;27793:4;27787;27783:15;27775:23;;27540:265;;;:::o;27811:98::-;;27896:5;27890:12;27880:22;;27869:40;;;:::o;27915:99::-;;28001:5;27995:12;27985:22;;27974:40;;;:::o;28020:168::-;;28137:6;28132:3;28125:19;28177:4;28172:3;28168:14;28153:29;;28115:73;;;;:::o;28194:169::-;;28312:6;28307:3;28300:19;28352:4;28347:3;28343:14;28328:29;;28290:73;;;;:::o;28369:148::-;;28508:3;28493:18;;28483:34;;;;:::o;28523:305::-;;28582:20;28600:1;28582:20;:::i;:::-;28577:25;;28616:20;28634:1;28616:20;:::i;:::-;28611:25;;28770:1;28702:66;28698:74;28695:1;28692:81;28689:2;;;28776:18;;:::i;:::-;28689:2;28820:1;28817;28813:9;28806:16;;28567:261;;;;:::o;28834:185::-;;28891:20;28909:1;28891:20;:::i;:::-;28886:25;;28925:20;28943:1;28925:20;:::i;:::-;28920:25;;28964:1;28954:2;;28969:18;;:::i;:::-;28954:2;29011:1;29008;29004:9;28999:14;;28876:143;;;;:::o;29025:348::-;;29088:20;29106:1;29088:20;:::i;:::-;29083:25;;29122:20;29140:1;29122:20;:::i;:::-;29117:25;;29310:1;29242:66;29238:74;29235:1;29232:81;29227:1;29220:9;29213:17;29209:105;29206:2;;;29317:18;;:::i;:::-;29206:2;29365:1;29362;29358:9;29347:20;;29073:300;;;;:::o;29379:191::-;;29439:20;29457:1;29439:20;:::i;:::-;29434:25;;29473:20;29491:1;29473:20;:::i;:::-;29468:25;;29512:1;29509;29506:8;29503:2;;;29517:18;;:::i;:::-;29503:2;29562:1;29559;29555:9;29547:17;;29424:146;;;;:::o;29576:96::-;;29642:24;29660:5;29642:24;:::i;:::-;29631:35;;29621:51;;;:::o;29678:90::-;;29755:5;29748:13;29741:21;29730:32;;29720:48;;;:::o;29774:77::-;;29840:5;29829:16;;29819:32;;;:::o;29857:149::-;;29933:66;29926:5;29922:78;29911:89;;29901:105;;;:::o;30012:126::-;;30089:42;30082:5;30078:54;30067:65;;30057:81;;;:::o;30144:77::-;;30210:5;30199:16;;30189:32;;;:::o;30227:154::-;30311:6;30306:3;30301;30288:30;30373:1;30364:6;30359:3;30355:16;30348:27;30278:103;;;:::o;30387:307::-;30455:1;30465:113;30479:6;30476:1;30473:13;30465:113;;;30564:1;30559:3;30555:11;30549:18;30545:1;30540:3;30536:11;30529:39;30501:2;30498:1;30494:10;30489:15;;30465:113;;;30596:6;30593:1;30590:13;30587:2;;;30676:1;30667:6;30662:3;30658:16;30651:27;30587:2;30436:258;;;;:::o;30700:171::-;;30762:24;30780:5;30762:24;:::i;:::-;30753:33;;30808:4;30801:5;30798:15;30795:2;;;30816:18;;:::i;:::-;30795:2;30863:1;30856:5;30852:13;30845:20;;30743:128;;;:::o;30877:320::-;;30958:1;30952:4;30948:12;30938:22;;31005:1;30999:4;30995:12;31026:18;31016:2;;31082:4;31074:6;31070:17;31060:27;;31016:2;31144;31136:6;31133:14;31113:18;31110:38;31107:2;;;31163:18;;:::i;:::-;31107:2;30928:269;;;;:::o;31203:233::-;;31265:24;31283:5;31265:24;:::i;:::-;31256:33;;31311:66;31304:5;31301:77;31298:2;;;31381:18;;:::i;:::-;31298:2;31428:1;31421:5;31417:13;31410:20;;31246:190;;;:::o;31442:176::-;;31491:20;31509:1;31491:20;:::i;:::-;31486:25;;31525:20;31543:1;31525:20;:::i;:::-;31520:25;;31564:1;31554:2;;31569:18;;:::i;:::-;31554:2;31610:1;31607;31603:9;31598:14;;31476:142;;;;:::o;31624:180::-;31672:77;31669:1;31662:88;31769:4;31766:1;31759:15;31793:4;31790:1;31783:15;31810:180;31858:77;31855:1;31848:88;31955:4;31952:1;31945:15;31979:4;31976:1;31969:15;31996:180;32044:77;32041:1;32034:88;32141:4;32138:1;32131:15;32165:4;32162:1;32155:15;32182:180;32230:77;32227:1;32220:88;32327:4;32324:1;32317:15;32351:4;32348:1;32341:15;32368:102;;32460:2;32456:7;32451:2;32444:5;32440:14;32436:28;32426:38;;32416:54;;;:::o;32476:122::-;32549:24;32567:5;32549:24;:::i;:::-;32542:5;32539:35;32529:2;;32588:1;32585;32578:12;32529:2;32519:79;:::o;32604:116::-;32674:21;32689:5;32674:21;:::i;:::-;32667:5;32664:32;32654:2;;32710:1;32707;32700:12;32654:2;32644:76;:::o;32726:122::-;32799:24;32817:5;32799:24;:::i;:::-;32792:5;32789:35;32779:2;;32838:1;32835;32828:12;32779:2;32769:79;:::o;32854:120::-;32926:23;32943:5;32926:23;:::i;:::-;32919:5;32916:34;32906:2;;32964:1;32961;32954:12;32906:2;32896:78;:::o;32980:122::-;33053:24;33071:5;33053:24;:::i;:::-;33046:5;33043:35;33033:2;;33092:1;33089;33082:12;33033:2;33023:79;:::o

Swarm Source

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