ETH Price: $3,139.64 (+1.13%)

Token

Gutter Comics (GCOM)
 

Overview

Max Total Supply

5,302 GCOM

Holders

1,830

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
devlir.eth
Balance
4 GCOM
0x4374c5cBD40f47d1Ba3D67A70a8a3fdb04EE80aa
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Gutter Comic #1, “Tales From The Gutter” is a tokenized comic cover NFT, illustrated by Tom Velez, for the Gutter Cat Gang’s first comic. The Tales From The Gutter cover NFT consists of 9 different rarities and future utility includes downloadable digital files, burn-to-redeem physical copies, an...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
GutterComics

Compiler Version
v0.8.11+commit.d7f03943

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 15 : GutterComics.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.11;

import "@openzeppelin/contracts/utils/Address.sol";
import "@openzeppelin/contracts/token/ERC20/IERC20.sol";
import "@openzeppelin/contracts/token/ERC721/IERC721.sol";
import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC1155/IERC1155.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";
import "@openzeppelin/contracts/utils/cryptography/ECDSA.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract GutterComics is ERC721, Ownable, ReentrancyGuard {
    using Address for address;
    using Strings for uint256;
    using ECDSA for bytes32;

    //gasless approvals on opensea
    address proxyRegistryAddress = 0xa5409ec958C83C3f309868babACA7c86DCB077c1;

    string public _baseURIextended =
        "https://comicsapi.guttercatgang.com/metadata/comics/";
    string public _contractURI =
        "ipfs://Qmf6iFDeNGFcEAdympLTpNZhGyTjtQtTeJ9bbde3f9tKyZ";

    uint256 public maxNormalSupplyID = 12000;
    uint256 public saleStopID = 9000;
    uint256 public pricePerComic = 0.04 ether;

    bool public locked; //metadata lock
    uint256 public _currentIndex;
    uint256 private _tokensBurned;

    bool public presaleLive;
    bool public saleLive;
    bool public freeMintLive;
    bool public burnLive;

    address public gutterCatNFTAddress =
        0xEdB61f74B0d09B2558F1eeb79B247c1F363Ae452;
    address public gutterRatNFTAddress =
        0xD7B397eDad16ca8111CA4A3B832d0a5E3ae2438C;
    address public gutterPigeonNFTAddress =
        0x950b9476a4de757BB134483029AC4Ec17E739e3A;
    address public gutterDogNFTAddress =
        0x6E9DA81ce622fB65ABf6a8d8040e460fF2543Add;

    // upgrade-related settings
    address private signerAddress;
    bool public upgradeLive;

    mapping(uint256 => bool) public usedCatIDs; //used cat IDs for free claiming
    mapping(address => uint256) public purchases;

    event TokenUpgraded(uint256 id, uint256 coverType);

    constructor() ERC721("Gutter Comics", "GCOM") {}

    function presale(uint256 qty, uint256 gutterCatorRatID)
        external
        payable
        nonReentrant
    {
        require(tx.origin == msg.sender, "no...");
        require(presaleLive, "presale not live");
        require(qty <= 5, "max 5 per tx");
        require(purchases[msg.sender] + qty <= 10, "limit exceded");

        require(_currentIndex + qty <= saleStopID, "out of stock");
        require(pricePerComic * qty == msg.value, "exact amount needed");

        require(
            (IERC1155(gutterCatNFTAddress).balanceOf(
                msg.sender,
                gutterCatorRatID
            ) > 0) ||
                (IERC1155(gutterRatNFTAddress).balanceOf(
                    msg.sender,
                    gutterCatorRatID
                ) > 0) ||
                (IERC721(gutterPigeonNFTAddress).balanceOf(msg.sender) > 0) ||
                (IERC721(gutterDogNFTAddress).balanceOf(msg.sender) > 0),
            "you have to own a gutter species"
        );

        purchases[msg.sender] += qty;

        mintMultiple(msg.sender, qty);
    }

    function publicSale(uint256 qty) external payable nonReentrant {
        require(tx.origin == msg.sender, "no...");
        require(saleLive, "sale not live");
        require(qty <= 5, "max 5 per tx");
        require(purchases[msg.sender] + qty <= 10, "limit exceded");

        require(_currentIndex + qty <= saleStopID, "out of stock");
        require(pricePerComic * qty == msg.value, "exact amount needed");

        purchases[msg.sender] += qty;

        mintMultiple(msg.sender, qty);
    }

    // free for gutter cats
    function freeSale(uint256 catID) external nonReentrant {
        require(tx.origin == msg.sender, "no...");
        require(freeMintLive, "free mint not live");

        require(_currentIndex + 1 <= maxNormalSupplyID, "out of stock");
        require(!usedCatIDs[catID], "you can only mint once with this id");

        require(
            IERC1155(gutterCatNFTAddress).balanceOf(msg.sender, catID) > 0,
            "you have to own a cat with this id"
        );

        usedCatIDs[catID] = true;

        mintToken(msg.sender);
    }

    function upgradeComic(
        bytes32 hash,
        bytes memory sig,
        uint256 firstId,
        uint256 secondId,
        uint256 coverType
    ) external nonReentrant {
        require(
            _currentIndex >= maxNormalSupplyID,
            "wrong max supply settings"
        );
        require(upgradeLive, "upgrade not live");
        require(matchAddresSigner(hash, sig), "no direct mint");
        require(
            hashTransaction(firstId, secondId, coverType) == hash,
            "hash check failed"
        );
        require(_exists(firstId) && _exists(secondId), "tokens don't exist");
        require(
            ownerOf(firstId) == msg.sender && ownerOf(secondId) == msg.sender,
            "not the owner"
        );
        require(firstId != secondId, "same ids");

        burnToken(firstId);
        burnToken(secondId);

        mintToken(msg.sender);

        emit TokenUpgraded(_currentIndex, coverType);
    }

    //admin mint
    function adminMint(address to, uint256 qty) external onlyOwner {
        require(_currentIndex + qty <= maxNormalSupplyID, "out of stock");
        mintMultiple(to, qty);
    }

    function mintMultiple(address receiver, uint256 qty) private {
        for (uint256 i = 0; i < qty; i++) {
            mintToken(receiver);
        }
    }

    function mintToken(address receiver) private {
        _currentIndex += 1;
        _safeMint(receiver, _currentIndex);
    }

    function burnToken(uint256 tokenId) private {
        _tokensBurned += 1;
        _burn(tokenId);
    }

    //burn
    function burn(uint256 tokenId) public virtual {
        require(burnLive, "burn not live");
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "caller is not owner nor approved"
        );
        burnToken(tokenId);
    }

    function setBaseURI(string memory newuri) public onlyOwner {
        require(!locked, "locked functions");
        _baseURIextended = newuri;
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        require(
            _exists(_tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );
        return string(abi.encodePacked(_baseURIextended, _tokenId.toString()));
    }

    function setContractURI(string memory newuri) public onlyOwner {
        require(!locked, "locked functions");
        _contractURI = newuri;
    }

    function contractURI() public view returns (string memory) {
        return _contractURI;
    }

    //sets the gang addresses
    function setGutterAddresses(
        address cats,
        address rats,
        address pigeons,
        address dogs
    ) external onlyOwner {
        gutterCatNFTAddress = cats; //0xEdB61f74B0d09B2558F1eeb79B247c1F363Ae452
        gutterRatNFTAddress = rats; //0xD7B397eDad16ca8111CA4A3B832d0a5E3ae2438C
        gutterPigeonNFTAddress = pigeons; //0x950b9476a4de757BB134483029AC4Ec17E739e3A
        gutterDogNFTAddress = dogs; //0x6e9da81ce622fb65abf6a8d8040e460ff2543add
    }

    //sets presale live
    function setPresaleLive(bool live) external onlyOwner {
        presaleLive = live;
    }

    //sets sale live
    function setSaleLive(bool live) external onlyOwner {
        saleLive = live;
    }

    //sets free mint live
    function setFreeMintLive(bool live) external onlyOwner {
        freeMintLive = live;
    }

    //sets burn live
    function setBurnLive(bool live) external onlyOwner {
        burnLive = live;
    }

    //sets upgrade live
    function setUpgradeLive(bool live) external onlyOwner {
        upgradeLive = live;
    }

    //sets upgrade live
    function setSaleStopID(uint256 newSaleStopID) external onlyOwner {
        require(newSaleStopID <= maxNormalSupplyID, "invalid id");
        saleStopID = newSaleStopID;
    }

    function withdraw() public onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function reclaimERC20(IERC20 erc20Token) public onlyOwner {
        erc20Token.transfer(msg.sender, erc20Token.balanceOf(address(this)));
    }

    function reclaimERC721(IERC721 erc721Token, uint256 id) public onlyOwner {
        erc721Token.safeTransferFrom(address(this), msg.sender, id);
    }

    function reclaimERC1155(
        IERC1155 erc1155Token,
        uint256 id,
        uint256 qty
    ) public onlyOwner {
        erc1155Token.safeTransferFrom(address(this), msg.sender, id, qty, "");
    }

    /**
     * Override isApprovedForAll to whitelist user's OpenSea proxy accounts to enable gas-less listings.
     */
    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        // Whitelist OpenSea proxy contract for easy trading.
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }
        return super.isApprovedForAll(owner, operator);
    }

    //sets the opensea proxy
    function setProxyRegistry(address _newRegistry) external onlyOwner {
        proxyRegistryAddress = _newRegistry;
    }

    // and for the eternity!
    function lockMetadata() external onlyOwner {
        locked = true;
    }

    //sets signer address
    function setSignerAddress(address newSigner) external onlyOwner {
        signerAddress = newSigner;
    }

    // decreases max supply
    function decreaseMaxNormalSupplyID(uint256 newSupplyID) external onlyOwner {
        require(
            maxNormalSupplyID > newSupplyID && newSupplyID >= _currentIndex,
            "invalid new supply"
        );
        maxNormalSupplyID = newSupplyID;
    }

    function totalSupply() public view returns (uint256) {
        return _currentIndex - _tokensBurned;
    }

    // utils
    function hashTransaction(
        uint256 firstId,
        uint256 secondId,
        uint256 coverType
    ) private pure returns (bytes32) {
        bytes32 hash = keccak256(
            abi.encodePacked(
                "\x19Ethereum Signed Message:\n32",
                keccak256(abi.encodePacked(firstId, secondId, coverType))
            )
        );
        return hash;
    }

    function matchAddresSigner(bytes32 hash, bytes memory signature)
        private
        view
        returns (bool)
    {
        return signerAddress == hash.recover(signature);
    }

    function exists(uint256 id) external view returns (bool) {
        return _exists(id);
    }
}

//opensea removal of approvals
contract OwnableDelegateProxy {

}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

File 2 of 15 : 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 3 of 15 : IERC20.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC20/IERC20.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

import "../../utils/introspection/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 5 of 15 : 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 6 of 15 : 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 "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/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 7 of 15 : 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 8 of 15 : 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 9 of 15 : 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 10 of 15 : 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);
    }
}

File 11 of 15 : 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 12 of 15 : IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "../../utils/introspection/IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 13 of 15 : Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;

import "../utils/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 14 of 15 : ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "../Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s;
        uint8 v;
        assembly {
            s := and(vs, 0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff)
            v := add(shr(255, vs), 27)
        }
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 15 of 15 : ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

