ETH Price: $3,653.68 (-1.48%)

Token

Cosmic Meta Pixel Art (CMPA)
 

Overview

Max Total Supply

556 CMPA

Holders

96

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Part of the generative art series 'Cosmic Meta' which is 100% stored on the Ethereum blockchain. Each artwork consists of millions of pixels generated through a complex and hard process by Artificial Intelligence.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
CosmicMetaPixelArt

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 3 of 14: CosmicMetaPixelArt.sol
// SPDX-License-Identifier: MIT
// Author: https://twitter.com/ahmetbutun
// ERC-721 Smart Contract for the Cosmic Meta Pixel Art NFT Collection - https://cosmicmeta.io
pragma solidity ^0.8.9;

import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./Pausable.sol";
import "./Ownable.sol";

contract CosmicMetaPixelArt is ERC721, ERC721Enumerable, Pausable, Ownable {
    using Strings for uint256;

    string public baseTokenURI;
    string public contractURI;
    uint256 public constant MAX_TOKENS = 8888; // 8888 Pixel Art
    uint256 public maxMint = 20; // Max 20 Pixel Art per transaction
    uint256 public price = 0.05 ether; // Each Pixel Art cost 0.05 ETH to mint
    uint256 public preMintPrice = 0.02 ether; // Lower price for pre-sale
    bool public mainSale = false; // Main Sale is disabled by default
    mapping(address => bool) public presaleAccessList; // Whitelist for pre-sale

    constructor(string memory _baseTokenURI, string memory _contractURI) ERC721("Cosmic Meta Pixel Art", "CMPA") {
        setBaseURI(_baseTokenURI);
        setContractURI(_contractURI);

        // The first 50 Pixel Art are minted for the team, giveaways and our community
        mint(msg.sender, 50);

        // Transactions are paused after deploy
        pause();
    }

    function preMint(address _to, uint256 _quantity) public payable {
        uint256 supply = totalSupply();

        require(hasPresaleAccess(_to), "You are not whitelisted for the Pixel Art pre-sale");
        require(!mainSale, "You can't pre-mint Pixel Art at the moment");
        require(_quantity > 0 && _quantity <= maxMint, "You can only mint 1 to 20 Pixel Art");
        require(msg.value >= preMintPrice * _quantity, "Ether sent is not correct");
        require(supply + _quantity <= MAX_TOKENS, "Exceeds maximum supply");

        for (uint256 i = 1; i <= _quantity; i++) {
          _safeMint(_to, supply + i);
        }
    }

    function mint(address _to, uint256 _quantity) public payable {
        uint256 supply = totalSupply();

        if (msg.sender != owner()) {
            require(mainSale, "The Pixel Art main sale is not open");
            require(_quantity > 0 && _quantity <= maxMint, "You can only mint 1 to 20 Pixel Art");
            require(msg.value >= price * _quantity, "Ether sent is not correct");
        }

        require(supply + _quantity <= MAX_TOKENS, "Exceeds maximum supply");

        for (uint256 i = 1; i <= _quantity; i++) {
          _safeMint(_to, supply + i);
        }
    }

    function walletOfOwner(address _owner) public view returns (uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);

        for (uint256 i; i < tokenCount; i++) {
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }

        return tokensId;
    }

    function setPresaleAccessList(address[] memory _addressList) public onlyOwner {
        for (uint256 i; i < _addressList.length; i++) {
            presaleAccessList[_addressList[i]] = true;
        }
    }

    function hasPresaleAccess(address wallet) public view returns (bool) {
        return presaleAccessList[wallet];
    }

    function setBaseURI(string memory _baseTokenURI) public onlyOwner {
        baseTokenURI = _baseTokenURI;
    }

    function setContractURI(string memory _contractURI) public onlyOwner {
        contractURI = _contractURI;
    }

    function setPrice(uint256 _price) public onlyOwner() {
        price = _price;
    }

    function setPreMintPrice(uint256 _price) public onlyOwner() {
        preMintPrice = _price;
    }

    function setMaxMint(uint256 _maxMint) public onlyOwner() {
        maxMint = _maxMint;
    }

    function updateMainSaleStatus(bool _mainSale) public onlyOwner {
        mainSale = _mainSale;
    }

    function pause() public onlyOwner {
        _pause();
    }

    function start() public onlyOwner {
        _unpause();
    }

    function withdraw(uint256 _amount) public payable onlyOwner {
        require(payable(msg.sender).send(_amount));
    }

    function withdrawAll() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }

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

    function _beforeTokenTransfer(address from, address to, uint256 tokenId)
        internal
        whenNotPaused
        override(ERC721, ERC721Enumerable)
    {
        super._beforeTokenTransfer(from, to, tokenId);
    }

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

