ETH Price: $2,454.80 (-1.33%)

Token

AssassinApeClub (AAC)
 

Overview

Max Total Supply

1,526 AAC

Holders

588

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 AAC
0xBa367A8c44f0E814c02c28c5029b4ff2039c03B8
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
AssassinApeClub

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 13 : AssassinApeClub.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.2;

import "@openzeppelin/contracts/access/Ownable.sol";
import "erc721a/contracts/ERC721A.sol";
import "@openzeppelin/contracts/security/ReentrancyGuard.sol";

contract AssassinApeClub is ERC721A, Ownable, ReentrancyGuard {
    enum Status {
        Waiting,
        Started,
        Finished
    }
    using Strings for uint256;
    Status public status;
    string private baseURI;
    uint256 public constant MAX_MINT_PER_ADDR = 15;
    uint256 public constant MAX_FREE_MINT_PER_ADDR = 2;
    uint256 public PUBLIC_PRICE = 0.0016 * 10**18;
    uint256 public constant MAX_SUPPLY = 5555;
    uint256 public constant FREE_MINT_SUPPLY = 1000;
    uint256 public INSTANT_FREE_MINTED = 0;

    event Minted(address minter, uint256 amount);

    constructor(string memory initBaseURI)
        ERC721A("AssassinApeClub", "AAC")
    {
        baseURI = initBaseURI;
        _safeMint(msg.sender, MAX_FREE_MINT_PER_ADDR);
    }

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

    function setBaseURI(string calldata newBaseURI) external onlyOwner {
        baseURI = newBaseURI;
    }

    function mint(uint256 quantity) external payable nonReentrant {
        require(status == Status.Started, "-Not started yet-");
        require(tx.origin == msg.sender, "-Contract call not allowed-");
        require(
            numberMinted(msg.sender) + quantity <= MAX_MINT_PER_ADDR,
            "-This is more than allowed-"
        );
        require(
            totalSupply() + quantity <= MAX_SUPPLY,
            "-Not enough quantity-"
        );

        uint256 _cost;
        if (INSTANT_FREE_MINTED < FREE_MINT_SUPPLY) {
            uint256 remainFreeAmont = (numberMinted(msg.sender) <
                MAX_FREE_MINT_PER_ADDR)
                ? (MAX_FREE_MINT_PER_ADDR - numberMinted(msg.sender))
                : 0;

            _cost =
                PUBLIC_PRICE *
                (
                    (quantity <= remainFreeAmont)
                        ? 0
                        : (quantity - remainFreeAmont)
                );

            INSTANT_FREE_MINTED += (
                (quantity <= remainFreeAmont) ? quantity : remainFreeAmont
            );
        } else {
            _cost = PUBLIC_PRICE * quantity;
        }
        require(msg.value >= _cost, "-Not enough ETH-");
        _safeMint(msg.sender, quantity);
        emit Minted(msg.sender, quantity);
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function setStatus(Status _status) external onlyOwner {
        status = _status;
    }

    function withdraw(address payable recipient)
        external
        onlyOwner
        nonReentrant
    {
        uint256 balance = address(this).balance;
        (bool success, ) = recipient.call{value: balance}("");
        require(success, "-Withdraw failed-");
    }

    function updatePrice(uint256 __price) external onlyOwner {
        PUBLIC_PRICE = __price;
    }
}

File 2 of 13 : 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 3 of 13 : ERC721A.sol
// SPDX-License-Identifier: MIT
// Creator: Chiru Labs

pragma solidity ^0.8.4;

import '@openzeppelin/contracts/token/ERC721/IERC721.sol';
import '@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol';
import '@openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol';
import '@openzeppelin/contracts/utils/Address.sol';
import '@openzeppelin/contracts/utils/Context.sol';
import '@openzeppelin/contracts/utils/Strings.sol';
import '@openzeppelin/contracts/utils/introspection/ERC165.sol';

error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintedQueryForZeroAddress();
error BurnedQueryForZeroAddress();
error AuxQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerIndexOutOfBounds();
error OwnerQueryForNonexistentToken();
error TokenIndexOutOfBounds();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

    // The tokenId of the next token to be minted.
    uint256 internal _currentIndex;

    // The number of tokens burned.
    uint256 internal _burnCounter;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

    // 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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
        _currentIndex = _startTokenId();
    }

    /**
     * To change the starting tokenId, please override this function.
     */
    function _startTokenId() internal view virtual returns (uint256) {
        return 0;
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * Returns the total amount of tokens minted in the contract.
     */
    function _totalMinted() internal view returns (uint256) {
        // Counter underflow is impossible as _currentIndex does not decrement,
        // and it is initialized to _startTokenId()
        unchecked {
            return _currentIndex - _startTokenId();
        }
    }

    /**
     * @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 override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return uint256(_addressData[owner].balance);
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert MintedQueryForZeroAddress();
        return uint256(_addressData[owner].numberMinted);
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        if (owner == address(0)) revert BurnedQueryForZeroAddress();
        return uint256(_addressData[owner].numberBurned);
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        return _addressData[owner].aux;
    }

    /**
     * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal {
        if (owner == address(0)) revert AuxQueryForZeroAddress();
        _addressData[owner].aux = aux;
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // Invariant:
                    // There will always be an ownership that has an address and is not burned
                    // before an ownership that does not have an address and is not burned.
                    // Hence, curr will not underflow.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view override returns (address) {
        return ownershipOf(tokenId).addr;
    }

    /**
     * @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) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        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 override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

        if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {
            revert ApprovalCallerNotOwnerNorApproved();
        }

        _approve(to, tokenId, owner);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public override {
        if (operator == _msgSender()) revert ApproveToCaller();

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _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 {
        _transfer(from, to, tokenId);
        if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {
            revert TransferToNonERC721ReceiverImplementer();
        }
    }

    /**
     * @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`),
     */
    function _exists(uint256 tokenId) internal view returns (bool) {
        return _startTokenId() <= tokenId && tokenId < _currentIndex &&
            !_ownerships[tokenId].burned;
    }

    function _safeMint(address to, uint256 quantity) internal {
        _safeMint(to, quantity, '');
    }

    /**
     * @dev Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

        _beforeTokenTransfers(address(0), to, startTokenId, quantity);

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;
            uint256 end = updatedIndex + quantity;

            if (safe && to.isContract()) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex != end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex != end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * 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
    ) private {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
            isApprovedForAll(prevOwnership.addr, _msgSender()) ||
            getApproved(tokenId) == _msgSender());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(from, to, tokenId);
        _afterTokenTransfers(from, to, tokenId, 1);
    }

    /**
     * @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 {
        TokenOwnership memory prevOwnership = ownershipOf(tokenId);

        _beforeTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[prevOwnership.addr].balance -= 1;
            _addressData[prevOwnership.addr].numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            _ownerships[tokenId].addr = prevOwnership.addr;
            _ownerships[tokenId].startTimestamp = uint64(block.timestamp);
            _ownerships[tokenId].burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            if (_ownerships[nextTokenId].addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId < _currentIndex) {
                    _ownerships[nextTokenId].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        emit Transfer(prevOwnership.addr, address(0), tokenId);
        _afterTokenTransfers(prevOwnership.addr, address(0), tokenId, 1);

        // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.
        unchecked {
            _burnCounter++;
        }
    }

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

    /**
     * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

    /**
     * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
     * And also called before burning one token.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * 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, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _beforeTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}

    /**
     * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
     * minting.
     * And also called after one token has been burned.
     *
     * startTokenId - the first token id to be transferred
     * quantity - the amount to be transferred
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been
     * transferred to `to`.
     * - When `from` is zero, `tokenId` has been minted for `to`.
     * - When `to` is zero, `tokenId` has been burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _afterTokenTransfers(
        address from,
        address to,
        uint256 startTokenId,
        uint256 quantity
    ) internal virtual {}
}

File 4 of 13 : 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;
    }
}

File 5 of 13 : 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 6 of 13 : 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 7 of 13 : 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 13 : 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 13 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "../IERC721.sol";

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

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

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

File 10 of 13 : Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 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 11 of 13 : 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 12 of 13 : 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 13 of 13 : 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);
}

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"initBaseURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"MintedQueryForZeroAddress","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"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":false,"internalType":"address","name":"minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FREE_MINT_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"INSTANT_FREE_MINTED","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_FREE_MINT_PER_ADDR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_MINT_PER_ADDR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PUBLIC_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"enum AssassinApeClub.Status","name":"_status","type":"uint8"}],"name":"setStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"status","outputs":[{"internalType":"enum AssassinApeClub.Status","name":"","type":"uint8"}],"stateMutability":"view","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":"uint256","name":"__price","type":"uint256"}],"name":"updatePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"recipient","type":"address"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526605af3107a40000600c556000600d553480156200002157600080fd5b50604051620047103803806200471083398181016040528101906200004791906200096d565b6040518060400160405280600f81526020017f417373617373696e417065436c756200000000000000000000000000000000008152506040518060400160405280600381526020017f41414300000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000cb92919062000808565b508060039080519060200190620000e492919062000808565b50620000f56200015860201b60201c565b60008190555050506200011d620001116200015d60201b60201c565b6200016560201b60201c565b600160098190555080600b90805190602001906200013d92919062000808565b50620001513360026200022b60201b60201c565b5062000c79565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200024d8282604051806020016040528060008152506200025160201b60201c565b5050565b6200026683838360016200026b60201b60201c565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415620002d9576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600084141562000315576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200032a60008683876200066760201b60201c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015620005025750620005018773ffffffffffffffffffffffffffffffffffffffff166200066d60201b620017cb1760201c565b5b15620005d5575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46200058060008884806001019550886200069060201b60201c565b620005b7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082141562000509578260005414620005cf57600080fd5b62000642565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415620005d6575b8160008190555050506200066060008683876200080260201b60201c565b5050505050565b50505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006be6200015d60201b60201c565b8786866040518563ffffffff1660e01b8152600401620006e2949392919062000a15565b602060405180830381600087803b158015620006fd57600080fd5b505af19250505080156200073157506040513d601f19601f820116820180604052508101906200072e919062000941565b60015b620007af573d806000811462000764576040519150601f19603f3d011682016040523d82523d6000602084013e62000769565b606091505b50600081511415620007a7576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b828054620008169062000b84565b90600052602060002090601f0160209004810192826200083a576000855562000886565b82601f106200085557805160ff191683800117855562000886565b8280016001018555821562000886579182015b828111156200088557825182559160200191906001019062000868565b5b50905062000895919062000899565b5090565b5b80821115620008b45760008160009055506001016200089a565b5090565b6000620008cf620008c98462000a92565b62000a69565b905082815260208101848484011115620008e857600080fd5b620008f584828562000b4e565b509392505050565b6000815190506200090e8162000c5f565b92915050565b600082601f8301126200092657600080fd5b815162000938848260208601620008b8565b91505092915050565b6000602082840312156200095457600080fd5b60006200096484828501620008fd565b91505092915050565b6000602082840312156200098057600080fd5b600082015167ffffffffffffffff8111156200099b57600080fd5b620009a98482850162000914565b91505092915050565b620009bd8162000ae4565b82525050565b6000620009d08262000ac8565b620009dc818562000ad3565b9350620009ee81856020860162000b4e565b620009f98162000c4e565b840191505092915050565b62000a0f8162000b44565b82525050565b600060808201905062000a2c6000830187620009b2565b62000a3b6020830186620009b2565b62000a4a604083018562000a04565b818103606083015262000a5e8184620009c3565b905095945050505050565b600062000a7562000a88565b905062000a83828262000bba565b919050565b6000604051905090565b600067ffffffffffffffff82111562000ab05762000aaf62000c1f565b5b62000abb8262000c4e565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600062000af18262000b24565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000b6e57808201518184015260208101905062000b51565b8381111562000b7e576000848401525b50505050565b6000600282049050600182168062000b9d57607f821691505b6020821081141562000bb45762000bb362000bf0565b5b50919050565b62000bc58262000c4e565b810181811067ffffffffffffffff8211171562000be75762000be662000c1f565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b62000c6a8162000af8565b811462000c7657600080fd5b50565b613a878062000c896000396000f3fe6080604052600436106101cd5760003560e01c80636352211e116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd14610643578063dc33e68114610680578063e985e9c5146106bd578063f2fde38b146106fa576101cd565b806395d89b41146105aa578063a0712d68146105d5578063a22cb465146105f1578063b88d4fde1461061a576101cd565b8063715018a6116100d1578063715018a61461051457806382481c0e1461052b5780638d6cc56d146105565780638da5cb5b1461057f576101cd565b80636352211e1461046f57806363eb8bb6146104ac57806370a08231146104d7576101cd565b8063200d2ed21161016f57806342842e0e1161013e57806342842e0e146103c957806351cff8d9146103f257806355f804b31461041b578063611f3f1014610444576101cd565b8063200d2ed21461032157806323b872dd1461034c5780632e49d78b1461037557806332cb6b0c1461039e576101cd565b8063081812fc116101ab578063081812fc14610265578063095ea7b3146102a257806316154862146102cb57806318160ddd146102f6576101cd565b806301ffc9a7146101d25780630528eb431461020f57806306fdde031461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612e1f565b610723565b604051610206919061320e565b60405180910390f35b34801561021b57600080fd5b50610224610805565b6040516102319190613386565b60405180910390f35b34801561024657600080fd5b5061024f61080a565b60405161025c9190613244565b60405180910390f35b34801561027157600080fd5b5061028c60048036038101906102879190612edf565b61089c565b604051610299919061317e565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190612de3565b610918565b005b3480156102d757600080fd5b506102e0610a23565b6040516102ed9190613386565b60405180910390f35b34801561030257600080fd5b5061030b610a28565b6040516103189190613386565b60405180910390f35b34801561032d57600080fd5b50610336610a3f565b6040516103439190613229565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e9190612cdd565b610a52565b005b34801561038157600080fd5b5061039c60048036038101906103979190612e71565b610a62565b005b3480156103aa57600080fd5b506103b3610b31565b6040516103c09190613386565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb9190612cdd565b610b37565b005b3480156103fe57600080fd5b5061041960048036038101906104149190612c78565b610b57565b005b34801561042757600080fd5b50610442600480360381019061043d9190612e9a565b610cdf565b005b34801561045057600080fd5b50610459610d71565b6040516104669190613386565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190612edf565b610d77565b6040516104a3919061317e565b60405180910390f35b3480156104b857600080fd5b506104c1610d8d565b6040516104ce9190613386565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190612c4f565b610d93565b60405161050b9190613386565b60405180910390f35b34801561052057600080fd5b50610529610e63565b005b34801561053757600080fd5b50610540610eeb565b60405161054d9190613386565b60405180910390f35b34801561056257600080fd5b5061057d60048036038101906105789190612edf565b610ef1565b005b34801561058b57600080fd5b50610594610f77565b6040516105a1919061317e565b60405180910390f35b3480156105b657600080fd5b506105bf610fa1565b6040516105cc9190613244565b60405180910390f35b6105ef60048036038101906105ea9190612edf565b611033565b005b3480156105fd57600080fd5b5061061860048036038101906106139190612da7565b61139a565b005b34801561062657600080fd5b50610641600480360381019061063c9190612d2c565b611512565b005b34801561064f57600080fd5b5061066a60048036038101906106659190612edf565b61158e565b6040516106779190613244565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a29190612c4f565b61162d565b6040516106b49190613386565b60405180910390f35b3480156106c957600080fd5b506106e460048036038101906106df9190612ca1565b61163f565b6040516106f1919061320e565b60405180910390f35b34801561070657600080fd5b50610721600480360381019061071c9190612c4f565b6116d3565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ee57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107fe57506107fd826117ee565b5b9050919050565b600281565b60606002805461081990613647565b80601f016020809104026020016040519081016040528092919081815260200182805461084590613647565b80156108925780601f1061086757610100808354040283529160200191610892565b820191906000526020600020905b81548152906001019060200180831161087557829003601f168201915b5050505050905090565b60006108a782611858565b6108dd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092382610d77565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561098b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109aa6118a6565b73ffffffffffffffffffffffffffffffffffffffff16141580156109dc57506109da816109d56118a6565b61163f565b155b15610a13576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a1e8383836118ae565b505050565b600f81565b6000610a32611960565b6001546000540303905090565b600a60009054906101000a900460ff1681565b610a5d838383611965565b505050565b610a6a6118a6565b73ffffffffffffffffffffffffffffffffffffffff16610a88610f77565b73ffffffffffffffffffffffffffffffffffffffff1614610ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad590613326565b60405180910390fd5b80600a60006101000a81548160ff02191690836002811115610b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b6115b381565b610b5283838360405180602001604052806000815250611512565b505050565b610b5f6118a6565b73ffffffffffffffffffffffffffffffffffffffff16610b7d610f77565b73ffffffffffffffffffffffffffffffffffffffff1614610bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bca90613326565b60405180910390fd5b60026009541415610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1090613346565b60405180910390fd5b6002600981905550600047905060008273ffffffffffffffffffffffffffffffffffffffff1682604051610c4c90613169565b60006040518083038185875af1925050503d8060008114610c89576040519150601f19603f3d011682016040523d82523d6000602084013e610c8e565b606091505b5050905080610cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc990613286565b60405180910390fd5b5050600160098190555050565b610ce76118a6565b73ffffffffffffffffffffffffffffffffffffffff16610d05610f77565b73ffffffffffffffffffffffffffffffffffffffff1614610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5290613326565b60405180910390fd5b8181600b9190610d6c929190612a24565b505050565b600c5481565b6000610d8282611e56565b600001519050919050565b6103e881565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dfb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e6b6118a6565b73ffffffffffffffffffffffffffffffffffffffff16610e89610f77565b73ffffffffffffffffffffffffffffffffffffffff1614610edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed690613326565b60405180910390fd5b610ee960006120e5565b565b600d5481565b610ef96118a6565b73ffffffffffffffffffffffffffffffffffffffff16610f17610f77565b73ffffffffffffffffffffffffffffffffffffffff1614610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490613326565b60405180910390fd5b80600c8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610fb090613647565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdc90613647565b80156110295780601f10610ffe57610100808354040283529160200191611029565b820191906000526020600020905b81548152906001019060200180831161100c57829003601f168201915b5050505050905090565b60026009541415611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090613346565b60405180910390fd5b6002600981905550600160028111156110bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600a60009054906101000a900460ff166002811115611103577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a90613366565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146111b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a8906132a6565b60405180910390fd5b600f816111bd3361162d565b6111c79190613445565b1115611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff90613306565b60405180910390fd5b6115b381611214610a28565b61121e9190613445565b111561125f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611256906132e6565b60405180910390fd5b60006103e8600d5410156112f7576000600261127a3361162d565b1061128657600061129c565b61128f3361162d565b600261129b9190613526565b5b9050808311156112b75780836112b29190613526565b6112ba565b60005b600c546112c791906134cc565b9150808311156112d757806112d9565b825b600d60008282546112ea9190613445565b9250508190555050611308565b81600c5461130591906134cc565b90505b8034101561134b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611342906132c6565b60405180910390fd5b61135533836121ab565b7f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe33836040516113869291906131e5565b60405180910390a150600160098190555050565b6113a26118a6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611407576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006114146118a6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114c16118a6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611506919061320e565b60405180910390a35050565b61151d848484611965565b61153c8373ffffffffffffffffffffffffffffffffffffffff166117cb565b8015611551575061154f848484846121c9565b155b15611588576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061159982611858565b6115cf576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115d9612329565b90506000815114156115fa5760405180602001604052806000815250611625565b80611604846123bb565b604051602001611615929190613145565b6040516020818303038152906040525b915050919050565b600061163882612568565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116db6118a6565b73ffffffffffffffffffffffffffffffffffffffff166116f9610f77565b73ffffffffffffffffffffffffffffffffffffffff161461174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174690613326565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b690613266565b60405180910390fd5b6117c8816120e5565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611863611960565b11158015611872575060005482105b801561189f575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061197082611e56565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166119976118a6565b73ffffffffffffffffffffffffffffffffffffffff1614806119ca57506119c982600001516119c46118a6565b61163f565b5b80611a0f57506119d86118a6565b73ffffffffffffffffffffffffffffffffffffffff166119f78461089c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a48576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611ab1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b18576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b258585856001612638565b611b3560008484600001516118ae565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611de657600054811015611de55782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e4f858585600161263e565b5050505050565b611e5e612aaa565b600082905080611e6c611960565b11158015611e7b575060005481105b156120ae576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516120ac57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f905780925050506120e0565b5b6001156120ab57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120a65780925050506120e0565b611f91565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121c5828260405180602001604052806000815250612644565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121ef6118a6565b8786866040518563ffffffff1660e01b81526004016122119493929190613199565b602060405180830381600087803b15801561222b57600080fd5b505af192505050801561225c57506040513d601f19601f820116820180604052508101906122599190612e48565b60015b6122d6573d806000811461228c576040519150601f19603f3d011682016040523d82523d6000602084013e612291565b606091505b506000815114156122ce576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b805461233890613647565b80601f016020809104026020016040519081016040528092919081815260200182805461236490613647565b80156123b15780601f10612386576101008083540402835291602001916123b1565b820191906000526020600020905b81548152906001019060200180831161239457829003601f168201915b5050505050905090565b60606000821415612403576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612563565b600082905060005b6000821461243557808061241e906136aa565b915050600a8261242e919061349b565b915061240b565b60008167ffffffffffffffff811115612477577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124a95781602001600182028036833780820191505090505b5090505b6000851461255c576001826124c29190613526565b9150600a856124d191906136f3565b60306124dd9190613445565b60f81b818381518110612519577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612555919061349b565b94506124ad565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125d0576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b6126518383836001612656565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156126c3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156126fe576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61270b6000868387612638565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156128d557506128d48773ffffffffffffffffffffffffffffffffffffffff166117cb565b5b1561299b575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461294a60008884806001019550886121c9565b612980576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156128db57826000541461299657600080fd5b612a07565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561299c575b816000819055505050612a1d600086838761263e565b5050505050565b828054612a3090613647565b90600052602060002090601f016020900481019282612a525760008555612a99565b82601f10612a6b57803560ff1916838001178555612a99565b82800160010185558215612a99579182015b82811115612a98578235825591602001919060010190612a7d565b5b509050612aa69190612aed565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612b06576000816000905550600101612aee565b5090565b6000612b1d612b18846133c6565b6133a1565b905082815260208101848484011115612b3557600080fd5b612b40848285613605565b509392505050565b600081359050612b57816139ce565b92915050565b600081359050612b6c816139e5565b92915050565b600081359050612b81816139fc565b92915050565b600081359050612b9681613a13565b92915050565b600081519050612bab81613a13565b92915050565b600082601f830112612bc257600080fd5b8135612bd2848260208601612b0a565b91505092915050565b600081359050612bea81613a2a565b92915050565b60008083601f840112612c0257600080fd5b8235905067ffffffffffffffff811115612c1b57600080fd5b602083019150836001820283011115612c3357600080fd5b9250929050565b600081359050612c4981613a3a565b92915050565b600060208284031215612c6157600080fd5b6000612c6f84828501612b48565b91505092915050565b600060208284031215612c8a57600080fd5b6000612c9884828501612b5d565b91505092915050565b60008060408385031215612cb457600080fd5b6000612cc285828601612b48565b9250506020612cd385828601612b48565b9150509250929050565b600080600060608486031215612cf257600080fd5b6000612d0086828701612b48565b9350506020612d1186828701612b48565b9250506040612d2286828701612c3a565b9150509250925092565b60008060008060808587031215612d4257600080fd5b6000612d5087828801612b48565b9450506020612d6187828801612b48565b9350506040612d7287828801612c3a565b925050606085013567ffffffffffffffff811115612d8f57600080fd5b612d9b87828801612bb1565b91505092959194509250565b60008060408385031215612dba57600080fd5b6000612dc885828601612b48565b9250506020612dd985828601612b72565b9150509250929050565b60008060408385031215612df657600080fd5b6000612e0485828601612b48565b9250506020612e1585828601612c3a565b9150509250929050565b600060208284031215612e3157600080fd5b6000612e3f84828501612b87565b91505092915050565b600060208284031215612e5a57600080fd5b6000612e6884828501612b9c565b91505092915050565b600060208284031215612e8357600080fd5b6000612e9184828501612bdb565b91505092915050565b60008060208385031215612ead57600080fd5b600083013567ffffffffffffffff811115612ec757600080fd5b612ed385828601612bf0565b92509250509250929050565b600060208284031215612ef157600080fd5b6000612eff84828501612c3a565b91505092915050565b612f118161355a565b82525050565b612f208161357e565b82525050565b6000612f31826133f7565b612f3b818561340d565b9350612f4b818560208601613614565b612f548161380f565b840191505092915050565b612f68816135f3565b82525050565b6000612f7982613402565b612f838185613429565b9350612f93818560208601613614565b612f9c8161380f565b840191505092915050565b6000612fb282613402565b612fbc818561343a565b9350612fcc818560208601613614565b80840191505092915050565b6000612fe5602683613429565b9150612ff082613820565b604082019050919050565b6000613008601183613429565b91506130138261386f565b602082019050919050565b600061302b601b83613429565b915061303682613898565b602082019050919050565b600061304e601083613429565b9150613059826138c1565b602082019050919050565b6000613071601583613429565b915061307c826138ea565b602082019050919050565b6000613094601b83613429565b915061309f82613913565b602082019050919050565b60006130b7602083613429565b91506130c28261393c565b602082019050919050565b60006130da60008361341e565b91506130e582613965565b600082019050919050565b60006130fd601f83613429565b915061310882613968565b602082019050919050565b6000613120601183613429565b915061312b82613991565b602082019050919050565b61313f816135e9565b82525050565b60006131518285612fa7565b915061315d8284612fa7565b91508190509392505050565b6000613174826130cd565b9150819050919050565b60006020820190506131936000830184612f08565b92915050565b60006080820190506131ae6000830187612f08565b6131bb6020830186612f08565b6131c86040830185613136565b81810360608301526131da8184612f26565b905095945050505050565b60006040820190506131fa6000830185612f08565b6132076020830184613136565b9392505050565b60006020820190506132236000830184612f17565b92915050565b600060208201905061323e6000830184612f5f565b92915050565b6000602082019050818103600083015261325e8184612f6e565b905092915050565b6000602082019050818103600083015261327f81612fd8565b9050919050565b6000602082019050818103600083015261329f81612ffb565b9050919050565b600060208201905081810360008301526132bf8161301e565b9050919050565b600060208201905081810360008301526132df81613041565b9050919050565b600060208201905081810360008301526132ff81613064565b9050919050565b6000602082019050818103600083015261331f81613087565b9050919050565b6000602082019050818103600083015261333f816130aa565b9050919050565b6000602082019050818103600083015261335f816130f0565b9050919050565b6000602082019050818103600083015261337f81613113565b9050919050565b600060208201905061339b6000830184613136565b92915050565b60006133ab6133bc565b90506133b78282613679565b919050565b6000604051905090565b600067ffffffffffffffff8211156133e1576133e06137e0565b5b6133ea8261380f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613450826135e9565b915061345b836135e9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134905761348f613724565b5b828201905092915050565b60006134a6826135e9565b91506134b1836135e9565b9250826134c1576134c0613753565b5b828204905092915050565b60006134d7826135e9565b91506134e2836135e9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561351b5761351a613724565b5b828202905092915050565b6000613531826135e9565b915061353c836135e9565b92508282101561354f5761354e613724565b5b828203905092915050565b6000613565826135c9565b9050919050565b6000613577826135c9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506135c4826139ba565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006135fe826135b6565b9050919050565b82818337600083830152505050565b60005b83811015613632578082015181840152602081019050613617565b83811115613641576000848401525b50505050565b6000600282049050600182168061365f57607f821691505b60208210811415613673576136726137b1565b5b50919050565b6136828261380f565b810181811067ffffffffffffffff821117156136a1576136a06137e0565b5b80604052505050565b60006136b5826135e9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136e8576136e7613724565b5b600182019050919050565b60006136fe826135e9565b9150613709836135e9565b92508261371957613718613753565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f2d5769746864726177206661696c65642d000000000000000000000000000000600082015250565b7f2d436f6e74726163742063616c6c206e6f7420616c6c6f7765642d0000000000600082015250565b7f2d4e6f7420656e6f756768204554482d00000000000000000000000000000000600082015250565b7f2d4e6f7420656e6f756768207175616e746974792d0000000000000000000000600082015250565b7f2d54686973206973206d6f7265207468616e20616c6c6f7765642d0000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2d4e6f742073746172746564207965742d000000000000000000000000000000600082015250565b600381106139cb576139ca613782565b5b50565b6139d78161355a565b81146139e257600080fd5b50565b6139ee8161356c565b81146139f957600080fd5b50565b613a058161357e565b8114613a1057600080fd5b50565b613a1c8161358a565b8114613a2757600080fd5b50565b60038110613a3757600080fd5b50565b613a43816135e9565b8114613a4e57600080fd5b5056fea2646970667358221220eeccf6bbf56874e975f96e65896a68452f2448681c0b9a2d4c5752d8f508903e64736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d634773647557685358416f4372564a426f434a6e4b3735577843434238476b4d5678736f387472396242584e2f00000000000000000000

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c80636352211e116100f757806395d89b4111610095578063c87b56dd11610064578063c87b56dd14610643578063dc33e68114610680578063e985e9c5146106bd578063f2fde38b146106fa576101cd565b806395d89b41146105aa578063a0712d68146105d5578063a22cb465146105f1578063b88d4fde1461061a576101cd565b8063715018a6116100d1578063715018a61461051457806382481c0e1461052b5780638d6cc56d146105565780638da5cb5b1461057f576101cd565b80636352211e1461046f57806363eb8bb6146104ac57806370a08231146104d7576101cd565b8063200d2ed21161016f57806342842e0e1161013e57806342842e0e146103c957806351cff8d9146103f257806355f804b31461041b578063611f3f1014610444576101cd565b8063200d2ed21461032157806323b872dd1461034c5780632e49d78b1461037557806332cb6b0c1461039e576101cd565b8063081812fc116101ab578063081812fc14610265578063095ea7b3146102a257806316154862146102cb57806318160ddd146102f6576101cd565b806301ffc9a7146101d25780630528eb431461020f57806306fdde031461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f49190612e1f565b610723565b604051610206919061320e565b60405180910390f35b34801561021b57600080fd5b50610224610805565b6040516102319190613386565b60405180910390f35b34801561024657600080fd5b5061024f61080a565b60405161025c9190613244565b60405180910390f35b34801561027157600080fd5b5061028c60048036038101906102879190612edf565b61089c565b604051610299919061317e565b60405180910390f35b3480156102ae57600080fd5b506102c960048036038101906102c49190612de3565b610918565b005b3480156102d757600080fd5b506102e0610a23565b6040516102ed9190613386565b60405180910390f35b34801561030257600080fd5b5061030b610a28565b6040516103189190613386565b60405180910390f35b34801561032d57600080fd5b50610336610a3f565b6040516103439190613229565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e9190612cdd565b610a52565b005b34801561038157600080fd5b5061039c60048036038101906103979190612e71565b610a62565b005b3480156103aa57600080fd5b506103b3610b31565b6040516103c09190613386565b60405180910390f35b3480156103d557600080fd5b506103f060048036038101906103eb9190612cdd565b610b37565b005b3480156103fe57600080fd5b5061041960048036038101906104149190612c78565b610b57565b005b34801561042757600080fd5b50610442600480360381019061043d9190612e9a565b610cdf565b005b34801561045057600080fd5b50610459610d71565b6040516104669190613386565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190612edf565b610d77565b6040516104a3919061317e565b60405180910390f35b3480156104b857600080fd5b506104c1610d8d565b6040516104ce9190613386565b60405180910390f35b3480156104e357600080fd5b506104fe60048036038101906104f99190612c4f565b610d93565b60405161050b9190613386565b60405180910390f35b34801561052057600080fd5b50610529610e63565b005b34801561053757600080fd5b50610540610eeb565b60405161054d9190613386565b60405180910390f35b34801561056257600080fd5b5061057d60048036038101906105789190612edf565b610ef1565b005b34801561058b57600080fd5b50610594610f77565b6040516105a1919061317e565b60405180910390f35b3480156105b657600080fd5b506105bf610fa1565b6040516105cc9190613244565b60405180910390f35b6105ef60048036038101906105ea9190612edf565b611033565b005b3480156105fd57600080fd5b5061061860048036038101906106139190612da7565b61139a565b005b34801561062657600080fd5b50610641600480360381019061063c9190612d2c565b611512565b005b34801561064f57600080fd5b5061066a60048036038101906106659190612edf565b61158e565b6040516106779190613244565b60405180910390f35b34801561068c57600080fd5b506106a760048036038101906106a29190612c4f565b61162d565b6040516106b49190613386565b60405180910390f35b3480156106c957600080fd5b506106e460048036038101906106df9190612ca1565b61163f565b6040516106f1919061320e565b60405180910390f35b34801561070657600080fd5b50610721600480360381019061071c9190612c4f565b6116d3565b005b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107ee57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107fe57506107fd826117ee565b5b9050919050565b600281565b60606002805461081990613647565b80601f016020809104026020016040519081016040528092919081815260200182805461084590613647565b80156108925780601f1061086757610100808354040283529160200191610892565b820191906000526020600020905b81548152906001019060200180831161087557829003601f168201915b5050505050905090565b60006108a782611858565b6108dd576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061092382610d77565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561098b576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109aa6118a6565b73ffffffffffffffffffffffffffffffffffffffff16141580156109dc57506109da816109d56118a6565b61163f565b155b15610a13576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610a1e8383836118ae565b505050565b600f81565b6000610a32611960565b6001546000540303905090565b600a60009054906101000a900460ff1681565b610a5d838383611965565b505050565b610a6a6118a6565b73ffffffffffffffffffffffffffffffffffffffff16610a88610f77565b73ffffffffffffffffffffffffffffffffffffffff1614610ade576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad590613326565b60405180910390fd5b80600a60006101000a81548160ff02191690836002811115610b29577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b021790555050565b6115b381565b610b5283838360405180602001604052806000815250611512565b505050565b610b5f6118a6565b73ffffffffffffffffffffffffffffffffffffffff16610b7d610f77565b73ffffffffffffffffffffffffffffffffffffffff1614610bd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bca90613326565b60405180910390fd5b60026009541415610c19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1090613346565b60405180910390fd5b6002600981905550600047905060008273ffffffffffffffffffffffffffffffffffffffff1682604051610c4c90613169565b60006040518083038185875af1925050503d8060008114610c89576040519150601f19603f3d011682016040523d82523d6000602084013e610c8e565b606091505b5050905080610cd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc990613286565b60405180910390fd5b5050600160098190555050565b610ce76118a6565b73ffffffffffffffffffffffffffffffffffffffff16610d05610f77565b73ffffffffffffffffffffffffffffffffffffffff1614610d5b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5290613326565b60405180910390fd5b8181600b9190610d6c929190612a24565b505050565b600c5481565b6000610d8282611e56565b600001519050919050565b6103e881565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dfb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b610e6b6118a6565b73ffffffffffffffffffffffffffffffffffffffff16610e89610f77565b73ffffffffffffffffffffffffffffffffffffffff1614610edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed690613326565b60405180910390fd5b610ee960006120e5565b565b600d5481565b610ef96118a6565b73ffffffffffffffffffffffffffffffffffffffff16610f17610f77565b73ffffffffffffffffffffffffffffffffffffffff1614610f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f6490613326565b60405180910390fd5b80600c8190555050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610fb090613647565b80601f0160208091040260200160405190810160405280929190818152602001828054610fdc90613647565b80156110295780601f10610ffe57610100808354040283529160200191611029565b820191906000526020600020905b81548152906001019060200180831161100c57829003601f168201915b5050505050905090565b60026009541415611079576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107090613346565b60405180910390fd5b6002600981905550600160028111156110bb577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b600a60009054906101000a900460ff166002811115611103577f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b14611143576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113a90613366565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146111b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111a8906132a6565b60405180910390fd5b600f816111bd3361162d565b6111c79190613445565b1115611208576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ff90613306565b60405180910390fd5b6115b381611214610a28565b61121e9190613445565b111561125f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611256906132e6565b60405180910390fd5b60006103e8600d5410156112f7576000600261127a3361162d565b1061128657600061129c565b61128f3361162d565b600261129b9190613526565b5b9050808311156112b75780836112b29190613526565b6112ba565b60005b600c546112c791906134cc565b9150808311156112d757806112d9565b825b600d60008282546112ea9190613445565b9250508190555050611308565b81600c5461130591906134cc565b90505b8034101561134b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611342906132c6565b60405180910390fd5b61135533836121ab565b7f30385c845b448a36257a6a1716e6ad2e1bc2cbe333cde1e69fe849ad6511adfe33836040516113869291906131e5565b60405180910390a150600160098190555050565b6113a26118a6565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611407576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006114146118a6565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166114c16118a6565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611506919061320e565b60405180910390a35050565b61151d848484611965565b61153c8373ffffffffffffffffffffffffffffffffffffffff166117cb565b8015611551575061154f848484846121c9565b155b15611588576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b606061159982611858565b6115cf576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006115d9612329565b90506000815114156115fa5760405180602001604052806000815250611625565b80611604846123bb565b604051602001611615929190613145565b6040516020818303038152906040525b915050919050565b600061163882612568565b9050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116db6118a6565b73ffffffffffffffffffffffffffffffffffffffff166116f9610f77565b73ffffffffffffffffffffffffffffffffffffffff161461174f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161174690613326565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156117bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117b690613266565b60405180910390fd5b6117c8816120e5565b50565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600081611863611960565b11158015611872575060005482105b801561189f575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b600033905090565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061197082611e56565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166119976118a6565b73ffffffffffffffffffffffffffffffffffffffff1614806119ca57506119c982600001516119c46118a6565b61163f565b5b80611a0f57506119d86118a6565b73ffffffffffffffffffffffffffffffffffffffff166119f78461089c565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611a48576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614611ab1576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611b18576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b258585856001612638565b611b3560008484600001516118ae565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550836004600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166004600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415611de657600054811015611de55782600001516004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e4f858585600161263e565b5050505050565b611e5e612aaa565b600082905080611e6c611960565b11158015611e7b575060005481105b156120ae576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff161515151581525050905080604001516120ac57600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611f905780925050506120e0565b5b6001156120ab57818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146120a65780925050506120e0565b611f91565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6121c5828260405180602001604052806000815250612644565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026121ef6118a6565b8786866040518563ffffffff1660e01b81526004016122119493929190613199565b602060405180830381600087803b15801561222b57600080fd5b505af192505050801561225c57506040513d601f19601f820116820180604052508101906122599190612e48565b60015b6122d6573d806000811461228c576040519150601f19603f3d011682016040523d82523d6000602084013e612291565b606091505b506000815114156122ce576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600b805461233890613647565b80601f016020809104026020016040519081016040528092919081815260200182805461236490613647565b80156123b15780601f10612386576101008083540402835291602001916123b1565b820191906000526020600020905b81548152906001019060200180831161239457829003601f168201915b5050505050905090565b60606000821415612403576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612563565b600082905060005b6000821461243557808061241e906136aa565b915050600a8261242e919061349b565b915061240b565b60008167ffffffffffffffff811115612477577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156124a95781602001600182028036833780820191505090505b5090505b6000851461255c576001826124c29190613526565b9150600a856124d191906136f3565b60306124dd9190613445565b60f81b818381518110612519577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612555919061349b565b94506124ad565b8093505050505b919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156125d0576040517f35ebb31900000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160089054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b50505050565b50505050565b6126518383836001612656565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156126c3576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008414156126fe576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61270b6000868387612638565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000819050600085820190508380156128d557506128d48773ffffffffffffffffffffffffffffffffffffffff166117cb565b5b1561299b575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461294a60008884806001019550886121c9565b612980576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808214156128db57826000541461299657600080fd5b612a07565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082141561299c575b816000819055505050612a1d600086838761263e565b5050505050565b828054612a3090613647565b90600052602060002090601f016020900481019282612a525760008555612a99565b82601f10612a6b57803560ff1916838001178555612a99565b82800160010185558215612a99579182015b82811115612a98578235825591602001919060010190612a7d565b5b509050612aa69190612aed565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612b06576000816000905550600101612aee565b5090565b6000612b1d612b18846133c6565b6133a1565b905082815260208101848484011115612b3557600080fd5b612b40848285613605565b509392505050565b600081359050612b57816139ce565b92915050565b600081359050612b6c816139e5565b92915050565b600081359050612b81816139fc565b92915050565b600081359050612b9681613a13565b92915050565b600081519050612bab81613a13565b92915050565b600082601f830112612bc257600080fd5b8135612bd2848260208601612b0a565b91505092915050565b600081359050612bea81613a2a565b92915050565b60008083601f840112612c0257600080fd5b8235905067ffffffffffffffff811115612c1b57600080fd5b602083019150836001820283011115612c3357600080fd5b9250929050565b600081359050612c4981613a3a565b92915050565b600060208284031215612c6157600080fd5b6000612c6f84828501612b48565b91505092915050565b600060208284031215612c8a57600080fd5b6000612c9884828501612b5d565b91505092915050565b60008060408385031215612cb457600080fd5b6000612cc285828601612b48565b9250506020612cd385828601612b48565b9150509250929050565b600080600060608486031215612cf257600080fd5b6000612d0086828701612b48565b9350506020612d1186828701612b48565b9250506040612d2286828701612c3a565b9150509250925092565b60008060008060808587031215612d4257600080fd5b6000612d5087828801612b48565b9450506020612d6187828801612b48565b9350506040612d7287828801612c3a565b925050606085013567ffffffffffffffff811115612d8f57600080fd5b612d9b87828801612bb1565b91505092959194509250565b60008060408385031215612dba57600080fd5b6000612dc885828601612b48565b9250506020612dd985828601612b72565b9150509250929050565b60008060408385031215612df657600080fd5b6000612e0485828601612b48565b9250506020612e1585828601612c3a565b9150509250929050565b600060208284031215612e3157600080fd5b6000612e3f84828501612b87565b91505092915050565b600060208284031215612e5a57600080fd5b6000612e6884828501612b9c565b91505092915050565b600060208284031215612e8357600080fd5b6000612e9184828501612bdb565b91505092915050565b60008060208385031215612ead57600080fd5b600083013567ffffffffffffffff811115612ec757600080fd5b612ed385828601612bf0565b92509250509250929050565b600060208284031215612ef157600080fd5b6000612eff84828501612c3a565b91505092915050565b612f118161355a565b82525050565b612f208161357e565b82525050565b6000612f31826133f7565b612f3b818561340d565b9350612f4b818560208601613614565b612f548161380f565b840191505092915050565b612f68816135f3565b82525050565b6000612f7982613402565b612f838185613429565b9350612f93818560208601613614565b612f9c8161380f565b840191505092915050565b6000612fb282613402565b612fbc818561343a565b9350612fcc818560208601613614565b80840191505092915050565b6000612fe5602683613429565b9150612ff082613820565b604082019050919050565b6000613008601183613429565b91506130138261386f565b602082019050919050565b600061302b601b83613429565b915061303682613898565b602082019050919050565b600061304e601083613429565b9150613059826138c1565b602082019050919050565b6000613071601583613429565b915061307c826138ea565b602082019050919050565b6000613094601b83613429565b915061309f82613913565b602082019050919050565b60006130b7602083613429565b91506130c28261393c565b602082019050919050565b60006130da60008361341e565b91506130e582613965565b600082019050919050565b60006130fd601f83613429565b915061310882613968565b602082019050919050565b6000613120601183613429565b915061312b82613991565b602082019050919050565b61313f816135e9565b82525050565b60006131518285612fa7565b915061315d8284612fa7565b91508190509392505050565b6000613174826130cd565b9150819050919050565b60006020820190506131936000830184612f08565b92915050565b60006080820190506131ae6000830187612f08565b6131bb6020830186612f08565b6131c86040830185613136565b81810360608301526131da8184612f26565b905095945050505050565b60006040820190506131fa6000830185612f08565b6132076020830184613136565b9392505050565b60006020820190506132236000830184612f17565b92915050565b600060208201905061323e6000830184612f5f565b92915050565b6000602082019050818103600083015261325e8184612f6e565b905092915050565b6000602082019050818103600083015261327f81612fd8565b9050919050565b6000602082019050818103600083015261329f81612ffb565b9050919050565b600060208201905081810360008301526132bf8161301e565b9050919050565b600060208201905081810360008301526132df81613041565b9050919050565b600060208201905081810360008301526132ff81613064565b9050919050565b6000602082019050818103600083015261331f81613087565b9050919050565b6000602082019050818103600083015261333f816130aa565b9050919050565b6000602082019050818103600083015261335f816130f0565b9050919050565b6000602082019050818103600083015261337f81613113565b9050919050565b600060208201905061339b6000830184613136565b92915050565b60006133ab6133bc565b90506133b78282613679565b919050565b6000604051905090565b600067ffffffffffffffff8211156133e1576133e06137e0565b5b6133ea8261380f565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000613450826135e9565b915061345b836135e9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156134905761348f613724565b5b828201905092915050565b60006134a6826135e9565b91506134b1836135e9565b9250826134c1576134c0613753565b5b828204905092915050565b60006134d7826135e9565b91506134e2836135e9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561351b5761351a613724565b5b828202905092915050565b6000613531826135e9565b915061353c836135e9565b92508282101561354f5761354e613724565b5b828203905092915050565b6000613565826135c9565b9050919050565b6000613577826135c9565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b60008190506135c4826139ba565b919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006135fe826135b6565b9050919050565b82818337600083830152505050565b60005b83811015613632578082015181840152602081019050613617565b83811115613641576000848401525b50505050565b6000600282049050600182168061365f57607f821691505b60208210811415613673576136726137b1565b5b50919050565b6136828261380f565b810181811067ffffffffffffffff821117156136a1576136a06137e0565b5b80604052505050565b60006136b5826135e9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156136e8576136e7613724565b5b600182019050919050565b60006136fe826135e9565b9150613709836135e9565b92508261371957613718613753565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f2d5769746864726177206661696c65642d000000000000000000000000000000600082015250565b7f2d436f6e74726163742063616c6c206e6f7420616c6c6f7765642d0000000000600082015250565b7f2d4e6f7420656e6f756768204554482d00000000000000000000000000000000600082015250565b7f2d4e6f7420656e6f756768207175616e746974792d0000000000000000000000600082015250565b7f2d54686973206973206d6f7265207468616e20616c6c6f7765642d0000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b50565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f2d4e6f742073746172746564207965742d000000000000000000000000000000600082015250565b600381106139cb576139ca613782565b5b50565b6139d78161355a565b81146139e257600080fd5b50565b6139ee8161356c565b81146139f957600080fd5b50565b613a058161357e565b8114613a1057600080fd5b50565b613a1c8161358a565b8114613a2757600080fd5b50565b60038110613a3757600080fd5b50565b613a43816135e9565b8114613a4e57600080fd5b5056fea2646970667358221220eeccf6bbf56874e975f96e65896a68452f2448681c0b9a2d4c5752d8f508903e64736f6c63430008040033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d634773647557685358416f4372564a426f434a6e4b3735577843434238476b4d5678736f387472396242584e2f00000000000000000000

-----Decoded View---------------
Arg [0] : initBaseURI (string): ipfs://QmcGsduWhSXAoCrVJBoCJnK75WxCCB8GkMVxso8tr9bBXN/

-----Encoded View---------------
4 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [2] : 697066733a2f2f516d634773647557685358416f4372564a426f434a6e4b3735
Arg [3] : 577843434238476b4d5678736f387472396242584e2f00000000000000000000


Deployed Bytecode Sourcemap

214:2872:11:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4843:300:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;494:50:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8139:98:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9595:200;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9172:362;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;442:46:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4114:297:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;388:20:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10426:164:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2618:87:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;601:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10656:179:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2711:271:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1085:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;550:45;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7955:122:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;648:47:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5202:203:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1668:101:0;;;;;;;;;;;;;:::i;:::-;;701:38:11;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2988:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1036:85:0;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;8301:102:12;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1195:1300:11;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9862:274:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;10901:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;8469:313;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2501:111:11;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10202:162:12;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1918:198:0;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4843:300:12;4945:4;4995:25;4980:40;;;:11;:40;;;;:104;;;;5051:33;5036:48;;;:11;:48;;;;4980:104;:156;;;;5100:36;5124:11;5100:23;:36::i;:::-;4980:156;4961:175;;4843:300;;;:::o;494:50:11:-;543:1;494:50;:::o;8139:98:12:-;8193:13;8225:5;8218:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8139:98;:::o;9595:200::-;9663:7;9687:16;9695:7;9687;:16::i;:::-;9682:64;;9712:34;;;;;;;;;;;;;;9682:64;9764:15;:24;9780:7;9764:24;;;;;;;;;;;;;;;;;;;;;9757:31;;9595:200;;;:::o;9172:362::-;9244:13;9260:24;9276:7;9260:15;:24::i;:::-;9244:40;;9304:5;9298:11;;:2;:11;;;9294:48;;;9318:24;;;;;;;;;;;;;;9294:48;9373:5;9357:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;9383:37;9400:5;9407:12;:10;:12::i;:::-;9383:16;:37::i;:::-;9382:38;9357:63;9353:136;;;9443:35;;;;;;;;;;;;;;9353:136;9499:28;9508:2;9512:7;9521:5;9499:8;:28::i;:::-;9172:362;;;:::o;442:46:11:-;486:2;442:46;:::o;4114:297:12:-;4158:7;4379:15;:13;:15::i;:::-;4364:12;;4348:13;;:28;:46;4341:53;;4114:297;:::o;388:20:11:-;;;;;;;;;;;;;:::o;10426:164:12:-;10555:28;10565:4;10571:2;10575:7;10555:9;:28::i;:::-;10426:164;;;:::o;2618:87:11:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2691:7:11::1;2682:6;;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2618:87:::0;:::o;601:41::-;638:4;601:41;:::o;10656:179:12:-;10789:39;10806:4;10812:2;10816:7;10789:39;;;;;;;;;;;;:16;:39::i;:::-;10656:179;;;:::o;2711:271:11:-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1:1::1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;2826:15:11::2;2844:21;2826:39;;2876:12;2894:9;:14;;2916:7;2894:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2875:53;;;2946:7;2938:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;2484:1:1;;1701::::1;2628:7;:22;;;;2711:271:11::0;:::o;1085:104::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1172:10:11::1;;1162:7;:20;;;;;;;:::i;:::-;;1085:104:::0;;:::o;550:45::-;;;;:::o;7955:122:12:-;8019:7;8045:20;8057:7;8045:11;:20::i;:::-;:25;;;8038:32;;7955:122;;;:::o;648:47:11:-;691:4;648:47;:::o;5202:203:12:-;5266:7;5306:1;5289:19;;:5;:19;;;5285:60;;;5317:28;;;;;;;;;;;;;;5285:60;5370:12;:19;5383:5;5370:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;5362:36;;5355:43;;5202:203;;;:::o;1668:101:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1732:30:::1;1759:1;1732:18;:30::i;:::-;1668:101::o:0;701:38:11:-;;;;:::o;2988:96::-;1259:12:0;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3070:7:11::1;3055:12;:22;;;;2988:96:::0;:::o;1036:85:0:-;1082:7;1108:6;;;;;;;;;;;1101:13;;1036:85;:::o;8301:102:12:-;8357:13;8389:7;8382:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;8301:102;:::o;1195:1300:11:-;1744:1:1;2325:7;;:19;;2317:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1744:1;2455:7;:18;;;;1285:14:11::1;1275:24;;;;;;;;;;;;;;;;:6;;;;;;;;;;;:24;;;;;;;;;;;;;;;;;1267:54;;;;;;;;;;;;:::i;:::-;;;;;;;;;1352:10;1339:23;;:9;:23;;;1331:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;486:2;1452:8;1425:24;1438:10;1425:12;:24::i;:::-;:35;;;;:::i;:::-;:56;;1404:130;;;;;;;;;;;;:::i;:::-;;;;;;;;;638:4;1581:8;1565:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:38;;1544:106;;;;;;;;;;;;:::i;:::-;;;;;;;;;1661:13;691:4;1688:19;;:38;1684:664;;;1742:23;543:1;1769:24;1782:10;1769:12;:24::i;:::-;:65;1768:157;;1924:1;1768:157;;;1880:24;1893:10;1880:12;:24::i;:::-;543:1;1855:49;;;;:::i;:::-;1768:157;1742:183;;2030:15;2018:8;:27;;2017:112;;2113:15;2102:8;:26;;;;:::i;:::-;2017:112;;;2073:1;2017:112;1964:12;;:183;;;;:::i;:::-;1940:207;;2216:15;2204:8;:27;;2203:58;;2246:15;2203:58;;;2235:8;2203:58;2162:19;;:113;;;;;;;:::i;:::-;;;;;;;;1684:664;;;;2329:8;2314:12;;:23;;;;:::i;:::-;2306:31;;1684:664;2378:5;2365:9;:18;;2357:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;2414:31;2424:10;2436:8;2414:9;:31::i;:::-;2460:28;2467:10;2479:8;2460:28;;;;;;;:::i;:::-;;;;;;;;2484:1:1;1701::::0;2628:7;:22;;;;1195:1300:11;:::o;9862:274:12:-;9964:12;:10;:12::i;:::-;9952:24;;:8;:24;;;9948:54;;;9985:17;;;;;;;;;;;;;;9948:54;10058:8;10013:18;:32;10032:12;:10;:12::i;:::-;10013:32;;;;;;;;;;;;;;;:42;10046:8;10013:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;10110:8;10081:48;;10096:12;:10;:12::i;:::-;10081:48;;;10120:8;10081:48;;;;;;:::i;:::-;;;;;;;;9862:274;;:::o;10901:359::-;11062:28;11072:4;11078:2;11082:7;11062:9;:28::i;:::-;11104:15;:2;:13;;;:15::i;:::-;:76;;;;;11124:56;11155:4;11161:2;11165:7;11174:5;11124:30;:56::i;:::-;11123:57;11104:76;11100:154;;;11203:40;;;;;;;;;;;;;;11100:154;10901:359;;;;:::o;8469:313::-;8542:13;8572:16;8580:7;8572;:16::i;:::-;8567:59;;8597:29;;;;;;;;;;;;;;8567:59;8637:21;8661:10;:8;:10::i;:::-;8637:34;;8713:1;8694:7;8688:21;:26;;:87;;;;;;;;;;;;;;;;;8741:7;8750:18;:7;:16;:18::i;:::-;8724:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8688:87;8681:94;;;8469:313;;;:::o;2501:111:11:-;2559:7;2585:20;2599:5;2585:13;:20::i;:::-;2578:27;;2501:111;;;:::o;10202:162:12:-;10299:4;10322:18;:25;10341:5;10322:25;;;;;;;;;;;;;;;:35;10348:8;10322:35;;;;;;;;;;;;;;;;;;;;;;;;;10315:42;;10202:162;;;;:::o;1918:198:0:-;1259:12;:10;:12::i;:::-;1248:23;;:7;:5;:7::i;:::-;:23;;;1240:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2026:1:::1;2006:22;;:8;:22;;;;1998:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2081:28;2100:8;2081:18;:28::i;:::-;1918:198:::0;:::o;1175:320:6:-;1235:4;1487:1;1465:7;:19;;;:23;1458:30;;1175:320;;;:::o;829:155:9:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;11506:184:12:-;11563:4;11605:7;11586:15;:13;:15::i;:::-;:26;;:53;;;;;11626:13;;11616:7;:23;11586:53;:97;;;;;11656:11;:20;11668:7;11656:20;;;;;;;;;;;:27;;;;;;;;;;;;11655:28;11586:97;11579:104;;11506:184;;;:::o;640:96:7:-;693:7;719:10;712:17;;640:96;:::o;18922:189:12:-;19059:2;19032:15;:24;19048:7;19032:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;19096:7;19092:2;19076:28;;19085:5;19076:28;;;;;;;;;;;;18922:189;;;:::o;3846:90::-;3902:7;3846:90;:::o;14528:2067::-;14638:35;14676:20;14688:7;14676:11;:20::i;:::-;14638:58;;14707:22;14749:13;:18;;;14733:34;;:12;:10;:12::i;:::-;:34;;;:100;;;;14783:50;14800:13;:18;;;14820:12;:10;:12::i;:::-;14783:16;:50::i;:::-;14733:100;:152;;;;14873:12;:10;:12::i;:::-;14849:36;;:20;14861:7;14849:11;:20::i;:::-;:36;;;14733:152;14707:179;;14902:17;14897:66;;14928:35;;;;;;;;;;;;;;14897:66;14999:4;14977:26;;:13;:18;;;:26;;;14973:67;;15012:28;;;;;;;;;;;;;;14973:67;15068:1;15054:16;;:2;:16;;;15050:52;;;15079:23;;;;;;;;;;;;;;15050:52;15113:43;15135:4;15141:2;15145:7;15154:1;15113:21;:43::i;:::-;15218:49;15235:1;15239:7;15248:13;:18;;;15218:8;:49::i;:::-;15587:1;15557:12;:18;15570:4;15557:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15630:1;15602:12;:16;15615:2;15602:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15674:2;15646:11;:20;15658:7;15646:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;15735:15;15690:11;:20;15702:7;15690:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;15999:19;16031:1;16021:7;:11;15999:33;;16091:1;16050:43;;:11;:24;16062:11;16050:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;16046:438;;;16272:13;;16258:11;:27;16254:216;;;16341:13;:18;;;16309:11;:24;16321:11;16309:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;16423:13;:28;;;16381:11;:24;16393:11;16381:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;16254:216;16046:438;14528:2067;16528:7;16524:2;16509:27;;16518:4;16509:27;;;;;;;;;;;;16546:42;16567:4;16573:2;16577:7;16586:1;16546:20;:42::i;:::-;14528:2067;;;;;:::o;6815:1083::-;6876:21;;:::i;:::-;6909:12;6924:7;6909:22;;6989:4;6970:15;:13;:15::i;:::-;:23;;:47;;;;;7004:13;;6997:4;:20;6970:47;6966:868;;;7037:31;7071:11;:17;7083:4;7071:17;;;;;;;;;;;7037:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7111:9;:16;;;7106:714;;7181:1;7155:28;;:9;:14;;;:28;;;7151:99;;7218:9;7211:16;;;;;;7151:99;7547:255;7554:4;7547:255;;;7586:6;;;;;;;;7630:11;:17;7642:4;7630:17;;;;;;;;;;;7618:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;7703:1;7677:28;;:9;:14;;;:28;;;7673:107;;7744:9;7737:16;;;;;;7673:107;7547:255;;;7106:714;6966:868;;7860:31;;;;;;;;;;;;;;6815:1083;;;;:::o;2270:187:0:-;2343:16;2362:6;;;;;;;;;;;2343:25;;2387:8;2378:6;;:17;;;;;;;;;;;;;;;;;;2441:8;2410:40;;2431:8;2410:40;;;;;;;;;;;;2270:187;;:::o;11696:102:12:-;11764:27;11774:2;11778:8;11764:27;;;;;;;;;;;;:9;:27::i;:::-;11696:102;;:::o;19592:650::-;19750:4;19786:2;19770:36;;;19807:12;:10;:12::i;:::-;19821:4;19827:7;19836:5;19770:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;19766:470;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20018:1;20001:6;:13;:18;19997:229;;;20046:40;;;;;;;;;;;;;;19997:229;20186:6;20180:13;20171:6;20167:2;20163:15;20156:38;19766:470;19898:45;;;19888:55;;;:6;:55;;;;19881:62;;;19592:650;;;;;;:::o;981:98:11:-;1033:13;1065:7;1058:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;981:98;:::o;328:703:8:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;5482:204:12:-;5543:7;5583:1;5566:19;;:5;:19;;;5562:59;;;5594:27;;;;;;;;;;;;;;5562:59;5646:12;:19;5659:5;5646:19;;;;;;;;;;;;;;;:32;;;;;;;;;;;;5638:41;;5631:48;;5482:204;;;:::o;20873:154::-;;;;;:::o;21668:153::-;;;;;:::o;12149:157::-;12267:32;12273:2;12277:8;12287:5;12294:4;12267:5;:32::i;:::-;12149:157;;;:::o;12553:1733::-;12686:20;12709:13;;12686:36;;12750:1;12736:16;;:2;:16;;;12732:48;;;12761:19;;;;;;;;;;;;;;12732:48;12806:1;12794:8;:13;12790:44;;;12816:18;;;;;;;;;;;;;;12790:44;12845:61;12875:1;12879:2;12883:12;12897:8;12845:21;:61::i;:::-;13212:8;13177:12;:16;13190:2;13177:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13275:8;13235:12;:16;13248:2;13235:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13332:2;13299:11;:25;13311:12;13299:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;13398:15;13348:11;:25;13360:12;13348:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;13429:20;13452:12;13429:35;;13478:11;13507:8;13492:12;:23;13478:37;;13534:4;:23;;;;;13542:15;:2;:13;;;:15::i;:::-;13534:23;13530:628;;;13577:309;13632:12;13628:2;13607:38;;13624:1;13607:38;;;;;;;;;;;;13672:69;13711:1;13715:2;13719:14;;;;;;13735:5;13672:30;:69::i;:::-;13667:172;;13776:40;;;;;;;;;;;;;;13667:172;13881:3;13865:12;:19;;13577:309;;13965:12;13948:13;;:29;13944:43;;13979:8;;;13944:43;13530:628;;;14026:118;14081:14;;;;;;14077:2;14056:40;;14073:1;14056:40;;;;;;;;;;;;14139:3;14123:12;:19;;14026:118;;13530:628;14187:12;14171:13;:28;;;;12553:1733;;14219:60;14248:1;14252:2;14256:12;14270:8;14219:20;:60::i;:::-;12553:1733;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:13:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:155::-;555:5;593:6;580:20;571:29;;609:41;644:5;609:41;:::i;:::-;561:95;;;;:::o;662:133::-;705:5;743:6;730:20;721:29;;759:30;783:5;759:30;:::i;:::-;711:84;;;;:::o;801:137::-;846:5;884:6;871:20;862:29;;900:32;926:5;900:32;:::i;:::-;852:86;;;;:::o;944:141::-;1000:5;1031:6;1025:13;1016:22;;1047:32;1073:5;1047:32;:::i;:::-;1006:79;;;;:::o;1104:271::-;1159:5;1208:3;1201:4;1193:6;1189:17;1185:27;1175:2;;1226:1;1223;1216:12;1175:2;1266:6;1253:20;1291:78;1365:3;1357:6;1350:4;1342:6;1338:17;1291:78;:::i;:::-;1282:87;;1165:210;;;;;:::o;1381:159::-;1437:5;1475:6;1462:20;1453:29;;1491:43;1528:5;1491:43;:::i;:::-;1443:97;;;;:::o;1560:352::-;1618:8;1628:6;1678:3;1671:4;1663:6;1659:17;1655:27;1645:2;;1696:1;1693;1686:12;1645:2;1732:6;1719:20;1709:30;;1762:18;1754:6;1751:30;1748:2;;;1794:1;1791;1784:12;1748:2;1831:4;1823:6;1819:17;1807:29;;1885:3;1877:4;1869:6;1865:17;1855:8;1851:32;1848:41;1845:2;;;1902:1;1899;1892:12;1845:2;1635:277;;;;;:::o;1918:139::-;1964:5;2002:6;1989:20;1980:29;;2018:33;2045:5;2018:33;:::i;:::-;1970:87;;;;:::o;2063:262::-;2122:6;2171:2;2159:9;2150:7;2146:23;2142:32;2139:2;;;2187:1;2184;2177:12;2139:2;2230:1;2255:53;2300:7;2291:6;2280:9;2276:22;2255:53;:::i;:::-;2245:63;;2201:117;2129:196;;;;:::o;2331:278::-;2398:6;2447:2;2435:9;2426:7;2422:23;2418:32;2415:2;;;2463:1;2460;2453:12;2415:2;2506:1;2531:61;2584:7;2575:6;2564:9;2560:22;2531:61;:::i;:::-;2521:71;;2477:125;2405:204;;;;:::o;2615:407::-;2683:6;2691;2740:2;2728:9;2719:7;2715:23;2711:32;2708:2;;;2756:1;2753;2746:12;2708:2;2799:1;2824:53;2869:7;2860:6;2849:9;2845:22;2824:53;:::i;:::-;2814:63;;2770:117;2926:2;2952:53;2997:7;2988:6;2977:9;2973:22;2952:53;:::i;:::-;2942:63;;2897:118;2698:324;;;;;:::o;3028:552::-;3105:6;3113;3121;3170:2;3158:9;3149:7;3145:23;3141:32;3138:2;;;3186:1;3183;3176:12;3138:2;3229:1;3254:53;3299:7;3290:6;3279:9;3275:22;3254:53;:::i;:::-;3244:63;;3200:117;3356:2;3382:53;3427:7;3418:6;3407:9;3403:22;3382:53;:::i;:::-;3372:63;;3327:118;3484:2;3510:53;3555:7;3546:6;3535:9;3531:22;3510:53;:::i;:::-;3500:63;;3455:118;3128:452;;;;;:::o;3586:809::-;3681:6;3689;3697;3705;3754:3;3742:9;3733:7;3729:23;3725:33;3722:2;;;3771:1;3768;3761:12;3722:2;3814:1;3839:53;3884:7;3875:6;3864:9;3860:22;3839:53;:::i;:::-;3829:63;;3785:117;3941:2;3967:53;4012:7;4003:6;3992:9;3988:22;3967:53;:::i;:::-;3957:63;;3912:118;4069:2;4095:53;4140:7;4131:6;4120:9;4116:22;4095:53;:::i;:::-;4085:63;;4040:118;4225:2;4214:9;4210:18;4197:32;4256:18;4248:6;4245:30;4242:2;;;4288:1;4285;4278:12;4242:2;4316:62;4370:7;4361:6;4350:9;4346:22;4316:62;:::i;:::-;4306:72;;4168:220;3712:683;;;;;;;:::o;4401:401::-;4466:6;4474;4523:2;4511:9;4502:7;4498:23;4494:32;4491:2;;;4539:1;4536;4529:12;4491:2;4582:1;4607:53;4652:7;4643:6;4632:9;4628:22;4607:53;:::i;:::-;4597:63;;4553:117;4709:2;4735:50;4777:7;4768:6;4757:9;4753:22;4735:50;:::i;:::-;4725:60;;4680:115;4481:321;;;;;:::o;4808:407::-;4876:6;4884;4933:2;4921:9;4912:7;4908:23;4904:32;4901:2;;;4949:1;4946;4939:12;4901:2;4992:1;5017:53;5062:7;5053:6;5042:9;5038:22;5017:53;:::i;:::-;5007:63;;4963:117;5119:2;5145:53;5190:7;5181:6;5170:9;5166:22;5145:53;:::i;:::-;5135:63;;5090:118;4891:324;;;;;:::o;5221:260::-;5279:6;5328:2;5316:9;5307:7;5303:23;5299:32;5296:2;;;5344:1;5341;5334:12;5296:2;5387:1;5412:52;5456:7;5447:6;5436:9;5432:22;5412:52;:::i;:::-;5402:62;;5358:116;5286:195;;;;:::o;5487:282::-;5556:6;5605:2;5593:9;5584:7;5580:23;5576:32;5573:2;;;5621:1;5618;5611:12;5573:2;5664:1;5689:63;5744:7;5735:6;5724:9;5720:22;5689:63;:::i;:::-;5679:73;;5635:127;5563:206;;;;:::o;5775:282::-;5844:6;5893:2;5881:9;5872:7;5868:23;5864:32;5861:2;;;5909:1;5906;5899:12;5861:2;5952:1;5977:63;6032:7;6023:6;6012:9;6008:22;5977:63;:::i;:::-;5967:73;;5923:127;5851:206;;;;:::o;6063:395::-;6134:6;6142;6191:2;6179:9;6170:7;6166:23;6162:32;6159:2;;;6207:1;6204;6197:12;6159:2;6278:1;6267:9;6263:17;6250:31;6308:18;6300:6;6297:30;6294:2;;;6340:1;6337;6330:12;6294:2;6376:65;6433:7;6424:6;6413:9;6409:22;6376:65;:::i;:::-;6358:83;;;;6221:230;6149:309;;;;;:::o;6464:262::-;6523:6;6572:2;6560:9;6551:7;6547:23;6543:32;6540:2;;;6588:1;6585;6578:12;6540:2;6631:1;6656:53;6701:7;6692:6;6681:9;6677:22;6656:53;:::i;:::-;6646:63;;6602:117;6530:196;;;;:::o;6732:118::-;6819:24;6837:5;6819:24;:::i;:::-;6814:3;6807:37;6797:53;;:::o;6856:109::-;6937:21;6952:5;6937:21;:::i;:::-;6932:3;6925:34;6915:50;;:::o;6971:360::-;7057:3;7085:38;7117:5;7085:38;:::i;:::-;7139:70;7202:6;7197:3;7139:70;:::i;:::-;7132:77;;7218:52;7263:6;7258:3;7251:4;7244:5;7240:16;7218:52;:::i;:::-;7295:29;7317:6;7295:29;:::i;:::-;7290:3;7286:39;7279:46;;7061:270;;;;;:::o;7337:147::-;7432:45;7471:5;7432:45;:::i;:::-;7427:3;7420:58;7410:74;;:::o;7490:364::-;7578:3;7606:39;7639:5;7606:39;:::i;:::-;7661:71;7725:6;7720:3;7661:71;:::i;:::-;7654:78;;7741:52;7786:6;7781:3;7774:4;7767:5;7763:16;7741:52;:::i;:::-;7818:29;7840:6;7818:29;:::i;:::-;7813:3;7809:39;7802:46;;7582:272;;;;;:::o;7860:377::-;7966:3;7994:39;8027:5;7994:39;:::i;:::-;8049:89;8131:6;8126:3;8049:89;:::i;:::-;8042:96;;8147:52;8192:6;8187:3;8180:4;8173:5;8169:16;8147:52;:::i;:::-;8224:6;8219:3;8215:16;8208:23;;7970:267;;;;;:::o;8243:366::-;8385:3;8406:67;8470:2;8465:3;8406:67;:::i;:::-;8399:74;;8482:93;8571:3;8482:93;:::i;:::-;8600:2;8595:3;8591:12;8584:19;;8389:220;;;:::o;8615:366::-;8757:3;8778:67;8842:2;8837:3;8778:67;:::i;:::-;8771:74;;8854:93;8943:3;8854:93;:::i;:::-;8972:2;8967:3;8963:12;8956:19;;8761:220;;;:::o;8987:366::-;9129:3;9150:67;9214:2;9209:3;9150:67;:::i;:::-;9143:74;;9226:93;9315:3;9226:93;:::i;:::-;9344:2;9339:3;9335:12;9328:19;;9133:220;;;:::o;9359:366::-;9501:3;9522:67;9586:2;9581:3;9522:67;:::i;:::-;9515:74;;9598:93;9687:3;9598:93;:::i;:::-;9716:2;9711:3;9707:12;9700:19;;9505:220;;;:::o;9731:366::-;9873:3;9894:67;9958:2;9953:3;9894:67;:::i;:::-;9887:74;;9970:93;10059:3;9970:93;:::i;:::-;10088:2;10083:3;10079:12;10072:19;;9877:220;;;:::o;10103:366::-;10245:3;10266:67;10330:2;10325:3;10266:67;:::i;:::-;10259:74;;10342:93;10431:3;10342:93;:::i;:::-;10460:2;10455:3;10451:12;10444:19;;10249:220;;;:::o;10475:366::-;10617:3;10638:67;10702:2;10697:3;10638:67;:::i;:::-;10631:74;;10714:93;10803:3;10714:93;:::i;:::-;10832:2;10827:3;10823:12;10816:19;;10621:220;;;:::o;10847:398::-;11006:3;11027:83;11108:1;11103:3;11027:83;:::i;:::-;11020:90;;11119:93;11208:3;11119:93;:::i;:::-;11237:1;11232:3;11228:11;11221:18;;11010:235;;;:::o;11251:366::-;11393:3;11414:67;11478:2;11473:3;11414:67;:::i;:::-;11407:74;;11490:93;11579:3;11490:93;:::i;:::-;11608:2;11603:3;11599:12;11592:19;;11397:220;;;:::o;11623:366::-;11765:3;11786:67;11850:2;11845:3;11786:67;:::i;:::-;11779:74;;11862:93;11951:3;11862:93;:::i;:::-;11980:2;11975:3;11971:12;11964:19;;11769:220;;;:::o;11995:118::-;12082:24;12100:5;12082:24;:::i;:::-;12077:3;12070:37;12060:53;;:::o;12119:435::-;12299:3;12321:95;12412:3;12403:6;12321:95;:::i;:::-;12314:102;;12433:95;12524:3;12515:6;12433:95;:::i;:::-;12426:102;;12545:3;12538:10;;12303:251;;;;;:::o;12560:379::-;12744:3;12766:147;12909:3;12766:147;:::i;:::-;12759:154;;12930:3;12923:10;;12748:191;;;:::o;12945:222::-;13038:4;13076:2;13065:9;13061:18;13053:26;;13089:71;13157:1;13146:9;13142:17;13133:6;13089:71;:::i;:::-;13043:124;;;;:::o;13173:640::-;13368:4;13406:3;13395:9;13391:19;13383:27;;13420:71;13488:1;13477:9;13473:17;13464:6;13420:71;:::i;:::-;13501:72;13569:2;13558:9;13554:18;13545:6;13501:72;:::i;:::-;13583;13651:2;13640:9;13636:18;13627:6;13583:72;:::i;:::-;13702:9;13696:4;13692:20;13687:2;13676:9;13672:18;13665:48;13730:76;13801:4;13792:6;13730:76;:::i;:::-;13722:84;;13373:440;;;;;;;:::o;13819:332::-;13940:4;13978:2;13967:9;13963:18;13955:26;;13991:71;14059:1;14048:9;14044:17;14035:6;13991:71;:::i;:::-;14072:72;14140:2;14129:9;14125:18;14116:6;14072:72;:::i;:::-;13945:206;;;;;:::o;14157:210::-;14244:4;14282:2;14271:9;14267:18;14259:26;;14295:65;14357:1;14346:9;14342:17;14333:6;14295:65;:::i;:::-;14249:118;;;;:::o;14373:238::-;14474:4;14512:2;14501:9;14497:18;14489:26;;14525:79;14601:1;14590:9;14586:17;14577:6;14525:79;:::i;:::-;14479:132;;;;:::o;14617:313::-;14730:4;14768:2;14757:9;14753:18;14745:26;;14817:9;14811:4;14807:20;14803:1;14792:9;14788:17;14781:47;14845:78;14918:4;14909:6;14845:78;:::i;:::-;14837:86;;14735:195;;;;:::o;14936:419::-;15102:4;15140:2;15129:9;15125:18;15117:26;;15189:9;15183:4;15179:20;15175:1;15164:9;15160:17;15153:47;15217:131;15343:4;15217:131;:::i;:::-;15209:139;;15107:248;;;:::o;15361:419::-;15527:4;15565:2;15554:9;15550:18;15542:26;;15614:9;15608:4;15604:20;15600:1;15589:9;15585:17;15578:47;15642:131;15768:4;15642:131;:::i;:::-;15634:139;;15532:248;;;:::o;15786:419::-;15952:4;15990:2;15979:9;15975:18;15967:26;;16039:9;16033:4;16029:20;16025:1;16014:9;16010:17;16003:47;16067:131;16193:4;16067:131;:::i;:::-;16059:139;;15957:248;;;:::o;16211:419::-;16377:4;16415:2;16404:9;16400:18;16392:26;;16464:9;16458:4;16454:20;16450:1;16439:9;16435:17;16428:47;16492:131;16618:4;16492:131;:::i;:::-;16484:139;;16382:248;;;:::o;16636:419::-;16802:4;16840:2;16829:9;16825:18;16817:26;;16889:9;16883:4;16879:20;16875:1;16864:9;16860:17;16853:47;16917:131;17043:4;16917:131;:::i;:::-;16909:139;;16807:248;;;:::o;17061:419::-;17227:4;17265:2;17254:9;17250:18;17242:26;;17314:9;17308:4;17304:20;17300:1;17289:9;17285:17;17278:47;17342:131;17468:4;17342:131;:::i;:::-;17334:139;;17232:248;;;:::o;17486:419::-;17652:4;17690:2;17679:9;17675:18;17667:26;;17739:9;17733:4;17729:20;17725:1;17714:9;17710:17;17703:47;17767:131;17893:4;17767:131;:::i;:::-;17759:139;;17657:248;;;:::o;17911:419::-;18077:4;18115:2;18104:9;18100:18;18092:26;;18164:9;18158:4;18154:20;18150:1;18139:9;18135:17;18128:47;18192:131;18318:4;18192:131;:::i;:::-;18184:139;;18082:248;;;:::o;18336:419::-;18502:4;18540:2;18529:9;18525:18;18517:26;;18589:9;18583:4;18579:20;18575:1;18564:9;18560:17;18553:47;18617:131;18743:4;18617:131;:::i;:::-;18609:139;;18507:248;;;:::o;18761:222::-;18854:4;18892:2;18881:9;18877:18;18869:26;;18905:71;18973:1;18962:9;18958:17;18949:6;18905:71;:::i;:::-;18859:124;;;;:::o;18989:129::-;19023:6;19050:20;;:::i;:::-;19040:30;;19079:33;19107:4;19099:6;19079:33;:::i;:::-;19030:88;;;:::o;19124:75::-;19157:6;19190:2;19184:9;19174:19;;19164:35;:::o;19205:307::-;19266:4;19356:18;19348:6;19345:30;19342:2;;;19378:18;;:::i;:::-;19342:2;19416:29;19438:6;19416:29;:::i;:::-;19408:37;;19500:4;19494;19490:15;19482:23;;19271:241;;;:::o;19518:98::-;19569:6;19603:5;19597:12;19587:22;;19576:40;;;:::o;19622:99::-;19674:6;19708:5;19702:12;19692:22;;19681:40;;;:::o;19727:168::-;19810:11;19844:6;19839:3;19832:19;19884:4;19879:3;19875:14;19860:29;;19822:73;;;;:::o;19901:147::-;20002:11;20039:3;20024:18;;20014:34;;;;:::o;20054:169::-;20138:11;20172:6;20167:3;20160:19;20212:4;20207:3;20203:14;20188:29;;20150:73;;;;:::o;20229:148::-;20331:11;20368:3;20353:18;;20343:34;;;;:::o;20383:305::-;20423:3;20442:20;20460:1;20442:20;:::i;:::-;20437:25;;20476:20;20494:1;20476:20;:::i;:::-;20471:25;;20630:1;20562:66;20558:74;20555:1;20552:81;20549:2;;;20636:18;;:::i;:::-;20549:2;20680:1;20677;20673:9;20666:16;;20427:261;;;;:::o;20694:185::-;20734:1;20751:20;20769:1;20751:20;:::i;:::-;20746:25;;20785:20;20803:1;20785:20;:::i;:::-;20780:25;;20824:1;20814:2;;20829:18;;:::i;:::-;20814:2;20871:1;20868;20864:9;20859:14;;20736:143;;;;:::o;20885:348::-;20925:7;20948:20;20966:1;20948:20;:::i;:::-;20943:25;;20982:20;21000:1;20982:20;:::i;:::-;20977:25;;21170:1;21102:66;21098:74;21095:1;21092:81;21087:1;21080:9;21073:17;21069:105;21066:2;;;21177:18;;:::i;:::-;21066:2;21225:1;21222;21218:9;21207:20;;20933:300;;;;:::o;21239:191::-;21279:4;21299:20;21317:1;21299:20;:::i;:::-;21294:25;;21333:20;21351:1;21333:20;:::i;:::-;21328:25;;21372:1;21369;21366:8;21363:2;;;21377:18;;:::i;:::-;21363:2;21422:1;21419;21415:9;21407:17;;21284:146;;;;:::o;21436:96::-;21473:7;21502:24;21520:5;21502:24;:::i;:::-;21491:35;;21481:51;;;:::o;21538:104::-;21583:7;21612:24;21630:5;21612:24;:::i;:::-;21601:35;;21591:51;;;:::o;21648:90::-;21682:7;21725:5;21718:13;21711:21;21700:32;;21690:48;;;:::o;21744:149::-;21780:7;21820:66;21813:5;21809:78;21798:89;;21788:105;;;:::o;21899:131::-;21946:7;21975:5;21964:16;;21981:43;22018:5;21981:43;:::i;:::-;21954:76;;;:::o;22036:126::-;22073:7;22113:42;22106:5;22102:54;22091:65;;22081:81;;;:::o;22168:77::-;22205:7;22234:5;22223:16;;22213:32;;;:::o;22251:131::-;22309:9;22342:34;22370:5;22342:34;:::i;:::-;22329:47;;22319:63;;;:::o;22388:154::-;22472:6;22467:3;22462;22449:30;22534:1;22525:6;22520:3;22516:16;22509:27;22439:103;;;:::o;22548:307::-;22616:1;22626:113;22640:6;22637:1;22634:13;22626:113;;;22725:1;22720:3;22716:11;22710:18;22706:1;22701:3;22697:11;22690:39;22662:2;22659:1;22655:10;22650:15;;22626:113;;;22757:6;22754:1;22751:13;22748:2;;;22837:1;22828:6;22823:3;22819:16;22812:27;22748:2;22597:258;;;;:::o;22861:320::-;22905:6;22942:1;22936:4;22932:12;22922:22;;22989:1;22983:4;22979:12;23010:18;23000:2;;23066:4;23058:6;23054:17;23044:27;;23000:2;23128;23120:6;23117:14;23097:18;23094:38;23091:2;;;23147:18;;:::i;:::-;23091:2;22912:269;;;;:::o;23187:281::-;23270:27;23292:4;23270:27;:::i;:::-;23262:6;23258:40;23400:6;23388:10;23385:22;23364:18;23352:10;23349:34;23346:62;23343:2;;;23411:18;;:::i;:::-;23343:2;23451:10;23447:2;23440:22;23230:238;;;:::o;23474:233::-;23513:3;23536:24;23554:5;23536:24;:::i;:::-;23527:33;;23582:66;23575:5;23572:77;23569:2;;;23652:18;;:::i;:::-;23569:2;23699:1;23692:5;23688:13;23681:20;;23517:190;;;:::o;23713:176::-;23745:1;23762:20;23780:1;23762:20;:::i;:::-;23757:25;;23796:20;23814:1;23796:20;:::i;:::-;23791:25;;23835:1;23825:2;;23840:18;;:::i;:::-;23825:2;23881:1;23878;23874:9;23869:14;;23747:142;;;;:::o;23895:180::-;23943:77;23940:1;23933:88;24040:4;24037:1;24030:15;24064:4;24061:1;24054:15;24081:180;24129:77;24126:1;24119:88;24226:4;24223:1;24216:15;24250:4;24247:1;24240:15;24267:180;24315:77;24312:1;24305:88;24412:4;24409:1;24402:15;24436:4;24433:1;24426:15;24453:180;24501:77;24498:1;24491:88;24598:4;24595:1;24588:15;24622:4;24619:1;24612:15;24639:180;24687:77;24684:1;24677:88;24784:4;24781:1;24774:15;24808:4;24805:1;24798:15;24825:102;24866:6;24917:2;24913:7;24908:2;24901:5;24897:14;24893:28;24883:38;;24873:54;;;:::o;24933:225::-;25073:34;25069:1;25061:6;25057:14;25050:58;25142:8;25137:2;25129:6;25125:15;25118:33;25039:119;:::o;25164:167::-;25304:19;25300:1;25292:6;25288:14;25281:43;25270:61;:::o;25337:177::-;25477:29;25473:1;25465:6;25461:14;25454:53;25443:71;:::o;25520:166::-;25660:18;25656:1;25648:6;25644:14;25637:42;25626:60;:::o;25692:171::-;25832:23;25828:1;25820:6;25816:14;25809:47;25798:65;:::o;25869:177::-;26009:29;26005:1;25997:6;25993:14;25986:53;25975:71;:::o;26052:182::-;26192:34;26188:1;26180:6;26176:14;26169:58;26158:76;:::o;26240:114::-;26346:8;:::o;26360:181::-;26500:33;26496:1;26488:6;26484:14;26477:57;26466:75;:::o;26547:167::-;26687:19;26683:1;26675:6;26671:14;26664:43;26653:61;:::o;26720:115::-;26803:1;26796:5;26793:12;26783:2;;26809:18;;:::i;:::-;26783:2;26773:62;:::o;26841:122::-;26914:24;26932:5;26914:24;:::i;:::-;26907:5;26904:35;26894:2;;26953:1;26950;26943:12;26894:2;26884:79;:::o;26969:138::-;27050:32;27076:5;27050:32;:::i;:::-;27043:5;27040:43;27030:2;;27097:1;27094;27087:12;27030:2;27020:87;:::o;27113:116::-;27183:21;27198:5;27183:21;:::i;:::-;27176:5;27173:32;27163:2;;27219:1;27216;27209:12;27163:2;27153:76;:::o;27235:120::-;27307:23;27324:5;27307:23;:::i;:::-;27300:5;27297:34;27287:2;;27345:1;27342;27335:12;27287:2;27277:78;:::o;27361:109::-;27444:1;27437:5;27434:12;27424:2;;27460:1;27457;27450:12;27424:2;27414:56;:::o;27476:122::-;27549:24;27567:5;27549:24;:::i;:::-;27542:5;27539:35;27529:2;;27588:1;27585;27578:12;27529:2;27519:79;:::o

Swarm Source

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