Settings
{
  "metadata": {
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"coverType","type":"uint256"}],"name":"TokenUpgraded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_baseURIextended","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_currentIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"adminMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSupplyID","type":"uint256"}],"name":"decreaseMaxNormalSupplyID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"freeMintLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"catID","type":"uint256"}],"name":"freeSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gutterCatNFTAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gutterDogNFTAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gutterPigeonNFTAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"gutterRatNFTAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"locked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNormalSupplyID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"qty","type":"uint256"},{"internalType":"uint256","name":"gutterCatorRatID","type":"uint256"}],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pricePerComic","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"publicSale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"purchases","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"contract IERC1155","name":"erc1155Token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"qty","type":"uint256"}],"name":"reclaimERC1155","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC20","name":"erc20Token","type":"address"}],"name":"reclaimERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"contract IERC721","name":"erc721Token","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"reclaimERC721","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStopID","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"newuri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"live","type":"bool"}],"name":"setBurnLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newuri","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"live","type":"bool"}],"name":"setFreeMintLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"cats","type":"address"},{"internalType":"address","name":"rats","type":"address"},{"internalType":"address","name":"pigeons","type":"address"},{"internalType":"address","name":"dogs","type":"address"}],"name":"setGutterAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"live","type":"bool"}],"name":"setPresaleLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newRegistry","type":"address"}],"name":"setProxyRegistry","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"live","type":"bool"}],"name":"setSaleLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newSaleStopID","type":"uint256"}],"name":"setSaleStopID","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newSigner","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"live","type":"bool"}],"name":"setUpgradeLive","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":"_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":"bytes32","name":"hash","type":"bytes32"},{"internalType":"bytes","name":"sig","type":"bytes"},{"internalType":"uint256","name":"firstId","type":"uint256"},{"internalType":"uint256","name":"secondId","type":"uint256"},{"internalType":"uint256","name":"coverType","type":"uint256"}],"name":"upgradeComic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"upgradeLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"usedCatIDs","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600880546001600160a01b03191673a5409ec958c83c3f309868babaca7c86dcb077c117905560e0604052603460808181529062003e4c60a03980516200004f9160099160209091019062000220565b5060405180606001604052806035815260200162003e176035913980516200008091600a9160209091019062000220565b50612ee0600b55612328600c55668e1bc9bf040000600d556011805477edb61f74b0d09b2558f1eeb79b247c1f363ae45200000000600160201b600160c01b0319909116179055601280546001600160a01b031990811673d7b397edad16ca8111ca4a3b832d0a5e3ae2438c1790915560138054821673950b9476a4de757bb134483029ac4ec17e739e3a17905560148054909116736e9da81ce622fb65abf6a8d8040e460ff2543add1790553480156200013a57600080fd5b50604080518082018252600d81526c47757474657220436f6d69637360981b60208083019182528351808501909452600484526347434f4d60e01b9084015281519192916200018c9160009162000220565b508051620001a290600190602084019062000220565b505050620001bf620001b9620001ca60201b60201c565b620001ce565b600160075562000303565b3390565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b8280546200022e90620002c6565b90600052602060002090601f0160209004810192826200025257600085556200029d565b82601f106200026d57805160ff19168380011785556200029d565b828001600101855582156200029d579182015b828111156200029d57825182559160200191906001019062000280565b50620002ab929150620002af565b5090565b5b80821115620002ab5760008155600101620002b0565b600181811c90821680620002db57607f821691505b60208210811415620002fd57634e487b7160e01b600052602260045260246000fd5b50919050565b613b0480620003136000396000f3fe6080604052600436106103975760003560e01c806370a08231116101dc578063b287c8ed11610102578063df356a62116100a0578063e8a3d4851161006f578063e8a3d48514610a54578063e985e9c514610a69578063f2fde38b14610a89578063f557ed2414610aa957600080fd5b8063df356a62146109e2578063e081b78114610a02578063e58306f914610a21578063e5af14fa14610a4157600080fd5b8063c87b56dd116100dc578063c87b56dd14610971578063cbd4282c14610991578063cf309012146109a7578063d1b85c53146109c157600080fd5b8063b287c8ed14610929578063b88d4fde1461093c578063c0e727401461095c57600080fd5b8063938e3d7b1161017a578063989bdbb611610149578063989bdbb6146108b4578063a22cb465146108c9578063a39ee95c146108e9578063adfdeef91461090957600080fd5b8063938e3d7b146108495780639451c99a1461086957806395d89b411461087f57806397c31b741461089457600080fd5b8063842a77d3116101b6578063842a77d3146107be5780638905fd4f146107eb5780638da5cb5b1461080b5780638f0c62cc1461082957600080fd5b806370a082311461076f578063715018a61461078f57806383a9e049146107a457600080fd5b806323b872dd116102c157806351a3af491161025f5780636027c1851161022e5780636027c185146106e75780636352211e1461070f5780636b7d24701461072f5780636d42fee51461074f57600080fd5b806351a3af491461066757806355d2f4911461068757806355f804b3146106a75780635842894a146106c757600080fd5b80633ccfd60b1161029b5780633ccfd60b146105f257806342842e0e1461060757806342966c68146106275780634f558e791461064757600080fd5b806323b872dd146105925780633708a2e5146105b25780633c4c7bb4146105d257600080fd5b8063095ea7b3116103395780631a4a85b2116103085780631a4a85b21461051b5780631c61b7a91461053c5780631c67ccb61461055c5780631c8e7d2a1461057257600080fd5b8063095ea7b3146104a657806313cd8785146104c6578063180e2074146104e657806318160ddd1461050657600080fd5b806306fdde031161037557806306fdde0314610417578063074a304b14610439578063081812fc146104595780630928fc221461049157600080fd5b806301ffc9a71461039c578063046dc166146103d1578063062d26e5146103f3575b600080fd5b3480156103a857600080fd5b506103bc6103b7366004613297565b610ad9565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b506103f16103ec3660046132d0565b610b2b565b005b3480156103ff57600080fd5b50610409600b5481565b6040519081526020016103c8565b34801561042357600080fd5b5061042c610b80565b6040516103c89190613345565b34801561044557600080fd5b506103f1610454366004613358565b610c12565b34801561046557600080fd5b50610479610474366004613358565b610e3c565b6040516001600160a01b0390911681526020016103c8565b34801561049d57600080fd5b5061042c610ec4565b3480156104b257600080fd5b506103f16104c1366004613371565b610f52565b3480156104d257600080fd5b50601454610479906001600160a01b031681565b3480156104f257600080fd5b506103f1610501366004613449565b611068565b34801561051257600080fd5b50610409611393565b34801561052757600080fd5b506015546103bc90600160a01b900460ff1681565b34801561054857600080fd5b506103f1610557366004613358565b6113aa565b34801561056857600080fd5b50610409600d5481565b34801561057e57600080fd5b506103f161058d3660046134ab565b611418565b34801561059e57600080fd5b506103f16105ad3660046134e0565b6114c2565b3480156105be57600080fd5b506103f16105cd36600461352f565b6114f4565b3480156105de57600080fd5b506103f16105ed36600461352f565b61153c565b3480156105fe57600080fd5b506103f1611580565b34801561061357600080fd5b506103f16106223660046134e0565b6115dd565b34801561063357600080fd5b506103f1610642366004613358565b6115f8565b34801561065357600080fd5b506103bc610662366004613358565b6116a2565b34801561067357600080fd5b506103f161068236600461352f565b6116ad565b34801561069357600080fd5b50601254610479906001600160a01b031681565b3480156106b357600080fd5b506103f16106c236600461354c565b6116f3565b3480156106d357600080fd5b506011546103bc9062010000900460ff1681565b3480156106f357600080fd5b506011546104799064010000000090046001600160a01b031681565b34801561071b57600080fd5b5061047961072a366004613358565b611776565b34801561073b57600080fd5b506103f161074a366004613371565b6117ed565b34801561075b57600080fd5b50601354610479906001600160a01b031681565b34801561077b57600080fd5b5061040961078a3660046132d0565b611881565b34801561079b57600080fd5b506103f1611908565b3480156107b057600080fd5b506011546103bc9060ff1681565b3480156107ca57600080fd5b506104096107d93660046132d0565b60176020526000908152604090205481565b3480156107f757600080fd5b506103f16108063660046132d0565b61193e565b34801561081757600080fd5b506006546001600160a01b0316610479565b34801561083557600080fd5b506103f161084436600461352f565b611a49565b34801561085557600080fd5b506103f161086436600461354c565b611a86565b34801561087557600080fd5b50610409600f5481565b34801561088b57600080fd5b5061042c611b09565b3480156108a057600080fd5b506103f16108af366004613358565b611b18565b3480156108c057600080fd5b506103f1611b9b565b3480156108d557600080fd5b506103f16108e4366004613595565b611bd4565b3480156108f557600080fd5b506103f161090436600461352f565b611bdf565b34801561091557600080fd5b506103f16109243660046132d0565b611c27565b6103f1610937366004613358565b611c73565b34801561094857600080fd5b506103f16109573660046135ce565b611e4d565b34801561096857600080fd5b5061042c611e85565b34801561097d57600080fd5b5061042c61098c366004613358565b611e92565b34801561099d57600080fd5b50610409600c5481565b3480156109b357600080fd5b50600e546103bc9060ff1681565b3480156109cd57600080fd5b506011546103bc906301000000900460ff1681565b3480156109ee57600080fd5b506103f16109fd36600461363a565b611f33565b348015610a0e57600080fd5b506011546103bc90610100900460ff1681565b348015610a2d57600080fd5b506103f1610a3c366004613371565b611fbc565b6103f1610a4f366004613696565b61201f565b348015610a6057600080fd5b5061042c61242b565b348015610a7557600080fd5b506103bc610a843660046136b8565b61243a565b348015610a9557600080fd5b506103f1610aa43660046132d0565b6124fb565b348015610ab557600080fd5b506103bc610ac4366004613358565b60166020526000908152604090205460ff1681565b60006001600160e01b031982166380ac58cd60e01b1480610b0a57506001600160e01b03198216635b5e139f60e01b145b80610b2557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b03163314610b5e5760405162461bcd60e51b8152600401610b55906136e6565b60405180910390fd5b601580546001600160a01b0319166001600160a01b0392909216919091179055565b606060008054610b8f9061371b565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbb9061371b565b8015610c085780601f10610bdd57610100808354040283529160200191610c08565b820191906000526020600020905b815481529060010190602001808311610beb57829003601f168201915b5050505050905090565b60026007541415610c355760405162461bcd60e51b8152600401610b5590613756565b6002600755323314610c595760405162461bcd60e51b8152600401610b559061378d565b60115462010000900460ff16610ca65760405162461bcd60e51b815260206004820152601260248201527166726565206d696e74206e6f74206c69766560701b6044820152606401610b55565b600b54600f54610cb79060016137c2565b1115610cd55760405162461bcd60e51b8152600401610b55906137da565b60008181526016602052604090205460ff1615610d405760405162461bcd60e51b815260206004820152602360248201527f796f752063616e206f6e6c79206d696e74206f6e636520776974682074686973604482015262081a5960ea1b6064820152608401610b55565b601154604051627eeac760e11b81523360048201526024810183905260009164010000000090046001600160a01b03169062fdd58e90604401602060405180830381865afa158015610d96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dba9190613800565b11610e125760405162461bcd60e51b815260206004820152602260248201527f796f75206861766520746f206f776e20612063617420776974682074686973206044820152611a5960f21b6064820152608401610b55565b6000818152601660205260409020805460ff19166001179055610e3433612593565b506001600755565b6000610e47826125b9565b610ea85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b55565b506000908152600460205260409020546001600160a01b031690565b60098054610ed19061371b565b80601f0160208091040260200160405190810160405280929190818152602001828054610efd9061371b565b8015610f4a5780601f10610f1f57610100808354040283529160200191610f4a565b820191906000526020600020905b815481529060010190602001808311610f2d57829003601f168201915b505050505081565b6000610f5d82611776565b9050806001600160a01b0316836001600160a01b03161415610fcb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b55565b336001600160a01b0382161480610fe75750610fe7813361243a565b6110595760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b55565b61106383836125d6565b505050565b6002600754141561108b5760405162461bcd60e51b8152600401610b5590613756565b6002600755600b54600f5410156110e45760405162461bcd60e51b815260206004820152601960248201527f77726f6e67206d617820737570706c792073657474696e6773000000000000006044820152606401610b55565b601554600160a01b900460ff166111305760405162461bcd60e51b815260206004820152601060248201526f75706772616465206e6f74206c69766560801b6044820152606401610b55565b61113a8585612644565b6111775760405162461bcd60e51b815260206004820152600e60248201526d1b9bc8191a5c9958dd081b5a5b9d60921b6044820152606401610b55565b6040805160208082018690528183018590526060808301859052835180840390910181526080830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060a084015260bc808401919091528351808403909101815260dc9092019092528051910120851461122f5760405162461bcd60e51b81526020600482015260116024820152701a185cda0818da1958dac819985a5b1959607a1b6044820152606401610b55565b611238836125b9565b80156112485750611248826125b9565b6112895760405162461bcd60e51b81526020600482015260126024820152711d1bdad95b9cc8191bdb89dd08195e1a5cdd60721b6044820152606401610b55565b3361129384611776565b6001600160a01b03161480156112b95750336112ae83611776565b6001600160a01b0316145b6112f55760405162461bcd60e51b815260206004820152600d60248201526c3737ba103a34329037bbb732b960991b6044820152606401610b55565b818314156113305760405162461bcd60e51b815260206004820152600860248201526773616d652069647360c01b6044820152606401610b55565b61133983612668565b61134282612668565b61134b33612593565b600f5460408051918252602082018390527f5a9f40c616794dfd2d8eeef37ef23dbe81c3d88b3955dfdc538b49da61f280d9910160405180910390a150506001600755505050565b6000601054600f546113a59190613819565b905090565b6006546001600160a01b031633146113d45760405162461bcd60e51b8152600401610b55906136e6565b600b548111156114135760405162461bcd60e51b815260206004820152600a6024820152691a5b9d985b1a59081a5960b21b6044820152606401610b55565b600c55565b6006546001600160a01b031633146114425760405162461bcd60e51b8152600401610b55906136e6565b604051637921219560e11b8152306004820152336024820152604481018390526064810182905260a06084820152600060a48201526001600160a01b0384169063f242432a9060c401600060405180830381600087803b1580156114a557600080fd5b505af11580156114b9573d6000803e3d6000fd5b50505050505050565b6114cd335b8261268a565b6114e95760405162461bcd60e51b8152600401610b5590613830565b61106383838361274c565b6006546001600160a01b0316331461151e5760405162461bcd60e51b8152600401610b55906136e6565b6011805491151563010000000263ff00000019909216919091179055565b6006546001600160a01b031633146115665760405162461bcd60e51b8152600401610b55906136e6565b601180549115156101000261ff0019909216919091179055565b6006546001600160a01b031633146115aa5760405162461bcd60e51b8152600401610b55906136e6565b6040514790339082156108fc029083906000818181858888f193505050501580156115d9573d6000803e3d6000fd5b5050565b61106383838360405180602001604052806000815250611e4d565b6011546301000000900460ff166116415760405162461bcd60e51b815260206004820152600d60248201526c6275726e206e6f74206c69766560981b6044820152606401610b55565b61164a336114c7565b6116965760405162461bcd60e51b815260206004820181905260248201527f63616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610b55565b61169f81612668565b50565b6000610b25826125b9565b6006546001600160a01b031633146116d75760405162461bcd60e51b8152600401610b55906136e6565b60118054911515620100000262ff000019909216919091179055565b6006546001600160a01b0316331461171d5760405162461bcd60e51b8152600401610b55906136e6565b600e5460ff16156117635760405162461bcd60e51b815260206004820152601060248201526f6c6f636b65642066756e6374696f6e7360801b6044820152606401610b55565b80516115d99060099060208401906131e8565b6000818152600260205260408120546001600160a01b031680610b255760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b55565b6006546001600160a01b031633146118175760405162461bcd60e51b8152600401610b55906136e6565b604051632142170760e11b8152306004820152336024820152604481018290526001600160a01b038316906342842e0e90606401600060405180830381600087803b15801561186557600080fd5b505af1158015611879573d6000803e3d6000fd5b505050505050565b60006001600160a01b0382166118ec5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b55565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146119325760405162461bcd60e51b8152600401610b55906136e6565b61193c60006128ec565b565b6006546001600160a01b031633146119685760405162461bcd60e51b8152600401610b55906136e6565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156119b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119da9190613800565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d99190613881565b6006546001600160a01b03163314611a735760405162461bcd60e51b8152600401610b55906136e6565b6011805460ff1916911515919091179055565b6006546001600160a01b03163314611ab05760405162461bcd60e51b8152600401610b55906136e6565b600e5460ff1615611af65760405162461bcd60e51b815260206004820152601060248201526f6c6f636b65642066756e6374696f6e7360801b6044820152606401610b55565b80516115d990600a9060208401906131e8565b606060018054610b8f9061371b565b6006546001600160a01b03163314611b425760405162461bcd60e51b8152600401610b55906136e6565b80600b54118015611b555750600f548110155b611b965760405162461bcd60e51b8152602060048201526012602482015271696e76616c6964206e657720737570706c7960701b6044820152606401610b55565b600b55565b6006546001600160a01b03163314611bc55760405162461bcd60e51b8152600401610b55906136e6565b600e805460ff19166001179055565b6115d933838361293e565b6006546001600160a01b03163314611c095760405162461bcd60e51b8152600401610b55906136e6565b60158054911515600160a01b0260ff60a01b19909216919091179055565b6006546001600160a01b03163314611c515760405162461bcd60e51b8152600401610b55906136e6565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60026007541415611c965760405162461bcd60e51b8152600401610b5590613756565b6002600755323314611cba5760405162461bcd60e51b8152600401610b559061378d565b601154610100900460ff16611d015760405162461bcd60e51b815260206004820152600d60248201526c73616c65206e6f74206c69766560981b6044820152606401610b55565b6005811115611d415760405162461bcd60e51b815260206004820152600c60248201526b0dac2f0406a40e0cae440e8f60a31b6044820152606401610b55565b33600090815260176020526040902054600a90611d5f9083906137c2565b1115611d9d5760405162461bcd60e51b815260206004820152600d60248201526c1b1a5b5a5d08195e18d9591959609a1b6044820152606401610b55565b600c5481600f54611dae91906137c2565b1115611dcc5760405162461bcd60e51b8152600401610b55906137da565b3481600d54611ddb919061389e565b14611e1e5760405162461bcd60e51b8152602060048201526013602482015272195e1858dd08185b5bdd5b9d081b9959591959606a1b6044820152606401610b55565b3360009081526017602052604081208054839290611e3d9084906137c2565b90915550610e3490503382612a0d565b611e57338361268a565b611e735760405162461bcd60e51b8152600401610b5590613830565b611e7f84848484612a33565b50505050565b600a8054610ed19061371b565b6060611e9d826125b9565b611f015760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b55565b6009611f0c83612a66565b604051602001611f1d9291906138d9565b6040516020818303038152906040529050919050565b6006546001600160a01b03163314611f5d5760405162461bcd60e51b8152600401610b55906136e6565b601180546001600160a01b0395861664010000000002640100000000600160c01b0319909116179055601280549385166001600160a01b0319948516179055601380549285169284169290921790915560148054919093169116179055565b6006546001600160a01b03163314611fe65760405162461bcd60e51b8152600401610b55906136e6565b600b5481600f54611ff791906137c2565b11156120155760405162461bcd60e51b8152600401610b55906137da565b6115d98282612a0d565b600260075414156120425760405162461bcd60e51b8152600401610b5590613756565b60026007553233146120665760405162461bcd60e51b8152600401610b559061378d565b60115460ff166120ab5760405162461bcd60e51b815260206004820152601060248201526f70726573616c65206e6f74206c69766560801b6044820152606401610b55565b60058211156120eb5760405162461bcd60e51b815260206004820152600c60248201526b0dac2f0406a40e0cae440e8f60a31b6044820152606401610b55565b33600090815260176020526040902054600a906121099084906137c2565b11156121475760405162461bcd60e51b815260206004820152600d60248201526c1b1a5b5a5d08195e18d9591959609a1b6044820152606401610b55565b600c5482600f5461215891906137c2565b11156121765760405162461bcd60e51b8152600401610b55906137da565b3482600d54612185919061389e565b146121c85760405162461bcd60e51b8152602060048201526013602482015272195e1858dd08185b5bdd5b9d081b9959591959606a1b6044820152606401610b55565b601154604051627eeac760e11b81523360048201526024810183905260009164010000000090046001600160a01b03169062fdd58e90604401602060405180830381865afa15801561221e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122429190613800565b11806122bd5750601254604051627eeac760e11b8152336004820152602481018390526000916001600160a01b03169062fdd58e90604401602060405180830381865afa158015612297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122bb9190613800565b115b8061233257506013546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190613800565b115b806123a757506014546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a59190613800565b115b6123f35760405162461bcd60e51b815260206004820181905260248201527f796f75206861766520746f206f776e20612067757474657220737065636965736044820152606401610b55565b33600090815260176020526040812080548492906124129084906137c2565b9091555061242290503383612a0d565b50506001600755565b6060600a8054610b8f9061371b565b60085460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa15801561248c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b09190613980565b6001600160a01b031614156124c9576001915050610b25565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b6006546001600160a01b031633146125255760405162461bcd60e51b8152600401610b55906136e6565b6001600160a01b03811661258a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b55565b61169f816128ec565b6001600f60008282546125a691906137c2565b9250508190555061169f81600f54612b64565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061260b82611776565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126508383612b7e565b6015546001600160a01b039182169116149392505050565b60016010600082825461267b91906137c2565b9091555061169f905081612ba2565b6000612695826125b9565b6126f65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b55565b600061270183611776565b9050806001600160a01b0316846001600160a01b0316148061273c5750836001600160a01b031661273184610e3c565b6001600160a01b0316145b806124f357506124f3818561243a565b826001600160a01b031661275f82611776565b6001600160a01b0316146127c75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b55565b6001600160a01b0382166128295760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b55565b6128346000826125d6565b6001600160a01b038316600090815260036020526040812080546001929061285d908490613819565b90915550506001600160a01b038216600090815260036020526040812080546001929061288b9084906137c2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156129a05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b55565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60005b8181101561106357612a2183612593565b80612a2b8161399d565b915050612a10565b612a3e84848461274c565b612a4a84848484612c3d565b611e7f5760405162461bcd60e51b8152600401610b55906139b8565b606081612a8a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612ab45780612a9e8161399d565b9150612aad9050600a83613a20565b9150612a8e565b60008167ffffffffffffffff811115612acf57612acf61339d565b6040519080825280601f01601f191660200182016040528015612af9576020820181803683370190505b5090505b84156124f357612b0e600183613819565b9150612b1b600a86613a34565b612b269060306137c2565b60f81b818381518110612b3b57612b3b613a48565b60200101906001600160f81b031916908160001a905350612b5d600a86613a20565b9450612afd565b6115d9828260405180602001604052806000815250612d3b565b6000806000612b8d8585612d6e565b91509150612b9a81612dde565b509392505050565b6000612bad82611776565b9050612bba6000836125d6565b6001600160a01b0381166000908152600360205260408120805460019290612be3908490613819565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160a01b0384163b15612d3057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c81903390899088908890600401613a5e565b6020604051808303816000875af1925050508015612cbc575060408051601f3d908101601f19168201909252612cb991810190613a9b565b60015b612d16573d808015612cea576040519150601f19603f3d011682016040523d82523d6000602084013e612cef565b606091505b508051612d0e5760405162461bcd60e51b8152600401610b55906139b8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506124f3565b506001949350505050565b612d458383612f99565b612d526000848484612c3d565b6110635760405162461bcd60e51b8152600401610b55906139b8565b600080825160411415612da55760208301516040840151606085015160001a612d99878285856130cc565b94509450505050612dd7565b825160401415612dcf5760208301516040840151612dc48683836131b9565b935093505050612dd7565b506000905060025b9250929050565b6000816004811115612df257612df2613ab8565b1415612dfb5750565b6001816004811115612e0f57612e0f613ab8565b1415612e5d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b55565b6002816004811115612e7157612e71613ab8565b1415612ebf5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b55565b6003816004811115612ed357612ed3613ab8565b1415612f2c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b55565b6004816004811115612f4057612f40613ab8565b141561169f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b55565b6001600160a01b038216612fef5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b55565b612ff8816125b9565b156130455760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b55565b6001600160a01b038216600090815260036020526040812080546001929061306e9084906137c2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561310357506000905060036131b0565b8460ff16601b1415801561311b57508460ff16601c14155b1561312c57506000905060046131b0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613180573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166131a9576000600192509250506131b0565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016131da878288856130cc565b935093505050935093915050565b8280546131f49061371b565b90600052602060002090601f016020900481019282613216576000855561325c565b82601f1061322f57805160ff191683800117855561325c565b8280016001018555821561325c579182015b8281111561325c578251825591602001919060010190613241565b5061326892915061326c565b5090565b5b80821115613268576000815560010161326d565b6001600160e01b03198116811461169f57600080fd5b6000602082840312156132a957600080fd5b81356132b481613281565b9392505050565b6001600160a01b038116811461169f57600080fd5b6000602082840312156132e257600080fd5b81356132b4816132bb565b60005b838110156133085781810151838201526020016132f0565b83811115611e7f5750506000910152565b600081518084526133318160208601602086016132ed565b601f01601f19169290920160200192915050565b6020815260006132b46020830184613319565b60006020828403121561336a57600080fd5b5035919050565b6000806040838503121561338457600080fd5b823561338f816132bb565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156133ce576133ce61339d565b604051601f8501601f19908116603f011681019082821181831017156133f6576133f661339d565b8160405280935085815286868601111561340f57600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261343a57600080fd5b6132b4838335602085016133b3565b600080600080600060a0868803121561346157600080fd5b85359450602086013567ffffffffffffffff81111561347f57600080fd5b61348b88828901613429565b959895975050505060408401359360608101359360809091013592509050565b6000806000606084860312156134c057600080fd5b83356134cb816132bb565b95602085013595506040909401359392505050565b6000806000606084860312156134f557600080fd5b8335613500816132bb565b92506020840135613510816132bb565b929592945050506040919091013590565b801515811461169f57600080fd5b60006020828403121561354157600080fd5b81356132b481613521565b60006020828403121561355e57600080fd5b813567ffffffffffffffff81111561357557600080fd5b8201601f8101841361358657600080fd5b6124f3848235602084016133b3565b600080604083850312156135a857600080fd5b82356135b3816132bb565b915060208301356135c381613521565b809150509250929050565b600080600080608085870312156135e457600080fd5b84356135ef816132bb565b935060208501356135ff816132bb565b925060408501359150606085013567ffffffffffffffff81111561362257600080fd5b61362e87828801613429565b91505092959194509250565b6000806000806080858703121561365057600080fd5b843561365b816132bb565b9350602085013561366b816132bb565b9250604085013561367b816132bb565b9150606085013561368b816132bb565b939692955090935050565b600080604083850312156136a957600080fd5b50508035926020909101359150565b600080604083850312156136cb57600080fd5b82356136d6816132bb565b915060208301356135c3816132bb565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061372f57607f821691505b6020821081141561375057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b602080825260059082015264373797171760d91b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156137d5576137d56137ac565b500190565b6020808252600c908201526b6f7574206f662073746f636b60a01b604082015260600190565b60006020828403121561381257600080fd5b5051919050565b60008282101561382b5761382b6137ac565b500390565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60006020828403121561389357600080fd5b81516132b481613521565b60008160001904831182151516156138b8576138b86137ac565b500290565b600081516138cf8185602086016132ed565b9290920192915050565b600080845481600182811c9150808316806138f557607f831692505b602080841082141561391557634e487b7160e01b86526022600452602486fd5b818015613929576001811461393a57613967565b60ff19861689528489019650613967565b60008b81526020902060005b8681101561395f5781548b820152908501908301613946565b505084890196505b50505050505061397781856138bd565b95945050505050565b60006020828403121561399257600080fd5b81516132b4816132bb565b60006000198214156139b1576139b16137ac565b5060010190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082613a2f57613a2f613a0a565b500490565b600082613a4357613a43613a0a565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613a9190830184613319565b9695505050505050565b600060208284031215613aad57600080fd5b81516132b481613281565b634e487b7160e01b600052602160045260246000fdfea264697066735822122009537da6493379832f866f8a43cb9875b7a49daef35d0822429531446fd8ab3964736f6c634300080b0033697066733a2f2f516d6636694644654e474663454164796d704c54704e5a684779546a74517454654a3962626465336639744b795a68747470733a2f2f636f6d6963736170692e67757474657263617467616e672e636f6d2f6d657461646174612f636f6d6963732f