File 1 of 14: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Address.sol)

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 2 of 14: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 4 of 14: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 5 of 14: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @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 {
        _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @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 6 of 14: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @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 7 of 14: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 8 of 14: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 9 of 14: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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 10 of 14: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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 11 of 14: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

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 12 of 14: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 13 of 14: Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

    bool private _paused;

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

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

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

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

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

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

File 14 of 14: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_baseTokenURI","type":"string"},{"internalType":"string","name":"_contractURI","type":"string"}],"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":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"address","name":"wallet","type":"address"}],"name":"hasPresaleAccess","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":"mainSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_quantity","type":"uint256"}],"name":"preMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"preMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleAccessList","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","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":"_baseTokenURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_contractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPreMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addressList","type":"address[]"}],"name":"setPresaleAccessList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"start","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"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_mainSale","type":"bool"}],"name":"updateMainSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526014600d5566b1a2bc2ec50000600e5566470de4df820000600f556000601060006101000a81548160ff0219169083151502179055503480156200004757600080fd5b5060405162006d2f38038062006d2f83398181016040528101906200006d9190620013f8565b6040518060400160405280601581526020017f436f736d6963204d65746120506978656c2041727400000000000000000000008152506040518060400160405280600481526020017f434d5041000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000f1929190620011ab565b5080600190805190602001906200010a929190620011ab565b5050506000600a60006101000a81548160ff021916908315150217905550620001486200013c6200019560201b60201c565b6200019d60201b60201c565b62000159826200026360201b60201c565b6200016a816200030e60201b60201c565b6200017d336032620003b960201b60201c565b6200018d620005ac60201b60201c565b505062001d90565b600033905090565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002736200019560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002996200064d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002f2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002e990620014de565b60405180910390fd5b80600b90805190602001906200030a929190620011ab565b5050565b6200031e6200019560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620003446200064d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200039d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200039490620014de565b60405180910390fd5b80600c9080519060200190620003b5929190620011ab565b5050565b6000620003cb6200067760201b60201c565b9050620003dd6200064d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200050d57601060009054906101000a900460ff1662000462576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004599062001576565b60405180910390fd5b600082118015620004755750600d548211155b620004b7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004ae906200160e565b60405180910390fd5b81600e54620004c7919062001669565b3410156200050c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000503906200171a565b60405180910390fd5b5b6122b882826200051e91906200173c565b111562000562576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200055990620017e9565b60405180910390fd5b6000600190505b828111620005a657620005908482846200058491906200173c565b6200068460201b60201c565b80806200059d906200180b565b91505062000569565b50505050565b620005bc6200019560201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620005e26200064d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200063b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200063290620014de565b60405180910390fd5b6200064b620006aa60201b60201c565b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600880549050905090565b620006a68282604051806020016040528060008152506200076260201b60201c565b5050565b620006ba620007d060201b60201c565b15620006fd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006f490620018a9565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620007496200019560201b60201c565b60405162000758919062001910565b60405180910390a1565b620007748383620007e760201b60201c565b620007896000848484620009cd60201b60201c565b620007cb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007c290620019a3565b60405180910390fd5b505050565b6000600a60009054906101000a900460ff16905090565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200085a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008519062001a15565b60405180910390fd5b6200086b8162000b8760201b60201c565b15620008ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008a59062001a87565b60405180910390fd5b620008c26000838362000bf360201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546200091491906200173c565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620009fb8473ffffffffffffffffffffffffffffffffffffffff1662000c6360201b62001ffc1760201c565b1562000b7a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0262000a2d6200019560201b60201c565b8786866040518563ffffffff1660e01b815260040162000a51949392919062001b17565b602060405180830381600087803b15801562000a6c57600080fd5b505af192505050801562000aa057506040513d601f19601f8201168201806040525081019062000a9d919062001bc8565b60015b62000b29573d806000811462000ad3576040519150601f19603f3d011682016040523d82523d6000602084013e62000ad8565b606091505b5060008151141562000b21576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000b1890620019a3565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000b7f565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b62000c03620007d060201b60201c565b1562000c46576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000c3d90620018a9565b60405180910390fd5b62000c5e83838362000c7660201b6200200f1760201c565b505050565b600080823b905060008111915050919050565b62000c8e83838362000dbd60201b620021231760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141562000cdb5762000cd58162000dc260201b60201c565b62000d23565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000d225762000d21838262000e0b60201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000d705762000d6a8162000f8860201b60201c565b62000db8565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000db75762000db682826200106460201b60201c565b5b5b505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000e2584620010f060201b6200161e1760201c565b62000e31919062001bfa565b905060006007600084815260200190815260200160002054905081811462000f17576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000f9e919062001bfa565b905060006009600084815260200190815260200160002054905060006008838154811062000fd15762000fd062001c35565b5b90600052602060002001549050806008838154811062000ff65762000ff562001c35565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062001048576200104762001c64565b5b6001900381819060005260206000200160009055905550505050565b60006200107c83620010f060201b6200161e1760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562001164576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200115b9062001d09565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b828054620011b99062001d5a565b90600052602060002090601f016020900481019282620011dd576000855562001229565b82601f10620011f857805160ff191683800117855562001229565b8280016001018555821562001229579182015b82811115620012285782518255916020019190600101906200120b565b5b5090506200123891906200123c565b5090565b5b80821115620012575760008160009055506001016200123d565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620012c48262001279565b810181811067ffffffffffffffff82111715620012e657620012e56200128a565b5b80604052505050565b6000620012fb6200125b565b9050620013098282620012b9565b919050565b600067ffffffffffffffff8211156200132c576200132b6200128a565b5b620013378262001279565b9050602081019050919050565b60005b838110156200136457808201518184015260208101905062001347565b8381111562001374576000848401525b50505050565b6000620013916200138b846200130e565b620012ef565b905082815260208101848484011115620013b057620013af62001274565b5b620013bd84828562001344565b509392505050565b600082601f830112620013dd57620013dc6200126f565b5b8151620013ef8482602086016200137a565b91505092915050565b6000806040838503121562001412576200141162001265565b5b600083015167ffffffffffffffff8111156200143357620014326200126a565b5b6200144185828601620013c5565b925050602083015167ffffffffffffffff8111156200146557620014646200126a565b5b6200147385828601620013c5565b9150509250929050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620014c66020836200147d565b9150620014d3826200148e565b602082019050919050565b60006020820190508181036000830152620014f981620014b7565b9050919050565b7f54686520506978656c20417274206d61696e2073616c65206973206e6f74206f60008201527f70656e0000000000000000000000000000000000000000000000000000000000602082015250565b60006200155e6023836200147d565b91506200156b8262001500565b604082019050919050565b6000602082019050818103600083015262001591816200154f565b9050919050565b7f596f752063616e206f6e6c79206d696e74203120746f20323020506978656c2060008201527f4172740000000000000000000000000000000000000000000000000000000000602082015250565b6000620015f66023836200147d565b9150620016038262001598565b604082019050919050565b600060208201905081810360008301526200162981620015e7565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620016768262001630565b9150620016838362001630565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620016bf57620016be6200163a565b5b828202905092915050565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b6000620017026019836200147d565b91506200170f82620016ca565b602082019050919050565b600060208201905081810360008301526200173581620016f3565b9050919050565b6000620017498262001630565b9150620017568362001630565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200178e576200178d6200163a565b5b828201905092915050565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b6000620017d16016836200147d565b9150620017de8262001799565b602082019050919050565b600060208201905081810360008301526200180481620017c2565b9050919050565b6000620018188262001630565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200184e576200184d6200163a565b5b600182019050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000620018916010836200147d565b91506200189e8262001859565b602082019050919050565b60006020820190508181036000830152620018c48162001882565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620018f882620018cb565b9050919050565b6200190a81620018eb565b82525050565b6000602082019050620019276000830184620018ff565b92915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006200198b6032836200147d565b915062001998826200192d565b604082019050919050565b60006020820190508181036000830152620019be816200197c565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000620019fd6020836200147d565b915062001a0a82620019c5565b602082019050919050565b6000602082019050818103600083015262001a3081620019ee565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600062001a6f601c836200147d565b915062001a7c8262001a37565b602082019050919050565b6000602082019050818103600083015262001aa28162001a60565b9050919050565b62001ab48162001630565b82525050565b600081519050919050565b600082825260208201905092915050565b600062001ae38262001aba565b62001aef818562001ac5565b935062001b0181856020860162001344565b62001b0c8162001279565b840191505092915050565b600060808201905062001b2e6000830187620018ff565b62001b3d6020830186620018ff565b62001b4c604083018562001aa9565b818103606083015262001b60818462001ad6565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62001ba28162001b6b565b811462001bae57600080fd5b50565b60008151905062001bc28162001b97565b92915050565b60006020828403121562001be15762001be062001265565b5b600062001bf18482850162001bb1565b91505092915050565b600062001c078262001630565b915062001c148362001630565b92508282101562001c2a5762001c296200163a565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600062001cf1602a836200147d565b915062001cfe8262001c93565b604082019050919050565b6000602082019050818103600083015262001d248162001ce2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062001d7357607f821691505b6020821081141562001d8a5762001d8962001d2b565b5b50919050565b614f8f8062001da06000396000f3fe60806040526004361061025c5760003560e01c806370a0823111610144578063a22cb465116100b6578063d547cfb71161007a578063d547cfb7146108ac578063da6405e1146108d7578063e8a3d48514610900578063e985e9c51461092b578063f2fde38b14610968578063f47c84c5146109915761025c565b8063a22cb465146107dd578063b88d4fde14610806578063be9a65551461082f578063c1d7ae3114610846578063c87b56dd1461086f5761025c565b80638da5cb5b116101085780638da5cb5b146106df57806391b7f5ed1461070a578063938e3d7b1461073357806395d89b411461075c578063a035b1fe14610787578063a187c89b146107b25761025c565b806370a082311461063f578063715018a61461067c5780637501f741146106935780638456cb59146106be578063853828b6146106d55761025c565b80632f994122116101dd5780634f6ccce7116101a15780634f6ccce71461051d578063547520fe1461055a57806355f804b3146105835780635c975abb146105ac57806360cfd359146105d75780636352211e146106025761025c565b80632f9941221461043557806334131cd31461047257806340c10f191461049b57806342842e0e146104b7578063438b6300146104e05761025c565b806318160ddd1161022457806318160ddd1461036c57806323b872dd14610397578063290c292d146103c05780632e1a7d4d146103dc5780632f745c59146103f85761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630f2091861461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613567565b6109bc565b60405161029591906135af565b60405180910390f35b3480156102aa57600080fd5b506102b36109ce565b6040516102c09190613663565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb91906136bb565b610a60565b6040516102fd9190613729565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613770565b610ae5565b005b34801561033b57600080fd5b50610356600480360381019061035191906137b0565b610bfd565b60405161036391906135af565b60405180910390f35b34801561037857600080fd5b50610381610c53565b60405161038e91906137ec565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b99190613807565b610c60565b005b6103da60048036038101906103d59190613770565b610cc0565b005b6103f660048036038101906103f191906136bb565b610e91565b005b34801561040457600080fd5b5061041f600480360381019061041a9190613770565b610f4e565b60405161042c91906137ec565b60405180910390f35b34801561044157600080fd5b5061045c600480360381019061045791906137b0565b610ff3565b60405161046991906135af565b60405180910390f35b34801561047e57600080fd5b50610499600480360381019061049491906139a2565b611013565b005b6104b560048036038101906104b09190613770565b611124565b005b3480156104c357600080fd5b506104de60048036038101906104d99190613807565b6112e7565b005b3480156104ec57600080fd5b50610507600480360381019061050291906137b0565b611307565b6040516105149190613aa9565b60405180910390f35b34801561052957600080fd5b50610544600480360381019061053f91906136bb565b6113b5565b60405161055191906137ec565b60405180910390f35b34801561056657600080fd5b50610581600480360381019061057c91906136bb565b611426565b005b34801561058f57600080fd5b506105aa60048036038101906105a59190613b80565b6114ac565b005b3480156105b857600080fd5b506105c1611542565b6040516105ce91906135af565b60405180910390f35b3480156105e357600080fd5b506105ec611559565b6040516105f991906135af565b60405180910390f35b34801561060e57600080fd5b50610629600480360381019061062491906136bb565b61156c565b6040516106369190613729565b60405180910390f35b34801561064b57600080fd5b50610666600480360381019061066191906137b0565b61161e565b60405161067391906137ec565b60405180910390f35b34801561068857600080fd5b506106916116d6565b005b34801561069f57600080fd5b506106a861175e565b6040516106b591906137ec565b60405180910390f35b3480156106ca57600080fd5b506106d3611764565b005b6106dd6117ea565b005b3480156106eb57600080fd5b506106f46118a6565b6040516107019190613729565b60405180910390f35b34801561071657600080fd5b50610731600480360381019061072c91906136bb565b6118d0565b005b34801561073f57600080fd5b5061075a60048036038101906107559190613b80565b611956565b005b34801561076857600080fd5b506107716119ec565b60405161077e9190613663565b60405180910390f35b34801561079357600080fd5b5061079c611a7e565b6040516107a991906137ec565b60405180910390f35b3480156107be57600080fd5b506107c7611a84565b6040516107d491906137ec565b60405180910390f35b3480156107e957600080fd5b5061080460048036038101906107ff9190613bf5565b611a8a565b005b34801561081257600080fd5b5061082d60048036038101906108289190613cd6565b611aa0565b005b34801561083b57600080fd5b50610844611b02565b005b34801561085257600080fd5b5061086d60048036038101906108689190613d59565b611b88565b005b34801561087b57600080fd5b50610896600480360381019061089191906136bb565b611c21565b6040516108a39190613663565b60405180910390f35b3480156108b857600080fd5b506108c1611cc8565b6040516108ce9190613663565b60405180910390f35b3480156108e357600080fd5b506108fe60048036038101906108f991906136bb565b611d56565b005b34801561090c57600080fd5b50610915611ddc565b6040516109229190613663565b60405180910390f35b34801561093757600080fd5b50610952600480360381019061094d9190613d86565b611e6a565b60405161095f91906135af565b60405180910390f35b34801561097457600080fd5b5061098f600480360381019061098a91906137b0565b611efe565b005b34801561099d57600080fd5b506109a6611ff6565b6040516109b391906137ec565b60405180910390f35b60006109c782612128565b9050919050565b6060600080546109dd90613df5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0990613df5565b8015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b5050505050905090565b6000610a6b826121a2565b610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa190613e99565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af08261156c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5890613f2b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8061220e565b73ffffffffffffffffffffffffffffffffffffffff161480610baf5750610bae81610ba961220e565b611e6a565b5b610bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be590613fbd565b60405180910390fd5b610bf88383612216565b505050565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600880549050905090565b610c71610c6b61220e565b826122cf565b610cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca79061404f565b60405180910390fd5b610cbb8383836123ad565b505050565b6000610cca610c53565b9050610cd583610bfd565b610d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0b906140e1565b60405180910390fd5b601060009054906101000a900460ff1615610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90614173565b60405180910390fd5b600082118015610d765750600d548211155b610db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac90614205565b60405180910390fd5b81600f54610dc39190614254565b341015610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc906142fa565b60405180910390fd5b6122b88282610e14919061431a565b1115610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c906143bc565b60405180910390fd5b6000600190505b828111610e8b57610e78848284610e73919061431a565b612609565b8080610e83906143dc565b915050610e5c565b50505050565b610e9961220e565b73ffffffffffffffffffffffffffffffffffffffff16610eb76118a6565b73ffffffffffffffffffffffffffffffffffffffff1614610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490614471565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610f4b57600080fd5b50565b6000610f598361161e565b8210610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9190614503565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60116020528060005260406000206000915054906101000a900460ff1681565b61101b61220e565b73ffffffffffffffffffffffffffffffffffffffff166110396118a6565b73ffffffffffffffffffffffffffffffffffffffff161461108f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108690614471565b60405180910390fd5b60005b8151811015611120576001601160008484815181106110b4576110b3614523565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611118906143dc565b915050611092565b5050565b600061112e610c53565b90506111386118a6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461125b57601060009054906101000a900460ff166111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b0906145c4565b60405180910390fd5b6000821180156111cb5750600d548211155b61120a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120190614205565b60405180910390fd5b81600e546112189190614254565b34101561125a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611251906142fa565b60405180910390fd5b5b6122b8828261126a919061431a565b11156112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a2906143bc565b60405180910390fd5b6000600190505b8281116112e1576112ce8482846112c9919061431a565b612609565b80806112d9906143dc565b9150506112b2565b50505050565b61130283838360405180602001604052806000815250611aa0565b505050565b606060006113148361161e565b905060008167ffffffffffffffff8111156113325761133161385f565b5b6040519080825280602002602001820160405280156113605781602001602082028036833780820191505090505b50905060005b828110156113aa576113788582610f4e565b82828151811061138b5761138a614523565b5b60200260200101818152505080806113a2906143dc565b915050611366565b508092505050919050565b60006113bf610c53565b8210611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f790614656565b60405180910390fd5b6008828154811061141457611413614523565b5b90600052602060002001549050919050565b61142e61220e565b73ffffffffffffffffffffffffffffffffffffffff1661144c6118a6565b73ffffffffffffffffffffffffffffffffffffffff16146114a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149990614471565b60405180910390fd5b80600d8190555050565b6114b461220e565b73ffffffffffffffffffffffffffffffffffffffff166114d26118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f90614471565b60405180910390fd5b80600b908051906020019061153e929190613458565b5050565b6000600a60009054906101000a900460ff16905090565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c906146e8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561168f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116869061477a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116de61220e565b73ffffffffffffffffffffffffffffffffffffffff166116fc6118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174990614471565b60405180910390fd5b61175c6000612627565b565b600d5481565b61176c61220e565b73ffffffffffffffffffffffffffffffffffffffff1661178a6118a6565b73ffffffffffffffffffffffffffffffffffffffff16146117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d790614471565b60405180910390fd5b6117e86126ed565b565b6117f261220e565b73ffffffffffffffffffffffffffffffffffffffff166118106118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185d90614471565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506118a457600080fd5b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118d861220e565b73ffffffffffffffffffffffffffffffffffffffff166118f66118a6565b73ffffffffffffffffffffffffffffffffffffffff161461194c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194390614471565b60405180910390fd5b80600e8190555050565b61195e61220e565b73ffffffffffffffffffffffffffffffffffffffff1661197c6118a6565b73ffffffffffffffffffffffffffffffffffffffff16146119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c990614471565b60405180910390fd5b80600c90805190602001906119e8929190613458565b5050565b6060600180546119fb90613df5565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2790613df5565b8015611a745780601f10611a4957610100808354040283529160200191611a74565b820191906000526020600020905b815481529060010190602001808311611a5757829003601f168201915b5050505050905090565b600e5481565b600f5481565b611a9c611a9561220e565b8383612790565b5050565b611ab1611aab61220e565b836122cf565b611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae79061404f565b60405180910390fd5b611afc848484846128fd565b50505050565b611b0a61220e565b73ffffffffffffffffffffffffffffffffffffffff16611b286118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7590614471565b60405180910390fd5b611b86612959565b565b611b9061220e565b73ffffffffffffffffffffffffffffffffffffffff16611bae6118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfb90614471565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6060611c2c826121a2565b611c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c629061480c565b60405180910390fd5b6000611c756129fb565b90506000815111611c955760405180602001604052806000815250611cc0565b80611c9f84612a8d565b604051602001611cb0929190614868565b6040516020818303038152906040525b915050919050565b600b8054611cd590613df5565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0190613df5565b8015611d4e5780601f10611d2357610100808354040283529160200191611d4e565b820191906000526020600020905b815481529060010190602001808311611d3157829003601f168201915b505050505081565b611d5e61220e565b73ffffffffffffffffffffffffffffffffffffffff16611d7c6118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc990614471565b60405180910390fd5b80600f8190555050565b600c8054611de990613df5565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1590613df5565b8015611e625780601f10611e3757610100808354040283529160200191611e62565b820191906000526020600020905b815481529060010190602001808311611e4557829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f0661220e565b73ffffffffffffffffffffffffffffffffffffffff16611f246118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7190614471565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe1906148fe565b60405180910390fd5b611ff381612627565b50565b6122b881565b600080823b905060008111915050919050565b61201a838383612123565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561205d5761205881612bee565b61209c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461209b5761209a8382612c37565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120df576120da81612da4565b61211e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461211d5761211c8282612e75565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061219b575061219a82612ef4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122898361156c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122da826121a2565b612319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231090614990565b60405180910390fd5b60006123248361156c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061239357508373ffffffffffffffffffffffffffffffffffffffff1661237b84610a60565b73ffffffffffffffffffffffffffffffffffffffff16145b806123a457506123a38185611e6a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123cd8261156c565b73ffffffffffffffffffffffffffffffffffffffff1614612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a90614a22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248a90614ab4565b60405180910390fd5b61249e838383612fd6565b6124a9600082612216565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f99190614ad4565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612550919061431a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61262382826040518060200160405280600081525061302e565b5050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126f5611542565b15612735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272c90614b54565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861277961220e565b6040516127869190613729565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f690614bc0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128f091906135af565b60405180910390a3505050565b6129088484846123ad565b61291484848484613089565b612953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294a90614c52565b60405180910390fd5b50505050565b612961611542565b6129a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299790614cbe565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6129e461220e565b6040516129f19190613729565b60405180910390a1565b6060600b8054612a0a90613df5565b80601f0160208091040260200160405190810160405280929190818152602001828054612a3690613df5565b8015612a835780601f10612a5857610100808354040283529160200191612a83565b820191906000526020600020905b815481529060010190602001808311612a6657829003601f168201915b5050505050905090565b60606000821415612ad5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612be9565b600082905060005b60008214612b07578080612af0906143dc565b915050600a82612b009190614d0d565b9150612add565b60008167ffffffffffffffff811115612b2357612b2261385f565b5b6040519080825280601f01601f191660200182016040528015612b555781602001600182028036833780820191505090505b5090505b60008514612be257600182612b6e9190614ad4565b9150600a85612b7d9190614d3e565b6030612b89919061431a565b60f81b818381518110612b9f57612b9e614523565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bdb9190614d0d565b9450612b59565b8093505050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c448461161e565b612c4e9190614ad4565b9050600060076000848152602001908152602001600020549050818114612d33576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612db89190614ad4565b9050600060096000848152602001908152602001600020549050600060088381548110612de857612de7614523565b5b906000526020600020015490508060088381548110612e0a57612e09614523565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e5957612e58614d6f565b5b6001900381819060005260206000200160009055905550505050565b6000612e808361161e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fbf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612fcf5750612fce82613220565b5b9050919050565b612fde611542565b1561301e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301590614b54565b60405180910390fd5b61302983838361200f565b505050565b613038838361328a565b6130456000848484613089565b613084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307b90614c52565b60405180910390fd5b505050565b60006130aa8473ffffffffffffffffffffffffffffffffffffffff16611ffc565b15613213578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130d361220e565b8786866040518563ffffffff1660e01b81526004016130f59493929190614df3565b602060405180830381600087803b15801561310f57600080fd5b505af192505050801561314057506040513d601f19601f8201168201806040525081019061313d9190614e54565b60015b6131c3573d8060008114613170576040519150601f19603f3d011682016040523d82523d6000602084013e613175565b606091505b506000815114156131bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b290614c52565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613218565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f190614ecd565b60405180910390fd5b613303816121a2565b15613343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333a90614f39565b60405180910390fd5b61334f60008383612fd6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461339f919061431a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461346490613df5565b90600052602060002090601f01602090048101928261348657600085556134cd565b82601f1061349f57805160ff19168380011785556134cd565b828001600101855582156134cd579182015b828111156134cc5782518255916020019190600101906134b1565b5b5090506134da91906134de565b5090565b5b808211156134f75760008160009055506001016134df565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135448161350f565b811461354f57600080fd5b50565b6000813590506135618161353b565b92915050565b60006020828403121561357d5761357c613505565b5b600061358b84828501613552565b91505092915050565b60008115159050919050565b6135a981613594565b82525050565b60006020820190506135c460008301846135a0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136045780820151818401526020810190506135e9565b83811115613613576000848401525b50505050565b6000601f19601f8301169050919050565b6000613635826135ca565b61363f81856135d5565b935061364f8185602086016135e6565b61365881613619565b840191505092915050565b6000602082019050818103600083015261367d818461362a565b905092915050565b6000819050919050565b61369881613685565b81146136a357600080fd5b50565b6000813590506136b58161368f565b92915050565b6000602082840312156136d1576136d0613505565b5b60006136df848285016136a6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613713826136e8565b9050919050565b61372381613708565b82525050565b600060208201905061373e600083018461371a565b92915050565b61374d81613708565b811461375857600080fd5b50565b60008135905061376a81613744565b92915050565b6000806040838503121561378757613786613505565b5b60006137958582860161375b565b92505060206137a6858286016136a6565b9150509250929050565b6000602082840312156137c6576137c5613505565b5b60006137d48482850161375b565b91505092915050565b6137e681613685565b82525050565b600060208201905061380160008301846137dd565b92915050565b6000806000606084860312156138205761381f613505565b5b600061382e8682870161375b565b935050602061383f8682870161375b565b9250506040613850868287016136a6565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61389782613619565b810181811067ffffffffffffffff821117156138b6576138b561385f565b5b80604052505050565b60006138c96134fb565b90506138d5828261388e565b919050565b600067ffffffffffffffff8211156138f5576138f461385f565b5b602082029050602081019050919050565b600080fd5b600061391e613919846138da565b6138bf565b9050808382526020820190506020840283018581111561394157613940613906565b5b835b8181101561396a5780613956888261375b565b845260208401935050602081019050613943565b5050509392505050565b600082601f8301126139895761398861385a565b5b813561399984826020860161390b565b91505092915050565b6000602082840312156139b8576139b7613505565b5b600082013567ffffffffffffffff8111156139d6576139d561350a565b5b6139e284828501613974565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a2081613685565b82525050565b6000613a328383613a17565b60208301905092915050565b6000602082019050919050565b6000613a56826139eb565b613a6081856139f6565b9350613a6b83613a07565b8060005b83811015613a9c578151613a838882613a26565b9750613a8e83613a3e565b925050600181019050613a6f565b5085935050505092915050565b60006020820190508181036000830152613ac38184613a4b565b905092915050565b600080fd5b600067ffffffffffffffff821115613aeb57613aea61385f565b5b613af482613619565b9050602081019050919050565b82818337600083830152505050565b6000613b23613b1e84613ad0565b6138bf565b905082815260208101848484011115613b3f57613b3e613acb565b5b613b4a848285613b01565b509392505050565b600082601f830112613b6757613b6661385a565b5b8135613b77848260208601613b10565b91505092915050565b600060208284031215613b9657613b95613505565b5b600082013567ffffffffffffffff811115613bb457613bb361350a565b5b613bc084828501613b52565b91505092915050565b613bd281613594565b8114613bdd57600080fd5b50565b600081359050613bef81613bc9565b92915050565b60008060408385031215613c0c57613c0b613505565b5b6000613c1a8582860161375b565b9250506020613c2b85828601613be0565b9150509250929050565b600067ffffffffffffffff821115613c5057613c4f61385f565b5b613c5982613619565b9050602081019050919050565b6000613c79613c7484613c35565b6138bf565b905082815260208101848484011115613c9557613c94613acb565b5b613ca0848285613b01565b509392505050565b600082601f830112613cbd57613cbc61385a565b5b8135613ccd848260208601613c66565b91505092915050565b60008060008060808587031215613cf057613cef613505565b5b6000613cfe8782880161375b565b9450506020613d0f8782880161375b565b9350506040613d20878288016136a6565b925050606085013567ffffffffffffffff811115613d4157613d4061350a565b5b613d4d87828801613ca8565b91505092959194509250565b600060208284031215613d6f57613d6e613505565b5b6000613d7d84828501613be0565b91505092915050565b60008060408385031215613d9d57613d9c613505565b5b6000613dab8582860161375b565b9250506020613dbc8582860161375b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e0d57607f821691505b60208210811415613e2157613e20613dc6565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613e83602c836135d5565b9150613e8e82613e27565b604082019050919050565b60006020820190508181036000830152613eb281613e76565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f156021836135d5565b9150613f2082613eb9565b604082019050919050565b60006020820190508181036000830152613f4481613f08565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613fa76038836135d5565b9150613fb282613f4b565b604082019050919050565b60006020820190508181036000830152613fd681613f9a565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006140396031836135d5565b915061404482613fdd565b604082019050919050565b600060208201905081810360008301526140688161402c565b9050919050565b7f596f7520617265206e6f742077686974656c697374656420666f72207468652060008201527f506978656c20417274207072652d73616c650000000000000000000000000000602082015250565b60006140cb6032836135d5565b91506140d68261406f565b604082019050919050565b600060208201905081810360008301526140fa816140be565b9050919050565b7f596f752063616e2774207072652d6d696e7420506978656c204172742061742060008201527f746865206d6f6d656e7400000000000000000000000000000000000000000000602082015250565b600061415d602a836135d5565b915061416882614101565b604082019050919050565b6000602082019050818103600083015261418c81614150565b9050919050565b7f596f752063616e206f6e6c79206d696e74203120746f20323020506978656c2060008201527f4172740000000000000000000000000000000000000000000000000000000000602082015250565b60006141ef6023836135d5565b91506141fa82614193565b604082019050919050565b6000602082019050818103600083015261421e816141e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061425f82613685565b915061426a83613685565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142a3576142a2614225565b5b828202905092915050565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b60006142e46019836135d5565b91506142ef826142ae565b602082019050919050565b60006020820190508181036000830152614313816142d7565b9050919050565b600061432582613685565b915061433083613685565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561436557614364614225565b5b828201905092915050565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b60006143a66016836135d5565b91506143b182614370565b602082019050919050565b600060208201905081810360008301526143d581614399565b9050919050565b60006143e782613685565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561441a57614419614225565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061445b6020836135d5565b915061446682614425565b602082019050919050565b6000602082019050818103600083015261448a8161444e565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006144ed602b836135d5565b91506144f882614491565b604082019050919050565b6000602082019050818103600083015261451c816144e0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f54686520506978656c20417274206d61696e2073616c65206973206e6f74206f60008201527f70656e0000000000000000000000000000000000000000000000000000000000602082015250565b60006145ae6023836135d5565b91506145b982614552565b604082019050919050565b600060208201905081810360008301526145dd816145a1565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614640602c836135d5565b915061464b826145e4565b604082019050919050565b6000602082019050818103600083015261466f81614633565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006146d26029836135d5565b91506146dd82614676565b604082019050919050565b60006020820190508181036000830152614701816146c5565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614764602a836135d5565b915061476f82614708565b604082019050919050565b6000602082019050818103600083015261479381614757565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006147f6602f836135d5565b91506148018261479a565b604082019050919050565b60006020820190508181036000830152614825816147e9565b9050919050565b600081905092915050565b6000614842826135ca565b61484c818561482c565b935061485c8185602086016135e6565b80840191505092915050565b60006148748285614837565b91506148808284614837565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148e86026836135d5565b91506148f38261488c565b604082019050919050565b60006020820190508181036000830152614917816148db565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061497a602c836135d5565b91506149858261491e565b604082019050919050565b600060208201905081810360008301526149a98161496d565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614a0c6029836135d5565b9150614a17826149b0565b604082019050919050565b60006020820190508181036000830152614a3b816149ff565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a9e6024836135d5565b9150614aa982614a42565b604082019050919050565b60006020820190508181036000830152614acd81614a91565b9050919050565b6000614adf82613685565b9150614aea83613685565b925082821015614afd57614afc614225565b5b828203905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614b3e6010836135d5565b9150614b4982614b08565b602082019050919050565b60006020820190508181036000830152614b6d81614b31565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614baa6019836135d5565b9150614bb582614b74565b602082019050919050565b60006020820190508181036000830152614bd981614b9d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614c3c6032836135d5565b9150614c4782614be0565b604082019050919050565b60006020820190508181036000830152614c6b81614c2f565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614ca86014836135d5565b9150614cb382614c72565b602082019050919050565b60006020820190508181036000830152614cd781614c9b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614d1882613685565b9150614d2383613685565b925082614d3357614d32614cde565b5b828204905092915050565b6000614d4982613685565b9150614d5483613685565b925082614d6457614d63614cde565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000614dc582614d9e565b614dcf8185614da9565b9350614ddf8185602086016135e6565b614de881613619565b840191505092915050565b6000608082019050614e08600083018761371a565b614e15602083018661371a565b614e2260408301856137dd565b8181036060830152614e348184614dba565b905095945050505050565b600081519050614e4e8161353b565b92915050565b600060208284031215614e6a57614e69613505565b5b6000614e7884828501614e3f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614eb76020836135d5565b9150614ec282614e81565b602082019050919050565b60006020820190508181036000830152614ee681614eaa565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614f23601c836135d5565b9150614f2e82614eed565b602082019050919050565b60006020820190508181036000830152614f5281614f16565b905091905056fea26469706673582212206336394852d478a27e74ab782ac107985ca75180a835c8966383f0b7663b6b2d64736f6c63430008090033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6170692e636f736d69636d6574612e696f2f706978656c2d6172742f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003168747470733a2f2f6170692e636f736d69636d6574612e696f2f706978656c2d6172742f636f6e74726163742e6a736f6e000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061025c5760003560e01c806370a0823111610144578063a22cb465116100b6578063d547cfb71161007a578063d547cfb7146108ac578063da6405e1146108d7578063e8a3d48514610900578063e985e9c51461092b578063f2fde38b14610968578063f47c84c5146109915761025c565b8063a22cb465146107dd578063b88d4fde14610806578063be9a65551461082f578063c1d7ae3114610846578063c87b56dd1461086f5761025c565b80638da5cb5b116101085780638da5cb5b146106df57806391b7f5ed1461070a578063938e3d7b1461073357806395d89b411461075c578063a035b1fe14610787578063a187c89b146107b25761025c565b806370a082311461063f578063715018a61461067c5780637501f741146106935780638456cb59146106be578063853828b6146106d55761025c565b80632f994122116101dd5780634f6ccce7116101a15780634f6ccce71461051d578063547520fe1461055a57806355f804b3146105835780635c975abb146105ac57806360cfd359146105d75780636352211e146106025761025c565b80632f9941221461043557806334131cd31461047257806340c10f191461049b57806342842e0e146104b7578063438b6300146104e05761025c565b806318160ddd1161022457806318160ddd1461036c57806323b872dd14610397578063290c292d146103c05780632e1a7d4d146103dc5780632f745c59146103f85761025c565b806301ffc9a71461026157806306fdde031461029e578063081812fc146102c9578063095ea7b3146103065780630f2091861461032f575b600080fd5b34801561026d57600080fd5b5061028860048036038101906102839190613567565b6109bc565b60405161029591906135af565b60405180910390f35b3480156102aa57600080fd5b506102b36109ce565b6040516102c09190613663565b60405180910390f35b3480156102d557600080fd5b506102f060048036038101906102eb91906136bb565b610a60565b6040516102fd9190613729565b60405180910390f35b34801561031257600080fd5b5061032d60048036038101906103289190613770565b610ae5565b005b34801561033b57600080fd5b50610356600480360381019061035191906137b0565b610bfd565b60405161036391906135af565b60405180910390f35b34801561037857600080fd5b50610381610c53565b60405161038e91906137ec565b60405180910390f35b3480156103a357600080fd5b506103be60048036038101906103b99190613807565b610c60565b005b6103da60048036038101906103d59190613770565b610cc0565b005b6103f660048036038101906103f191906136bb565b610e91565b005b34801561040457600080fd5b5061041f600480360381019061041a9190613770565b610f4e565b60405161042c91906137ec565b60405180910390f35b34801561044157600080fd5b5061045c600480360381019061045791906137b0565b610ff3565b60405161046991906135af565b60405180910390f35b34801561047e57600080fd5b50610499600480360381019061049491906139a2565b611013565b005b6104b560048036038101906104b09190613770565b611124565b005b3480156104c357600080fd5b506104de60048036038101906104d99190613807565b6112e7565b005b3480156104ec57600080fd5b50610507600480360381019061050291906137b0565b611307565b6040516105149190613aa9565b60405180910390f35b34801561052957600080fd5b50610544600480360381019061053f91906136bb565b6113b5565b60405161055191906137ec565b60405180910390f35b34801561056657600080fd5b50610581600480360381019061057c91906136bb565b611426565b005b34801561058f57600080fd5b506105aa60048036038101906105a59190613b80565b6114ac565b005b3480156105b857600080fd5b506105c1611542565b6040516105ce91906135af565b60405180910390f35b3480156105e357600080fd5b506105ec611559565b6040516105f991906135af565b60405180910390f35b34801561060e57600080fd5b50610629600480360381019061062491906136bb565b61156c565b6040516106369190613729565b60405180910390f35b34801561064b57600080fd5b50610666600480360381019061066191906137b0565b61161e565b60405161067391906137ec565b60405180910390f35b34801561068857600080fd5b506106916116d6565b005b34801561069f57600080fd5b506106a861175e565b6040516106b591906137ec565b60405180910390f35b3480156106ca57600080fd5b506106d3611764565b005b6106dd6117ea565b005b3480156106eb57600080fd5b506106f46118a6565b6040516107019190613729565b60405180910390f35b34801561071657600080fd5b50610731600480360381019061072c91906136bb565b6118d0565b005b34801561073f57600080fd5b5061075a60048036038101906107559190613b80565b611956565b005b34801561076857600080fd5b506107716119ec565b60405161077e9190613663565b60405180910390f35b34801561079357600080fd5b5061079c611a7e565b6040516107a991906137ec565b60405180910390f35b3480156107be57600080fd5b506107c7611a84565b6040516107d491906137ec565b60405180910390f35b3480156107e957600080fd5b5061080460048036038101906107ff9190613bf5565b611a8a565b005b34801561081257600080fd5b5061082d60048036038101906108289190613cd6565b611aa0565b005b34801561083b57600080fd5b50610844611b02565b005b34801561085257600080fd5b5061086d60048036038101906108689190613d59565b611b88565b005b34801561087b57600080fd5b50610896600480360381019061089191906136bb565b611c21565b6040516108a39190613663565b60405180910390f35b3480156108b857600080fd5b506108c1611cc8565b6040516108ce9190613663565b60405180910390f35b3480156108e357600080fd5b506108fe60048036038101906108f991906136bb565b611d56565b005b34801561090c57600080fd5b50610915611ddc565b6040516109229190613663565b60405180910390f35b34801561093757600080fd5b50610952600480360381019061094d9190613d86565b611e6a565b60405161095f91906135af565b60405180910390f35b34801561097457600080fd5b5061098f600480360381019061098a91906137b0565b611efe565b005b34801561099d57600080fd5b506109a6611ff6565b6040516109b391906137ec565b60405180910390f35b60006109c782612128565b9050919050565b6060600080546109dd90613df5565b80601f0160208091040260200160405190810160405280929190818152602001828054610a0990613df5565b8015610a565780601f10610a2b57610100808354040283529160200191610a56565b820191906000526020600020905b815481529060010190602001808311610a3957829003601f168201915b5050505050905090565b6000610a6b826121a2565b610aaa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aa190613e99565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610af08261156c565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5890613f2b565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b8061220e565b73ffffffffffffffffffffffffffffffffffffffff161480610baf5750610bae81610ba961220e565b611e6a565b5b610bee576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be590613fbd565b60405180910390fd5b610bf88383612216565b505050565b6000601160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff169050919050565b6000600880549050905090565b610c71610c6b61220e565b826122cf565b610cb0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ca79061404f565b60405180910390fd5b610cbb8383836123ad565b505050565b6000610cca610c53565b9050610cd583610bfd565b610d14576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d0b906140e1565b60405180910390fd5b601060009054906101000a900460ff1615610d64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5b90614173565b60405180910390fd5b600082118015610d765750600d548211155b610db5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dac90614205565b60405180910390fd5b81600f54610dc39190614254565b341015610e05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dfc906142fa565b60405180910390fd5b6122b88282610e14919061431a565b1115610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c906143bc565b60405180910390fd5b6000600190505b828111610e8b57610e78848284610e73919061431a565b612609565b8080610e83906143dc565b915050610e5c565b50505050565b610e9961220e565b73ffffffffffffffffffffffffffffffffffffffff16610eb76118a6565b73ffffffffffffffffffffffffffffffffffffffff1614610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490614471565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050610f4b57600080fd5b50565b6000610f598361161e565b8210610f9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9190614503565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60116020528060005260406000206000915054906101000a900460ff1681565b61101b61220e565b73ffffffffffffffffffffffffffffffffffffffff166110396118a6565b73ffffffffffffffffffffffffffffffffffffffff161461108f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108690614471565b60405180910390fd5b60005b8151811015611120576001601160008484815181106110b4576110b3614523565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611118906143dc565b915050611092565b5050565b600061112e610c53565b90506111386118a6565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461125b57601060009054906101000a900460ff166111b9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b0906145c4565b60405180910390fd5b6000821180156111cb5750600d548211155b61120a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120190614205565b60405180910390fd5b81600e546112189190614254565b34101561125a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611251906142fa565b60405180910390fd5b5b6122b8828261126a919061431a565b11156112ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a2906143bc565b60405180910390fd5b6000600190505b8281116112e1576112ce8482846112c9919061431a565b612609565b80806112d9906143dc565b9150506112b2565b50505050565b61130283838360405180602001604052806000815250611aa0565b505050565b606060006113148361161e565b905060008167ffffffffffffffff8111156113325761133161385f565b5b6040519080825280602002602001820160405280156113605781602001602082028036833780820191505090505b50905060005b828110156113aa576113788582610f4e565b82828151811061138b5761138a614523565b5b60200260200101818152505080806113a2906143dc565b915050611366565b508092505050919050565b60006113bf610c53565b8210611400576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f790614656565b60405180910390fd5b6008828154811061141457611413614523565b5b90600052602060002001549050919050565b61142e61220e565b73ffffffffffffffffffffffffffffffffffffffff1661144c6118a6565b73ffffffffffffffffffffffffffffffffffffffff16146114a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149990614471565b60405180910390fd5b80600d8190555050565b6114b461220e565b73ffffffffffffffffffffffffffffffffffffffff166114d26118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f90614471565b60405180910390fd5b80600b908051906020019061153e929190613458565b5050565b6000600a60009054906101000a900460ff16905090565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611615576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161160c906146e8565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561168f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116869061477a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6116de61220e565b73ffffffffffffffffffffffffffffffffffffffff166116fc6118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611752576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174990614471565b60405180910390fd5b61175c6000612627565b565b600d5481565b61176c61220e565b73ffffffffffffffffffffffffffffffffffffffff1661178a6118a6565b73ffffffffffffffffffffffffffffffffffffffff16146117e0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d790614471565b60405180910390fd5b6117e86126ed565b565b6117f261220e565b73ffffffffffffffffffffffffffffffffffffffff166118106118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611866576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185d90614471565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506118a457600080fd5b565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6118d861220e565b73ffffffffffffffffffffffffffffffffffffffff166118f66118a6565b73ffffffffffffffffffffffffffffffffffffffff161461194c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194390614471565b60405180910390fd5b80600e8190555050565b61195e61220e565b73ffffffffffffffffffffffffffffffffffffffff1661197c6118a6565b73ffffffffffffffffffffffffffffffffffffffff16146119d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119c990614471565b60405180910390fd5b80600c90805190602001906119e8929190613458565b5050565b6060600180546119fb90613df5565b80601f0160208091040260200160405190810160405280929190818152602001828054611a2790613df5565b8015611a745780601f10611a4957610100808354040283529160200191611a74565b820191906000526020600020905b815481529060010190602001808311611a5757829003601f168201915b5050505050905090565b600e5481565b600f5481565b611a9c611a9561220e565b8383612790565b5050565b611ab1611aab61220e565b836122cf565b611af0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae79061404f565b60405180910390fd5b611afc848484846128fd565b50505050565b611b0a61220e565b73ffffffffffffffffffffffffffffffffffffffff16611b286118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611b7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7590614471565b60405180910390fd5b611b86612959565b565b611b9061220e565b73ffffffffffffffffffffffffffffffffffffffff16611bae6118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfb90614471565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6060611c2c826121a2565b611c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c629061480c565b60405180910390fd5b6000611c756129fb565b90506000815111611c955760405180602001604052806000815250611cc0565b80611c9f84612a8d565b604051602001611cb0929190614868565b6040516020818303038152906040525b915050919050565b600b8054611cd590613df5565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0190613df5565b8015611d4e5780601f10611d2357610100808354040283529160200191611d4e565b820191906000526020600020905b815481529060010190602001808311611d3157829003601f168201915b505050505081565b611d5e61220e565b73ffffffffffffffffffffffffffffffffffffffff16611d7c6118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dc990614471565b60405180910390fd5b80600f8190555050565b600c8054611de990613df5565b80601f0160208091040260200160405190810160405280929190818152602001828054611e1590613df5565b8015611e625780601f10611e3757610100808354040283529160200191611e62565b820191906000526020600020905b815481529060010190602001808311611e4557829003601f168201915b505050505081565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f0661220e565b73ffffffffffffffffffffffffffffffffffffffff16611f246118a6565b73ffffffffffffffffffffffffffffffffffffffff1614611f7a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7190614471565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611fea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fe1906148fe565b60405180910390fd5b611ff381612627565b50565b6122b881565b600080823b905060008111915050919050565b61201a838383612123565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561205d5761205881612bee565b61209c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461209b5761209a8382612c37565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156120df576120da81612da4565b61211e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461211d5761211c8282612e75565b5b5b505050565b505050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061219b575061219a82612ef4565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166122898361156c565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006122da826121a2565b612319576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161231090614990565b60405180910390fd5b60006123248361156c565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061239357508373ffffffffffffffffffffffffffffffffffffffff1661237b84610a60565b73ffffffffffffffffffffffffffffffffffffffff16145b806123a457506123a38185611e6a565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166123cd8261156c565b73ffffffffffffffffffffffffffffffffffffffff1614612423576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241a90614a22565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612493576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248a90614ab4565b60405180910390fd5b61249e838383612fd6565b6124a9600082612216565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124f99190614ad4565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612550919061431a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b61262382826040518060200160405280600081525061302e565b5050565b6000600a60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6126f5611542565b15612735576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161272c90614b54565b60405180910390fd5b6001600a60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a25861277961220e565b6040516127869190613729565b60405180910390a1565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156127ff576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127f690614bc0565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128f091906135af565b60405180910390a3505050565b6129088484846123ad565b61291484848484613089565b612953576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161294a90614c52565b60405180910390fd5b50505050565b612961611542565b6129a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299790614cbe565b60405180910390fd5b6000600a60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa6129e461220e565b6040516129f19190613729565b60405180910390a1565b6060600b8054612a0a90613df5565b80601f0160208091040260200160405190810160405280929190818152602001828054612a3690613df5565b8015612a835780601f10612a5857610100808354040283529160200191612a83565b820191906000526020600020905b815481529060010190602001808311612a6657829003601f168201915b5050505050905090565b60606000821415612ad5576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612be9565b600082905060005b60008214612b07578080612af0906143dc565b915050600a82612b009190614d0d565b9150612add565b60008167ffffffffffffffff811115612b2357612b2261385f565b5b6040519080825280601f01601f191660200182016040528015612b555781602001600182028036833780820191505090505b5090505b60008514612be257600182612b6e9190614ad4565b9150600a85612b7d9190614d3e565b6030612b89919061431a565b60f81b818381518110612b9f57612b9e614523565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612bdb9190614d0d565b9450612b59565b8093505050505b919050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612c448461161e565b612c4e9190614ad4565b9050600060076000848152602001908152602001600020549050818114612d33576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612db89190614ad4565b9050600060096000848152602001908152602001600020549050600060088381548110612de857612de7614523565b5b906000526020600020015490508060088381548110612e0a57612e09614523565b5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612e5957612e58614d6f565b5b6001900381819060005260206000200160009055905550505050565b6000612e808361161e565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612fbf57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612fcf5750612fce82613220565b5b9050919050565b612fde611542565b1561301e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161301590614b54565b60405180910390fd5b61302983838361200f565b505050565b613038838361328a565b6130456000848484613089565b613084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307b90614c52565b60405180910390fd5b505050565b60006130aa8473ffffffffffffffffffffffffffffffffffffffff16611ffc565b15613213578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130d361220e565b8786866040518563ffffffff1660e01b81526004016130f59493929190614df3565b602060405180830381600087803b15801561310f57600080fd5b505af192505050801561314057506040513d601f19601f8201168201806040525081019061313d9190614e54565b60015b6131c3573d8060008114613170576040519150601f19603f3d011682016040523d82523d6000602084013e613175565b606091505b506000815114156131bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131b290614c52565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613218565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132f190614ecd565b60405180910390fd5b613303816121a2565b15613343576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161333a90614f39565b60405180910390fd5b61334f60008383612fd6565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461339f919061431a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461346490613df5565b90600052602060002090601f01602090048101928261348657600085556134cd565b82601f1061349f57805160ff19168380011785556134cd565b828001600101855582156134cd579182015b828111156134cc5782518255916020019190600101906134b1565b5b5090506134da91906134de565b5090565b5b808211156134f75760008160009055506001016134df565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135448161350f565b811461354f57600080fd5b50565b6000813590506135618161353b565b92915050565b60006020828403121561357d5761357c613505565b5b600061358b84828501613552565b91505092915050565b60008115159050919050565b6135a981613594565b82525050565b60006020820190506135c460008301846135a0565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156136045780820151818401526020810190506135e9565b83811115613613576000848401525b50505050565b6000601f19601f8301169050919050565b6000613635826135ca565b61363f81856135d5565b935061364f8185602086016135e6565b61365881613619565b840191505092915050565b6000602082019050818103600083015261367d818461362a565b905092915050565b6000819050919050565b61369881613685565b81146136a357600080fd5b50565b6000813590506136b58161368f565b92915050565b6000602082840312156136d1576136d0613505565b5b60006136df848285016136a6565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000613713826136e8565b9050919050565b61372381613708565b82525050565b600060208201905061373e600083018461371a565b92915050565b61374d81613708565b811461375857600080fd5b50565b60008135905061376a81613744565b92915050565b6000806040838503121561378757613786613505565b5b60006137958582860161375b565b92505060206137a6858286016136a6565b9150509250929050565b6000602082840312156137c6576137c5613505565b5b60006137d48482850161375b565b91505092915050565b6137e681613685565b82525050565b600060208201905061380160008301846137dd565b92915050565b6000806000606084860312156138205761381f613505565b5b600061382e8682870161375b565b935050602061383f8682870161375b565b9250506040613850868287016136a6565b9150509250925092565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61389782613619565b810181811067ffffffffffffffff821117156138b6576138b561385f565b5b80604052505050565b60006138c96134fb565b90506138d5828261388e565b919050565b600067ffffffffffffffff8211156138f5576138f461385f565b5b602082029050602081019050919050565b600080fd5b600061391e613919846138da565b6138bf565b9050808382526020820190506020840283018581111561394157613940613906565b5b835b8181101561396a5780613956888261375b565b845260208401935050602081019050613943565b5050509392505050565b600082601f8301126139895761398861385a565b5b813561399984826020860161390b565b91505092915050565b6000602082840312156139b8576139b7613505565b5b600082013567ffffffffffffffff8111156139d6576139d561350a565b5b6139e284828501613974565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b613a2081613685565b82525050565b6000613a328383613a17565b60208301905092915050565b6000602082019050919050565b6000613a56826139eb565b613a6081856139f6565b9350613a6b83613a07565b8060005b83811015613a9c578151613a838882613a26565b9750613a8e83613a3e565b925050600181019050613a6f565b5085935050505092915050565b60006020820190508181036000830152613ac38184613a4b565b905092915050565b600080fd5b600067ffffffffffffffff821115613aeb57613aea61385f565b5b613af482613619565b9050602081019050919050565b82818337600083830152505050565b6000613b23613b1e84613ad0565b6138bf565b905082815260208101848484011115613b3f57613b3e613acb565b5b613b4a848285613b01565b509392505050565b600082601f830112613b6757613b6661385a565b5b8135613b77848260208601613b10565b91505092915050565b600060208284031215613b9657613b95613505565b5b600082013567ffffffffffffffff811115613bb457613bb361350a565b5b613bc084828501613b52565b91505092915050565b613bd281613594565b8114613bdd57600080fd5b50565b600081359050613bef81613bc9565b92915050565b60008060408385031215613c0c57613c0b613505565b5b6000613c1a8582860161375b565b9250506020613c2b85828601613be0565b9150509250929050565b600067ffffffffffffffff821115613c5057613c4f61385f565b5b613c5982613619565b9050602081019050919050565b6000613c79613c7484613c35565b6138bf565b905082815260208101848484011115613c9557613c94613acb565b5b613ca0848285613b01565b509392505050565b600082601f830112613cbd57613cbc61385a565b5b8135613ccd848260208601613c66565b91505092915050565b60008060008060808587031215613cf057613cef613505565b5b6000613cfe8782880161375b565b9450506020613d0f8782880161375b565b9350506040613d20878288016136a6565b925050606085013567ffffffffffffffff811115613d4157613d4061350a565b5b613d4d87828801613ca8565b91505092959194509250565b600060208284031215613d6f57613d6e613505565b5b6000613d7d84828501613be0565b91505092915050565b60008060408385031215613d9d57613d9c613505565b5b6000613dab8582860161375b565b9250506020613dbc8582860161375b565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e0d57607f821691505b60208210811415613e2157613e20613dc6565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613e83602c836135d5565b9150613e8e82613e27565b604082019050919050565b60006020820190508181036000830152613eb281613e76565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613f156021836135d5565b9150613f2082613eb9565b604082019050919050565b60006020820190508181036000830152613f4481613f08565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613fa76038836135d5565b9150613fb282613f4b565b604082019050919050565b60006020820190508181036000830152613fd681613f9a565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b60006140396031836135d5565b915061404482613fdd565b604082019050919050565b600060208201905081810360008301526140688161402c565b9050919050565b7f596f7520617265206e6f742077686974656c697374656420666f72207468652060008201527f506978656c20417274207072652d73616c650000000000000000000000000000602082015250565b60006140cb6032836135d5565b91506140d68261406f565b604082019050919050565b600060208201905081810360008301526140fa816140be565b9050919050565b7f596f752063616e2774207072652d6d696e7420506978656c204172742061742060008201527f746865206d6f6d656e7400000000000000000000000000000000000000000000602082015250565b600061415d602a836135d5565b915061416882614101565b604082019050919050565b6000602082019050818103600083015261418c81614150565b9050919050565b7f596f752063616e206f6e6c79206d696e74203120746f20323020506978656c2060008201527f4172740000000000000000000000000000000000000000000000000000000000602082015250565b60006141ef6023836135d5565b91506141fa82614193565b604082019050919050565b6000602082019050818103600083015261421e816141e2565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061425f82613685565b915061426a83613685565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142a3576142a2614225565b5b828202905092915050565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b60006142e46019836135d5565b91506142ef826142ae565b602082019050919050565b60006020820190508181036000830152614313816142d7565b9050919050565b600061432582613685565b915061433083613685565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561436557614364614225565b5b828201905092915050565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b60006143a66016836135d5565b91506143b182614370565b602082019050919050565b600060208201905081810360008301526143d581614399565b9050919050565b60006143e782613685565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561441a57614419614225565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b600061445b6020836135d5565b915061446682614425565b602082019050919050565b6000602082019050818103600083015261448a8161444e565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006144ed602b836135d5565b91506144f882614491565b604082019050919050565b6000602082019050818103600083015261451c816144e0565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f54686520506978656c20417274206d61696e2073616c65206973206e6f74206f60008201527f70656e0000000000000000000000000000000000000000000000000000000000602082015250565b60006145ae6023836135d5565b91506145b982614552565b604082019050919050565b600060208201905081810360008301526145dd816145a1565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614640602c836135d5565b915061464b826145e4565b604082019050919050565b6000602082019050818103600083015261466f81614633565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b60006146d26029836135d5565b91506146dd82614676565b604082019050919050565b60006020820190508181036000830152614701816146c5565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000614764602a836135d5565b915061476f82614708565b604082019050919050565b6000602082019050818103600083015261479381614757565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006147f6602f836135d5565b91506148018261479a565b604082019050919050565b60006020820190508181036000830152614825816147e9565b9050919050565b600081905092915050565b6000614842826135ca565b61484c818561482c565b935061485c8185602086016135e6565b80840191505092915050565b60006148748285614837565b91506148808284614837565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006148e86026836135d5565b91506148f38261488c565b604082019050919050565b60006020820190508181036000830152614917816148db565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061497a602c836135d5565b91506149858261491e565b604082019050919050565b600060208201905081810360008301526149a98161496d565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614a0c6029836135d5565b9150614a17826149b0565b604082019050919050565b60006020820190508181036000830152614a3b816149ff565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a9e6024836135d5565b9150614aa982614a42565b604082019050919050565b60006020820190508181036000830152614acd81614a91565b9050919050565b6000614adf82613685565b9150614aea83613685565b925082821015614afd57614afc614225565b5b828203905092915050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614b3e6010836135d5565b9150614b4982614b08565b602082019050919050565b60006020820190508181036000830152614b6d81614b31565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614baa6019836135d5565b9150614bb582614b74565b602082019050919050565b60006020820190508181036000830152614bd981614b9d565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614c3c6032836135d5565b9150614c4782614be0565b604082019050919050565b60006020820190508181036000830152614c6b81614c2f565b9050919050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614ca86014836135d5565b9150614cb382614c72565b602082019050919050565b60006020820190508181036000830152614cd781614c9b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614d1882613685565b9150614d2383613685565b925082614d3357614d32614cde565b5b828204905092915050565b6000614d4982613685565b9150614d5483613685565b925082614d6457614d63614cde565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000614dc582614d9e565b614dcf8185614da9565b9350614ddf8185602086016135e6565b614de881613619565b840191505092915050565b6000608082019050614e08600083018761371a565b614e15602083018661371a565b614e2260408301856137dd565b8181036060830152614e348184614dba565b905095945050505050565b600081519050614e4e8161353b565b92915050565b600060208284031215614e6a57614e69613505565b5b6000614e7884828501614e3f565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614eb76020836135d5565b9150614ec282614e81565b602082019050919050565b60006020820190508181036000830152614ee681614eaa565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614f23601c836135d5565b9150614f2e82614eed565b602082019050919050565b60006020820190508181036000830152614f5281614f16565b905091905056fea26469706673582212206336394852d478a27e74ab782ac107985ca75180a835c8966383f0b7663b6b2d64736f6c63430008090033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000a0000000000000000000000000000000000000000000000000000000000000002468747470733a2f2f6170692e636f736d69636d6574612e696f2f706978656c2d6172742f00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000003168747470733a2f2f6170692e636f736d69636d6574612e696f2f706978656c2d6172742f636f6e74726163742e6a736f6e000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseTokenURI (string): https://api.cosmicmeta.io/pixel-art/
Arg [1] : _contractURI (string): https://api.cosmicmeta.io/pixel-art/contract.json

-----Encoded View---------------
8 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000024
Arg [3] : 68747470733a2f2f6170692e636f736d69636d6574612e696f2f706978656c2d
Arg [4] : 6172742f00000000000000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000031
Arg [6] : 68747470733a2f2f6170692e636f736d69636d6574612e696f2f706978656c2d
Arg [7] : 6172742f636f6e74726163742e6a736f6e000000000000000000000000000000


Deployed Bytecode Sourcemap

310:4612:2:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4351:212;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2408:98:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3919:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3457:401;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3166:120:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1614:111:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4646:330:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1327:649:2;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4091:121;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1290:253:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;853:49:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2948:210;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1984:599;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5042:179:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2591:349:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1797:230:5;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3739:94:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3294:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1091:84:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;782:28:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2111:235:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1849:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1661:101:11;;;;;;;;;;;;;:::i;:::-;;557:27:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3951:61;;;;;;;;;;;;;:::i;:::-;;4220:123;;;:::i;:::-;;1029:85:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3537:86:2;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3415:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2570:102:4;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;627:33:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;707:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4203:153:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5287:320;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4020:63:2;;;;;;;;;;;;;:::i;:::-;;3841:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2738:329:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;426:26:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3631:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;459:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4422:162:4;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1911:198:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;491:41:2;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4351:212;4490:4;4519:36;4543:11;4519:23;:36::i;:::-;4512:43;;4351:212;;;:::o;2408:98:4:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;4022:16;4030:7;4022;:16::i;:::-;4014:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4105:15;:24;4121:7;4105:24;;;;;;;;;;;;;;;;;;;;;4098:31;;3919:217;;;:::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;3594:11;;:2;:11;;;;3586:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3691:5;3675:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3700:37;3717:5;3724:12;:10;:12::i;:::-;3700:16;:37::i;:::-;3675:62;3654:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3527:331;3457:401;;:::o;3166:120:2:-;3229:4;3253:17;:25;3271:6;3253:25;;;;;;;;;;;;;;;;;;;;;;;;;3246:32;;3166:120;;;:::o;1614:111:5:-;1675:7;1701:10;:17;;;;1694:24;;1614:111;:::o;4646:330:4:-;4835:41;4854:12;:10;:12::i;:::-;4868:7;4835:18;:41::i;:::-;4827:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;:::-;4646:330;;;:::o;1327:649:2:-;1402:14;1419:13;:11;:13::i;:::-;1402:30;;1453:21;1470:3;1453:16;:21::i;:::-;1445:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;1549:8;;;;;;;;;;;1548:9;1540:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;1635:1;1623:9;:13;:37;;;;;1653:7;;1640:9;:20;;1623:37;1615:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;1747:9;1732:12;;:24;;;;:::i;:::-;1719:9;:37;;1711:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;528:4;1814:9;1805:6;:18;;;;:::i;:::-;:32;;1797:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;1882:9;1894:1;1882:13;;1877:92;1902:9;1897:1;:14;1877:92;;1931:26;1941:3;1955:1;1946:6;:10;;;;:::i;:::-;1931:9;:26::i;:::-;1913:3;;;;;:::i;:::-;;;;1877:92;;;;1391:585;1327:649;;:::o;4091:121::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4178:10:2::1;4170:24;;:33;4195:7;4170:33;;;;;;;;;;;;;;;;;;;;;;;4162:42;;;::::0;::::1;;4091:121:::0;:::o;1290:253:5:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1510:12;:19;1523:5;1510:19;;;;;;;;;;;;;;;:26;1530:5;1510:26;;;;;;;;;;;;1503:33;;1290:253;;;;:::o;853:49:2:-;;;;;;;;;;;;;;;;;;;;;;:::o;2948:210::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3042:9:2::1;3037:114;3057:12;:19;3053:1;:23;3037:114;;;3135:4;3098:17;:34;3116:12;3129:1;3116:15;;;;;;;;:::i;:::-;;;;;;;;3098:34;;;;;;;;;;;;;;;;:41;;;;;;;;;;;;;;;;;;3078:3;;;;;:::i;:::-;;;;3037:114;;;;2948:210:::0;:::o;1984:599::-;2056:14;2073:13;:11;:13::i;:::-;2056:30;;2117:7;:5;:7::i;:::-;2103:21;;:10;:21;;;2099:293;;2149:8;;;;;;;;;;;2141:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;2232:1;2220:9;:13;:37;;;;;2250:7;;2237:9;:20;;2220:37;2212:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;2341:9;2333:5;;:17;;;;:::i;:::-;2320:9;:30;;2312:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2099:293;528:4;2421:9;2412:6;:18;;;;:::i;:::-;:32;;2404:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;2489:9;2501:1;2489:13;;2484:92;2509:9;2504:1;:14;2484:92;;2538:26;2548:3;2562:1;2553:6;:10;;;;:::i;:::-;2538:9;:26::i;:::-;2520:3;;;;;:::i;:::-;;;;2484:92;;;;2045:538;1984:599;;:::o;5042:179:4:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;:::-;5042:179;;;:::o;2591:349:2:-;2651:16;2680:18;2701:17;2711:6;2701:9;:17::i;:::-;2680:38;;2731:25;2773:10;2759:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2731:53;;2802:9;2797:108;2817:10;2813:1;:14;2797:108;;;2863:30;2883:6;2891:1;2863:19;:30::i;:::-;2849:8;2858:1;2849:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;2829:3;;;;;:::i;:::-;;;;2797:108;;;;2924:8;2917:15;;;;2591:349;;;:::o;1797:230:5:-;1872:7;1907:30;:28;:30::i;:::-;1899:5;:38;1891:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2003:10;2014:5;2003:17;;;;;;;;:::i;:::-;;;;;;;;;;1996:24;;1797:230;;;:::o;3739:94:2:-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3817:8:2::1;3807:7;:18;;;;3739:94:::0;:::o;3294:113::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3386:13:2::1;3371:12;:28;;;;;;;;;;;;:::i;:::-;;3294:113:::0;:::o;1091:84:12:-;1138:4;1161:7;;;;;;;;;;;1154:14;;1091:84;:::o;782:28:2:-;;;;;;;;;;;;;:::o;2111:235:4:-;2183:7;2202:13;2218:7;:16;2226:7;2218:16;;;;;;;;;;;;;;;;;;;;;2202:32;;2269:1;2252:19;;:5;:19;;;;2244:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2334:5;2327:12;;;2111:235;;;:::o;1849:205::-;1921:7;1965:1;1948:19;;:5;:19;;;;1940:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2031:9;:16;2041:5;2031:16;;;;;;;;;;;;;;;;2024:23;;1849:205;;;:::o;1661:101:11:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1725:30:::1;1752:1;1725:18;:30::i;:::-;1661:101::o:0;557:27:2:-;;;;:::o;3951:61::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3996:8:2::1;:6;:8::i;:::-;3951:61::o:0;4220:123::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4295:10:2::1;4287:24;;:47;4312:21;4287:47;;;;;;;;;;;;;;;;;;;;;;;4279:56;;;::::0;::::1;;4220:123::o:0;1029:85:11:-;1075:7;1101:6;;;;;;;;;;;1094:13;;1029:85;:::o;3537:86:2:-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3609:6:2::1;3601:5;:14;;;;3537:86:::0;:::o;3415:114::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3509:12:2::1;3495:11;:26;;;;;;;;;;;;:::i;:::-;;3415:114:::0;:::o;2570:102:4:-;2626:13;2658:7;2651:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2570:102;:::o;627:33:2:-;;;;:::o;707:40::-;;;;:::o;4203:153:4:-;4297:52;4316:12;:10;:12::i;:::-;4330:8;4340;4297:18;:52::i;:::-;4203:153;;:::o;5287:320::-;5456:41;5475:12;:10;:12::i;:::-;5489:7;5456:18;:41::i;:::-;5448:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;:::-;5287:320;;;;:::o;4020:63:2:-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4065:10:2::1;:8;:10::i;:::-;4020:63::o:0;3841:102::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3926:9:2::1;3915:8;;:20;;;;;;;;;;;;;;;;;;3841:102:::0;:::o;2738:329:4:-;2811:13;2844:16;2852:7;2844;:16::i;:::-;2836:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2923:21;2947:10;:8;:10::i;:::-;2923:34;;2998:1;2980:7;2974:21;:25;:86;;;;;;;;;;;;;;;;;3026:7;3035:18;:7;:16;:18::i;:::-;3009:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2974:86;2967:93;;;2738:329;;;:::o;426:26:2:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3631:100::-;1252:12:11;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3717:6:2::1;3702:12;:21;;;;3631:100:::0;:::o;459:25::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;4422:162:4:-;4519:4;4542:18;:25;4561:5;4542:25;;;;;;;;;;;;;;;:35;4568:8;4542:35;;;;;;;;;;;;;;;;;;;;;;;;;4535:42;;4422:162;;;;:::o;1911:198:11:-;1252:12;:10;:12::i;:::-;1241:23;;:7;:5;:7::i;:::-;:23;;;1233:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2019:1:::1;1999:22;;:8;:22;;;;1991:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2074:28;2093:8;2074:18;:28::i;:::-;1911:198:::0;:::o;491:41:2:-;528:4;491:41;:::o;771:377:0:-;831:4;1034:12;1099:7;1087:20;1079:28;;1140:1;1133:4;:8;1126:15;;;771:377;;;:::o;2623:572:5:-;2762:45;2789:4;2795:2;2799:7;2762:26;:45::i;:::-;2838:1;2822:18;;:4;:18;;;2818:183;;;2856:40;2888:7;2856:31;:40::i;:::-;2818:183;;;2925:2;2917:10;;:4;:10;;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2913:88;2818:183;3028:1;3014:16;;:2;:16;;;3010:179;;;3046:45;3083:7;3046:36;:45::i;:::-;3010:179;;;3118:4;3112:10;;:2;:10;;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;:::-;3108:81;3010:179;2623:572;;;:::o;13430:122:4:-;;;;:::o;989:222:5:-;1091:4;1129:35;1114:50;;;:11;:50;;;;:90;;;;1168:36;1192:11;1168:23;:36::i;:::-;1114:90;1107:97;;989:222;;;:::o;7079:125:4:-;7144:4;7195:1;7167:30;;:7;:16;7175:7;7167:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7160:37;;7079:125;;;:::o;640:96:1:-;693:7;719:10;712:17;;640:96;:::o;10930:171:4:-;11031:2;11004:15;:24;11020:7;11004:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11086:7;11082:2;11048:46;;11057:23;11072:7;11057:14;:23::i;:::-;11048:46;;;;;;;;;;;;10930:171;;:::o;7362:344::-;7455:4;7479:16;7487:7;7479;:16::i;:::-;7471:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;7611:16;;:7;:16;;;:51;;;;7655:7;7631:31;;:20;7643:7;7631:11;:20::i;:::-;:31;;;7611:51;:87;;;;7666:32;7683:5;7690:7;7666:16;:32::i;:::-;7611:87;7603:96;;;7362:344;;;;:::o;10259:560::-;10413:4;10386:31;;:23;10401:7;10386:14;:23::i;:::-;:31;;;10378:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10495:1;10481:16;;:2;:16;;;;10473:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10549:39;10570:4;10576:2;10580:7;10549:20;:39::i;:::-;10650:29;10667:1;10671:7;10650:8;:29::i;:::-;10709:1;10690:9;:15;10700:4;10690:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10737:1;10720:9;:13;10730:2;10720:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10767:2;10748:7;:16;10756:7;10748:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10804:7;10800:2;10785:27;;10794:4;10785:27;;;;;;;;;;;;10259:560;;;:::o;8036:108::-;8111:26;8121:2;8125:7;8111:26;;;;;;;;;;;;:9;:26::i;:::-;8036:108;;:::o;2263:187:11:-;2336:16;2355:6;;;;;;;;;;;2336:25;;2380:8;2371:6;;:17;;;;;;;;;;;;;;;;;;2434:8;2403:40;;2424:8;2403:40;;;;;;;;;;;;2326:124;2263:187;:::o;1856:115:12:-;1405:8;:6;:8::i;:::-;1404:9;1396:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1925:4:::1;1915:7;;:14;;;;;;;;;;;;;;;;;;1944:20;1951:12;:10;:12::i;:::-;1944:20;;;;;;:::i;:::-;;;;;;;;1856:115::o:0;11236:307:4:-;11386:8;11377:17;;:5;:17;;;;11369:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11472:8;11434:18;:25;11453:5;11434:25;;;;;;;;;;;;;;;:35;11460:8;11434:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11517:8;11495:41;;11510:5;11495:41;;;11527:8;11495:41;;;;;;:::i;:::-;;;;;;;;11236:307;;;:::o;6469:::-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6469:307;;;;:::o;2103:117:12:-;1670:8;:6;:8::i;:::-;1662:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2171:5:::1;2161:7;;:15;;;;;;;;;;;;;;;;;;2191:22;2200:12;:10;:12::i;:::-;2191:22;;;;;;:::i;:::-;;;;;;;;2103:117::o:0;4806:113:2:-;4866:13;4899:12;4892:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4806:113;:::o;328:703:13:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;3901:161:5:-;4004:10;:17;;;;3977:15;:24;3993:7;3977:24;;;;;;;;;;;:44;;;;4031:10;4047:7;4031:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3901:161;:::o;4679:970::-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;4941:51;;5002:18;5023:17;:26;5041:7;5023:26;;;;;;;;;;;;5002:47;;5167:14;5153:10;:28;5149:323;;5197:19;5219:12;:18;5232:4;5219:18;;;;;;;;;;;;;;;:34;5238:14;5219:34;;;;;;;;;;;;5197:56;;5301:11;5268:12;:18;5281:4;5268:18;;;;;;;;;;;;;;;:30;5287:10;5268:30;;;;;;;;;;;:44;;;;5417:10;5384:17;:30;5402:11;5384:30;;;;;;;;;;;:43;;;;5183:289;5149:323;5565:17;:26;5583:7;5565:26;;;;;;;;;;;5558:33;;;5608:12;:18;5621:4;5608:18;;;;;;;;;;;;;;;:34;5627:14;5608:34;;;;;;;;;;;5601:41;;;4760:889;;4679:970;;:::o;5937:1061::-;6186:22;6231:1;6211:10;:17;;;;:21;;;;:::i;:::-;6186:46;;6242:18;6263:15;:24;6279:7;6263:24;;;;;;;;;;;;6242:45;;6609:19;6631:10;6642:14;6631:26;;;;;;;;:::i;:::-;;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6803:10;6772:15;:28;6788:11;6772:28;;;;;;;;;;;:41;;;;6941:15;:24;6957:7;6941:24;;;;;;;;;;;6934:31;;;6975:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6008:990;;;5937:1061;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;3573:37;;3647:7;3620:12;:16;3633:2;3620:16;;;;;;;;;;;;;;;:24;3637:6;3620:24;;;;;;;;;;;:34;;;;3693:6;3664:17;:26;3682:7;3664:26;;;;;;;;;;;:35;;;;3563:143;3489:217;;:::o;1490:300:4:-;1592:4;1642:25;1627:40;;;:11;:40;;;;:104;;;;1698:33;1683:48;;;:11;:48;;;;1627:104;:156;;;;1747:36;1771:11;1747:23;:36::i;:::-;1627:156;1608:175;;1490:300;;;:::o;4571:227:2:-;1405:8:12;:6;:8::i;:::-;1404:9;1396:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;4745:45:2::1;4772:4;4778:2;4782:7;4745:26;:45::i;:::-;4571:227:::0;;;:::o;8365:311:4:-;8490:18;8496:2;8500:7;8490:5;:18::i;:::-;8539:54;8570:1;8574:2;8578:7;8587:5;8539:22;:54::i;:::-;8518:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;8365:311;;;:::o;12096:778::-;12246:4;12266:15;:2;:13;;;:15::i;:::-;12262:606;;;12317:2;12301:36;;;12338:12;:10;:12::i;:::-;12352:4;12358:7;12367:5;12301:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12297:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12557:1;12540:6;:13;:18;12536:266;;;12582:60;;;;;;;;;;:::i;:::-;;;;;;;;12536:266;12754:6;12748:13;12739:6;12735:2;12731:15;12724:38;12297:519;12433:41;;;12423:51;;;:6;:51;;;;12416:58;;;;;12262:606;12853:4;12846:11;;12096:778;;;;;;;:::o;829:155:3:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;8998:372:4:-;9091:1;9077:16;;:2;:16;;;;9069:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9149:16;9157:7;9149;:16::i;:::-;9148:17;9140:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9209:45;9238:1;9242:2;9246:7;9209:20;:45::i;:::-;9282:1;9265:9;:13;9275:2;9265:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9312:2;9293:7;:16;9301:7;9293:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9355:7;9351:2;9330:33;;9347:1;9330:33;;;;;;;;;;;;8998:372;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:14:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:329::-;4997:6;5046:2;5034:9;5025:7;5021:23;5017:32;5014:119;;;5052:79;;:::i;:::-;5014:119;5172:1;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5143:117;4938:329;;;;:::o;5273:118::-;5360:24;5378:5;5360:24;:::i;:::-;5355:3;5348:37;5273:118;;:::o;5397:222::-;5490:4;5528:2;5517:9;5513:18;5505:26;;5541:71;5609:1;5598:9;5594:17;5585:6;5541:71;:::i;:::-;5397:222;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:180;6421:77;6418:1;6411:88;6518:4;6515:1;6508:15;6542:4;6539:1;6532:15;6559:281;6642:27;6664:4;6642:27;:::i;:::-;6634:6;6630:40;6772:6;6760:10;6757:22;6736:18;6724:10;6721:34;6718:62;6715:88;;;6783:18;;:::i;:::-;6715:88;6823:10;6819:2;6812:22;6602:238;6559:281;;:::o;6846:129::-;6880:6;6907:20;;:::i;:::-;6897:30;;6936:33;6964:4;6956:6;6936:33;:::i;:::-;6846:129;;;:::o;6981:311::-;7058:4;7148:18;7140:6;7137:30;7134:56;;;7170:18;;:::i;:::-;7134:56;7220:4;7212:6;7208:17;7200:25;;7280:4;7274;7270:15;7262:23;;6981:311;;;:::o;7298:117::-;7407:1;7404;7397:12;7438:710;7534:5;7559:81;7575:64;7632:6;7575:64;:::i;:::-;7559:81;:::i;:::-;7550:90;;7660:5;7689:6;7682:5;7675:21;7723:4;7716:5;7712:16;7705:23;;7776:4;7768:6;7764:17;7756:6;7752:30;7805:3;7797:6;7794:15;7791:122;;;7824:79;;:::i;:::-;7791:122;7939:6;7922:220;7956:6;7951:3;7948:15;7922:220;;;8031:3;8060:37;8093:3;8081:10;8060:37;:::i;:::-;8055:3;8048:50;8127:4;8122:3;8118:14;8111:21;;7998:144;7982:4;7977:3;7973:14;7966:21;;7922:220;;;7926:21;7540:608;;7438:710;;;;;:::o;8171:370::-;8242:5;8291:3;8284:4;8276:6;8272:17;8268:27;8258:122;;8299:79;;:::i;:::-;8258:122;8416:6;8403:20;8441:94;8531:3;8523:6;8516:4;8508:6;8504:17;8441:94;:::i;:::-;8432:103;;8248:293;8171:370;;;;:::o;8547:539::-;8631:6;8680:2;8668:9;8659:7;8655:23;8651:32;8648:119;;;8686:79;;:::i;:::-;8648:119;8834:1;8823:9;8819:17;8806:31;8864:18;8856:6;8853:30;8850:117;;;8886:79;;:::i;:::-;8850:117;8991:78;9061:7;9052:6;9041:9;9037:22;8991:78;:::i;:::-;8981:88;;8777:302;8547:539;;;;:::o;9092:114::-;9159:6;9193:5;9187:12;9177:22;;9092:114;;;:::o;9212:184::-;9311:11;9345:6;9340:3;9333:19;9385:4;9380:3;9376:14;9361:29;;9212:184;;;;:::o;9402:132::-;9469:4;9492:3;9484:11;;9522:4;9517:3;9513:14;9505:22;;9402:132;;;:::o;9540:108::-;9617:24;9635:5;9617:24;:::i;:::-;9612:3;9605:37;9540:108;;:::o;9654:179::-;9723:10;9744:46;9786:3;9778:6;9744:46;:::i;:::-;9822:4;9817:3;9813:14;9799:28;;9654:179;;;;:::o;9839:113::-;9909:4;9941;9936:3;9932:14;9924:22;;9839:113;;;:::o;9988:732::-;10107:3;10136:54;10184:5;10136:54;:::i;:::-;10206:86;10285:6;10280:3;10206:86;:::i;:::-;10199:93;;10316:56;10366:5;10316:56;:::i;:::-;10395:7;10426:1;10411:284;10436:6;10433:1;10430:13;10411:284;;;10512:6;10506:13;10539:63;10598:3;10583:13;10539:63;:::i;:::-;10532:70;;10625:60;10678:6;10625:60;:::i;:::-;10615:70;;10471:224;10458:1;10455;10451:9;10446:14;;10411:284;;;10415:14;10711:3;10704:10;;10112:608;;;9988:732;;;;:::o;10726:373::-;10869:4;10907:2;10896:9;10892:18;10884:26;;10956:9;10950:4;10946:20;10942:1;10931:9;10927:17;10920:47;10984:108;11087:4;11078:6;10984:108;:::i;:::-;10976:116;;10726:373;;;;:::o;11105:117::-;11214:1;11211;11204:12;11228:308;11290:4;11380:18;11372:6;11369:30;11366:56;;;11402:18;;:::i;:::-;11366:56;11440:29;11462:6;11440:29;:::i;:::-;11432:37;;11524:4;11518;11514:15;11506:23;;11228:308;;;:::o;11542:154::-;11626:6;11621:3;11616;11603:30;11688:1;11679:6;11674:3;11670:16;11663:27;11542:154;;;:::o;11702:412::-;11780:5;11805:66;11821:49;11863:6;11821:49;:::i;:::-;11805:66;:::i;:::-;11796:75;;11894:6;11887:5;11880:21;11932:4;11925:5;11921:16;11970:3;11961:6;11956:3;11952:16;11949:25;11946:112;;;11977:79;;:::i;:::-;11946:112;12067:41;12101:6;12096:3;12091;12067:41;:::i;:::-;11786:328;11702:412;;;;;:::o;12134:340::-;12190:5;12239:3;12232:4;12224:6;12220:17;12216:27;12206:122;;12247:79;;:::i;:::-;12206:122;12364:6;12351:20;12389:79;12464:3;12456:6;12449:4;12441:6;12437:17;12389:79;:::i;:::-;12380:88;;12196:278;12134:340;;;;:::o;12480:509::-;12549:6;12598:2;12586:9;12577:7;12573:23;12569:32;12566:119;;;12604:79;;:::i;:::-;12566:119;12752:1;12741:9;12737:17;12724:31;12782:18;12774:6;12771:30;12768:117;;;12804:79;;:::i;:::-;12768:117;12909:63;12964:7;12955:6;12944:9;12940:22;12909:63;:::i;:::-;12899:73;;12695:287;12480:509;;;;:::o;12995:116::-;13065:21;13080:5;13065:21;:::i;:::-;13058:5;13055:32;13045:60;;13101:1;13098;13091:12;13045:60;12995:116;:::o;13117:133::-;13160:5;13198:6;13185:20;13176:29;;13214:30;13238:5;13214:30;:::i;:::-;13117:133;;;;:::o;13256:468::-;13321:6;13329;13378:2;13366:9;13357:7;13353:23;13349:32;13346:119;;;13384:79;;:::i;:::-;13346:119;13504:1;13529:53;13574:7;13565:6;13554:9;13550:22;13529:53;:::i;:::-;13519:63;;13475:117;13631:2;13657:50;13699:7;13690:6;13679:9;13675:22;13657:50;:::i;:::-;13647:60;;13602:115;13256:468;;;;;:::o;13730:307::-;13791:4;13881:18;13873:6;13870:30;13867:56;;;13903:18;;:::i;:::-;13867:56;13941:29;13963:6;13941:29;:::i;:::-;13933:37;;14025:4;14019;14015:15;14007:23;;13730:307;;;:::o;14043:410::-;14120:5;14145:65;14161:48;14202:6;14161:48;:::i;:::-;14145:65;:::i;:::-;14136:74;;14233:6;14226:5;14219:21;14271:4;14264:5;14260:16;14309:3;14300:6;14295:3;14291:16;14288:25;14285:112;;;14316:79;;:::i;:::-;14285:112;14406:41;14440:6;14435:3;14430;14406:41;:::i;:::-;14126:327;14043:410;;;;;:::o;14472:338::-;14527:5;14576:3;14569:4;14561:6;14557:17;14553:27;14543:122;;14584:79;;:::i;:::-;14543:122;14701:6;14688:20;14726:78;14800:3;14792:6;14785:4;14777:6;14773:17;14726:78;:::i;:::-;14717:87;;14533:277;14472:338;;;;:::o;14816:943::-;14911:6;14919;14927;14935;14984:3;14972:9;14963:7;14959:23;14955:33;14952:120;;;14991:79;;:::i;:::-;14952:120;15111:1;15136:53;15181:7;15172:6;15161:9;15157:22;15136:53;:::i;:::-;15126:63;;15082:117;15238:2;15264:53;15309:7;15300:6;15289:9;15285:22;15264:53;:::i;:::-;15254:63;;15209:118;15366:2;15392:53;15437:7;15428:6;15417:9;15413:22;15392:53;:::i;:::-;15382:63;;15337:118;15522:2;15511:9;15507:18;15494:32;15553:18;15545:6;15542:30;15539:117;;;15575:79;;:::i;:::-;15539:117;15680:62;15734:7;15725:6;15714:9;15710:22;15680:62;:::i;:::-;15670:72;;15465:287;14816:943;;;;;;;:::o;15765:323::-;15821:6;15870:2;15858:9;15849:7;15845:23;15841:32;15838:119;;;15876:79;;:::i;:::-;15838:119;15996:1;16021:50;16063:7;16054:6;16043:9;16039:22;16021:50;:::i;:::-;16011:60;;15967:114;15765:323;;;;:::o;16094:474::-;16162:6;16170;16219:2;16207:9;16198:7;16194:23;16190:32;16187:119;;;16225:79;;:::i;:::-;16187:119;16345:1;16370:53;16415:7;16406:6;16395:9;16391:22;16370:53;:::i;:::-;16360:63;;16316:117;16472:2;16498:53;16543:7;16534:6;16523:9;16519:22;16498:53;:::i;:::-;16488:63;;16443:118;16094:474;;;;;:::o;16574:180::-;16622:77;16619:1;16612:88;16719:4;16716:1;16709:15;16743:4;16740:1;16733:15;16760:320;16804:6;16841:1;16835:4;16831:12;16821:22;;16888:1;16882:4;16878:12;16909:18;16899:81;;16965:4;16957:6;16953:17;16943:27;;16899:81;17027:2;17019:6;17016:14;16996:18;16993:38;16990:84;;;17046:18;;:::i;:::-;16990:84;16811:269;16760:320;;;:::o;17086:231::-;17226:34;17222:1;17214:6;17210:14;17203:58;17295:14;17290:2;17282:6;17278:15;17271:39;17086:231;:::o;17323:366::-;17465:3;17486:67;17550:2;17545:3;17486:67;:::i;:::-;17479:74;;17562:93;17651:3;17562:93;:::i;:::-;17680:2;17675:3;17671:12;17664:19;;17323:366;;;:::o;17695:419::-;17861:4;17899:2;17888:9;17884:18;17876:26;;17948:9;17942:4;17938:20;17934:1;17923:9;17919:17;17912:47;17976:131;18102:4;17976:131;:::i;:::-;17968:139;;17695:419;;;:::o;18120:220::-;18260:34;18256:1;18248:6;18244:14;18237:58;18329:3;18324:2;18316:6;18312:15;18305:28;18120:220;:::o;18346:366::-;18488:3;18509:67;18573:2;18568:3;18509:67;:::i;:::-;18502:74;;18585:93;18674:3;18585:93;:::i;:::-;18703:2;18698:3;18694:12;18687:19;;18346:366;;;:::o;18718:419::-;18884:4;18922:2;18911:9;18907:18;18899:26;;18971:9;18965:4;18961:20;18957:1;18946:9;18942:17;18935:47;18999:131;19125:4;18999:131;:::i;:::-;18991:139;;18718:419;;;:::o;19143:243::-;19283:34;19279:1;19271:6;19267:14;19260:58;19352:26;19347:2;19339:6;19335:15;19328:51;19143:243;:::o;19392:366::-;19534:3;19555:67;19619:2;19614:3;19555:67;:::i;:::-;19548:74;;19631:93;19720:3;19631:93;:::i;:::-;19749:2;19744:3;19740:12;19733:19;;19392:366;;;:::o;19764:419::-;19930:4;19968:2;19957:9;19953:18;19945:26;;20017:9;20011:4;20007:20;20003:1;19992:9;19988:17;19981:47;20045:131;20171:4;20045:131;:::i;:::-;20037:139;;19764:419;;;:::o;20189:236::-;20329:34;20325:1;20317:6;20313:14;20306:58;20398:19;20393:2;20385:6;20381:15;20374:44;20189:236;:::o;20431:366::-;20573:3;20594:67;20658:2;20653:3;20594:67;:::i;:::-;20587:74;;20670:93;20759:3;20670:93;:::i;:::-;20788:2;20783:3;20779:12;20772:19;;20431:366;;;:::o;20803:419::-;20969:4;21007:2;20996:9;20992:18;20984:26;;21056:9;21050:4;21046:20;21042:1;21031:9;21027:17;21020:47;21084:131;21210:4;21084:131;:::i;:::-;21076:139;;20803:419;;;:::o;21228:237::-;21368:34;21364:1;21356:6;21352:14;21345:58;21437:20;21432:2;21424:6;21420:15;21413:45;21228:237;:::o;21471:366::-;21613:3;21634:67;21698:2;21693:3;21634:67;:::i;:::-;21627:74;;21710:93;21799:3;21710:93;:::i;:::-;21828:2;21823:3;21819:12;21812:19;;21471:366;;;:::o;21843:419::-;22009:4;22047:2;22036:9;22032:18;22024:26;;22096:9;22090:4;22086:20;22082:1;22071:9;22067:17;22060:47;22124:131;22250:4;22124:131;:::i;:::-;22116:139;;21843:419;;;:::o;22268:229::-;22408:34;22404:1;22396:6;22392:14;22385:58;22477:12;22472:2;22464:6;22460:15;22453:37;22268:229;:::o;22503:366::-;22645:3;22666:67;22730:2;22725:3;22666:67;:::i;:::-;22659:74;;22742:93;22831:3;22742:93;:::i;:::-;22860:2;22855:3;22851:12;22844:19;;22503:366;;;:::o;22875:419::-;23041:4;23079:2;23068:9;23064:18;23056:26;;23128:9;23122:4;23118:20;23114:1;23103:9;23099:17;23092:47;23156:131;23282:4;23156:131;:::i;:::-;23148:139;;22875:419;;;:::o;23300:222::-;23440:34;23436:1;23428:6;23424:14;23417:58;23509:5;23504:2;23496:6;23492:15;23485:30;23300:222;:::o;23528:366::-;23670:3;23691:67;23755:2;23750:3;23691:67;:::i;:::-;23684:74;;23767:93;23856:3;23767:93;:::i;:::-;23885:2;23880:3;23876:12;23869:19;;23528:366;;;:::o;23900:419::-;24066:4;24104:2;24093:9;24089:18;24081:26;;24153:9;24147:4;24143:20;24139:1;24128:9;24124:17;24117:47;24181:131;24307:4;24181:131;:::i;:::-;24173:139;;23900:419;;;:::o;24325:180::-;24373:77;24370:1;24363:88;24470:4;24467:1;24460:15;24494:4;24491:1;24484:15;24511:348;24551:7;24574:20;24592:1;24574:20;:::i;:::-;24569:25;;24608:20;24626:1;24608:20;:::i;:::-;24603:25;;24796:1;24728:66;24724:74;24721:1;24718:81;24713:1;24706:9;24699:17;24695:105;24692:131;;;24803:18;;:::i;:::-;24692:131;24851:1;24848;24844:9;24833:20;;24511:348;;;;:::o;24865:175::-;25005:27;25001:1;24993:6;24989:14;24982:51;24865:175;:::o;25046:366::-;25188:3;25209:67;25273:2;25268:3;25209:67;:::i;:::-;25202:74;;25285:93;25374:3;25285:93;:::i;:::-;25403:2;25398:3;25394:12;25387:19;;25046:366;;;:::o;25418:419::-;25584:4;25622:2;25611:9;25607:18;25599:26;;25671:9;25665:4;25661:20;25657:1;25646:9;25642:17;25635:47;25699:131;25825:4;25699:131;:::i;:::-;25691:139;;25418:419;;;:::o;25843:305::-;25883:3;25902:20;25920:1;25902:20;:::i;:::-;25897:25;;25936:20;25954:1;25936:20;:::i;:::-;25931:25;;26090:1;26022:66;26018:74;26015:1;26012:81;26009:107;;;26096:18;;:::i;:::-;26009:107;26140:1;26137;26133:9;26126:16;;25843:305;;;;:::o;26154:172::-;26294:24;26290:1;26282:6;26278:14;26271:48;26154:172;:::o;26332:366::-;26474:3;26495:67;26559:2;26554:3;26495:67;:::i;:::-;26488:74;;26571:93;26660:3;26571:93;:::i;:::-;26689:2;26684:3;26680:12;26673:19;;26332:366;;;:::o;26704:419::-;26870:4;26908:2;26897:9;26893:18;26885:26;;26957:9;26951:4;26947:20;26943:1;26932:9;26928:17;26921:47;26985:131;27111:4;26985:131;:::i;:::-;26977:139;;26704:419;;;:::o;27129:233::-;27168:3;27191:24;27209:5;27191:24;:::i;:::-;27182:33;;27237:66;27230:5;27227:77;27224:103;;;27307:18;;:::i;:::-;27224:103;27354:1;27347:5;27343:13;27336:20;;27129:233;;;:::o;27368:182::-;27508:34;27504:1;27496:6;27492:14;27485:58;27368:182;:::o;27556:366::-;27698:3;27719:67;27783:2;27778:3;27719:67;:::i;:::-;27712:74;;27795:93;27884:3;27795:93;:::i;:::-;27913:2;27908:3;27904:12;27897:19;;27556:366;;;:::o;27928:419::-;28094:4;28132:2;28121:9;28117:18;28109:26;;28181:9;28175:4;28171:20;28167:1;28156:9;28152:17;28145:47;28209:131;28335:4;28209:131;:::i;:::-;28201:139;;27928:419;;;:::o;28353:230::-;28493:34;28489:1;28481:6;28477:14;28470:58;28562:13;28557:2;28549:6;28545:15;28538:38;28353:230;:::o;28589:366::-;28731:3;28752:67;28816:2;28811:3;28752:67;:::i;:::-;28745:74;;28828:93;28917:3;28828:93;:::i;:::-;28946:2;28941:3;28937:12;28930:19;;28589:366;;;:::o;28961:419::-;29127:4;29165:2;29154:9;29150:18;29142:26;;29214:9;29208:4;29204:20;29200:1;29189:9;29185:17;29178:47;29242:131;29368:4;29242:131;:::i;:::-;29234:139;;28961:419;;;:::o;29386:180::-;29434:77;29431:1;29424:88;29531:4;29528:1;29521:15;29555:4;29552:1;29545:15;29572:222;29712:34;29708:1;29700:6;29696:14;29689:58;29781:5;29776:2;29768:6;29764:15;29757:30;29572:222;:::o;29800:366::-;29942:3;29963:67;30027:2;30022:3;29963:67;:::i;:::-;29956:74;;30039:93;30128:3;30039:93;:::i;:::-;30157:2;30152:3;30148:12;30141:19;;29800:366;;;:::o;30172:419::-;30338:4;30376:2;30365:9;30361:18;30353:26;;30425:9;30419:4;30415:20;30411:1;30400:9;30396:17;30389:47;30453:131;30579:4;30453:131;:::i;:::-;30445:139;;30172:419;;;:::o;30597:231::-;30737:34;30733:1;30725:6;30721:14;30714:58;30806:14;30801:2;30793:6;30789:15;30782:39;30597:231;:::o;30834:366::-;30976:3;30997:67;31061:2;31056:3;30997:67;:::i;:::-;30990:74;;31073:93;31162:3;31073:93;:::i;:::-;31191:2;31186:3;31182:12;31175:19;;30834:366;;;:::o;31206:419::-;31372:4;31410:2;31399:9;31395:18;31387:26;;31459:9;31453:4;31449:20;31445:1;31434:9;31430:17;31423:47;31487:131;31613:4;31487:131;:::i;:::-;31479:139;;31206:419;;;:::o;31631:228::-;31771:34;31767:1;31759:6;31755:14;31748:58;31840:11;31835:2;31827:6;31823:15;31816:36;31631:228;:::o;31865:366::-;32007:3;32028:67;32092:2;32087:3;32028:67;:::i;:::-;32021:74;;32104:93;32193:3;32104:93;:::i;:::-;32222:2;32217:3;32213:12;32206:19;;31865:366;;;:::o;32237:419::-;32403:4;32441:2;32430:9;32426:18;32418:26;;32490:9;32484:4;32480:20;32476:1;32465:9;32461:17;32454:47;32518:131;32644:4;32518:131;:::i;:::-;32510:139;;32237:419;;;:::o;32662:229::-;32802:34;32798:1;32790:6;32786:14;32779:58;32871:12;32866:2;32858:6;32854:15;32847:37;32662:229;:::o;32897:366::-;33039:3;33060:67;33124:2;33119:3;33060:67;:::i;:::-;33053:74;;33136:93;33225:3;33136:93;:::i;:::-;33254:2;33249:3;33245:12;33238:19;;32897:366;;;:::o;33269:419::-;33435:4;33473:2;33462:9;33458:18;33450:26;;33522:9;33516:4;33512:20;33508:1;33497:9;33493:17;33486:47;33550:131;33676:4;33550:131;:::i;:::-;33542:139;;33269:419;;;:::o;33694:234::-;33834:34;33830:1;33822:6;33818:14;33811:58;33903:17;33898:2;33890:6;33886:15;33879:42;33694:234;:::o;33934:366::-;34076:3;34097:67;34161:2;34156:3;34097:67;:::i;:::-;34090:74;;34173:93;34262:3;34173:93;:::i;:::-;34291:2;34286:3;34282:12;34275:19;;33934:366;;;:::o;34306:419::-;34472:4;34510:2;34499:9;34495:18;34487:26;;34559:9;34553:4;34549:20;34545:1;34534:9;34530:17;34523:47;34587:131;34713:4;34587:131;:::i;:::-;34579:139;;34306:419;;;:::o;34731:148::-;34833:11;34870:3;34855:18;;34731:148;;;;:::o;34885:377::-;34991:3;35019:39;35052:5;35019:39;:::i;:::-;35074:89;35156:6;35151:3;35074:89;:::i;:::-;35067:96;;35172:52;35217:6;35212:3;35205:4;35198:5;35194:16;35172:52;:::i;:::-;35249:6;35244:3;35240:16;35233:23;;34995:267;34885:377;;;;:::o;35268:435::-;35448:3;35470:95;35561:3;35552:6;35470:95;:::i;:::-;35463:102;;35582:95;35673:3;35664:6;35582:95;:::i;:::-;35575:102;;35694:3;35687:10;;35268:435;;;;;:::o;35709:225::-;35849:34;35845:1;35837:6;35833:14;35826:58;35918:8;35913:2;35905:6;35901:15;35894:33;35709:225;:::o;35940:366::-;36082:3;36103:67;36167:2;36162:3;36103:67;:::i;:::-;36096:74;;36179:93;36268:3;36179:93;:::i;:::-;36297:2;36292:3;36288:12;36281:19;;35940:366;;;:::o;36312:419::-;36478:4;36516:2;36505:9;36501:18;36493:26;;36565:9;36559:4;36555:20;36551:1;36540:9;36536:17;36529:47;36593:131;36719:4;36593:131;:::i;:::-;36585:139;;36312:419;;;:::o;36737:231::-;36877:34;36873:1;36865:6;36861:14;36854:58;36946:14;36941:2;36933:6;36929:15;36922:39;36737:231;:::o;36974:366::-;37116:3;37137:67;37201:2;37196:3;37137:67;:::i;:::-;37130:74;;37213:93;37302:3;37213:93;:::i;:::-;37331:2;37326:3;37322:12;37315:19;;36974:366;;;:::o;37346:419::-;37512:4;37550:2;37539:9;37535:18;37527:26;;37599:9;37593:4;37589:20;37585:1;37574:9;37570:17;37563:47;37627:131;37753:4;37627:131;:::i;:::-;37619:139;;37346:419;;;:::o;37771:228::-;37911:34;37907:1;37899:6;37895:14;37888:58;37980:11;37975:2;37967:6;37963:15;37956:36;37771:228;:::o;38005:366::-;38147:3;38168:67;38232:2;38227:3;38168:67;:::i;:::-;38161:74;;38244:93;38333:3;38244:93;:::i;:::-;38362:2;38357:3;38353:12;38346:19;;38005:366;;;:::o;38377:419::-;38543:4;38581:2;38570:9;38566:18;38558:26;;38630:9;38624:4;38620:20;38616:1;38605:9;38601:17;38594:47;38658:131;38784:4;38658:131;:::i;:::-;38650:139;;38377:419;;;:::o;38802:223::-;38942:34;38938:1;38930:6;38926:14;38919:58;39011:6;39006:2;38998:6;38994:15;38987:31;38802:223;:::o;39031:366::-;39173:3;39194:67;39258:2;39253:3;39194:67;:::i;:::-;39187:74;;39270:93;39359:3;39270:93;:::i;:::-;39388:2;39383:3;39379:12;39372:19;;39031:366;;;:::o;39403:419::-;39569:4;39607:2;39596:9;39592:18;39584:26;;39656:9;39650:4;39646:20;39642:1;39631:9;39627:17;39620:47;39684:131;39810:4;39684:131;:::i;:::-;39676:139;;39403:419;;;:::o;39828:191::-;39868:4;39888:20;39906:1;39888:20;:::i;:::-;39883:25;;39922:20;39940:1;39922:20;:::i;:::-;39917:25;;39961:1;39958;39955:8;39952:34;;;39966:18;;:::i;:::-;39952:34;40011:1;40008;40004:9;39996:17;;39828:191;;;;:::o;40025:166::-;40165:18;40161:1;40153:6;40149:14;40142:42;40025:166;:::o;40197:366::-;40339:3;40360:67;40424:2;40419:3;40360:67;:::i;:::-;40353:74;;40436:93;40525:3;40436:93;:::i;:::-;40554:2;40549:3;40545:12;40538:19;;40197:366;;;:::o;40569:419::-;40735:4;40773:2;40762:9;40758:18;40750:26;;40822:9;40816:4;40812:20;40808:1;40797:9;40793:17;40786:47;40850:131;40976:4;40850:131;:::i;:::-;40842:139;;40569:419;;;:::o;40994:175::-;41134:27;41130:1;41122:6;41118:14;41111:51;40994:175;:::o;41175:366::-;41317:3;41338:67;41402:2;41397:3;41338:67;:::i;:::-;41331:74;;41414:93;41503:3;41414:93;:::i;:::-;41532:2;41527:3;41523:12;41516:19;;41175:366;;;:::o;41547:419::-;41713:4;41751:2;41740:9;41736:18;41728:26;;41800:9;41794:4;41790:20;41786:1;41775:9;41771:17;41764:47;41828:131;41954:4;41828:131;:::i;:::-;41820:139;;41547:419;;;:::o;41972:237::-;42112:34;42108:1;42100:6;42096:14;42089:58;42181:20;42176:2;42168:6;42164:15;42157:45;41972:237;:::o;42215:366::-;42357:3;42378:67;42442:2;42437:3;42378:67;:::i;:::-;42371:74;;42454:93;42543:3;42454:93;:::i;:::-;42572:2;42567:3;42563:12;42556:19;;42215:366;;;:::o;42587:419::-;42753:4;42791:2;42780:9;42776:18;42768:26;;42840:9;42834:4;42830:20;42826:1;42815:9;42811:17;42804:47;42868:131;42994:4;42868:131;:::i;:::-;42860:139;;42587:419;;;:::o;43012:170::-;43152:22;43148:1;43140:6;43136:14;43129:46;43012:170;:::o;43188:366::-;43330:3;43351:67;43415:2;43410:3;43351:67;:::i;:::-;43344:74;;43427:93;43516:3;43427:93;:::i;:::-;43545:2;43540:3;43536:12;43529:19;;43188:366;;;:::o;43560:419::-;43726:4;43764:2;43753:9;43749:18;43741:26;;43813:9;43807:4;43803:20;43799:1;43788:9;43784:17;43777:47;43841:131;43967:4;43841:131;:::i;:::-;43833:139;;43560:419;;;:::o;43985:180::-;44033:77;44030:1;44023:88;44130:4;44127:1;44120:15;44154:4;44151:1;44144:15;44171:185;44211:1;44228:20;44246:1;44228:20;:::i;:::-;44223:25;;44262:20;44280:1;44262:20;:::i;:::-;44257:25;;44301:1;44291:35;;44306:18;;:::i;:::-;44291:35;44348:1;44345;44341:9;44336:14;;44171:185;;;;:::o;44362:176::-;44394:1;44411:20;44429:1;44411:20;:::i;:::-;44406:25;;44445:20;44463:1;44445:20;:::i;:::-;44440:25;;44484:1;44474:35;;44489:18;;:::i;:::-;44474:35;44530:1;44527;44523:9;44518:14;;44362:176;;;;:::o;44544:180::-;44592:77;44589:1;44582:88;44689:4;44686:1;44679:15;44713:4;44710:1;44703:15;44730:98;44781:6;44815:5;44809:12;44799:22;;44730:98;;;:::o;44834:168::-;44917:11;44951:6;44946:3;44939:19;44991:4;44986:3;44982:14;44967:29;;44834:168;;;;:::o;45008:360::-;45094:3;45122:38;45154:5;45122:38;:::i;:::-;45176:70;45239:6;45234:3;45176:70;:::i;:::-;45169:77;;45255:52;45300:6;45295:3;45288:4;45281:5;45277:16;45255:52;:::i;:::-;45332:29;45354:6;45332:29;:::i;:::-;45327:3;45323:39;45316:46;;45098:270;45008:360;;;;:::o;45374:640::-;45569:4;45607:3;45596:9;45592:19;45584:27;;45621:71;45689:1;45678:9;45674:17;45665:6;45621:71;:::i;:::-;45702:72;45770:2;45759:9;45755:18;45746:6;45702:72;:::i;:::-;45784;45852:2;45841:9;45837:18;45828:6;45784:72;:::i;:::-;45903:9;45897:4;45893:20;45888:2;45877:9;45873:18;45866:48;45931:76;46002:4;45993:6;45931:76;:::i;:::-;45923:84;;45374:640;;;;;;;:::o;46020:141::-;46076:5;46107:6;46101:13;46092:22;;46123:32;46149:5;46123:32;:::i;:::-;46020:141;;;;:::o;46167:349::-;46236:6;46285:2;46273:9;46264:7;46260:23;46256:32;46253:119;;;46291:79;;:::i;:::-;46253:119;46411:1;46436:63;46491:7;46482:6;46471:9;46467:22;46436:63;:::i;:::-;46426:73;;46382:127;46167:349;;;;:::o;46522:182::-;46662:34;46658:1;46650:6;46646:14;46639:58;46522:182;:::o;46710:366::-;46852:3;46873:67;46937:2;46932:3;46873:67;:::i;:::-;46866:74;;46949:93;47038:3;46949:93;:::i;:::-;47067:2;47062:3;47058:12;47051:19;;46710:366;;;:::o;47082:419::-;47248:4;47286:2;47275:9;47271:18;47263:26;;47335:9;47329:4;47325:20;47321:1;47310:9;47306:17;47299:47;47363:131;47489:4;47363:131;:::i;:::-;47355:139;;47082:419;;;:::o;47507:178::-;47647:30;47643:1;47635:6;47631:14;47624:54;47507:178;:::o;47691:366::-;47833:3;47854:67;47918:2;47913:3;47854:67;:::i;:::-;47847:74;;47930:93;48019:3;47930:93;:::i;:::-;48048:2;48043:3;48039:12;48032:19;;47691:366;;;:::o;48063:419::-;48229:4;48267:2;48256:9;48252:18;48244:26;;48316:9;48310:4;48306:20;48302:1;48291:9;48287:17;48280:47;48344:131;48470:4;48344:131;:::i;:::-;48336:139;;48063:419;;;:::o

Swarm Source

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