Deployed Bytecode

0x6080604052600436106103975760003560e01c806370a08231116101dc578063b287c8ed11610102578063df356a62116100a0578063e8a3d4851161006f578063e8a3d48514610a54578063e985e9c514610a69578063f2fde38b14610a89578063f557ed2414610aa957600080fd5b8063df356a62146109e2578063e081b78114610a02578063e58306f914610a21578063e5af14fa14610a4157600080fd5b8063c87b56dd116100dc578063c87b56dd14610971578063cbd4282c14610991578063cf309012146109a7578063d1b85c53146109c157600080fd5b8063b287c8ed14610929578063b88d4fde1461093c578063c0e727401461095c57600080fd5b8063938e3d7b1161017a578063989bdbb611610149578063989bdbb6146108b4578063a22cb465146108c9578063a39ee95c146108e9578063adfdeef91461090957600080fd5b8063938e3d7b146108495780639451c99a1461086957806395d89b411461087f57806397c31b741461089457600080fd5b8063842a77d3116101b6578063842a77d3146107be5780638905fd4f146107eb5780638da5cb5b1461080b5780638f0c62cc1461082957600080fd5b806370a082311461076f578063715018a61461078f57806383a9e049146107a457600080fd5b806323b872dd116102c157806351a3af491161025f5780636027c1851161022e5780636027c185146106e75780636352211e1461070f5780636b7d24701461072f5780636d42fee51461074f57600080fd5b806351a3af491461066757806355d2f4911461068757806355f804b3146106a75780635842894a146106c757600080fd5b80633ccfd60b1161029b5780633ccfd60b146105f257806342842e0e1461060757806342966c68146106275780634f558e791461064757600080fd5b806323b872dd146105925780633708a2e5146105b25780633c4c7bb4146105d257600080fd5b8063095ea7b3116103395780631a4a85b2116103085780631a4a85b21461051b5780631c61b7a91461053c5780631c67ccb61461055c5780631c8e7d2a1461057257600080fd5b8063095ea7b3146104a657806313cd8785146104c6578063180e2074146104e657806318160ddd1461050657600080fd5b806306fdde031161037557806306fdde0314610417578063074a304b14610439578063081812fc146104595780630928fc221461049157600080fd5b806301ffc9a71461039c578063046dc166146103d1578063062d26e5146103f3575b600080fd5b3480156103a857600080fd5b506103bc6103b7366004613297565b610ad9565b60405190151581526020015b60405180910390f35b3480156103dd57600080fd5b506103f16103ec3660046132d0565b610b2b565b005b3480156103ff57600080fd5b50610409600b5481565b6040519081526020016103c8565b34801561042357600080fd5b5061042c610b80565b6040516103c89190613345565b34801561044557600080fd5b506103f1610454366004613358565b610c12565b34801561046557600080fd5b50610479610474366004613358565b610e3c565b6040516001600160a01b0390911681526020016103c8565b34801561049d57600080fd5b5061042c610ec4565b3480156104b257600080fd5b506103f16104c1366004613371565b610f52565b3480156104d257600080fd5b50601454610479906001600160a01b031681565b3480156104f257600080fd5b506103f1610501366004613449565b611068565b34801561051257600080fd5b50610409611393565b34801561052757600080fd5b506015546103bc90600160a01b900460ff1681565b34801561054857600080fd5b506103f1610557366004613358565b6113aa565b34801561056857600080fd5b50610409600d5481565b34801561057e57600080fd5b506103f161058d3660046134ab565b611418565b34801561059e57600080fd5b506103f16105ad3660046134e0565b6114c2565b3480156105be57600080fd5b506103f16105cd36600461352f565b6114f4565b3480156105de57600080fd5b506103f16105ed36600461352f565b61153c565b3480156105fe57600080fd5b506103f1611580565b34801561061357600080fd5b506103f16106223660046134e0565b6115dd565b34801561063357600080fd5b506103f1610642366004613358565b6115f8565b34801561065357600080fd5b506103bc610662366004613358565b6116a2565b34801561067357600080fd5b506103f161068236600461352f565b6116ad565b34801561069357600080fd5b50601254610479906001600160a01b031681565b3480156106b357600080fd5b506103f16106c236600461354c565b6116f3565b3480156106d357600080fd5b506011546103bc9062010000900460ff1681565b3480156106f357600080fd5b506011546104799064010000000090046001600160a01b031681565b34801561071b57600080fd5b5061047961072a366004613358565b611776565b34801561073b57600080fd5b506103f161074a366004613371565b6117ed565b34801561075b57600080fd5b50601354610479906001600160a01b031681565b34801561077b57600080fd5b5061040961078a3660046132d0565b611881565b34801561079b57600080fd5b506103f1611908565b3480156107b057600080fd5b506011546103bc9060ff1681565b3480156107ca57600080fd5b506104096107d93660046132d0565b60176020526000908152604090205481565b3480156107f757600080fd5b506103f16108063660046132d0565b61193e565b34801561081757600080fd5b506006546001600160a01b0316610479565b34801561083557600080fd5b506103f161084436600461352f565b611a49565b34801561085557600080fd5b506103f161086436600461354c565b611a86565b34801561087557600080fd5b50610409600f5481565b34801561088b57600080fd5b5061042c611b09565b3480156108a057600080fd5b506103f16108af366004613358565b611b18565b3480156108c057600080fd5b506103f1611b9b565b3480156108d557600080fd5b506103f16108e4366004613595565b611bd4565b3480156108f557600080fd5b506103f161090436600461352f565b611bdf565b34801561091557600080fd5b506103f16109243660046132d0565b611c27565b6103f1610937366004613358565b611c73565b34801561094857600080fd5b506103f16109573660046135ce565b611e4d565b34801561096857600080fd5b5061042c611e85565b34801561097d57600080fd5b5061042c61098c366004613358565b611e92565b34801561099d57600080fd5b50610409600c5481565b3480156109b357600080fd5b50600e546103bc9060ff1681565b3480156109cd57600080fd5b506011546103bc906301000000900460ff1681565b3480156109ee57600080fd5b506103f16109fd36600461363a565b611f33565b348015610a0e57600080fd5b506011546103bc90610100900460ff1681565b348015610a2d57600080fd5b506103f1610a3c366004613371565b611fbc565b6103f1610a4f366004613696565b61201f565b348015610a6057600080fd5b5061042c61242b565b348015610a7557600080fd5b506103bc610a843660046136b8565b61243a565b348015610a9557600080fd5b506103f1610aa43660046132d0565b6124fb565b348015610ab557600080fd5b506103bc610ac4366004613358565b60166020526000908152604090205460ff1681565b60006001600160e01b031982166380ac58cd60e01b1480610b0a57506001600160e01b03198216635b5e139f60e01b145b80610b2557506301ffc9a760e01b6001600160e01b03198316145b92915050565b6006546001600160a01b03163314610b5e5760405162461bcd60e51b8152600401610b55906136e6565b60405180910390fd5b601580546001600160a01b0319166001600160a01b0392909216919091179055565b606060008054610b8f9061371b565b80601f0160208091040260200160405190810160405280929190818152602001828054610bbb9061371b565b8015610c085780601f10610bdd57610100808354040283529160200191610c08565b820191906000526020600020905b815481529060010190602001808311610beb57829003601f168201915b5050505050905090565b60026007541415610c355760405162461bcd60e51b8152600401610b5590613756565b6002600755323314610c595760405162461bcd60e51b8152600401610b559061378d565b60115462010000900460ff16610ca65760405162461bcd60e51b815260206004820152601260248201527166726565206d696e74206e6f74206c69766560701b6044820152606401610b55565b600b54600f54610cb79060016137c2565b1115610cd55760405162461bcd60e51b8152600401610b55906137da565b60008181526016602052604090205460ff1615610d405760405162461bcd60e51b815260206004820152602360248201527f796f752063616e206f6e6c79206d696e74206f6e636520776974682074686973604482015262081a5960ea1b6064820152608401610b55565b601154604051627eeac760e11b81523360048201526024810183905260009164010000000090046001600160a01b03169062fdd58e90604401602060405180830381865afa158015610d96573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610dba9190613800565b11610e125760405162461bcd60e51b815260206004820152602260248201527f796f75206861766520746f206f776e20612063617420776974682074686973206044820152611a5960f21b6064820152608401610b55565b6000818152601660205260409020805460ff19166001179055610e3433612593565b506001600755565b6000610e47826125b9565b610ea85760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b55565b506000908152600460205260409020546001600160a01b031690565b60098054610ed19061371b565b80601f0160208091040260200160405190810160405280929190818152602001828054610efd9061371b565b8015610f4a5780601f10610f1f57610100808354040283529160200191610f4a565b820191906000526020600020905b815481529060010190602001808311610f2d57829003601f168201915b505050505081565b6000610f5d82611776565b9050806001600160a01b0316836001600160a01b03161415610fcb5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610b55565b336001600160a01b0382161480610fe75750610fe7813361243a565b6110595760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610b55565b61106383836125d6565b505050565b6002600754141561108b5760405162461bcd60e51b8152600401610b5590613756565b6002600755600b54600f5410156110e45760405162461bcd60e51b815260206004820152601960248201527f77726f6e67206d617820737570706c792073657474696e6773000000000000006044820152606401610b55565b601554600160a01b900460ff166111305760405162461bcd60e51b815260206004820152601060248201526f75706772616465206e6f74206c69766560801b6044820152606401610b55565b61113a8585612644565b6111775760405162461bcd60e51b815260206004820152600e60248201526d1b9bc8191a5c9958dd081b5a5b9d60921b6044820152606401610b55565b6040805160208082018690528183018590526060808301859052835180840390910181526080830184528051908201207f19457468657265756d205369676e6564204d6573736167653a0a33320000000060a084015260bc808401919091528351808403909101815260dc9092019092528051910120851461122f5760405162461bcd60e51b81526020600482015260116024820152701a185cda0818da1958dac819985a5b1959607a1b6044820152606401610b55565b611238836125b9565b80156112485750611248826125b9565b6112895760405162461bcd60e51b81526020600482015260126024820152711d1bdad95b9cc8191bdb89dd08195e1a5cdd60721b6044820152606401610b55565b3361129384611776565b6001600160a01b03161480156112b95750336112ae83611776565b6001600160a01b0316145b6112f55760405162461bcd60e51b815260206004820152600d60248201526c3737ba103a34329037bbb732b960991b6044820152606401610b55565b818314156113305760405162461bcd60e51b815260206004820152600860248201526773616d652069647360c01b6044820152606401610b55565b61133983612668565b61134282612668565b61134b33612593565b600f5460408051918252602082018390527f5a9f40c616794dfd2d8eeef37ef23dbe81c3d88b3955dfdc538b49da61f280d9910160405180910390a150506001600755505050565b6000601054600f546113a59190613819565b905090565b6006546001600160a01b031633146113d45760405162461bcd60e51b8152600401610b55906136e6565b600b548111156114135760405162461bcd60e51b815260206004820152600a6024820152691a5b9d985b1a59081a5960b21b6044820152606401610b55565b600c55565b6006546001600160a01b031633146114425760405162461bcd60e51b8152600401610b55906136e6565b604051637921219560e11b8152306004820152336024820152604481018390526064810182905260a06084820152600060a48201526001600160a01b0384169063f242432a9060c401600060405180830381600087803b1580156114a557600080fd5b505af11580156114b9573d6000803e3d6000fd5b50505050505050565b6114cd335b8261268a565b6114e95760405162461bcd60e51b8152600401610b5590613830565b61106383838361274c565b6006546001600160a01b0316331461151e5760405162461bcd60e51b8152600401610b55906136e6565b6011805491151563010000000263ff00000019909216919091179055565b6006546001600160a01b031633146115665760405162461bcd60e51b8152600401610b55906136e6565b601180549115156101000261ff0019909216919091179055565b6006546001600160a01b031633146115aa5760405162461bcd60e51b8152600401610b55906136e6565b6040514790339082156108fc029083906000818181858888f193505050501580156115d9573d6000803e3d6000fd5b5050565b61106383838360405180602001604052806000815250611e4d565b6011546301000000900460ff166116415760405162461bcd60e51b815260206004820152600d60248201526c6275726e206e6f74206c69766560981b6044820152606401610b55565b61164a336114c7565b6116965760405162461bcd60e51b815260206004820181905260248201527f63616c6c6572206973206e6f74206f776e6572206e6f7220617070726f7665646044820152606401610b55565b61169f81612668565b50565b6000610b25826125b9565b6006546001600160a01b031633146116d75760405162461bcd60e51b8152600401610b55906136e6565b60118054911515620100000262ff000019909216919091179055565b6006546001600160a01b0316331461171d5760405162461bcd60e51b8152600401610b55906136e6565b600e5460ff16156117635760405162461bcd60e51b815260206004820152601060248201526f6c6f636b65642066756e6374696f6e7360801b6044820152606401610b55565b80516115d99060099060208401906131e8565b6000818152600260205260408120546001600160a01b031680610b255760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610b55565b6006546001600160a01b031633146118175760405162461bcd60e51b8152600401610b55906136e6565b604051632142170760e11b8152306004820152336024820152604481018290526001600160a01b038316906342842e0e90606401600060405180830381600087803b15801561186557600080fd5b505af1158015611879573d6000803e3d6000fd5b505050505050565b60006001600160a01b0382166118ec5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610b55565b506001600160a01b031660009081526003602052604090205490565b6006546001600160a01b031633146119325760405162461bcd60e51b8152600401610b55906136e6565b61193c60006128ec565b565b6006546001600160a01b031633146119685760405162461bcd60e51b8152600401610b55906136e6565b6040516370a0823160e01b81523060048201526001600160a01b0382169063a9059cbb90339083906370a0823190602401602060405180830381865afa1580156119b6573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119da9190613800565b6040516001600160e01b031960e085901b1681526001600160a01b03909216600483015260248201526044016020604051808303816000875af1158015611a25573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906115d99190613881565b6006546001600160a01b03163314611a735760405162461bcd60e51b8152600401610b55906136e6565b6011805460ff1916911515919091179055565b6006546001600160a01b03163314611ab05760405162461bcd60e51b8152600401610b55906136e6565b600e5460ff1615611af65760405162461bcd60e51b815260206004820152601060248201526f6c6f636b65642066756e6374696f6e7360801b6044820152606401610b55565b80516115d990600a9060208401906131e8565b606060018054610b8f9061371b565b6006546001600160a01b03163314611b425760405162461bcd60e51b8152600401610b55906136e6565b80600b54118015611b555750600f548110155b611b965760405162461bcd60e51b8152602060048201526012602482015271696e76616c6964206e657720737570706c7960701b6044820152606401610b55565b600b55565b6006546001600160a01b03163314611bc55760405162461bcd60e51b8152600401610b55906136e6565b600e805460ff19166001179055565b6115d933838361293e565b6006546001600160a01b03163314611c095760405162461bcd60e51b8152600401610b55906136e6565b60158054911515600160a01b0260ff60a01b19909216919091179055565b6006546001600160a01b03163314611c515760405162461bcd60e51b8152600401610b55906136e6565b600880546001600160a01b0319166001600160a01b0392909216919091179055565b60026007541415611c965760405162461bcd60e51b8152600401610b5590613756565b6002600755323314611cba5760405162461bcd60e51b8152600401610b559061378d565b601154610100900460ff16611d015760405162461bcd60e51b815260206004820152600d60248201526c73616c65206e6f74206c69766560981b6044820152606401610b55565b6005811115611d415760405162461bcd60e51b815260206004820152600c60248201526b0dac2f0406a40e0cae440e8f60a31b6044820152606401610b55565b33600090815260176020526040902054600a90611d5f9083906137c2565b1115611d9d5760405162461bcd60e51b815260206004820152600d60248201526c1b1a5b5a5d08195e18d9591959609a1b6044820152606401610b55565b600c5481600f54611dae91906137c2565b1115611dcc5760405162461bcd60e51b8152600401610b55906137da565b3481600d54611ddb919061389e565b14611e1e5760405162461bcd60e51b8152602060048201526013602482015272195e1858dd08185b5bdd5b9d081b9959591959606a1b6044820152606401610b55565b3360009081526017602052604081208054839290611e3d9084906137c2565b90915550610e3490503382612a0d565b611e57338361268a565b611e735760405162461bcd60e51b8152600401610b5590613830565b611e7f84848484612a33565b50505050565b600a8054610ed19061371b565b6060611e9d826125b9565b611f015760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b55565b6009611f0c83612a66565b604051602001611f1d9291906138d9565b6040516020818303038152906040529050919050565b6006546001600160a01b03163314611f5d5760405162461bcd60e51b8152600401610b55906136e6565b601180546001600160a01b0395861664010000000002640100000000600160c01b0319909116179055601280549385166001600160a01b0319948516179055601380549285169284169290921790915560148054919093169116179055565b6006546001600160a01b03163314611fe65760405162461bcd60e51b8152600401610b55906136e6565b600b5481600f54611ff791906137c2565b11156120155760405162461bcd60e51b8152600401610b55906137da565b6115d98282612a0d565b600260075414156120425760405162461bcd60e51b8152600401610b5590613756565b60026007553233146120665760405162461bcd60e51b8152600401610b559061378d565b60115460ff166120ab5760405162461bcd60e51b815260206004820152601060248201526f70726573616c65206e6f74206c69766560801b6044820152606401610b55565b60058211156120eb5760405162461bcd60e51b815260206004820152600c60248201526b0dac2f0406a40e0cae440e8f60a31b6044820152606401610b55565b33600090815260176020526040902054600a906121099084906137c2565b11156121475760405162461bcd60e51b815260206004820152600d60248201526c1b1a5b5a5d08195e18d9591959609a1b6044820152606401610b55565b600c5482600f5461215891906137c2565b11156121765760405162461bcd60e51b8152600401610b55906137da565b3482600d54612185919061389e565b146121c85760405162461bcd60e51b8152602060048201526013602482015272195e1858dd08185b5bdd5b9d081b9959591959606a1b6044820152606401610b55565b601154604051627eeac760e11b81523360048201526024810183905260009164010000000090046001600160a01b03169062fdd58e90604401602060405180830381865afa15801561221e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122429190613800565b11806122bd5750601254604051627eeac760e11b8152336004820152602481018390526000916001600160a01b03169062fdd58e90604401602060405180830381865afa158015612297573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122bb9190613800565b115b8061233257506013546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa15801561230c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123309190613800565b115b806123a757506014546040516370a0823160e01b81523360048201526000916001600160a01b0316906370a0823190602401602060405180830381865afa158015612381573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906123a59190613800565b115b6123f35760405162461bcd60e51b815260206004820181905260248201527f796f75206861766520746f206f776e20612067757474657220737065636965736044820152606401610b55565b33600090815260176020526040812080548492906124129084906137c2565b9091555061242290503383612a0d565b50506001600755565b6060600a8054610b8f9061371b565b60085460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c455279190602401602060405180830381865afa15801561248c573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906124b09190613980565b6001600160a01b031614156124c9576001915050610b25565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b6006546001600160a01b031633146125255760405162461bcd60e51b8152600401610b55906136e6565b6001600160a01b03811661258a5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b55565b61169f816128ec565b6001600f60008282546125a691906137c2565b9250508190555061169f81600f54612b64565b6000908152600260205260409020546001600160a01b0316151590565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061260b82611776565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006126508383612b7e565b6015546001600160a01b039182169116149392505050565b60016010600082825461267b91906137c2565b9091555061169f905081612ba2565b6000612695826125b9565b6126f65760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610b55565b600061270183611776565b9050806001600160a01b0316846001600160a01b0316148061273c5750836001600160a01b031661273184610e3c565b6001600160a01b0316145b806124f357506124f3818561243a565b826001600160a01b031661275f82611776565b6001600160a01b0316146127c75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610b55565b6001600160a01b0382166128295760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610b55565b6128346000826125d6565b6001600160a01b038316600090815260036020526040812080546001929061285d908490613819565b90915550506001600160a01b038216600090815260036020526040812080546001929061288b9084906137c2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600680546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b816001600160a01b0316836001600160a01b031614156129a05760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610b55565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b60005b8181101561106357612a2183612593565b80612a2b8161399d565b915050612a10565b612a3e84848461274c565b612a4a84848484612c3d565b611e7f5760405162461bcd60e51b8152600401610b55906139b8565b606081612a8a5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612ab45780612a9e8161399d565b9150612aad9050600a83613a20565b9150612a8e565b60008167ffffffffffffffff811115612acf57612acf61339d565b6040519080825280601f01601f191660200182016040528015612af9576020820181803683370190505b5090505b84156124f357612b0e600183613819565b9150612b1b600a86613a34565b612b269060306137c2565b60f81b818381518110612b3b57612b3b613a48565b60200101906001600160f81b031916908160001a905350612b5d600a86613a20565b9450612afd565b6115d9828260405180602001604052806000815250612d3b565b6000806000612b8d8585612d6e565b91509150612b9a81612dde565b509392505050565b6000612bad82611776565b9050612bba6000836125d6565b6001600160a01b0381166000908152600360205260408120805460019290612be3908490613819565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b60006001600160a01b0384163b15612d3057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c81903390899088908890600401613a5e565b6020604051808303816000875af1925050508015612cbc575060408051601f3d908101601f19168201909252612cb991810190613a9b565b60015b612d16573d808015612cea576040519150601f19603f3d011682016040523d82523d6000602084013e612cef565b606091505b508051612d0e5760405162461bcd60e51b8152600401610b55906139b8565b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490506124f3565b506001949350505050565b612d458383612f99565b612d526000848484612c3d565b6110635760405162461bcd60e51b8152600401610b55906139b8565b600080825160411415612da55760208301516040840151606085015160001a612d99878285856130cc565b94509450505050612dd7565b825160401415612dcf5760208301516040840151612dc48683836131b9565b935093505050612dd7565b506000905060025b9250929050565b6000816004811115612df257612df2613ab8565b1415612dfb5750565b6001816004811115612e0f57612e0f613ab8565b1415612e5d5760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e617475726500000000000000006044820152606401610b55565b6002816004811115612e7157612e71613ab8565b1415612ebf5760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e677468006044820152606401610b55565b6003816004811115612ed357612ed3613ab8565b1415612f2c5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b6064820152608401610b55565b6004816004811115612f4057612f40613ab8565b141561169f5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b6064820152608401610b55565b6001600160a01b038216612fef5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610b55565b612ff8816125b9565b156130455760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610b55565b6001600160a01b038216600090815260036020526040812080546001929061306e9084906137c2565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a083111561310357506000905060036131b0565b8460ff16601b1415801561311b57508460ff16601c14155b1561312c57506000905060046131b0565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa158015613180573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166131a9576000600192509250506131b0565b9150600090505b94509492505050565b6000806001600160ff1b03831660ff84901c601b016131da878288856130cc565b935093505050935093915050565b8280546131f49061371b565b90600052602060002090601f016020900481019282613216576000855561325c565b82601f1061322f57805160ff191683800117855561325c565b8280016001018555821561325c579182015b8281111561325c578251825591602001919060010190613241565b5061326892915061326c565b5090565b5b80821115613268576000815560010161326d565b6001600160e01b03198116811461169f57600080fd5b6000602082840312156132a957600080fd5b81356132b481613281565b9392505050565b6001600160a01b038116811461169f57600080fd5b6000602082840312156132e257600080fd5b81356132b4816132bb565b60005b838110156133085781810151838201526020016132f0565b83811115611e7f5750506000910152565b600081518084526133318160208601602086016132ed565b601f01601f19169290920160200192915050565b6020815260006132b46020830184613319565b60006020828403121561336a57600080fd5b5035919050565b6000806040838503121561338457600080fd5b823561338f816132bb565b946020939093013593505050565b634e487b7160e01b600052604160045260246000fd5b600067ffffffffffffffff808411156133ce576133ce61339d565b604051601f8501601f19908116603f011681019082821181831017156133f6576133f661339d565b8160405280935085815286868601111561340f57600080fd5b858560208301376000602087830101525050509392505050565b600082601f83011261343a57600080fd5b6132b4838335602085016133b3565b600080600080600060a0868803121561346157600080fd5b85359450602086013567ffffffffffffffff81111561347f57600080fd5b61348b88828901613429565b959895975050505060408401359360608101359360809091013592509050565b6000806000606084860312156134c057600080fd5b83356134cb816132bb565b95602085013595506040909401359392505050565b6000806000606084860312156134f557600080fd5b8335613500816132bb565b92506020840135613510816132bb565b929592945050506040919091013590565b801515811461169f57600080fd5b60006020828403121561354157600080fd5b81356132b481613521565b60006020828403121561355e57600080fd5b813567ffffffffffffffff81111561357557600080fd5b8201601f8101841361358657600080fd5b6124f3848235602084016133b3565b600080604083850312156135a857600080fd5b82356135b3816132bb565b915060208301356135c381613521565b809150509250929050565b600080600080608085870312156135e457600080fd5b84356135ef816132bb565b935060208501356135ff816132bb565b925060408501359150606085013567ffffffffffffffff81111561362257600080fd5b61362e87828801613429565b91505092959194509250565b6000806000806080858703121561365057600080fd5b843561365b816132bb565b9350602085013561366b816132bb565b9250604085013561367b816132bb565b9150606085013561368b816132bb565b939692955090935050565b600080604083850312156136a957600080fd5b50508035926020909101359150565b600080604083850312156136cb57600080fd5b82356136d6816132bb565b915060208301356135c3816132bb565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c9082168061372f57607f821691505b6020821081141561375057634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b602080825260059082015264373797171760d91b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600082198211156137d5576137d56137ac565b500190565b6020808252600c908201526b6f7574206f662073746f636b60a01b604082015260600190565b60006020828403121561381257600080fd5b5051919050565b60008282101561382b5761382b6137ac565b500390565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60006020828403121561389357600080fd5b81516132b481613521565b60008160001904831182151516156138b8576138b86137ac565b500290565b600081516138cf8185602086016132ed565b9290920192915050565b600080845481600182811c9150808316806138f557607f831692505b602080841082141561391557634e487b7160e01b86526022600452602486fd5b818015613929576001811461393a57613967565b60ff19861689528489019650613967565b60008b81526020902060005b8681101561395f5781548b820152908501908301613946565b505084890196505b50505050505061397781856138bd565b95945050505050565b60006020828403121561399257600080fd5b81516132b4816132bb565b60006000198214156139b1576139b16137ac565b5060010190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b634e487b7160e01b600052601260045260246000fd5b600082613a2f57613a2f613a0a565b500490565b600082613a4357613a43613a0a565b500690565b634e487b7160e01b600052603260045260246000fd5b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613a9190830184613319565b9695505050505050565b600060208284031215613aad57600080fd5b81516132b481613281565b634e487b7160e01b600052602160045260246000fdfea264697066735822122009537da6493379832f866f8a43cb9875b7a49daef35d0822429531446fd8ab3964736f6c634300080b0033

Deployed Bytecode Sourcemap

576:10278:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1555:300:5;;;;;;;;;;-1:-1:-1;1555:300:5;;;;;:::i;:::-;;:::i;:::-;;;565:14:15;;558:22;540:41;;528:2;513:18;1555:300:5;;;;;;;;9648:106:0;;;;;;;;;;-1:-1:-1;9648:106:0;;;;;:::i;:::-;;:::i;:::-;;1047:40;;;;;;;;;;;;;;;;;;;1126:25:15;;;1114:2;1099:18;1047:40:0;980:177:15;2473:98:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3731:537:0:-;;;;;;;;;;-1:-1:-1;3731:537:0;;;;;:::i;:::-;;:::i;3984:217:5:-;;;;;;;;;;-1:-1:-1;3984:217:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;2284:32:15;;;2266:51;;2254:2;2239:18;3984:217:5;2120:203:15;847:95:0;;;;;;;;;;;;;:::i;3522:401:5:-;;;;;;;;;;-1:-1:-1;3522:401:5;;;;;:::i;:::-;;:::i;1683:87:0:-;;;;;;;;;;-1:-1:-1;1683:87:0;;;;-1:-1:-1;;;;;1683:87:0;;;4274:949;;;;;;;;;;-1:-1:-1;4274:949:0;;;;;:::i;:::-;;:::i;10055:106::-;;;;;;;;;;;;;:::i;1844:23::-;;;;;;;;;;-1:-1:-1;1844:23:0;;;;-1:-1:-1;;;1844:23:0;;;;;;7960:175;;;;;;;;;;-1:-1:-1;7960:175:0;;;;;:::i;:::-;;:::i;1131:41::-;;;;;;;;;;;;;;;;8591:205;;;;;;;;;;-1:-1:-1;8591:205:0;;;;;:::i;:::-;;:::i;4711:330:5:-;;;;;;;;;;-1:-1:-1;4711:330:5;;;;;:::i;:::-;;:::i;7728:83:0:-;;;;;;;;;;-1:-1:-1;7728:83:0;;;;;:::i;:::-;;:::i;7495:::-;;;;;;;;;;-1:-1:-1;7495:83:0;;;;;:::i;:::-;;:::i;8141:140::-;;;;;;;;;;;;;:::i;5107:179:5:-;;;;;;;;;;-1:-1:-1;5107:179:5;;;;;:::i;:::-;;:::i;5839:255:0:-;;;;;;;;;;-1:-1:-1;5839:255:0;;;;;:::i;:::-;;:::i;10760:92::-;;;;;;;;;;-1:-1:-1;10760:92:0;;;;;:::i;:::-;;:::i;7610:91::-;;;;;;;;;;-1:-1:-1;7610:91:0;;;;;:::i;:::-;;:::i;1494:87::-;;;;;;;;;;-1:-1:-1;1494:87:0;;;;-1:-1:-1;;;;;1494:87:0;;;6100:147;;;;;;;;;;-1:-1:-1;6100:147:0;;;;;:::i;:::-;;:::i;1344:24::-;;;;;;;;;;-1:-1:-1;1344:24:0;;;;;;;;;;;1401:87;;;;;;;;;;-1:-1:-1;1401:87:0;;;;;;;-1:-1:-1;;;;;1401:87:0;;;2176:235:5;;;;;;;;;;-1:-1:-1;2176:235:5;;;;;:::i;:::-;;:::i;8436:149:0:-;;;;;;;;;;-1:-1:-1;8436:149:0;;;;;:::i;:::-;;:::i;1587:90::-;;;;;;;;;;-1:-1:-1;1587:90:0;;;;-1:-1:-1;;;;;1587:90:0;;;1914:205:5;;;;;;;;;;-1:-1:-1;1914:205:5;;;;;:::i;:::-;;:::i;1668:101:1:-;;;;;;;;;;;;;:::i;1289:23:0:-;;;;;;;;;;-1:-1:-1;1289:23:0;;;;;;;;1955:44;;;;;;;;;;-1:-1:-1;1955:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;8287:143;;;;;;;;;;-1:-1:-1;8287:143:0;;;;;:::i;:::-;;:::i;1036:85:1:-;;;;;;;;;;-1:-1:-1;1108:6:1;;-1:-1:-1;;;;;1108:6:1;1036:85;;7379:89:0;;;;;;;;;;-1:-1:-1;7379:89:0;;;;;:::i;:::-;;:::i;6584:147::-;;;;;;;;;;-1:-1:-1;6584:147:0;;;;;:::i;:::-;;:::i;1219:28::-;;;;;;;;;;;;;;;;2635:102:5;;;;;;;;;;;;;:::i;9788:261:0:-;;;;;;;;;;-1:-1:-1;9788:261:0;;;;;:::i;:::-;;:::i;9543:73::-;;;;;;;;;;;;;:::i;4268:153:5:-;;;;;;;;;;-1:-1:-1;4268:153:5;;;;;:::i;:::-;;:::i;7841:89:0:-;;;;;;;;;;-1:-1:-1;7841:89:0;;;;;:::i;:::-;;:::i;9389:119::-;;;;;;;;;;-1:-1:-1;9389:119:0;;;;;:::i;:::-;;:::i;3198:499::-;;;;;;:::i;:::-;;:::i;5352:320:5:-;;;;;;;;;;-1:-1:-1;5352:320:5;;;;;:::i;:::-;;:::i;948:92:0:-;;;;;;;;;;;;;:::i;6253:325::-;;;;;;;;;;-1:-1:-1;6253:325:0;;;;;:::i;:::-;;:::i;1093:32::-;;;;;;;;;;;;;;;;1179:18;;;;;;;;;;-1:-1:-1;1179:18:0;;;;;;;;1374:20;;;;;;;;;;-1:-1:-1;1374:20:0;;;;;;;;;;;6868:481;;;;;;;;;;-1:-1:-1;6868:481:0;;;;;:::i;:::-;;:::i;1318:20::-;;;;;;;;;;-1:-1:-1;1318:20:0;;;;;;;;;;;5246:176;;;;;;;;;;-1:-1:-1;5246:176:0;;;;;:::i;:::-;;:::i;2117:1075::-;;;;;;:::i;:::-;;:::i;6737:95::-;;;;;;;;;;;;;:::i;8923:431::-;;;;;;;;;;-1:-1:-1;8923:431:0;;;;;:::i;:::-;;:::i;1918:198:1:-;;;;;;;;;;-1:-1:-1;1918:198:1;;;;;:::i;:::-;;:::i;1874:42:0:-;;;;;;;;;;-1:-1:-1;1874:42:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;1555:300:5;1657:4;-1:-1:-1;;;;;;1692:40:5;;-1:-1:-1;;;1692:40:5;;:104;;-1:-1:-1;;;;;;;1748:48:5;;-1:-1:-1;;;1748:48:5;1692:104;:156;;;-1:-1:-1;;;;;;;;;;937:40:13;;;1812:36:5;1673:175;1555:300;-1:-1:-1;;1555:300:5:o;9648:106:0:-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;;;;;;;;;9722:13:0::1;:25:::0;;-1:-1:-1;;;;;;9722:25:0::1;-1:-1:-1::0;;;;;9722:25:0;;;::::1;::::0;;;::::1;::::0;;9648:106::o;2473:98:5:-;2527:13;2559:5;2552:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2473:98;:::o;3731:537:0:-;1744:1:2;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:2;;;;;;;:::i;:::-;1744:1;2455:7;:18;3804:9:0::1;3817:10;3804:23;3796:41;;;;-1:-1:-1::0;;;3796:41:0::1;;;;;;;:::i;:::-;3855:12;::::0;;;::::1;;;3847:43;;;::::0;-1:-1:-1;;;3847:43:0;;10553:2:15;3847:43:0::1;::::0;::::1;10535:21:15::0;10592:2;10572:18;;;10565:30;-1:-1:-1;;;10611:18:15;;;10604:48;10669:18;;3847:43:0::1;10351:342:15::0;3847:43:0::1;3930:17;::::0;3909:13:::1;::::0;:17:::1;::::0;3925:1:::1;3909:17;:::i;:::-;:38;;3901:63;;;;-1:-1:-1::0;;;3901:63:0::1;;;;;;;:::i;:::-;3983:17;::::0;;;:10:::1;:17;::::0;;;;;::::1;;3982:18;3974:66;;;::::0;-1:-1:-1;;;3974:66:0;;11506:2:15;3974:66:0::1;::::0;::::1;11488:21:15::0;11545:2;11525:18;;;11518:30;11584:34;11564:18;;;11557:62;-1:-1:-1;;;11635:18:15;;;11628:33;11678:19;;3974:66:0::1;11304:399:15::0;3974:66:0::1;4081:19;::::0;4072:58:::1;::::0;-1:-1:-1;;;4072:58:0;;4112:10:::1;4081:19;4072:58:::0;::::1;11882:51:15::0;11949:18;;;11942:34;;;4133:1:0::1;::::0;4081:19;;::::1;-1:-1:-1::0;;;;;4081:19:0::1;::::0;4072:39:::1;::::0;11855:18:15;;4072:58:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:62;4051:143;;;::::0;-1:-1:-1;;;4051:143:0;;12378:2:15;4051:143:0::1;::::0;::::1;12360:21:15::0;12417:2;12397:18;;;12390:30;12456:34;12436:18;;;12429:62;-1:-1:-1;;;12507:18:15;;;12500:32;12549:19;;4051:143:0::1;12176:398:15::0;4051:143:0::1;4205:17;::::0;;;:10:::1;:17;::::0;;;;:24;;-1:-1:-1;;4205:24:0::1;4225:4;4205:24;::::0;;4240:21:::1;4250:10;4240:9;:21::i;:::-;-1:-1:-1::0;1701:1:2;2628:7;:22;3731:537:0:o;3984:217:5:-;4060:7;4087:16;4095:7;4087;:16::i;:::-;4079:73;;;;-1:-1:-1;;;4079:73:5;;12781:2:15;4079:73:5;;;12763:21:15;12820:2;12800:18;;;12793:30;12859:34;12839:18;;;12832:62;-1:-1:-1;;;12910:18:15;;;12903:42;12962:19;;4079:73:5;12579:408:15;4079:73:5;-1:-1:-1;4170:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;4170:24:5;;3984:217::o;847:95:0:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;3522:401:5:-;3602:13;3618:23;3633:7;3618:14;:23::i;:::-;3602:39;;3665:5;-1:-1:-1;;;;;3659:11:5;:2;-1:-1:-1;;;;;3659:11:5;;;3651:57;;;;-1:-1:-1;;;3651:57:5;;13194:2:15;3651:57:5;;;13176:21:15;13233:2;13213:18;;;13206:30;13272:34;13252:18;;;13245:62;-1:-1:-1;;;13323:18:15;;;13316:31;13364:19;;3651:57:5;12992:397:15;3651:57:5;719:10:10;-1:-1:-1;;;;;3740:21:5;;;;:62;;-1:-1:-1;3765:37:5;3782:5;719:10:10;8923:431:0;:::i;3765:37:5:-;3719:165;;;;-1:-1:-1;;;3719:165:5;;13596:2:15;3719:165:5;;;13578:21:15;13635:2;13615:18;;;13608:30;13674:34;13654:18;;;13647:62;13745:26;13725:18;;;13718:54;13789:19;;3719:165:5;13394:420:15;3719:165:5;3895:21;3904:2;3908:7;3895:8;:21::i;:::-;3592:331;3522:401;;:::o;4274:949:0:-;1744:1:2;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:2;;;;;;;:::i;:::-;1744:1;2455:7;:18;4498:17:0::1;::::0;4481:13:::1;::::0;:34:::1;;4460:106;;;::::0;-1:-1:-1;;;4460:106:0;;14021:2:15;4460:106:0::1;::::0;::::1;14003:21:15::0;14060:2;14040:18;;;14033:30;14099:27;14079:18;;;14072:55;14144:18;;4460:106:0::1;13819:349:15::0;4460:106:0::1;4584:11;::::0;-1:-1:-1;;;4584:11:0;::::1;;;4576:40;;;::::0;-1:-1:-1;;;4576:40:0;;14375:2:15;4576:40:0::1;::::0;::::1;14357:21:15::0;14414:2;14394:18;;;14387:30;-1:-1:-1;;;14433:18:15;;;14426:46;14489:18;;4576:40:0::1;14173:340:15::0;4576:40:0::1;4634:28;4652:4;4658:3;4634:17;:28::i;:::-;4626:55;;;::::0;-1:-1:-1;;;4626:55:0;;14720:2:15;4626:55:0::1;::::0;::::1;14702:21:15::0;14759:2;14739:18;;;14732:30;-1:-1:-1;;;14778:18:15;;;14771:44;14832:18;;4626:55:0::1;14518:338:15::0;4626:55:0::1;10464:46:::0;;;;;;;25890:19:15;;;25925:12;;;25918:28;;;25962:12;;;;25955:28;;;10464:46:0;;;;;;;;;;25999:12:15;;;10464:46:0;;10454:57;;;;;;26264:66:15;10368:157:0;;;26252:79:15;26347:12;;;;26340:28;;;;10368:157:0;;;;;;;;;;26384:12:15;;;;10368:157:0;;;10345:190;;;;;4761:4;4712:53:::1;4691:117;;;::::0;-1:-1:-1;;;4691:117:0;;15063:2:15;4691:117:0::1;::::0;::::1;15045:21:15::0;15102:2;15082:18;;;15075:30;-1:-1:-1;;;15121:18:15;;;15114:47;15178:18;;4691:117:0::1;14861:341:15::0;4691:117:0::1;4826:16;4834:7;4826;:16::i;:::-;:37;;;;;4846:17;4854:8;4846:7;:17::i;:::-;4818:68;;;::::0;-1:-1:-1;;;4818:68:0;;15409:2:15;4818:68:0::1;::::0;::::1;15391:21:15::0;15448:2;15428:18;;;15421:30;-1:-1:-1;;;15467:18:15;;;15460:48;15525:18;;4818:68:0::1;15207:342:15::0;4818:68:0::1;4937:10;4917:16;4925:7:::0;4917::::1;:16::i;:::-;-1:-1:-1::0;;;;;4917:30:0::1;;:65;;;;-1:-1:-1::0;4972:10:0::1;4951:17;4959:8:::0;4951:7:::1;:17::i;:::-;-1:-1:-1::0;;;;;4951:31:0::1;;4917:65;4896:125;;;::::0;-1:-1:-1;;;4896:125:0;;15756:2:15;4896:125:0::1;::::0;::::1;15738:21:15::0;15795:2;15775:18;;;15768:30;-1:-1:-1;;;15814:18:15;;;15807:43;15867:18;;4896:125:0::1;15554:337:15::0;4896:125:0::1;5050:8;5039:7;:19;;5031:40;;;::::0;-1:-1:-1;;;5031:40:0;;16098:2:15;5031:40:0::1;::::0;::::1;16080:21:15::0;16137:1;16117:18;;;16110:29;-1:-1:-1;;;16155:18:15;;;16148:38;16203:18;;5031:40:0::1;15896:331:15::0;5031:40:0::1;5082:18;5092:7;5082:9;:18::i;:::-;5110:19;5120:8;5110:9;:19::i;:::-;5140:21;5150:10;5140:9;:21::i;:::-;5191:13;::::0;5177:39:::1;::::0;;16406:25:15;;;16462:2;16447:18;;16440:34;;;5177:39:0::1;::::0;16379:18:15;5177:39:0::1;;;;;;;-1:-1:-1::0;;1701:1:2;2628:7;:22;-1:-1:-1;;;4274:949:0:o;10055:106::-;10099:7;10141:13;;10125;;:29;;;;:::i;:::-;10118:36;;10055:106;:::o;7960:175::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;8060:17:0::1;;8043:13;:34;;8035:57;;;::::0;-1:-1:-1;;;8035:57:0;;16817:2:15;8035:57:0::1;::::0;::::1;16799:21:15::0;16856:2;16836:18;;;16829:30;-1:-1:-1;;;16875:18:15;;;16868:40;16925:18;;8035:57:0::1;16615:334:15::0;8035:57:0::1;8102:10;:26:::0;7960:175::o;8591:205::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;8720:69:0::1;::::0;-1:-1:-1;;;8720:69:0;;8758:4:::1;8720:69;::::0;::::1;17287:34:15::0;8765:10:0::1;17337:18:15::0;;;17330:43;17389:18;;;17382:34;;;17432:18;;;17425:34;;;17267:3;17475:19;;;17468:32;-1:-1:-1;17516:19:15;;;17509:30;-1:-1:-1;;;;;8720:29:0;::::1;::::0;::::1;::::0;17556:19:15;;8720:69:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8591:205:::0;;;:::o;4711:330:5:-;4900:41;719:10:10;4919:12:5;4933:7;4900:18;:41::i;:::-;4892:103;;;;-1:-1:-1;;;4892:103:5;;;;;;;:::i;:::-;5006:28;5016:4;5022:2;5026:7;5006:9;:28::i;7728:83:0:-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;7789:8:0::1;:15:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;7789:15:0;;::::1;::::0;;;::::1;::::0;;7728:83::o;7495:::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;7556:8:0::1;:15:::0;;;::::1;;;;-1:-1:-1::0;;7556:15:0;;::::1;::::0;;;::::1;::::0;;7495:83::o;8141:140::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;8237:37:0::1;::::0;8206:21:::1;::::0;8245:10:::1;::::0;8237:37;::::1;;;::::0;8206:21;;8188:15:::1;8237:37:::0;8188:15;8237:37;8206:21;8245:10;8237:37;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;8178:103;8141:140::o:0;5107:179:5:-;5240:39;5257:4;5263:2;5267:7;5240:39;;;;;;;;;;;;:16;:39::i;5839:255:0:-;5903:8;;;;;;;5895:34;;;;-1:-1:-1;;;5895:34:0;;18206:2:15;5895:34:0;;;18188:21:15;18245:2;18225:18;;;18218:30;-1:-1:-1;;;18264:18:15;;;18257:43;18317:18;;5895:34:0;18004:337:15;5895:34:0;5960:41;719:10:10;5979:12:0;640:96:10;5960:41:0;5939:120;;;;-1:-1:-1;;;5939:120:0;;18548:2:15;5939:120:0;;;18530:21:15;;;18567:18;;;18560:30;18626:34;18606:18;;;18599:62;18678:18;;5939:120:0;18346:356:15;5939:120:0;6069:18;6079:7;6069:9;:18::i;:::-;5839:255;:::o;10760:92::-;10811:4;10834:11;10842:2;10834:7;:11::i;7610:91::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;7675:12:0::1;:19:::0;;;::::1;;::::0;::::1;-1:-1:-1::0;;7675:19:0;;::::1;::::0;;;::::1;::::0;;7610:91::o;6100:147::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;6178:6:0::1;::::0;::::1;;6177:7;6169:36;;;::::0;-1:-1:-1;;;6169:36:0;;18909:2:15;6169:36:0::1;::::0;::::1;18891:21:15::0;18948:2;18928:18;;;18921:30;-1:-1:-1;;;18967:18:15;;;18960:46;19023:18;;6169:36:0::1;18707:340:15::0;6169:36:0::1;6215:25:::0;;::::1;::::0;:16:::1;::::0;:25:::1;::::0;::::1;::::0;::::1;:::i;2176:235:5:-:0;2248:7;2283:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2283:16:5;2317:19;2309:73;;;;-1:-1:-1;;;2309:73:5;;19254:2:15;2309:73:5;;;19236:21:15;19293:2;19273:18;;;19266:30;19332:34;19312:18;;;19305:62;-1:-1:-1;;;19383:18:15;;;19376:39;19432:19;;2309:73:5;19052:405:15;8436:149:0;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;8519:59:0::1;::::0;-1:-1:-1;;;8519:59:0;;8556:4:::1;8519:59;::::0;::::1;19702:34:15::0;8563:10:0::1;19752:18:15::0;;;19745:43;19804:18;;;19797:34;;;-1:-1:-1;;;;;8519:28:0;::::1;::::0;::::1;::::0;19637:18:15;;8519:59:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;8436:149:::0;;:::o;1914:205:5:-;1986:7;-1:-1:-1;;;;;2013:19:5;;2005:74;;;;-1:-1:-1;;;2005:74:5;;20044:2:15;2005:74:5;;;20026:21:15;20083:2;20063:18;;;20056:30;20122:34;20102:18;;;20095:62;-1:-1:-1;;;20173:18:15;;;20166:40;20223:19;;2005:74:5;19842:406:15;2005:74:5;-1:-1:-1;;;;;;2096:16:5;;;;;:9;:16;;;;;;;1914:205::o;1668:101:1:-;1108:6;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;8287:143:0:-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;8387:35:0::1;::::0;-1:-1:-1;;;8387:35:0;;8416:4:::1;8387:35;::::0;::::1;2266:51:15::0;-1:-1:-1;;;;;8355:19:0;::::1;::::0;::::1;::::0;8375:10:::1;::::0;8355:19;;8387:20:::1;::::0;2239:18:15;;8387:35:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8355:68;::::0;-1:-1:-1;;;;;;8355:68:0::1;::::0;;;;;;-1:-1:-1;;;;;11900:32:15;;;8355:68:0::1;::::0;::::1;11882:51:15::0;11949:18;;;11942:34;11855:18;;8355:68:0::1;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;7379:89::-:0;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;7443:11:0::1;:18:::0;;-1:-1:-1;;7443:18:0::1;::::0;::::1;;::::0;;;::::1;::::0;;7379:89::o;6584:147::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;6666:6:0::1;::::0;::::1;;6665:7;6657:36;;;::::0;-1:-1:-1;;;6657:36:0;;18909:2:15;6657:36:0::1;::::0;::::1;18891:21:15::0;18948:2;18928:18;;;18921:30;-1:-1:-1;;;18967:18:15;;;18960:46;19023:18;;6657:36:0::1;18707:340:15::0;6657:36:0::1;6703:21:::0;;::::1;::::0;:12:::1;::::0;:21:::1;::::0;::::1;::::0;::::1;:::i;2635:102:5:-:0;2691:13;2723:7;2716:14;;;;;:::i;9788:261:0:-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;9914:11:0::1;9894:17;;:31;:63;;;;;9944:13;;9929:11;:28;;9894:63;9873:128;;;::::0;-1:-1:-1;;;9873:128:0;;20705:2:15;9873:128:0::1;::::0;::::1;20687:21:15::0;20744:2;20724:18;;;20717:30;-1:-1:-1;;;20763:18:15;;;20756:48;20821:18;;9873:128:0::1;20503:342:15::0;9873:128:0::1;10011:17;:31:::0;9788:261::o;9543:73::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;9596:6:0::1;:13:::0;;-1:-1:-1;;9596:13:0::1;9605:4;9596:13;::::0;;9543:73::o;4268:153:5:-;4362:52;719:10:10;4395:8:5;4405;4362:18;:52::i;7841:89:0:-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;7905:11:0::1;:18:::0;;;::::1;;-1:-1:-1::0;;;7905:18:0::1;-1:-1:-1::0;;;;7905:18:0;;::::1;::::0;;;::::1;::::0;;7841:89::o;9389:119::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;9466:20:0::1;:35:::0;;-1:-1:-1;;;;;;9466:35:0::1;-1:-1:-1::0;;;;;9466:35:0;;;::::1;::::0;;;::::1;::::0;;9389:119::o;3198:499::-;1744:1:2;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:2;;;;;;;:::i;:::-;1744:1;2455:7;:18;3279:9:0::1;3292:10;3279:23;3271:41;;;;-1:-1:-1::0;;;3271:41:0::1;;;;;;;:::i;:::-;3330:8;::::0;::::1;::::0;::::1;;;3322:34;;;::::0;-1:-1:-1;;;3322:34:0;;21052:2:15;3322:34:0::1;::::0;::::1;21034:21:15::0;21091:2;21071:18;;;21064:30;-1:-1:-1;;;21110:18:15;;;21103:43;21163:18;;3322:34:0::1;20850:337:15::0;3322:34:0::1;3381:1;3374:3;:8;;3366:33;;;::::0;-1:-1:-1;;;3366:33:0;;21394:2:15;3366:33:0::1;::::0;::::1;21376:21:15::0;21433:2;21413:18;;;21406:30;-1:-1:-1;;;21452:18:15;;;21445:42;21504:18;;3366:33:0::1;21192:336:15::0;3366:33:0::1;3427:10;3417:21;::::0;;;:9:::1;:21;::::0;;;;;3448:2:::1;::::0;3417:27:::1;::::0;3441:3;;3417:27:::1;:::i;:::-;:33;;3409:59;;;::::0;-1:-1:-1;;;3409:59:0;;21735:2:15;3409:59:0::1;::::0;::::1;21717:21:15::0;21774:2;21754:18;;;21747:30;-1:-1:-1;;;21793:18:15;;;21786:43;21846:18;;3409:59:0::1;21533:337:15::0;3409:59:0::1;3510:10;;3503:3;3487:13;;:19;;;;:::i;:::-;:33;;3479:58;;;;-1:-1:-1::0;;;3479:58:0::1;;;;;;;:::i;:::-;3578:9;3571:3;3555:13;;:19;;;;:::i;:::-;:32;3547:64;;;::::0;-1:-1:-1;;;3547:64:0;;22250:2:15;3547:64:0::1;::::0;::::1;22232:21:15::0;22289:2;22269:18;;;22262:30;-1:-1:-1;;;22308:18:15;;;22301:49;22367:18;;3547:64:0::1;22048:343:15::0;3547:64:0::1;3632:10;3622:21;::::0;;;:9:::1;:21;::::0;;;;:28;;3647:3;;3622:21;:28:::1;::::0;3647:3;;3622:28:::1;:::i;:::-;::::0;;;-1:-1:-1;3661:29:0::1;::::0;-1:-1:-1;3674:10:0::1;3686:3:::0;3661:12:::1;:29::i;5352:320:5:-:0;5521:41;719:10:10;5554:7:5;5521:18;:41::i;:::-;5513:103;;;;-1:-1:-1;;;5513:103:5;;;;;;;:::i;:::-;5626:39;5640:4;5646:2;5650:7;5659:5;5626:13;:39::i;:::-;5352:320;;;;:::o;948:92:0:-;;;;;;;:::i;6253:325::-;6351:13;6401:17;6409:8;6401:7;:17::i;:::-;6380:111;;;;-1:-1:-1;;;6380:111:0;;22598:2:15;6380:111:0;;;22580:21:15;22637:2;22617:18;;;22610:30;22676:34;22656:18;;;22649:62;-1:-1:-1;;;22727:18:15;;;22720:45;22782:19;;6380:111:0;22396:411:15;6380:111:0;6532:16;6550:19;:8;:17;:19::i;:::-;6515:55;;;;;;;;;:::i;:::-;;;;;;;;;;;;;6501:70;;6253:325;;;:::o;6868:481::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;7022:19:0::1;:26:::0;;-1:-1:-1;;;;;7022:26:0;;::::1;::::0;::::1;-1:-1:-1::0;;;;;;7022:26:0;;::::1;;::::0;;7103:19:::1;:26:::0;;;;::::1;-1:-1:-1::0;;;;;;7103:26:0;;::::1;;::::0;;7184:22:::1;:32:::0;;;;::::1;::::0;;::::1;::::0;;;::::1;::::0;;;7271:19:::1;:26:::0;;;;;::::1;::::0;::::1;;::::0;;6868:481::o;5246:176::-;1108:6:1;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;5350:17:0::1;;5343:3;5327:13;;:19;;;;:::i;:::-;:40;;5319:65;;;;-1:-1:-1::0;;;5319:65:0::1;;;;;;;:::i;:::-;5394:21;5407:2;5411:3;5394:12;:21::i;2117:1075::-:0;1744:1:2;2325:7;;:19;;2317:63;;;;-1:-1:-1;;;2317:63:2;;;;;;;:::i;:::-;1744:1;2455:7;:18;2249:9:0::1;2262:10;2249:23;2241:41;;;;-1:-1:-1::0;;;2241:41:0::1;;;;;;;:::i;:::-;2300:11;::::0;::::1;;2292:40;;;::::0;-1:-1:-1;;;2292:40:0;;24509:2:15;2292:40:0::1;::::0;::::1;24491:21:15::0;24548:2;24528:18;;;24521:30;-1:-1:-1;;;24567:18:15;;;24560:46;24623:18;;2292:40:0::1;24307:340:15::0;2292:40:0::1;2357:1;2350:3;:8;;2342:33;;;::::0;-1:-1:-1;;;2342:33:0;;21394:2:15;2342:33:0::1;::::0;::::1;21376:21:15::0;21433:2;21413:18;;;21406:30;-1:-1:-1;;;21452:18:15;;;21445:42;21504:18;;2342:33:0::1;21192:336:15::0;2342:33:0::1;2403:10;2393:21;::::0;;;:9:::1;:21;::::0;;;;;2424:2:::1;::::0;2393:27:::1;::::0;2417:3;;2393:27:::1;:::i;:::-;:33;;2385:59;;;::::0;-1:-1:-1;;;2385:59:0;;21735:2:15;2385:59:0::1;::::0;::::1;21717:21:15::0;21774:2;21754:18;;;21747:30;-1:-1:-1;;;21793:18:15;;;21786:43;21846:18;;2385:59:0::1;21533:337:15::0;2385:59:0::1;2486:10;;2479:3;2463:13;;:19;;;;:::i;:::-;:33;;2455:58;;;;-1:-1:-1::0;;;2455:58:0::1;;;;;;;:::i;:::-;2554:9;2547:3;2531:13;;:19;;;;:::i;:::-;:32;2523:64;;;::::0;-1:-1:-1;;;2523:64:0;;22250:2:15;2523:64:0::1;::::0;::::1;22232:21:15::0;22289:2;22269:18;;;22262:30;-1:-1:-1;;;22308:18:15;;;22301:49;22367:18;;2523:64:0::1;22048:343:15::0;2523:64:0::1;2629:19;::::0;2620:115:::1;::::0;-1:-1:-1;;;2620:115:0;;2677:10:::1;2629:19;2620:115:::0;::::1;11882:51:15::0;11949:18;;;11942:34;;;2738:1:0::1;::::0;2629:19;;::::1;-1:-1:-1::0;;;;;2629:19:0::1;::::0;2620:39:::1;::::0;11855:18:15;;2620:115:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:119;2619:274;;;-1:-1:-1::0;2770:19:0::1;::::0;2761:127:::1;::::0;-1:-1:-1;;;2761:127:0;;2822:10:::1;2761:127;::::0;::::1;11882:51:15::0;11949:18;;;11942:34;;;2891:1:0::1;::::0;-1:-1:-1;;;;;2770:19:0::1;::::0;2761:39:::1;::::0;11855:18:15;;2761:127:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:131;2619:274;:353;;;-1:-1:-1::0;2922:22:0::1;::::0;2914:53:::1;::::0;-1:-1:-1;;;2914:53:0;;2956:10:::1;2914:53;::::0;::::1;2266:51:15::0;2970:1:0::1;::::0;-1:-1:-1;;;;;2922:22:0::1;::::0;2914:41:::1;::::0;2239:18:15;;2914:53:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:57;2619:353;:429;;;-1:-1:-1::0;3001:19:0::1;::::0;2993:50:::1;::::0;-1:-1:-1;;;2993:50:0;;3032:10:::1;2993:50;::::0;::::1;2266:51:15::0;3046:1:0::1;::::0;-1:-1:-1;;;;;3001:19:0::1;::::0;2993:38:::1;::::0;2239:18:15;;2993:50:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:54;2619:429;2598:508;;;::::0;-1:-1:-1;;;2598:508:0;;24854:2:15;2598:508:0::1;::::0;::::1;24836:21:15::0;;;24873:18;;;24866:30;24932:34;24912:18;;;24905:62;24984:18;;2598:508:0::1;24652:356:15::0;2598:508:0::1;3127:10;3117:21;::::0;;;:9:::1;:21;::::0;;;;:28;;3142:3;;3117:21;:28:::1;::::0;3142:3;;3117:28:::1;:::i;:::-;::::0;;;-1:-1:-1;3156:29:0::1;::::0;-1:-1:-1;3169:10:0::1;3181:3:::0;3156:12:::1;:29::i;:::-;-1:-1:-1::0;;1701:1:2;2628:7;:22;2117:1075:0:o;6737:95::-;6781:13;6813:12;6806:19;;;;;:::i;8923:431::-;9170:20;;9213:28;;-1:-1:-1;;;9213:28:0;;-1:-1:-1;;;;;2284:32:15;;;9213:28:0;;;2266:51:15;9044:4:0;;9170:20;;;9205:49;;;;9170:20;;9213:21;;2239:18:15;;9213:28:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;9205:49:0;;9201:91;;;9277:4;9270:11;;;;;9201:91;-1:-1:-1;;;;;4607:25:5;;;4584:4;4607:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;9308:39:0;9301:46;8923:431;-1:-1:-1;;;;8923:431:0:o;1918:198:1:-;1108:6;;-1:-1:-1;;;;;1108:6:1;719:10:10;1248:23:1;1240:68;;;;-1:-1:-1;;;1240:68:1;;;;;;;:::i;:::-;-1:-1:-1;;;;;2006:22:1;::::1;1998:73;;;::::0;-1:-1:-1;;;1998:73:1;;25500:2:15;1998:73:1::1;::::0;::::1;25482:21:15::0;25539:2;25519:18;;;25512:30;25578:34;25558:18;;;25551:62;-1:-1:-1;;;25629:18:15;;;25622:36;25675:19;;1998:73:1::1;25298:402:15::0;1998:73:1::1;2081:28;2100:8;2081:18;:28::i;5589:124:0:-:0;5661:1;5644:13;;:18;;;;;;;:::i;:::-;;;;;;;;5672:34;5682:8;5692:13;;5672:9;:34::i;7144:125:5:-;7209:4;7232:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7232:16:5;:30;;;7144:125::o;10995:171::-;11069:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11069:29:5;-1:-1:-1;;;;;11069:29:5;;;;;;;;:24;;11122:23;11069:24;11122:14;:23::i;:::-;-1:-1:-1;;;;;11113:46:5;;;;;;;;;;;10995:171;;:::o;10569:185:0:-;10680:4;10724:23;:4;10737:9;10724:12;:23::i;:::-;10707:13;;-1:-1:-1;;;;;10707:40:0;;;:13;;:40;;10569:185;-1:-1:-1;;;10569:185:0:o;5719:103::-;5790:1;5773:13;;:18;;;;;;;:::i;:::-;;;;-1:-1:-1;5801:14:0;;-1:-1:-1;5807:7:0;5801:5;:14::i;7427:344:5:-;7520:4;7544:16;7552:7;7544;:16::i;:::-;7536:73;;;;-1:-1:-1;;;7536:73:5;;26609:2:15;7536:73:5;;;26591:21:15;26648:2;26628:18;;;26621:30;26687:34;26667:18;;;26660:62;-1:-1:-1;;;26738:18:15;;;26731:42;26790:19;;7536:73:5;26407:408:15;7536:73:5;7619:13;7635:23;7650:7;7635:14;:23::i;:::-;7619:39;;7687:5;-1:-1:-1;;;;;7676:16:5;:7;-1:-1:-1;;;;;7676:16:5;;:51;;;;7720:7;-1:-1:-1;;;;;7696:31:5;:20;7708:7;7696:11;:20::i;:::-;-1:-1:-1;;;;;7696:31:5;;7676:51;:87;;;;7731:32;7748:5;7755:7;7731:16;:32::i;10324:560::-;10478:4;-1:-1:-1;;;;;10451:31:5;:23;10466:7;10451:14;:23::i;:::-;-1:-1:-1;;;;;10451:31:5;;10443:85;;;;-1:-1:-1;;;10443:85:5;;27022:2:15;10443:85:5;;;27004:21:15;27061:2;27041:18;;;27034:30;27100:34;27080:18;;;27073:62;-1:-1:-1;;;27151:18:15;;;27144:39;27200:19;;10443:85:5;26820:405:15;10443:85:5;-1:-1:-1;;;;;10546:16:5;;10538:65;;;;-1:-1:-1;;;10538:65:5;;27432:2:15;10538:65:5;;;27414:21:15;27471:2;27451:18;;;27444:30;27510:34;27490:18;;;27483:62;-1:-1:-1;;;27561:18:15;;;27554:34;27605:19;;10538:65:5;27230:400:15;10538:65:5;10715:29;10732:1;10736:7;10715:8;:29::i;:::-;-1:-1:-1;;;;;10755:15:5;;;;;;:9;:15;;;;;:20;;10774:1;;10755:15;:20;;10774:1;;10755:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10785:13:5;;;;;;:9;:13;;;;;:18;;10802:1;;10785:13;:18;;10802:1;;10785:18;:::i;:::-;;;;-1:-1:-1;;10813:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10813:21:5;-1:-1:-1;;;;;10813:21:5;;;;;;;;;10850:27;;10813:16;;10850:27;;;;;;;10324:560;;;:::o;2270:187:1:-;2362:6;;;-1:-1:-1;;;;;2378:17:1;;;-1:-1:-1;;;;;;2378:17:1;;;;;;;2410:40;;2362:6;;;2378:17;2362:6;;2410:40;;2343:16;;2410:40;2333:124;2270:187;:::o;11301:307:5:-;11451:8;-1:-1:-1;;;;;11442:17:5;:5;-1:-1:-1;;;;;11442:17:5;;;11434:55;;;;-1:-1:-1;;;11434:55:5;;27837:2:15;11434:55:5;;;27819:21:15;27876:2;27856:18;;;27849:30;27915:27;27895:18;;;27888:55;27960:18;;11434:55:5;27635:349:15;11434:55:5;-1:-1:-1;;;;;11499:25:5;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;11499:46:5;;;;;;;;;;11560:41;;540::15;;;11560::5;;513:18:15;11560:41:5;;;;;;;11301:307;;;:::o;5428:155:0:-;5504:9;5499:78;5523:3;5519:1;:7;5499:78;;;5547:19;5557:8;5547:9;:19::i;:::-;5528:3;;;;:::i;:::-;;;;5499:78;;6534:307:5;6685:28;6695:4;6701:2;6705:7;6685:9;:28::i;:::-;6731:48;6754:4;6760:2;6764:7;6773:5;6731:22;:48::i;:::-;6723:111;;;;-1:-1:-1;;;6723:111:5;;;;;;;:::i;328:703:11:-;384:13;601:10;597:51;;-1:-1:-1;;627:10:11;;;;;;;;;;;;-1:-1:-1;;;627:10:11;;;;;328:703::o;597:51::-;672:5;657:12;711:75;718:9;;711:75;;743:8;;;;:::i;:::-;;-1:-1:-1;765:10:11;;-1:-1:-1;773:2:11;765:10;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;817:17:11;;795:39;;844:150;851:10;;844:150;;877:11;887:1;877:11;;:::i;:::-;;-1:-1:-1;945:10:11;953:2;945:5;:10;:::i;:::-;932:24;;:2;:24;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;902:56:11;;;;;;;;-1:-1:-1;972:11:11;981:2;972:11;;:::i;:::-;;;844:150;;8101:108:5;8176:26;8186:2;8190:7;8176:26;;;;;;;;;;;;:9;:26::i;4293:227:12:-;4371:7;4391:17;4410:18;4432:27;4443:4;4449:9;4432:10;:27::i;:::-;4390:69;;;;4469:18;4481:5;4469:11;:18::i;:::-;-1:-1:-1;4504:9:12;4293:227;-1:-1:-1;;;4293:227:12:o;9652:348:5:-;9711:13;9727:23;9742:7;9727:14;:23::i;:::-;9711:39;;9847:29;9864:1;9868:7;9847:8;:29::i;:::-;-1:-1:-1;;;;;9887:16:5;;;;;;:9;:16;;;;;:21;;9907:1;;9887:16;:21;;9907:1;;9887:21;:::i;:::-;;;;-1:-1:-1;;9925:16:5;;;;:7;:16;;;;;;9918:23;;-1:-1:-1;;;;;;9918:23:5;;;9957:36;9933:7;;9925:16;-1:-1:-1;;;;;9957:36:5;;;;;9925:16;;9957:36;9701:299;9652:348;:::o;12161:778::-;12311:4;-1:-1:-1;;;;;12331:13:5;;1087:20:9;1133:8;12327:606:5;;12366:72;;-1:-1:-1;;;12366:72:5;;-1:-1:-1;;;;;12366:36:5;;;;;:72;;719:10:10;;12417:4:5;;12423:7;;12432:5;;12366:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12366:72:5;;;;;;;;-1:-1:-1;;12366:72:5;;;;;;;;;;;;:::i;:::-;;;12362:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12605:13:5;;12601:266;;12647:60;;-1:-1:-1;;;12647:60:5;;;;;;;:::i;12601:266::-;12819:6;12813:13;12804:6;12800:2;12796:15;12789:38;12362:519;-1:-1:-1;;;;;;12488:51:5;-1:-1:-1;;;12488:51:5;;-1:-1:-1;12481:58:5;;12327:606;-1:-1:-1;12918:4:5;12161:778;;;;;;:::o;8430:311::-;8555:18;8561:2;8565:7;8555:5;:18::i;:::-;8604:54;8635:1;8639:2;8643:7;8652:5;8604:22;:54::i;:::-;8583:151;;;;-1:-1:-1;;;8583:151:5;;;;;;;:::i;2228:1279:12:-;2309:7;2318:12;2539:9;:16;2559:2;2539:22;2535:966;;;2828:4;2813:20;;2807:27;2877:4;2862:20;;2856:27;2934:4;2919:20;;2913:27;2577:9;2905:36;2975:25;2986:4;2905:36;2807:27;2856;2975:10;:25::i;:::-;2968:32;;;;;;;;;2535:966;3021:9;:16;3041:2;3021:22;3017:484;;;3290:4;3275:20;;3269:27;3340:4;3325:20;;3319:27;3380:23;3391:4;3269:27;3319;3380:10;:23::i;:::-;3373:30;;;;;;;;3017:484;-1:-1:-1;3450:1:12;;-1:-1:-1;3454:35:12;3017:484;2228:1279;;;;;:::o;533:631::-;610:20;601:5;:29;;;;;;;;:::i;:::-;;597:561;;;533:631;:::o;597:561::-;706:29;697:5;:38;;;;;;;;:::i;:::-;;693:465;;;751:34;;-1:-1:-1;;;751:34:12;;30147:2:15;751:34:12;;;30129:21:15;30186:2;30166:18;;;30159:30;30225:26;30205:18;;;30198:54;30269:18;;751:34:12;29945:348:15;693:465:12;815:35;806:5;:44;;;;;;;;:::i;:::-;;802:356;;;866:41;;-1:-1:-1;;;866:41:12;;30500:2:15;866:41:12;;;30482:21:15;30539:2;30519:18;;;30512:30;30578:33;30558:18;;;30551:61;30629:18;;866:41:12;30298:355:15;802:356:12;937:30;928:5;:39;;;;;;;;:::i;:::-;;924:234;;;983:44;;-1:-1:-1;;;983:44:12;;30860:2:15;983:44:12;;;30842:21:15;30899:2;30879:18;;;30872:30;30938:34;30918:18;;;30911:62;-1:-1:-1;;;30989:18:15;;;30982:32;31031:19;;983:44:12;30658:398:15;924:234:12;1057:30;1048:5;:39;;;;;;;;:::i;:::-;;1044:114;;;1103:44;;-1:-1:-1;;;1103:44:12;;31263:2:15;1103:44:12;;;31245:21:15;31302:2;31282:18;;;31275:30;31341:34;31321:18;;;31314:62;-1:-1:-1;;;31392:18:15;;;31385:32;31434:19;;1103:44:12;31061:398:15;9063:372:5;-1:-1:-1;;;;;9142:16:5;;9134:61;;;;-1:-1:-1;;;9134:61:5;;31666:2:15;9134:61:5;;;31648:21:15;;;31685:18;;;31678:30;31744:34;31724:18;;;31717:62;31796:18;;9134:61:5;31464:356:15;9134:61:5;9214:16;9222:7;9214;:16::i;:::-;9213:17;9205:58;;;;-1:-1:-1;;;9205:58:5;;32027:2:15;9205:58:5;;;32009:21:15;32066:2;32046:18;;;32039:30;32105;32085:18;;;32078:58;32153:18;;9205:58:5;31825:352:15;9205:58:5;-1:-1:-1;;;;;9330:13:5;;;;;;:9;:13;;;;;:18;;9347:1;;9330:13;:18;;9347:1;;9330:18;:::i;:::-;;;;-1:-1:-1;;9358:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9358:21:5;-1:-1:-1;;;;;9358:21:5;;;;;;;;9395:33;;9358:16;;;9395:33;;9358:16;;9395:33;9063:372;;:::o;5744:1603:12:-;5870:7;;6794:66;6781:79;;6777:161;;;-1:-1:-1;6892:1:12;;-1:-1:-1;6896:30:12;6876:51;;6777:161;6951:1;:7;;6956:2;6951:7;;:18;;;;;6962:1;:7;;6967:2;6962:7;;6951:18;6947:100;;;-1:-1:-1;7001:1:12;;-1:-1:-1;7005:30:12;6985:51;;6947:100;7158:24;;;7141:14;7158:24;;;;;;;;;32409:25:15;;;32482:4;32470:17;;32450:18;;;32443:45;;;;32504:18;;;32497:34;;;32547:18;;;32540:34;;;7158:24:12;;32381:19:15;;7158:24:12;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7158:24:12;;-1:-1:-1;;7158:24:12;;;-1:-1:-1;;;;;;;7196:20:12;;7192:101;;7248:1;7252:29;7232:50;;;;;;;7192:101;7311:6;-1:-1:-1;7319:20:12;;-1:-1:-1;5744:1603:12;;;;;;;;:::o;4774:379::-;4884:7;;-1:-1:-1;;;;;4981:75:12;;5082:3;5078:12;;;5092:2;5074:21;5121:25;5132:4;5074:21;5141:1;4981:75;5121:10;:25::i;:::-;5114:32;;;;;;4774:379;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:15;-1:-1:-1;;;;;;88:32:15;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;:::-;384:5;150:245;-1:-1:-1;;;150:245:15:o;592:131::-;-1:-1:-1;;;;;667:31:15;;657:42;;647:70;;713:1;710;703:12;728:247;787:6;840:2;828:9;819:7;815:23;811:32;808:52;;;856:1;853;846:12;808:52;895:9;882:23;914:31;939:5;914:31;:::i;1162:258::-;1234:1;1244:113;1258:6;1255:1;1252:13;1244:113;;;1334:11;;;1328:18;1315:11;;;1308:39;1280:2;1273:10;1244:113;;;1375:6;1372:1;1369:13;1366:48;;;-1:-1:-1;;1410:1:15;1392:16;;1385:27;1162:258::o;1425:269::-;1478:3;1516:5;1510:12;1543:6;1538:3;1531:19;1559:63;1615:6;1608:4;1603:3;1599:14;1592:4;1585:5;1581:16;1559:63;:::i;:::-;1676:2;1655:15;-1:-1:-1;;1651:29:15;1642:39;;;;1683:4;1638:50;;1425:269;-1:-1:-1;;1425:269:15:o;1699:231::-;1848:2;1837:9;1830:21;1811:4;1868:56;1920:2;1909:9;1905:18;1897:6;1868:56;:::i;1935:180::-;1994:6;2047:2;2035:9;2026:7;2022:23;2018:32;2015:52;;;2063:1;2060;2053:12;2015:52;-1:-1:-1;2086:23:15;;1935:180;-1:-1:-1;1935:180:15:o;2328:315::-;2396:6;2404;2457:2;2445:9;2436:7;2432:23;2428:32;2425:52;;;2473:1;2470;2463:12;2425:52;2512:9;2499:23;2531:31;2556:5;2531:31;:::i;:::-;2581:5;2633:2;2618:18;;;;2605:32;;-1:-1:-1;;;2328:315:15:o;2648:127::-;2709:10;2704:3;2700:20;2697:1;2690:31;2740:4;2737:1;2730:15;2764:4;2761:1;2754:15;2780:631;2844:5;2874:18;2915:2;2907:6;2904:14;2901:40;;;2921:18;;:::i;:::-;2996:2;2990:9;2964:2;3050:15;;-1:-1:-1;;3046:24:15;;;3072:2;3042:33;3038:42;3026:55;;;3096:18;;;3116:22;;;3093:46;3090:72;;;3142:18;;:::i;:::-;3182:10;3178:2;3171:22;3211:6;3202:15;;3241:6;3233;3226:22;3281:3;3272:6;3267:3;3263:16;3260:25;3257:45;;;3298:1;3295;3288:12;3257:45;3348:6;3343:3;3336:4;3328:6;3324:17;3311:44;3403:1;3396:4;3387:6;3379;3375:19;3371:30;3364:41;;;;2780:631;;;;;:::o;3416:220::-;3458:5;3511:3;3504:4;3496:6;3492:17;3488:27;3478:55;;3529:1;3526;3519:12;3478:55;3551:79;3626:3;3617:6;3604:20;3597:4;3589:6;3585:17;3551:79;:::i;3641:594::-;3745:6;3753;3761;3769;3777;3830:3;3818:9;3809:7;3805:23;3801:33;3798:53;;;3847:1;3844;3837:12;3798:53;3883:9;3870:23;3860:33;;3944:2;3933:9;3929:18;3916:32;3971:18;3963:6;3960:30;3957:50;;;4003:1;4000;3993:12;3957:50;4026:49;4067:7;4058:6;4047:9;4043:22;4026:49;:::i;:::-;3641:594;;4016:59;;-1:-1:-1;;;;4122:2:15;4107:18;;4094:32;;4173:2;4158:18;;4145:32;;4224:3;4209:19;;;4196:33;;-1:-1:-1;3641:594:15;-1:-1:-1;3641:594:15:o;4240:400::-;4334:6;4342;4350;4403:2;4391:9;4382:7;4378:23;4374:32;4371:52;;;4419:1;4416;4409:12;4371:52;4458:9;4445:23;4477:31;4502:5;4477:31;:::i;:::-;4527:5;4579:2;4564:18;;4551:32;;-1:-1:-1;4630:2:15;4615:18;;;4602:32;;4240:400;-1:-1:-1;;;4240:400:15:o;4645:456::-;4722:6;4730;4738;4791:2;4779:9;4770:7;4766:23;4762:32;4759:52;;;4807:1;4804;4797:12;4759:52;4846:9;4833:23;4865:31;4890:5;4865:31;:::i;:::-;4915:5;-1:-1:-1;4972:2:15;4957:18;;4944:32;4985:33;4944:32;4985:33;:::i;:::-;4645:456;;5037:7;;-1:-1:-1;;;5091:2:15;5076:18;;;;5063:32;;4645:456::o;5106:118::-;5192:5;5185:13;5178:21;5171:5;5168:32;5158:60;;5214:1;5211;5204:12;5229:241;5285:6;5338:2;5326:9;5317:7;5313:23;5309:32;5306:52;;;5354:1;5351;5344:12;5306:52;5393:9;5380:23;5412:28;5434:5;5412:28;:::i;5475:450::-;5544:6;5597:2;5585:9;5576:7;5572:23;5568:32;5565:52;;;5613:1;5610;5603:12;5565:52;5653:9;5640:23;5686:18;5678:6;5675:30;5672:50;;;5718:1;5715;5708:12;5672:50;5741:22;;5794:4;5786:13;;5782:27;-1:-1:-1;5772:55:15;;5823:1;5820;5813:12;5772:55;5846:73;5911:7;5906:2;5893:16;5888:2;5884;5880:11;5846:73;:::i;6533:382::-;6598:6;6606;6659:2;6647:9;6638:7;6634:23;6630:32;6627:52;;;6675:1;6672;6665:12;6627:52;6714:9;6701:23;6733:31;6758:5;6733:31;:::i;:::-;6783:5;-1:-1:-1;6840:2:15;6825:18;;6812:32;6853:30;6812:32;6853:30;:::i;:::-;6902:7;6892:17;;;6533:382;;;;;:::o;6920:665::-;7015:6;7023;7031;7039;7092:3;7080:9;7071:7;7067:23;7063:33;7060:53;;;7109:1;7106;7099:12;7060:53;7148:9;7135:23;7167:31;7192:5;7167:31;:::i;:::-;7217:5;-1:-1:-1;7274:2:15;7259:18;;7246:32;7287:33;7246:32;7287:33;:::i;:::-;7339:7;-1:-1:-1;7393:2:15;7378:18;;7365:32;;-1:-1:-1;7448:2:15;7433:18;;7420:32;7475:18;7464:30;;7461:50;;;7507:1;7504;7497:12;7461:50;7530:49;7571:7;7562:6;7551:9;7547:22;7530:49;:::i;:::-;7520:59;;;6920:665;;;;;;;:::o;7590:671::-;7676:6;7684;7692;7700;7753:3;7741:9;7732:7;7728:23;7724:33;7721:53;;;7770:1;7767;7760:12;7721:53;7809:9;7796:23;7828:31;7853:5;7828:31;:::i;:::-;7878:5;-1:-1:-1;7935:2:15;7920:18;;7907:32;7948:33;7907:32;7948:33;:::i;:::-;8000:7;-1:-1:-1;8059:2:15;8044:18;;8031:32;8072:33;8031:32;8072:33;:::i;:::-;8124:7;-1:-1:-1;8183:2:15;8168:18;;8155:32;8196:33;8155:32;8196:33;:::i;:::-;7590:671;;;;-1:-1:-1;7590:671:15;;-1:-1:-1;;7590:671:15:o;8266:248::-;8334:6;8342;8395:2;8383:9;8374:7;8370:23;8366:32;8363:52;;;8411:1;8408;8401:12;8363:52;-1:-1:-1;;8434:23:15;;;8504:2;8489:18;;;8476:32;;-1:-1:-1;8266:248:15:o;8519:388::-;8587:6;8595;8648:2;8636:9;8627:7;8623:23;8619:32;8616:52;;;8664:1;8661;8654:12;8616:52;8703:9;8690:23;8722:31;8747:5;8722:31;:::i;:::-;8772:5;-1:-1:-1;8829:2:15;8814:18;;8801:32;8842:33;8801:32;8842:33;:::i;8912:356::-;9114:2;9096:21;;;9133:18;;;9126:30;9192:34;9187:2;9172:18;;9165:62;9259:2;9244:18;;8912:356::o;9273:380::-;9352:1;9348:12;;;;9395;;;9416:61;;9470:4;9462:6;9458:17;9448:27;;9416:61;9523:2;9515:6;9512:14;9492:18;9489:38;9486:161;;;9569:10;9564:3;9560:20;9557:1;9550:31;9604:4;9601:1;9594:15;9632:4;9629:1;9622:15;9486:161;;9273:380;;;:::o;9658:355::-;9860:2;9842:21;;;9899:2;9879:18;;;9872:30;9938:33;9933:2;9918:18;;9911:61;10004:2;9989:18;;9658:355::o;10018:328::-;10220:2;10202:21;;;10259:1;10239:18;;;10232:29;-1:-1:-1;;;10292:2:15;10277:18;;10270:35;10337:2;10322:18;;10018:328::o;10698:127::-;10759:10;10754:3;10750:20;10747:1;10740:31;10790:4;10787:1;10780:15;10814:4;10811:1;10804:15;10830:128;10870:3;10901:1;10897:6;10894:1;10891:13;10888:39;;;10907:18;;:::i;:::-;-1:-1:-1;10943:9:15;;10830:128::o;10963:336::-;11165:2;11147:21;;;11204:2;11184:18;;;11177:30;-1:-1:-1;;;11238:2:15;11223:18;;11216:42;11290:2;11275:18;;10963:336::o;11987:184::-;12057:6;12110:2;12098:9;12089:7;12085:23;12081:32;12078:52;;;12126:1;12123;12116:12;12078:52;-1:-1:-1;12149:16:15;;11987:184;-1:-1:-1;11987:184:15:o;16485:125::-;16525:4;16553:1;16550;16547:8;16544:34;;;16558:18;;:::i;:::-;-1:-1:-1;16595:9:15;;16485:125::o;17586:413::-;17788:2;17770:21;;;17827:2;17807:18;;;17800:30;17866:34;17861:2;17846:18;;17839:62;-1:-1:-1;;;17932:2:15;17917:18;;17910:47;17989:3;17974:19;;17586:413::o;20253:245::-;20320:6;20373:2;20361:9;20352:7;20348:23;20344:32;20341:52;;;20389:1;20386;20379:12;20341:52;20421:9;20415:16;20440:28;20462:5;20440:28;:::i;21875:168::-;21915:7;21981:1;21977;21973:6;21969:14;21966:1;21963:21;21958:1;21951:9;21944:17;21940:45;21937:71;;;21988:18;;:::i;:::-;-1:-1:-1;22028:9:15;;21875:168::o;22938:185::-;22980:3;23018:5;23012:12;23033:52;23078:6;23073:3;23066:4;23059:5;23055:16;23033:52;:::i;:::-;23101:16;;;;;22938:185;-1:-1:-1;;22938:185:15:o;23128:1174::-;23304:3;23333:1;23366:6;23360:13;23396:3;23418:1;23446:9;23442:2;23438:18;23428:28;;23506:2;23495:9;23491:18;23528;23518:61;;23572:4;23564:6;23560:17;23550:27;;23518:61;23598:2;23646;23638:6;23635:14;23615:18;23612:38;23609:165;;;-1:-1:-1;;;23673:33:15;;23729:4;23726:1;23719:15;23759:4;23680:3;23747:17;23609:165;23790:18;23817:104;;;;23935:1;23930:320;;;;23783:467;;23817:104;-1:-1:-1;;23850:24:15;;23838:37;;23895:16;;;;-1:-1:-1;23817:104:15;;23930:320;22885:1;22878:14;;;22922:4;22909:18;;24025:1;24039:165;24053:6;24050:1;24047:13;24039:165;;;24131:14;;24118:11;;;24111:35;24174:16;;;;24068:10;;24039:165;;;24043:3;;24233:6;24228:3;24224:16;24217:23;;23783:467;;;;;;;24266:30;24292:3;24284:6;24266:30;:::i;:::-;24259:37;23128:1174;-1:-1:-1;;;;;23128:1174:15:o;25013:280::-;25112:6;25165:2;25153:9;25144:7;25140:23;25136:32;25133:52;;;25181:1;25178;25171:12;25133:52;25213:9;25207:16;25232:31;25257:5;25232:31;:::i;27989:135::-;28028:3;-1:-1:-1;;28049:17:15;;28046:43;;;28069:18;;:::i;:::-;-1:-1:-1;28116:1:15;28105:13;;27989:135::o;28129:414::-;28331:2;28313:21;;;28370:2;28350:18;;;28343:30;28409:34;28404:2;28389:18;;28382:62;-1:-1:-1;;;28475:2:15;28460:18;;28453:48;28533:3;28518:19;;28129:414::o;28548:127::-;28609:10;28604:3;28600:20;28597:1;28590:31;28640:4;28637:1;28630:15;28664:4;28661:1;28654:15;28680:120;28720:1;28746;28736:35;;28751:18;;:::i;:::-;-1:-1:-1;28785:9:15;;28680:120::o;28805:112::-;28837:1;28863;28853:35;;28868:18;;:::i;:::-;-1:-1:-1;28902:9:15;;28805:112::o;28922:127::-;28983:10;28978:3;28974:20;28971:1;28964:31;29014:4;29011:1;29004:15;29038:4;29035:1;29028:15;29054:500;-1:-1:-1;;;;;29323:15:15;;;29305:34;;29375:15;;29370:2;29355:18;;29348:43;29422:2;29407:18;;29400:34;;;29470:3;29465:2;29450:18;;29443:31;;;29248:4;;29491:57;;29528:19;;29520:6;29491:57;:::i;:::-;29483:65;29054:500;-1:-1:-1;;;;;;29054:500:15:o;29559:249::-;29628:6;29681:2;29669:9;29660:7;29656:23;29652:32;29649:52;;;29697:1;29694;29687:12;29649:52;29729:9;29723:16;29748:30;29772:5;29748:30;:::i;29813:127::-;29874:10;29869:3;29865:20;29862:1;29855:31;29905:4;29902:1;29895:15;29929:4;29926:1;29919:15

Swarm Source

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