ETH Price: $3,701.32 (+3.06%)

Token

Fox Family (FOXFAMILY)
 

Overview

Max Total Supply

2,440 FOXFAMILY

Holders

626

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
5 FOXFAMILY
0xdB5d7E2dc031488DD4985f6293FD5885e0dd9836
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:
FoxFamily

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-05
*/

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

pragma solidity ^0.8.13;


/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721A compliant contract.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

    /**
     * The token does not exist.
     */
    error ApprovalQueryForNonexistentToken();

    /**
     * The caller cannot approve to their own address.
     */
    error ApproveToCaller();

    /**
     * The caller cannot approve to the current owner.
     */
    error ApprovalToCurrentOwner();

    /**
     * Cannot query the balance for the zero address.
     */
    error BalanceQueryForZeroAddress();

    /**
     * Cannot mint to the zero address.
     */
    error MintToZeroAddress();

    /**
     * The quantity of tokens minted must be more than zero.
     */
    error MintZeroQuantity();

    /**
     * The token does not exist.
     */
    error OwnerQueryForNonexistentToken();

    /**
     * The caller must own the token or be an approved operator.
     */
    error TransferCallerNotOwnerNorApproved();

    /**
     * The token must be owned by `from`.
     */
    error TransferFromIncorrectOwner();

    /**
     * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface.
     */
    error TransferToNonERC721ReceiverImplementer();

    /**
     * Cannot transfer to the zero address.
     */
    error TransferToZeroAddress();

    /**
     * The token does not exist.
     */
    error URIQueryForNonexistentToken();

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

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     *
     * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens.
     */
    function totalSupply() external view returns (uint256);

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

    // ==============================
    //            IERC721
    // ==============================

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

    /**
     * @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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

    // ==============================
    //        IERC721Metadata
    // ==============================

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


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

pragma solidity ^0.8.4;


/**
 * @dev ERC721 token receiver interface.
 */
interface ERC721A__IERC721Receiver {
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

/**
 * @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 IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

    // The bit position of `numberMinted` in packed address data.
    uint256 private constant BITPOS_NUMBER_MINTED = 64;

    // The bit position of `numberBurned` in packed address data.
    uint256 private constant BITPOS_NUMBER_BURNED = 128;

    // The bit position of `aux` in packed address data.
    uint256 private constant BITPOS_AUX = 192;

    // Mask of all 256 bits in packed address data except the 64 bits for `aux`.
    uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1;

    // The bit position of `startTimestamp` in packed ownership.
    uint256 private constant BITPOS_START_TIMESTAMP = 160;

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant BITMASK_BURNED = 1 << 224;
    
    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITPOS_NEXT_INITIALIZED = 225;

    // The bit mask of the `nextInitialized` bit in packed ownership.
    uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225;

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

    // The number of tokens burned.
    uint256 private _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 `_packedOwnershipOf` implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    mapping(uint256 => uint256) private _packedOwnerships;

    // Mapping owner address to address data.
    //
    // Bits Layout:
    // - [0..63]    `balance`
    // - [64..127]  `numberMinted`
    // - [128..191] `numberBurned`
    // - [192..255] `aux`
    mapping(address => uint256) private _packedAddressData;

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

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

    /**
     * @dev Returns the next token ID to be minted.
     */
    function _nextTokenId() internal view returns (uint256) {
        return _currentIndex;
    }

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count. 
     * To get the total number of tokens minted, please see `_totalMinted`.
     */
    function totalSupply() public view override returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than `_currentIndex - _startTokenId()` times.
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * @dev 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 Returns the total number of tokens burned.
     */
    function _totalBurned() internal view returns (uint256) {
        return _burnCounter;
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes of the XOR of
        // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165
        // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the number of tokens burned by or on behalf of `owner`.
     */
    function _numberBurned(address owner) internal view returns (uint256) {
        return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY;
    }

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> BITPOS_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 {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        assembly { // Cast aux without masking.
            auxCasted := aux
        }
        packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    /**
     * Returns the packed ownership data of `tokenId`.
     */
    function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // 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.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP);
        ownership.burned = packed & BITMASK_BURNED != 0;
    }

    /**
     * Returns the unpacked `TokenOwnership` struct at `index`.
     */
    function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnerships[index]);
    }

    /**
     * @dev Initializes the ownership slot minted at `index` for efficiency purposes.
     */
    function _initializeOwnershipAt(uint256 index) internal {
        if (_packedOwnerships[index] == 0) {
            _packedOwnerships[index] = _packedOwnershipOf(index);
        }
    }

    /**
     * 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) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

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

    /**
     * @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, _toString(tokenId))) : '';
    }

    /**
     * @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 Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev Casts the boolean to uint256 without branching.
     */
    function _boolToUint256(bool value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = address(uint160(_packedOwnershipOf(tokenId)));
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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 virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), 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.code.length != 0)
            if (!_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 && // If within bounds,
            _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Equivalent to `_safeMint(to, quantity, '')`.
     */
    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 {
        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 {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

            if (to.code.length != 0) {
                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 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) 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 {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                (_boolToUint256(quantity == 1) << BITPOS_NEXT_INITIALIZED);

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

            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 {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

        if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner();

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            getApproved(tokenId) == _msgSenderERC721A());

        if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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 {
            // We can directly increment and decrement the balances.
            --_packedAddressData[from]; // Updates: `balance -= 1`.
            ++_packedAddressData[to]; // Updates: `balance += 1`.

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(to) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

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

    /**
     * @dev Equivalent to `_burn(tokenId, false)`.
     */
    function _burn(uint256 tokenId) internal virtual {
        _burn(tokenId, false);
    }

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

        address from = address(uint160(prevOwnershipPacked));

        if (approvalCheck) {
            bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
                isApprovedForAll(from, _msgSenderERC721A()) ||
                getApproved(tokenId) == _msgSenderERC721A());

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

        _beforeTokenTransfers(from, address(0), tokenId, 1);

        // Clear approvals from the previous owner.
        delete _tokenApprovals[tokenId];

        // 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 {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] =
                _addressToUint256(from) |
                (block.timestamp << BITPOS_START_TIMESTAMP) |
                BITMASK_BURNED | 
                BITMASK_NEXT_INITIALIZED;

            // If the next slot may not have been initialized (i.e. `nextInitialized == false`) .
            if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) {
                uint256 nextTokenId = tokenId + 1;
                // If the next slot's address is zero and not burned (i.e. packed value is zero).
                if (_packedOwnerships[nextTokenId] == 0) {
                    // If the next slot is within bounds.
                    if (nextTokenId != _currentIndex) {
                        // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`.
                        _packedOwnerships[nextTokenId] = prevOwnershipPacked;
                    }
                }
            }
        }

        emit Transfer(from, address(0), tokenId);
        _afterTokenTransfers(from, address(0), tokenId, 1);

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

    /**
     * @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 ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__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 {}

    /**
     * @dev Returns the message sender (defaults to `msg.sender`).
     *
     * If you are writing GSN compatible contracts, you need to override this function.
     */
    function _msgSenderERC721A() internal view virtual returns (address) {
        return msg.sender;
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function _toString(uint256 value) internal pure returns (string memory ptr) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), 
            // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length, 
            // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128.
            ptr := add(mload(0x40), 128)
            // Update the free memory pointer to allocate.
            mstore(0x40, ptr)

            // Cache the end of the memory to calculate the length later.
            let end := ptr

            // We write the string from the rightmost digit to the leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // Costs a bit more than early returning for the zero case,
            // but cheaper in terms of deployment and overall runtime costs.
            for { 
                // Initialize and perform the first pass without check.
                let temp := value
                // Move the pointer 1 byte leftwards to point to an empty character slot.
                ptr := sub(ptr, 1)
                // Write the character to the pointer. 48 is the ASCII index of '0'.
                mstore8(ptr, add(48, mod(temp, 10)))
                temp := div(temp, 10)
            } temp { 
                // Keep dividing `temp` until zero.
                temp := div(temp, 10)
            } { // Body of the for loop.
                ptr := sub(ptr, 1)
                mstore8(ptr, add(48, mod(temp, 10)))
            }
            
            let length := sub(end, ptr)
            // Move the pointer 32 bytes leftwards to make room for the length.
            ptr := sub(ptr, 32)
            // Store the length.
            mstore(ptr, length)
        }
    }
}


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


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


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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

pragma solidity >=0.8.9 <0.9.0;

contract FoxFamily is ERC721A, Ownable, ReentrancyGuard, OperatorFilterer {
  using Strings for uint256;

  string public uriPrefix = '';
  string public uriSuffix = '.json';
  string public hiddenMetadataUri;

  uint256 public cost = 0.015 ether;
  uint256 public maxNFTs = 3333;
  uint256 public maxPerTxn = 5;
  uint256 public maxMintAmount = 5;

  bool public paused = true;
  bool public revealed = true;

  constructor(
    string memory _tokenName,
    string memory _tokenSymbol
  ) ERC721A(_tokenName, _tokenSymbol) OperatorFilterer(address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6), false) {}

  modifier mintCompliance(uint256 _mintAmount) {
    require(!paused, "Minting has not started yet.");
    require(_mintAmount > 0 && _mintAmount <= maxPerTxn, "You can only mint 5 foxes per transaction.");
    require(totalSupply() + _mintAmount <= maxNFTs, "There are no foxes lefts!");
    require(tx.origin == msg.sender, "No minting with smart contract.");
    require(
      _mintAmount > 0 && numberMinted(msg.sender) + _mintAmount <= maxMintAmount,
       "You have minted the max number of foxes!"
    );
    require(msg.value >= cost * _mintAmount, "Insufficient or incorrect funds.");
    _;
  }

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    _safeMint(_msgSender(), _mintAmount);
  }
  
  function mintForAddress(uint256 _mintAmount, address _receiver) public onlyOwner {
    require(totalSupply() + _mintAmount <= maxNFTs, "Max supply exceeded!");
    _safeMint(_receiver, _mintAmount);
  }

  function _startTokenId() internal view virtual override returns (uint256) {
    return 1;
  }

  function tokenURI(uint256 _tokenId) public view virtual override returns (string memory) {
    require(_exists(_tokenId), "ERC721Metadata: URI query for nonexistent token");

    if (revealed == false) {
      return hiddenMetadataUri;
    }

    string memory currentBaseURI = _baseURI();
    return bytes(currentBaseURI).length > 0
        ? string(abi.encodePacked(currentBaseURI, _tokenId.toString(), uriSuffix))
        : '';
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

   function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function setMaxMintAmount(uint256 _maxMintAmount) public onlyOwner {
    maxMintAmount = _maxMintAmount;
  }

  function withdraw() public onlyOwner nonReentrant {
    (bool withdrawFunds, ) = payable(owner()).call{value: address(this).balance}("");
    require(withdrawFunds);
  }

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

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

  function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
  }

  function approve(address operator, uint256 tokenId) public override onlyAllowedOperatorApproval(operator) {
        super.approve(operator, tokenId);
  }

  function transferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.transferFrom(from, to, tokenId);
  }

  function safeTransferFrom(address from, address to, uint256 tokenId) public override onlyAllowedOperator(from) {
        super.safeTransferFrom(from, to, tokenId);
  }

  function safeTransferFrom(address from, address to, uint256 tokenId, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
  {
        super.safeTransferFrom(from, to, tokenId, data);
  }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_tokenName","type":"string"},{"internalType":"string","name":"_tokenSymbol","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":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","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":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":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","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":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNFTs","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTxn","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","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":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmount","type":"uint256"}],"name":"setMaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600a90805190602001906200002b9291906200045f565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600b9080519060200190620000799291906200045f565b5066354a6ba7a18000600d55610d05600e556005600f5560056010556001601160006101000a81548160ff0219169083151502179055506001601160016101000a81548160ff021916908315150217905550348015620000d857600080fd5b50604051620046d3380380620046d38339818101604052810190620000fe9190620006ac565b733cc6cdda760b79bafa08df41ecfa224f810dceb66000838381600290805190602001906200012f9291906200045f565b508060039080519060200190620001489291906200045f565b50620001596200038860201b60201c565b600081905550505062000181620001756200039160201b60201c565b6200039960201b60201c565b600160098190555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200037e57801562000244576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200020a92919062000776565b600060405180830381600087803b1580156200022557600080fd5b505af11580156200023a573d6000803e3d6000fd5b505050506200037d565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002fe576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002c492919062000776565b600060405180830381600087803b158015620002df57600080fd5b505af1158015620002f4573d6000803e3d6000fd5b505050506200037c565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620003479190620007a3565b600060405180830381600087803b1580156200036257600080fd5b505af115801562000377573d6000803e3d6000fd5b505050505b5b5b5050505062000824565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200046d90620007ef565b90600052602060002090601f016020900481019282620004915760008555620004dd565b82601f10620004ac57805160ff1916838001178555620004dd565b82800160010185558215620004dd579182015b82811115620004dc578251825591602001919060010190620004bf565b5b509050620004ec9190620004f0565b5090565b5b808211156200050b576000816000905550600101620004f1565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000578826200052d565b810181811067ffffffffffffffff821117156200059a57620005996200053e565b5b80604052505050565b6000620005af6200050f565b9050620005bd82826200056d565b919050565b600067ffffffffffffffff821115620005e057620005df6200053e565b5b620005eb826200052d565b9050602081019050919050565b60005b8381101562000618578082015181840152602081019050620005fb565b8381111562000628576000848401525b50505050565b6000620006456200063f84620005c2565b620005a3565b90508281526020810184848401111562000664576200066362000528565b5b62000671848285620005f8565b509392505050565b600082601f83011262000691576200069062000523565b5b8151620006a38482602086016200062e565b91505092915050565b60008060408385031215620006c657620006c562000519565b5b600083015167ffffffffffffffff811115620006e757620006e66200051e565b5b620006f58582860162000679565b925050602083015167ffffffffffffffff8111156200071957620007186200051e565b5b620007278582860162000679565b9150509250929050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200075e8262000731565b9050919050565b620007708162000751565b82525050565b60006040820190506200078d600083018562000765565b6200079c602083018462000765565b9392505050565b6000602082019050620007ba600083018462000765565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200080857607f821691505b6020821081036200081e576200081d620007c0565b5b50919050565b613e9f80620008346000396000f3fe6080604052600436106102255760003560e01c80635503a0e811610123578063a0712d68116100ab578063dc33e6811161006f578063dc33e681146107c2578063e0a80853146107ff578063e985e9c514610828578063efbd73f414610865578063f2fde38b1461088e57610225565b8063a0712d68146106ec578063a22cb46514610708578063a45ba8e714610731578063b88d4fde1461075c578063c87b56dd1461078557610225565b806370a08231116100f257806370a0823114610619578063715018a6146106565780637ec4a6591461066d5780638da5cb5b1461069657806395d89b41146106c157610225565b80635503a0e81461055b5780635c975abb1461058657806362b99ad4146105b15780636352211e146105dc57610225565b8063239c70ae116101b157806342842e0e1161017557806342842e0e1461048a57806344a0d68a146104b35780634e9e1ec6146104dc5780634fdd43cb14610507578063518302271461053057610225565b8063239c70ae146103c957806323b872dd146103f45780633cb519941461041d5780633ccfd60b1461044857806341f434341461045f57610225565b8063095ea7b3116101f8578063095ea7b3146102f857806313faede61461032157806316ba10e01461034c57806316c38b3c1461037557806318160ddd1461039e57610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063088a4ed0146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612cf5565b6108b7565b60405161025e9190612d3d565b60405180910390f35b34801561027357600080fd5b5061027c610949565b6040516102899190612df1565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612e49565b6109db565b6040516102c69190612eb7565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190612e49565b610a57565b005b34801561030457600080fd5b5061031f600480360381019061031a9190612efe565b610add565b005b34801561032d57600080fd5b50610336610af6565b6040516103439190612f4d565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e919061309d565b610afc565b005b34801561038157600080fd5b5061039c60048036038101906103979190613112565b610b92565b005b3480156103aa57600080fd5b506103b3610c2b565b6040516103c09190612f4d565b60405180910390f35b3480156103d557600080fd5b506103de610c42565b6040516103eb9190612f4d565b60405180910390f35b34801561040057600080fd5b5061041b6004803603810190610416919061313f565b610c48565b005b34801561042957600080fd5b50610432610c97565b60405161043f9190612f4d565b60405180910390f35b34801561045457600080fd5b5061045d610c9d565b005b34801561046b57600080fd5b50610474610dee565b60405161048191906131f1565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac919061313f565b610e00565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612e49565b610e4f565b005b3480156104e857600080fd5b506104f1610ed5565b6040516104fe9190612f4d565b60405180910390f35b34801561051357600080fd5b5061052e6004803603810190610529919061309d565b610edb565b005b34801561053c57600080fd5b50610545610f71565b6040516105529190612d3d565b60405180910390f35b34801561056757600080fd5b50610570610f84565b60405161057d9190612df1565b60405180910390f35b34801561059257600080fd5b5061059b611012565b6040516105a89190612d3d565b60405180910390f35b3480156105bd57600080fd5b506105c6611025565b6040516105d39190612df1565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190612e49565b6110b3565b6040516106109190612eb7565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b919061320c565b6110c5565b60405161064d9190612f4d565b60405180910390f35b34801561066257600080fd5b5061066b61117d565b005b34801561067957600080fd5b50610694600480360381019061068f919061309d565b611205565b005b3480156106a257600080fd5b506106ab61129b565b6040516106b89190612eb7565b60405180910390f35b3480156106cd57600080fd5b506106d66112c5565b6040516106e39190612df1565b60405180910390f35b61070660048036038101906107019190612e49565b611357565b005b34801561071457600080fd5b5061072f600480360381019061072a9190613239565b611587565b005b34801561073d57600080fd5b506107466115a0565b6040516107539190612df1565b60405180910390f35b34801561076857600080fd5b50610783600480360381019061077e919061331a565b61162e565b005b34801561079157600080fd5b506107ac60048036038101906107a79190612e49565b61167f565b6040516107b99190612df1565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e4919061320c565b6117d7565b6040516107f69190612f4d565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190613112565b6117e9565b005b34801561083457600080fd5b5061084f600480360381019061084a919061339d565b611882565b60405161085c9190612d3d565b60405180910390f35b34801561087157600080fd5b5061088c600480360381019061088791906133dd565b611916565b005b34801561089a57600080fd5b506108b560048036038101906108b0919061320c565b6119f7565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109425750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109589061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546109849061344c565b80156109d15780601f106109a6576101008083540402835291602001916109d1565b820191906000526020600020905b8154815290600101906020018083116109b457829003601f168201915b5050505050905090565b60006109e682611aee565b610a1c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a5f611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610a7d61129b565b73ffffffffffffffffffffffffffffffffffffffff1614610ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aca906134c9565b60405180910390fd5b8060108190555050565b81610ae781611b55565b610af18383611c52565b505050565b600d5481565b610b04611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610b2261129b565b73ffffffffffffffffffffffffffffffffffffffff1614610b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6f906134c9565b60405180910390fd5b80600b9080519060200190610b8e929190612be6565b5050565b610b9a611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610bb861129b565b73ffffffffffffffffffffffffffffffffffffffff1614610c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c05906134c9565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b6000610c35611df8565b6001546000540303905090565b60105481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c8657610c8533611b55565b5b610c91848484611e01565b50505050565b600f5481565b610ca5611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610cc361129b565b73ffffffffffffffffffffffffffffffffffffffff1614610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d10906134c9565b60405180910390fd5b600260095403610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5590613535565b60405180910390fd5b60026009819055506000610d7061129b565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d9390613586565b60006040518083038185875af1925050503d8060008114610dd0576040519150601f19603f3d011682016040523d82523d6000602084013e610dd5565b606091505b5050905080610de357600080fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e3e57610e3d33611b55565b5b610e49848484611e11565b50505050565b610e57611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610e7561129b565b73ffffffffffffffffffffffffffffffffffffffff1614610ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec2906134c9565b60405180910390fd5b80600d8190555050565b600e5481565b610ee3611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610f0161129b565b73ffffffffffffffffffffffffffffffffffffffff1614610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e906134c9565b60405180910390fd5b80600c9080519060200190610f6d929190612be6565b5050565b601160019054906101000a900460ff1681565b600b8054610f919061344c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbd9061344c565b801561100a5780601f10610fdf5761010080835404028352916020019161100a565b820191906000526020600020905b815481529060010190602001808311610fed57829003601f168201915b505050505081565b601160009054906101000a900460ff1681565b600a80546110329061344c565b80601f016020809104026020016040519081016040528092919081815260200182805461105e9061344c565b80156110ab5780601f10611080576101008083540402835291602001916110ab565b820191906000526020600020905b81548152906001019060200180831161108e57829003601f168201915b505050505081565b60006110be82611e31565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361112c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611185611b4d565b73ffffffffffffffffffffffffffffffffffffffff166111a361129b565b73ffffffffffffffffffffffffffffffffffffffff16146111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f0906134c9565b60405180910390fd5b6112036000611efd565b565b61120d611b4d565b73ffffffffffffffffffffffffffffffffffffffff1661122b61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611281576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611278906134c9565b60405180910390fd5b80600a9080519060200190611297929190612be6565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112d49061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546113009061344c565b801561134d5780601f106113225761010080835404028352916020019161134d565b820191906000526020600020905b81548152906001019060200180831161133057829003601f168201915b5050505050905090565b80601160009054906101000a900460ff16156113a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139f906135e7565b60405180910390fd5b6000811180156113ba5750600f548111155b6113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f090613679565b60405180910390fd5b600e5481611405610c2b565b61140f91906136c8565b1115611450576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114479061376a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b5906137d6565b60405180910390fd5b6000811180156114e35750601054816114d6336117d7565b6114e091906136c8565b11155b611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151990613868565b60405180910390fd5b80600d546115309190613888565b341015611572576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115699061392e565b60405180910390fd5b61158361157d611b4d565b83611fc3565b5050565b8161159181611b55565b61159b8383611fe1565b505050565b600c80546115ad9061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546115d99061344c565b80156116265780601f106115fb57610100808354040283529160200191611626565b820191906000526020600020905b81548152906001019060200180831161160957829003601f168201915b505050505081565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461166c5761166b33611b55565b5b61167885858585612158565b5050505050565b606061168a82611aee565b6116c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c0906139c0565b60405180910390fd5b60001515601160019054906101000a900460ff1615150361177657600c80546116f19061344c565b80601f016020809104026020016040519081016040528092919081815260200182805461171d9061344c565b801561176a5780601f1061173f5761010080835404028352916020019161176a565b820191906000526020600020905b81548152906001019060200180831161174d57829003601f168201915b505050505090506117d2565b60006117806121cb565b905060008151116117a057604051806020016040528060008152506117ce565b806117aa8461225d565b600b6040516020016117be93929190613ab0565b6040516020818303038152906040525b9150505b919050565b60006117e2826123bd565b9050919050565b6117f1611b4d565b73ffffffffffffffffffffffffffffffffffffffff1661180f61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c906134c9565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61191e611b4d565b73ffffffffffffffffffffffffffffffffffffffff1661193c61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611992576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611989906134c9565b60405180910390fd5b600e548261199e610c2b565b6119a891906136c8565b11156119e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e090613b2d565b60405180910390fd5b6119f38183611fc3565b5050565b6119ff611b4d565b73ffffffffffffffffffffffffffffffffffffffff16611a1d61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a906134c9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990613bbf565b60405180910390fd5b611aeb81611efd565b50565b600081611af9611df8565b11158015611b08575060005482105b8015611b46575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c4f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611bcc929190613bdf565b602060405180830381865afa158015611be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0d9190613c1d565b611c4e57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c459190612eb7565b60405180910390fd5b5b50565b6000611c5d82611e31565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cc4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611ce3612414565b73ffffffffffffffffffffffffffffffffffffffff1614611d4657611d0f81611d0a612414565b611882565b611d45576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b611e0c83838361241c565b505050565b611e2c8383836040518060200160405280600081525061162e565b505050565b60008082905080611e40611df8565b11611ec657600054811015611ec55760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611ec3575b60008103611eb9576004600083600190039350838152602001908152602001600020549050611e8f565b8092505050611ef8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fdd8282604051806020016040528060008152506127c3565b5050565b611fe9612414565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361204d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061205a612414565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612107612414565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161214c9190612d3d565b60405180910390a35050565b61216384848461241c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121c55761218e84848484612a76565b6121c4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a80546121da9061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546122069061344c565b80156122535780601f1061222857610100808354040283529160200191612253565b820191906000526020600020905b81548152906001019060200180831161223657829003601f168201915b5050505050905090565b6060600082036122a4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123b8565b600082905060005b600082146122d65780806122bf90613c4a565b915050600a826122cf9190613cc1565b91506122ac565b60008167ffffffffffffffff8111156122f2576122f1612f72565b5b6040519080825280601f01601f1916602001820160405280156123245781602001600182028036833780820191505090505b5090505b600085146123b15760018261233d9190613cf2565b9150600a8561234c9190613d26565b603061235891906136c8565b60f81b81838151811061236e5761236d613d57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123aa9190613cc1565b9450612328565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600033905090565b600061242782611e31565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461248e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166124af612414565b73ffffffffffffffffffffffffffffffffffffffff1614806124de57506124dd856124d8612414565b611882565b5b8061252357506124ec612414565b73ffffffffffffffffffffffffffffffffffffffff1661250b846109db565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061255c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036125c2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125cf8585856001612bc6565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6126cc86612bcc565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036127545760006001840190506000600460008381526020019081526020016000205403612752576000548114612751578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127bc8585856001612bd6565b5050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361282f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612869576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128766000858386612bc6565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16128db60018514612bdc565b901b60a042901b6128eb86612bcc565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146129ef575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461299f6000878480600101955087612a76565b6129d5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106129305782600054146129ea57600080fd5b612a5a565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106129f0575b816000819055505050612a706000858386612bd6565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a9c612414565b8786866040518563ffffffff1660e01b8152600401612abe9493929190613ddb565b6020604051808303816000875af1925050508015612afa57506040513d601f19601f82011682018060405250810190612af79190613e3c565b60015b612b73573d8060008114612b2a576040519150601f19603f3d011682016040523d82523d6000602084013e612b2f565b606091505b506000815103612b6b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b6000819050919050565b50505050565b6000819050919050565b828054612bf29061344c565b90600052602060002090601f016020900481019282612c145760008555612c5b565b82601f10612c2d57805160ff1916838001178555612c5b565b82800160010185558215612c5b579182015b82811115612c5a578251825591602001919060010190612c3f565b5b509050612c689190612c6c565b5090565b5b80821115612c85576000816000905550600101612c6d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cd281612c9d565b8114612cdd57600080fd5b50565b600081359050612cef81612cc9565b92915050565b600060208284031215612d0b57612d0a612c93565b5b6000612d1984828501612ce0565b91505092915050565b60008115159050919050565b612d3781612d22565b82525050565b6000602082019050612d526000830184612d2e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d92578082015181840152602081019050612d77565b83811115612da1576000848401525b50505050565b6000601f19601f8301169050919050565b6000612dc382612d58565b612dcd8185612d63565b9350612ddd818560208601612d74565b612de681612da7565b840191505092915050565b60006020820190508181036000830152612e0b8184612db8565b905092915050565b6000819050919050565b612e2681612e13565b8114612e3157600080fd5b50565b600081359050612e4381612e1d565b92915050565b600060208284031215612e5f57612e5e612c93565b5b6000612e6d84828501612e34565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ea182612e76565b9050919050565b612eb181612e96565b82525050565b6000602082019050612ecc6000830184612ea8565b92915050565b612edb81612e96565b8114612ee657600080fd5b50565b600081359050612ef881612ed2565b92915050565b60008060408385031215612f1557612f14612c93565b5b6000612f2385828601612ee9565b9250506020612f3485828601612e34565b9150509250929050565b612f4781612e13565b82525050565b6000602082019050612f626000830184612f3e565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612faa82612da7565b810181811067ffffffffffffffff82111715612fc957612fc8612f72565b5b80604052505050565b6000612fdc612c89565b9050612fe88282612fa1565b919050565b600067ffffffffffffffff82111561300857613007612f72565b5b61301182612da7565b9050602081019050919050565b82818337600083830152505050565b600061304061303b84612fed565b612fd2565b90508281526020810184848401111561305c5761305b612f6d565b5b61306784828561301e565b509392505050565b600082601f83011261308457613083612f68565b5b813561309484826020860161302d565b91505092915050565b6000602082840312156130b3576130b2612c93565b5b600082013567ffffffffffffffff8111156130d1576130d0612c98565b5b6130dd8482850161306f565b91505092915050565b6130ef81612d22565b81146130fa57600080fd5b50565b60008135905061310c816130e6565b92915050565b60006020828403121561312857613127612c93565b5b6000613136848285016130fd565b91505092915050565b60008060006060848603121561315857613157612c93565b5b600061316686828701612ee9565b935050602061317786828701612ee9565b925050604061318886828701612e34565b9150509250925092565b6000819050919050565b60006131b76131b26131ad84612e76565b613192565b612e76565b9050919050565b60006131c98261319c565b9050919050565b60006131db826131be565b9050919050565b6131eb816131d0565b82525050565b600060208201905061320660008301846131e2565b92915050565b60006020828403121561322257613221612c93565b5b600061323084828501612ee9565b91505092915050565b600080604083850312156132505761324f612c93565b5b600061325e85828601612ee9565b925050602061326f858286016130fd565b9150509250929050565b600067ffffffffffffffff82111561329457613293612f72565b5b61329d82612da7565b9050602081019050919050565b60006132bd6132b884613279565b612fd2565b9050828152602081018484840111156132d9576132d8612f6d565b5b6132e484828561301e565b509392505050565b600082601f83011261330157613300612f68565b5b81356133118482602086016132aa565b91505092915050565b6000806000806080858703121561333457613333612c93565b5b600061334287828801612ee9565b945050602061335387828801612ee9565b935050604061336487828801612e34565b925050606085013567ffffffffffffffff81111561338557613384612c98565b5b613391878288016132ec565b91505092959194509250565b600080604083850312156133b4576133b3612c93565b5b60006133c285828601612ee9565b92505060206133d385828601612ee9565b9150509250929050565b600080604083850312156133f4576133f3612c93565b5b600061340285828601612e34565b925050602061341385828601612ee9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061346457607f821691505b6020821081036134775761347661341d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006134b3602083612d63565b91506134be8261347d565b602082019050919050565b600060208201905081810360008301526134e2816134a6565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061351f601f83612d63565b915061352a826134e9565b602082019050919050565b6000602082019050818103600083015261354e81613512565b9050919050565b600081905092915050565b50565b6000613570600083613555565b915061357b82613560565b600082019050919050565b600061359182613563565b9150819050919050565b7f4d696e74696e6720686173206e6f742073746172746564207965742e00000000600082015250565b60006135d1601c83612d63565b91506135dc8261359b565b602082019050919050565b60006020820190508181036000830152613600816135c4565b9050919050565b7f596f752063616e206f6e6c79206d696e74203520666f7865732070657220747260008201527f616e73616374696f6e2e00000000000000000000000000000000000000000000602082015250565b6000613663602a83612d63565b915061366e82613607565b604082019050919050565b6000602082019050818103600083015261369281613656565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136d382612e13565b91506136de83612e13565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561371357613712613699565b5b828201905092915050565b7f546865726520617265206e6f20666f786573206c656674732100000000000000600082015250565b6000613754601983612d63565b915061375f8261371e565b602082019050919050565b6000602082019050818103600083015261378381613747565b9050919050565b7f4e6f206d696e74696e67207769746820736d61727420636f6e74726163742e00600082015250565b60006137c0601f83612d63565b91506137cb8261378a565b602082019050919050565b600060208201905081810360008301526137ef816137b3565b9050919050565b7f596f752068617665206d696e74656420746865206d6178206e756d626572206f60008201527f6620666f78657321000000000000000000000000000000000000000000000000602082015250565b6000613852602883612d63565b915061385d826137f6565b604082019050919050565b6000602082019050818103600083015261388181613845565b9050919050565b600061389382612e13565b915061389e83612e13565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138d7576138d6613699565b5b828202905092915050565b7f496e73756666696369656e74206f7220696e636f72726563742066756e64732e600082015250565b6000613918602083612d63565b9150613923826138e2565b602082019050919050565b600060208201905081810360008301526139478161390b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006139aa602f83612d63565b91506139b58261394e565b604082019050919050565b600060208201905081810360008301526139d98161399d565b9050919050565b600081905092915050565b60006139f682612d58565b613a0081856139e0565b9350613a10818560208601612d74565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613a3e8161344c565b613a4881866139e0565b94506001821660008114613a635760018114613a7457613aa7565b60ff19831686528186019350613aa7565b613a7d85613a1c565b60005b83811015613a9f57815481890152600182019150602081019050613a80565b838801955050505b50505092915050565b6000613abc82866139eb565b9150613ac882856139eb565b9150613ad48284613a31565b9150819050949350505050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613b17601483612d63565b9150613b2282613ae1565b602082019050919050565b60006020820190508181036000830152613b4681613b0a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ba9602683612d63565b9150613bb482613b4d565b604082019050919050565b60006020820190508181036000830152613bd881613b9c565b9050919050565b6000604082019050613bf46000830185612ea8565b613c016020830184612ea8565b9392505050565b600081519050613c17816130e6565b92915050565b600060208284031215613c3357613c32612c93565b5b6000613c4184828501613c08565b91505092915050565b6000613c5582612e13565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c8757613c86613699565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ccc82612e13565b9150613cd783612e13565b925082613ce757613ce6613c92565b5b828204905092915050565b6000613cfd82612e13565b9150613d0883612e13565b925082821015613d1b57613d1a613699565b5b828203905092915050565b6000613d3182612e13565b9150613d3c83612e13565b925082613d4c57613d4b613c92565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613dad82613d86565b613db78185613d91565b9350613dc7818560208601612d74565b613dd081612da7565b840191505092915050565b6000608082019050613df06000830187612ea8565b613dfd6020830186612ea8565b613e0a6040830185612f3e565b8181036060830152613e1c8184613da2565b905095945050505050565b600081519050613e3681612cc9565b92915050565b600060208284031215613e5257613e51612c93565b5b6000613e6084828501613e27565b9150509291505056fea2646970667358221220ac9ada43f61ebea56bcf975c0e0d4d5de69acf6478e951312822316d9f4daf3f64736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a466f782046616d696c79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009464f5846414d494c590000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102255760003560e01c80635503a0e811610123578063a0712d68116100ab578063dc33e6811161006f578063dc33e681146107c2578063e0a80853146107ff578063e985e9c514610828578063efbd73f414610865578063f2fde38b1461088e57610225565b8063a0712d68146106ec578063a22cb46514610708578063a45ba8e714610731578063b88d4fde1461075c578063c87b56dd1461078557610225565b806370a08231116100f257806370a0823114610619578063715018a6146106565780637ec4a6591461066d5780638da5cb5b1461069657806395d89b41146106c157610225565b80635503a0e81461055b5780635c975abb1461058657806362b99ad4146105b15780636352211e146105dc57610225565b8063239c70ae116101b157806342842e0e1161017557806342842e0e1461048a57806344a0d68a146104b35780634e9e1ec6146104dc5780634fdd43cb14610507578063518302271461053057610225565b8063239c70ae146103c957806323b872dd146103f45780633cb519941461041d5780633ccfd60b1461044857806341f434341461045f57610225565b8063095ea7b3116101f8578063095ea7b3146102f857806313faede61461032157806316ba10e01461034c57806316c38b3c1461037557806318160ddd1461039e57610225565b806301ffc9a71461022a57806306fdde0314610267578063081812fc14610292578063088a4ed0146102cf575b600080fd5b34801561023657600080fd5b50610251600480360381019061024c9190612cf5565b6108b7565b60405161025e9190612d3d565b60405180910390f35b34801561027357600080fd5b5061027c610949565b6040516102899190612df1565b60405180910390f35b34801561029e57600080fd5b506102b960048036038101906102b49190612e49565b6109db565b6040516102c69190612eb7565b60405180910390f35b3480156102db57600080fd5b506102f660048036038101906102f19190612e49565b610a57565b005b34801561030457600080fd5b5061031f600480360381019061031a9190612efe565b610add565b005b34801561032d57600080fd5b50610336610af6565b6040516103439190612f4d565b60405180910390f35b34801561035857600080fd5b50610373600480360381019061036e919061309d565b610afc565b005b34801561038157600080fd5b5061039c60048036038101906103979190613112565b610b92565b005b3480156103aa57600080fd5b506103b3610c2b565b6040516103c09190612f4d565b60405180910390f35b3480156103d557600080fd5b506103de610c42565b6040516103eb9190612f4d565b60405180910390f35b34801561040057600080fd5b5061041b6004803603810190610416919061313f565b610c48565b005b34801561042957600080fd5b50610432610c97565b60405161043f9190612f4d565b60405180910390f35b34801561045457600080fd5b5061045d610c9d565b005b34801561046b57600080fd5b50610474610dee565b60405161048191906131f1565b60405180910390f35b34801561049657600080fd5b506104b160048036038101906104ac919061313f565b610e00565b005b3480156104bf57600080fd5b506104da60048036038101906104d59190612e49565b610e4f565b005b3480156104e857600080fd5b506104f1610ed5565b6040516104fe9190612f4d565b60405180910390f35b34801561051357600080fd5b5061052e6004803603810190610529919061309d565b610edb565b005b34801561053c57600080fd5b50610545610f71565b6040516105529190612d3d565b60405180910390f35b34801561056757600080fd5b50610570610f84565b60405161057d9190612df1565b60405180910390f35b34801561059257600080fd5b5061059b611012565b6040516105a89190612d3d565b60405180910390f35b3480156105bd57600080fd5b506105c6611025565b6040516105d39190612df1565b60405180910390f35b3480156105e857600080fd5b5061060360048036038101906105fe9190612e49565b6110b3565b6040516106109190612eb7565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b919061320c565b6110c5565b60405161064d9190612f4d565b60405180910390f35b34801561066257600080fd5b5061066b61117d565b005b34801561067957600080fd5b50610694600480360381019061068f919061309d565b611205565b005b3480156106a257600080fd5b506106ab61129b565b6040516106b89190612eb7565b60405180910390f35b3480156106cd57600080fd5b506106d66112c5565b6040516106e39190612df1565b60405180910390f35b61070660048036038101906107019190612e49565b611357565b005b34801561071457600080fd5b5061072f600480360381019061072a9190613239565b611587565b005b34801561073d57600080fd5b506107466115a0565b6040516107539190612df1565b60405180910390f35b34801561076857600080fd5b50610783600480360381019061077e919061331a565b61162e565b005b34801561079157600080fd5b506107ac60048036038101906107a79190612e49565b61167f565b6040516107b99190612df1565b60405180910390f35b3480156107ce57600080fd5b506107e960048036038101906107e4919061320c565b6117d7565b6040516107f69190612f4d565b60405180910390f35b34801561080b57600080fd5b5061082660048036038101906108219190613112565b6117e9565b005b34801561083457600080fd5b5061084f600480360381019061084a919061339d565b611882565b60405161085c9190612d3d565b60405180910390f35b34801561087157600080fd5b5061088c600480360381019061088791906133dd565b611916565b005b34801561089a57600080fd5b506108b560048036038101906108b0919061320c565b6119f7565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061091257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109425750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546109589061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546109849061344c565b80156109d15780601f106109a6576101008083540402835291602001916109d1565b820191906000526020600020905b8154815290600101906020018083116109b457829003601f168201915b5050505050905090565b60006109e682611aee565b610a1c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a5f611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610a7d61129b565b73ffffffffffffffffffffffffffffffffffffffff1614610ad3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aca906134c9565b60405180910390fd5b8060108190555050565b81610ae781611b55565b610af18383611c52565b505050565b600d5481565b610b04611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610b2261129b565b73ffffffffffffffffffffffffffffffffffffffff1614610b78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6f906134c9565b60405180910390fd5b80600b9080519060200190610b8e929190612be6565b5050565b610b9a611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610bb861129b565b73ffffffffffffffffffffffffffffffffffffffff1614610c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c05906134c9565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b6000610c35611df8565b6001546000540303905090565b60105481565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c8657610c8533611b55565b5b610c91848484611e01565b50505050565b600f5481565b610ca5611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610cc361129b565b73ffffffffffffffffffffffffffffffffffffffff1614610d19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d10906134c9565b60405180910390fd5b600260095403610d5e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5590613535565b60405180910390fd5b60026009819055506000610d7061129b565b73ffffffffffffffffffffffffffffffffffffffff1647604051610d9390613586565b60006040518083038185875af1925050503d8060008114610dd0576040519150601f19603f3d011682016040523d82523d6000602084013e610dd5565b606091505b5050905080610de357600080fd5b506001600981905550565b6daaeb6d7670e522a718067333cd4e81565b823373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610e3e57610e3d33611b55565b5b610e49848484611e11565b50505050565b610e57611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610e7561129b565b73ffffffffffffffffffffffffffffffffffffffff1614610ecb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec2906134c9565b60405180910390fd5b80600d8190555050565b600e5481565b610ee3611b4d565b73ffffffffffffffffffffffffffffffffffffffff16610f0161129b565b73ffffffffffffffffffffffffffffffffffffffff1614610f57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4e906134c9565b60405180910390fd5b80600c9080519060200190610f6d929190612be6565b5050565b601160019054906101000a900460ff1681565b600b8054610f919061344c565b80601f0160208091040260200160405190810160405280929190818152602001828054610fbd9061344c565b801561100a5780601f10610fdf5761010080835404028352916020019161100a565b820191906000526020600020905b815481529060010190602001808311610fed57829003601f168201915b505050505081565b601160009054906101000a900460ff1681565b600a80546110329061344c565b80601f016020809104026020016040519081016040528092919081815260200182805461105e9061344c565b80156110ab5780601f10611080576101008083540402835291602001916110ab565b820191906000526020600020905b81548152906001019060200180831161108e57829003601f168201915b505050505081565b60006110be82611e31565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361112c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b611185611b4d565b73ffffffffffffffffffffffffffffffffffffffff166111a361129b565b73ffffffffffffffffffffffffffffffffffffffff16146111f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111f0906134c9565b60405180910390fd5b6112036000611efd565b565b61120d611b4d565b73ffffffffffffffffffffffffffffffffffffffff1661122b61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611281576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611278906134c9565b60405180910390fd5b80600a9080519060200190611297929190612be6565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112d49061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546113009061344c565b801561134d5780601f106113225761010080835404028352916020019161134d565b820191906000526020600020905b81548152906001019060200180831161133057829003601f168201915b5050505050905090565b80601160009054906101000a900460ff16156113a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139f906135e7565b60405180910390fd5b6000811180156113ba5750600f548111155b6113f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113f090613679565b60405180910390fd5b600e5481611405610c2b565b61140f91906136c8565b1115611450576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114479061376a565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146114be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b5906137d6565b60405180910390fd5b6000811180156114e35750601054816114d6336117d7565b6114e091906136c8565b11155b611522576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151990613868565b60405180910390fd5b80600d546115309190613888565b341015611572576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115699061392e565b60405180910390fd5b61158361157d611b4d565b83611fc3565b5050565b8161159181611b55565b61159b8383611fe1565b505050565b600c80546115ad9061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546115d99061344c565b80156116265780601f106115fb57610100808354040283529160200191611626565b820191906000526020600020905b81548152906001019060200180831161160957829003601f168201915b505050505081565b833373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461166c5761166b33611b55565b5b61167885858585612158565b5050505050565b606061168a82611aee565b6116c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116c0906139c0565b60405180910390fd5b60001515601160019054906101000a900460ff1615150361177657600c80546116f19061344c565b80601f016020809104026020016040519081016040528092919081815260200182805461171d9061344c565b801561176a5780601f1061173f5761010080835404028352916020019161176a565b820191906000526020600020905b81548152906001019060200180831161174d57829003601f168201915b505050505090506117d2565b60006117806121cb565b905060008151116117a057604051806020016040528060008152506117ce565b806117aa8461225d565b600b6040516020016117be93929190613ab0565b6040516020818303038152906040525b9150505b919050565b60006117e2826123bd565b9050919050565b6117f1611b4d565b73ffffffffffffffffffffffffffffffffffffffff1661180f61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611865576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185c906134c9565b60405180910390fd5b80601160016101000a81548160ff02191690831515021790555050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61191e611b4d565b73ffffffffffffffffffffffffffffffffffffffff1661193c61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611992576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611989906134c9565b60405180910390fd5b600e548261199e610c2b565b6119a891906136c8565b11156119e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e090613b2d565b60405180910390fd5b6119f38183611fc3565b5050565b6119ff611b4d565b73ffffffffffffffffffffffffffffffffffffffff16611a1d61129b565b73ffffffffffffffffffffffffffffffffffffffff1614611a73576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6a906134c9565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ad990613bbf565b60405180910390fd5b611aeb81611efd565b50565b600081611af9611df8565b11158015611b08575060005482105b8015611b46575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611c4f576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611bcc929190613bdf565b602060405180830381865afa158015611be9573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c0d9190613c1d565b611c4e57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611c459190612eb7565b60405180910390fd5b5b50565b6000611c5d82611e31565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611cc4576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16611ce3612414565b73ffffffffffffffffffffffffffffffffffffffff1614611d4657611d0f81611d0a612414565b611882565b611d45576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006001905090565b611e0c83838361241c565b505050565b611e2c8383836040518060200160405280600081525061162e565b505050565b60008082905080611e40611df8565b11611ec657600054811015611ec55760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611ec3575b60008103611eb9576004600083600190039350838152602001908152602001600020549050611e8f565b8092505050611ef8565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611fdd8282604051806020016040528060008152506127c3565b5050565b611fe9612414565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361204d576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061205a612414565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16612107612414565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161214c9190612d3d565b60405180910390a35050565b61216384848461241c565b60008373ffffffffffffffffffffffffffffffffffffffff163b146121c55761218e84848484612a76565b6121c4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600a80546121da9061344c565b80601f01602080910402602001604051908101604052809291908181526020018280546122069061344c565b80156122535780601f1061222857610100808354040283529160200191612253565b820191906000526020600020905b81548152906001019060200180831161223657829003601f168201915b5050505050905090565b6060600082036122a4576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506123b8565b600082905060005b600082146122d65780806122bf90613c4a565b915050600a826122cf9190613cc1565b91506122ac565b60008167ffffffffffffffff8111156122f2576122f1612f72565b5b6040519080825280601f01601f1916602001820160405280156123245781602001600182028036833780820191505090505b5090505b600085146123b15760018261233d9190613cf2565b9150600a8561234c9190613d26565b603061235891906136c8565b60f81b81838151811061236e5761236d613d57565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856123aa9190613cc1565b9450612328565b8093505050505b919050565b600067ffffffffffffffff6040600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b600033905090565b600061242782611e31565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461248e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166124af612414565b73ffffffffffffffffffffffffffffffffffffffff1614806124de57506124dd856124d8612414565b611882565b5b8061252357506124ec612414565b73ffffffffffffffffffffffffffffffffffffffff1661250b846109db565b73ffffffffffffffffffffffffffffffffffffffff16145b90508061255c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036125c2576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6125cf8585856001612bc6565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6126cc86612bcc565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316036127545760006001840190506000600460008381526020019081526020016000205403612752576000548114612751578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127bc8585856001612bd6565b5050505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361282f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612869576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128766000858386612bc6565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16128db60018514612bdc565b901b60a042901b6128eb86612bcc565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146129ef575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461299f6000878480600101955087612a76565b6129d5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106129305782600054146129ea57600080fd5b612a5a565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106129f0575b816000819055505050612a706000858386612bd6565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612a9c612414565b8786866040518563ffffffff1660e01b8152600401612abe9493929190613ddb565b6020604051808303816000875af1925050508015612afa57506040513d601f19601f82011682018060405250810190612af79190613e3c565b60015b612b73573d8060008114612b2a576040519150601f19603f3d011682016040523d82523d6000602084013e612b2f565b606091505b506000815103612b6b576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b6000819050919050565b50505050565b6000819050919050565b828054612bf29061344c565b90600052602060002090601f016020900481019282612c145760008555612c5b565b82601f10612c2d57805160ff1916838001178555612c5b565b82800160010185558215612c5b579182015b82811115612c5a578251825591602001919060010190612c3f565b5b509050612c689190612c6c565b5090565b5b80821115612c85576000816000905550600101612c6d565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612cd281612c9d565b8114612cdd57600080fd5b50565b600081359050612cef81612cc9565b92915050565b600060208284031215612d0b57612d0a612c93565b5b6000612d1984828501612ce0565b91505092915050565b60008115159050919050565b612d3781612d22565b82525050565b6000602082019050612d526000830184612d2e565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612d92578082015181840152602081019050612d77565b83811115612da1576000848401525b50505050565b6000601f19601f8301169050919050565b6000612dc382612d58565b612dcd8185612d63565b9350612ddd818560208601612d74565b612de681612da7565b840191505092915050565b60006020820190508181036000830152612e0b8184612db8565b905092915050565b6000819050919050565b612e2681612e13565b8114612e3157600080fd5b50565b600081359050612e4381612e1d565b92915050565b600060208284031215612e5f57612e5e612c93565b5b6000612e6d84828501612e34565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612ea182612e76565b9050919050565b612eb181612e96565b82525050565b6000602082019050612ecc6000830184612ea8565b92915050565b612edb81612e96565b8114612ee657600080fd5b50565b600081359050612ef881612ed2565b92915050565b60008060408385031215612f1557612f14612c93565b5b6000612f2385828601612ee9565b9250506020612f3485828601612e34565b9150509250929050565b612f4781612e13565b82525050565b6000602082019050612f626000830184612f3e565b92915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612faa82612da7565b810181811067ffffffffffffffff82111715612fc957612fc8612f72565b5b80604052505050565b6000612fdc612c89565b9050612fe88282612fa1565b919050565b600067ffffffffffffffff82111561300857613007612f72565b5b61301182612da7565b9050602081019050919050565b82818337600083830152505050565b600061304061303b84612fed565b612fd2565b90508281526020810184848401111561305c5761305b612f6d565b5b61306784828561301e565b509392505050565b600082601f83011261308457613083612f68565b5b813561309484826020860161302d565b91505092915050565b6000602082840312156130b3576130b2612c93565b5b600082013567ffffffffffffffff8111156130d1576130d0612c98565b5b6130dd8482850161306f565b91505092915050565b6130ef81612d22565b81146130fa57600080fd5b50565b60008135905061310c816130e6565b92915050565b60006020828403121561312857613127612c93565b5b6000613136848285016130fd565b91505092915050565b60008060006060848603121561315857613157612c93565b5b600061316686828701612ee9565b935050602061317786828701612ee9565b925050604061318886828701612e34565b9150509250925092565b6000819050919050565b60006131b76131b26131ad84612e76565b613192565b612e76565b9050919050565b60006131c98261319c565b9050919050565b60006131db826131be565b9050919050565b6131eb816131d0565b82525050565b600060208201905061320660008301846131e2565b92915050565b60006020828403121561322257613221612c93565b5b600061323084828501612ee9565b91505092915050565b600080604083850312156132505761324f612c93565b5b600061325e85828601612ee9565b925050602061326f858286016130fd565b9150509250929050565b600067ffffffffffffffff82111561329457613293612f72565b5b61329d82612da7565b9050602081019050919050565b60006132bd6132b884613279565b612fd2565b9050828152602081018484840111156132d9576132d8612f6d565b5b6132e484828561301e565b509392505050565b600082601f83011261330157613300612f68565b5b81356133118482602086016132aa565b91505092915050565b6000806000806080858703121561333457613333612c93565b5b600061334287828801612ee9565b945050602061335387828801612ee9565b935050604061336487828801612e34565b925050606085013567ffffffffffffffff81111561338557613384612c98565b5b613391878288016132ec565b91505092959194509250565b600080604083850312156133b4576133b3612c93565b5b60006133c285828601612ee9565b92505060206133d385828601612ee9565b9150509250929050565b600080604083850312156133f4576133f3612c93565b5b600061340285828601612e34565b925050602061341385828601612ee9565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061346457607f821691505b6020821081036134775761347661341d565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b60006134b3602083612d63565b91506134be8261347d565b602082019050919050565b600060208201905081810360008301526134e2816134a6565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b600061351f601f83612d63565b915061352a826134e9565b602082019050919050565b6000602082019050818103600083015261354e81613512565b9050919050565b600081905092915050565b50565b6000613570600083613555565b915061357b82613560565b600082019050919050565b600061359182613563565b9150819050919050565b7f4d696e74696e6720686173206e6f742073746172746564207965742e00000000600082015250565b60006135d1601c83612d63565b91506135dc8261359b565b602082019050919050565b60006020820190508181036000830152613600816135c4565b9050919050565b7f596f752063616e206f6e6c79206d696e74203520666f7865732070657220747260008201527f616e73616374696f6e2e00000000000000000000000000000000000000000000602082015250565b6000613663602a83612d63565b915061366e82613607565b604082019050919050565b6000602082019050818103600083015261369281613656565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006136d382612e13565b91506136de83612e13565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561371357613712613699565b5b828201905092915050565b7f546865726520617265206e6f20666f786573206c656674732100000000000000600082015250565b6000613754601983612d63565b915061375f8261371e565b602082019050919050565b6000602082019050818103600083015261378381613747565b9050919050565b7f4e6f206d696e74696e67207769746820736d61727420636f6e74726163742e00600082015250565b60006137c0601f83612d63565b91506137cb8261378a565b602082019050919050565b600060208201905081810360008301526137ef816137b3565b9050919050565b7f596f752068617665206d696e74656420746865206d6178206e756d626572206f60008201527f6620666f78657321000000000000000000000000000000000000000000000000602082015250565b6000613852602883612d63565b915061385d826137f6565b604082019050919050565b6000602082019050818103600083015261388181613845565b9050919050565b600061389382612e13565b915061389e83612e13565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156138d7576138d6613699565b5b828202905092915050565b7f496e73756666696369656e74206f7220696e636f72726563742066756e64732e600082015250565b6000613918602083612d63565b9150613923826138e2565b602082019050919050565b600060208201905081810360008301526139478161390b565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006139aa602f83612d63565b91506139b58261394e565b604082019050919050565b600060208201905081810360008301526139d98161399d565b9050919050565b600081905092915050565b60006139f682612d58565b613a0081856139e0565b9350613a10818560208601612d74565b80840191505092915050565b60008190508160005260206000209050919050565b60008154613a3e8161344c565b613a4881866139e0565b94506001821660008114613a635760018114613a7457613aa7565b60ff19831686528186019350613aa7565b613a7d85613a1c565b60005b83811015613a9f57815481890152600182019150602081019050613a80565b838801955050505b50505092915050565b6000613abc82866139eb565b9150613ac882856139eb565b9150613ad48284613a31565b9150819050949350505050565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b6000613b17601483612d63565b9150613b2282613ae1565b602082019050919050565b60006020820190508181036000830152613b4681613b0a565b9050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613ba9602683612d63565b9150613bb482613b4d565b604082019050919050565b60006020820190508181036000830152613bd881613b9c565b9050919050565b6000604082019050613bf46000830185612ea8565b613c016020830184612ea8565b9392505050565b600081519050613c17816130e6565b92915050565b600060208284031215613c3357613c32612c93565b5b6000613c4184828501613c08565b91505092915050565b6000613c5582612e13565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613c8757613c86613699565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613ccc82612e13565b9150613cd783612e13565b925082613ce757613ce6613c92565b5b828204905092915050565b6000613cfd82612e13565b9150613d0883612e13565b925082821015613d1b57613d1a613699565b5b828203905092915050565b6000613d3182612e13565b9150613d3c83612e13565b925082613d4c57613d4b613c92565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b6000613dad82613d86565b613db78185613d91565b9350613dc7818560208601612d74565b613dd081612da7565b840191505092915050565b6000608082019050613df06000830187612ea8565b613dfd6020830186612ea8565b613e0a6040830185612f3e565b8181036060830152613e1c8184613da2565b905095945050505050565b600081519050613e3681612cc9565b92915050565b600060208284031215613e5257613e51612c93565b5b6000613e6084828501613e27565b9150509291505056fea2646970667358221220ac9ada43f61ebea56bcf975c0e0d4d5de69acf6478e951312822316d9f4daf3f64736f6c634300080d0033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000000000000000000000000000000000000000000080000000000000000000000000000000000000000000000000000000000000000a466f782046616d696c79000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000009464f5846414d494c590000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _tokenName (string): Fox Family
Arg [1] : _tokenSymbol (string): FOXFAMILY

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [3] : 466f782046616d696c7900000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [5] : 464f5846414d494c590000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

51213:4177:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17818:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22831:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24907:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53961:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54658:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51433:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53772:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53878:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16872:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51538:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54819:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51505:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54077:172;;;;;;;;;;;;;:::i;:::-;;2827:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54986:169;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53360:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51471:29;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53528:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51607:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51357:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51577:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51324:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22620:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18497:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50361:103;;;;;;;;;;;;;:::i;:::-;;53666:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49710:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23000:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52462:127;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54478:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51395:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55161:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52909:445;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54255:107;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53440:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25562:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52597:205;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50619:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17818:615;17903:4;18218:10;18203:25;;:11;:25;;;;:102;;;;18295:10;18280:25;;:11;:25;;;;18203:102;:179;;;;18372:10;18357:25;;:11;:25;;;;18203:179;18183:199;;17818:615;;;:::o;22831:100::-;22885:13;22918:5;22911:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22831:100;:::o;24907:204::-;24975:7;25000:16;25008:7;25000;:16::i;:::-;24995:64;;25025:34;;;;;;;;;;;;;;24995:64;25079:15;:24;25095:7;25079:24;;;;;;;;;;;;;;;;;;;;;25072:31;;24907:204;;;:::o;53961:110::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54051:14:::1;54035:13;:30;;;;53961:110:::0;:::o;54658:155::-;54754:8;4348:30;4369:8;4348:20;:30::i;:::-;54775:32:::1;54789:8;54799:7;54775:13;:32::i;:::-;54658:155:::0;;;:::o;51433:33::-;;;;:::o;53772:100::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53856:10:::1;53844:9;:22;;;;;;;;;;;;:::i;:::-;;53772:100:::0;:::o;53878:77::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53943:6:::1;53934;;:15;;;;;;;;;;;;;;;;;;53878:77:::0;:::o;16872:315::-;16925:7;17153:15;:13;:15::i;:::-;17138:12;;17122:13;;:28;:46;17115:53;;16872:315;:::o;51538:32::-;;;;:::o;54819:161::-;54920:4;4176:10;4168:18;;:4;:18;;;4164:83;;4203:32;4224:10;4203:20;:32::i;:::-;4164:83;54937:37:::1;54956:4;54962:2;54966:7;54937:18;:37::i;:::-;54819:161:::0;;;;:::o;51505:28::-;;;;:::o;54077:172::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46917:1:::1;47515:7;;:19:::0;47507:63:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;46917:1;47648:7;:18;;;;54135::::2;54167:7;:5;:7::i;:::-;54159:21;;54188;54159:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54134:80;;;54229:13;54221:22;;;::::0;::::2;;54127:122;46873:1:::1;47827:7;:22;;;;54077:172::o:0;2827:143::-;2927:42;2827:143;:::o;54986:169::-;55091:4;4176:10;4168:18;;:4;:18;;;4164:83;;4203:32;4224:10;4203:20;:32::i;:::-;4164:83;55108:41:::1;55131:4;55137:2;55141:7;55108:22;:41::i;:::-;54986:169:::0;;;;:::o;53360:74::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53423:5:::1;53416:4;:12;;;;53360:74:::0;:::o;51471:29::-;;;;:::o;53528:132::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53636:18:::1;53616:17;:38;;;;;;;;;;;;:::i;:::-;;53528:132:::0;:::o;51607:27::-;;;;;;;;;;;;;:::o;51357:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51577:25::-;;;;;;;;;;;;;:::o;51324:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22620:144::-;22684:7;22727:27;22746:7;22727:18;:27::i;:::-;22704:52;;22620:144;;;:::o;18497:224::-;18561:7;18602:1;18585:19;;:5;:19;;;18581:60;;18613:28;;;;;;;;;;;;;;18581:60;13836:13;18659:18;:25;18678:5;18659:25;;;;;;;;;;;;;;;;:54;18652:61;;18497:224;;;:::o;50361:103::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50426:30:::1;50453:1;50426:18;:30::i;:::-;50361:103::o:0;53666:100::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53750:10:::1;53738:9;:22;;;;;;;;;;;;:::i;:::-;;53666:100:::0;:::o;49710:87::-;49756:7;49783:6;;;;;;;;;;;49776:13;;49710:87;:::o;23000:104::-;23056:13;23089:7;23082:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23000:104;:::o;52462:127::-;52527:11;51902:6;;;;;;;;;;;51901:7;51893:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;51970:1;51956:11;:15;:43;;;;;51990:9;;51975:11;:24;;51956:43;51948:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;52092:7;;52077:11;52061:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:38;;52053:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52157:10;52144:23;;:9;:23;;;52136:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;52240:1;52226:11;:15;:74;;;;;52287:13;;52272:11;52245:24;52258:10;52245:12;:24::i;:::-;:38;;;;:::i;:::-;:55;;52226:74;52210:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;52394:11;52387:4;;:18;;;;:::i;:::-;52374:9;:31;;52366:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52547:36:::1;52557:12;:10;:12::i;:::-;52571:11;52547:9;:36::i;:::-;52462:127:::0;;:::o;54478:174::-;54582:8;4348:30;4369:8;4348:20;:30::i;:::-;54603:43:::1;54627:8;54637;54603:23;:43::i;:::-;54478:174:::0;;;:::o;51395:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55161:224::-;55312:4;4176:10;4168:18;;:4;:18;;;4164:83;;4203:32;4224:10;4203:20;:32::i;:::-;4164:83;55332:47:::1;55355:4;55361:2;55365:7;55374:4;55332:22;:47::i;:::-;55161:224:::0;;;;;:::o;52909:445::-;52983:13;53013:17;53021:8;53013:7;:17::i;:::-;53005:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;53107:5;53095:17;;:8;;;;;;;;;;;:17;;;53091:64;;53130:17;53123:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53091:64;53163:28;53194:10;:8;:10::i;:::-;53163:41;;53249:1;53224:14;53218:28;:32;:130;;;;;;;;;;;;;;;;;53286:14;53302:19;:8;:17;:19::i;:::-;53323:9;53269:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53218:130;53211:137;;;52909:445;;;;:::o;54255:107::-;54313:7;54336:20;54350:5;54336:13;:20::i;:::-;54329:27;;54255:107;;;:::o;53440:81::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53509:6:::1;53498:8;;:17;;;;;;;;;;;;;;;;;;53440:81:::0;:::o;25562:164::-;25659:4;25683:18;:25;25702:5;25683:25;;;;;;;;;;;;;;;:35;25709:8;25683:35;;;;;;;;;;;;;;;;;;;;;;;;;25676:42;;25562:164;;;;:::o;52597:205::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52724:7:::1;;52709:11;52693:13;:11;:13::i;:::-;:27;;;;:::i;:::-;:38;;52685:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;52763:33;52773:9;52784:11;52763:9;:33::i;:::-;52597:205:::0;;:::o;50619:201::-;49941:12;:10;:12::i;:::-;49930:23;;:7;:5;:7::i;:::-;:23;;;49922:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;50728:1:::1;50708:22;;:8;:22;;::::0;50700:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;50784:28;50803:8;50784:18;:28::i;:::-;50619:201:::0;:::o;26941:273::-;26998:4;27054:7;27035:15;:13;:15::i;:::-;:26;;:66;;;;;27088:13;;27078:7;:23;27035:66;:152;;;;;27186:1;14606:8;27139:17;:26;27157:7;27139:26;;;;;;;;;;;;:43;:48;27035:152;27015:172;;26941:273;;;:::o;48489:98::-;48542:7;48569:10;48562:17;;48489:98;:::o;4406:419::-;4645:1;2927:42;4597:45;;;:49;4593:225;;;2927:42;4668;;;4719:4;4726:8;4668:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;4663:144;;4782:8;4763:28;;;;;;;;;;;:::i;:::-;;;;;;;;4663:144;4593:225;4406:419;:::o;24359:482::-;24440:13;24472:27;24491:7;24472:18;:27::i;:::-;24440:61;;24522:5;24516:11;;:2;:11;;;24512:48;;24536:24;;;;;;;;;;;;;;24512:48;24600:5;24577:28;;:19;:17;:19::i;:::-;:28;;;24573:175;;24625:44;24642:5;24649:19;:17;:19::i;:::-;24625:16;:44::i;:::-;24620:128;;24697:35;;;;;;;;;;;;;;24620:128;24573:175;24787:2;24760:15;:24;24776:7;24760:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;24825:7;24821:2;24805:28;;24814:5;24805:28;;;;;;;;;;;;24429:412;24359:482;;:::o;52808:95::-;52873:7;52896:1;52889:8;;52808:95;:::o;25793:170::-;25927:28;25937:4;25943:2;25947:7;25927:9;:28::i;:::-;25793:170;;;:::o;26034:185::-;26172:39;26189:4;26195:2;26199:7;26172:39;;;;;;;;;;;;:16;:39::i;:::-;26034:185;;;:::o;20135:1129::-;20202:7;20222:12;20237:7;20222:22;;20305:4;20286:15;:13;:15::i;:::-;:23;20282:915;;20339:13;;20332:4;:20;20328:869;;;20377:14;20394:17;:23;20412:4;20394:23;;;;;;;;;;;;20377:40;;20510:1;14606:8;20483:6;:23;:28;20479:699;;21002:113;21019:1;21009:6;:11;21002:113;;21062:17;:25;21080:6;;;;;;;21062:25;;;;;;;;;;;;21053:34;;21002:113;;;21148:6;21141:13;;;;;;20479:699;20354:843;20328:869;20282:915;21225:31;;;;;;;;;;;;;;20135:1129;;;;:::o;50980:191::-;51054:16;51073:6;;;;;;;;;;;51054:25;;51099:8;51090:6;;:17;;;;;;;;;;;;;;;;;;51154:8;51123:40;;51144:8;51123:40;;;;;;;;;;;;51043:128;50980:191;:::o;27298:104::-;27367:27;27377:2;27381:8;27367:27;;;;;;;;;;;;:9;:27::i;:::-;27298:104;;:::o;25183:308::-;25294:19;:17;:19::i;:::-;25282:31;;:8;:31;;;25278:61;;25322:17;;;;;;;;;;;;;;25278:61;25404:8;25352:18;:39;25371:19;:17;:19::i;:::-;25352:39;;;;;;;;;;;;;;;:49;25392:8;25352:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;25464:8;25428:55;;25443:19;:17;:19::i;:::-;25428:55;;;25474:8;25428:55;;;;;;:::i;:::-;;;;;;;;25183:308;;:::o;26290:396::-;26457:28;26467:4;26473:2;26477:7;26457:9;:28::i;:::-;26518:1;26500:2;:14;;;:19;26496:183;;26539:56;26570:4;26576:2;26580:7;26589:5;26539:30;:56::i;:::-;26534:145;;26623:40;;;;;;;;;;;;;;26534:145;26496:183;26290:396;;;;:::o;54368:104::-;54428:13;54457:9;54450:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54368:104;:::o;43411:723::-;43467:13;43697:1;43688:5;:10;43684:53;;43715:10;;;;;;;;;;;;;;;;;;;;;43684:53;43747:12;43762:5;43747:20;;43778:14;43803:78;43818:1;43810:4;:9;43803:78;;43836:8;;;;;:::i;:::-;;;;43867:2;43859:10;;;;;:::i;:::-;;;43803:78;;;43891:19;43923:6;43913:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43891:39;;43941:154;43957:1;43948:5;:10;43941:154;;43985:1;43975:11;;;;;:::i;:::-;;;44052:2;44044:5;:10;;;;:::i;:::-;44031:2;:24;;;;:::i;:::-;44018:39;;44001:6;44008;44001:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;44081:2;44072:11;;;;;:::i;:::-;;;43941:154;;;44119:6;44105:21;;;;;43411:723;;;;:::o;18803:176::-;18864:7;13836:13;13973:2;18892:18;:25;18911:5;18892:25;;;;;;;;;;;;;;;;:49;;18891:80;18884:87;;18803:176;;;:::o;40923:105::-;40983:7;41010:10;41003:17;;40923:105;:::o;32180:2515::-;32295:27;32325;32344:7;32325:18;:27::i;:::-;32295:57;;32410:4;32369:45;;32385:19;32369:45;;;32365:86;;32423:28;;;;;;;;;;;;;;32365:86;32464:22;32513:4;32490:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;32534:43;32551:4;32557:19;:17;:19::i;:::-;32534:16;:43::i;:::-;32490:87;:147;;;;32618:19;:17;:19::i;:::-;32594:43;;:20;32606:7;32594:11;:20::i;:::-;:43;;;32490:147;32464:174;;32656:17;32651:66;;32682:35;;;;;;;;;;;;;;32651:66;32746:1;32732:16;;:2;:16;;;32728:52;;32757:23;;;;;;;;;;;;;;32728:52;32793:43;32815:4;32821:2;32825:7;32834:1;32793:21;:43::i;:::-;32909:15;:24;32925:7;32909:24;;;;;;;;;;;;32902:31;;;;;;;;;;;33301:18;:24;33320:4;33301:24;;;;;;;;;;;;;;;;33299:26;;;;;;;;;;;;33370:18;:22;33389:2;33370:22;;;;;;;;;;;;;;;;33368:24;;;;;;;;;;;14888:8;14490:3;33751:15;:41;;33709:21;33727:2;33709:17;:21::i;:::-;:84;:128;33663:17;:26;33681:7;33663:26;;;;;;;;;;;:174;;;;34007:1;14888:8;33957:19;:46;:51;33953:626;;34029:19;34061:1;34051:7;:11;34029:33;;34218:1;34184:17;:30;34202:11;34184:30;;;;;;;;;;;;:35;34180:384;;34322:13;;34307:11;:28;34303:242;;34502:19;34469:17;:30;34487:11;34469:30;;;;;;;;;;;:52;;;;34303:242;34180:384;34010:569;33953:626;34626:7;34622:2;34607:27;;34616:4;34607:27;;;;;;;;;;;;34645:42;34666:4;34672:2;34676:7;34685:1;34645:20;:42::i;:::-;32284:2411;;32180:2515;;;:::o;27775:2236::-;27898:20;27921:13;;27898:36;;27963:1;27949:16;;:2;:16;;;27945:48;;27974:19;;;;;;;;;;;;;;27945:48;28020:1;28008:8;:13;28004:44;;28030:18;;;;;;;;;;;;;;28004:44;28061:61;28091:1;28095:2;28099:12;28113:8;28061:21;:61::i;:::-;28665:1;13973:2;28636:1;:25;;28635:31;28623:8;:44;28597:18;:22;28616:2;28597:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;14753:3;29066:29;29093:1;29081:8;:13;29066:14;:29::i;:::-;:56;;14490:3;29003:15;:41;;28961:21;28979:2;28961:17;:21::i;:::-;:84;:162;28910:17;:31;28928:12;28910:31;;;;;;;;;;;:213;;;;29140:20;29163:12;29140:35;;29190:11;29219:8;29204:12;:23;29190:37;;29266:1;29248:2;:14;;;:19;29244:635;;29288:313;29344:12;29340:2;29319:38;;29336:1;29319:38;;;;;;;;;;;;29385:69;29424:1;29428:2;29432:14;;;;;;29448:5;29385:30;:69::i;:::-;29380:174;;29490:40;;;;;;;;;;;;;;29380:174;29596:3;29581:12;:18;29288:313;;29682:12;29665:13;;:29;29661:43;;29696:8;;;29661:43;29244:635;;;29745:119;29801:14;;;;;;29797:2;29776:40;;29793:1;29776:40;;;;;;;;;;;;29859:3;29844:12;:18;29745:119;;29244:635;29909:12;29893:13;:28;;;;28374:1559;;29943:60;29972:1;29976:2;29980:12;29994:8;29943:20;:60::i;:::-;27887:2124;27775:2236;;;:::o;38392:716::-;38555:4;38601:2;38576:45;;;38622:19;:17;:19::i;:::-;38643:4;38649:7;38658:5;38576:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38572:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38876:1;38859:6;:13;:18;38855:235;;38905:40;;;;;;;;;;;;;;38855:235;39048:6;39042:13;39033:6;39029:2;39025:15;39018:38;38572:529;38745:54;;;38735:64;;;:6;:64;;;;38728:71;;;38392:716;;;;;;:::o;39756:159::-;;;;;:::o;23920:148::-;23984:14;24045:5;24035:15;;23920:148;;;:::o;40574:158::-;;;;;:::o;24155:142::-;24213:14;24274:5;24264:15;;24155:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:117::-;5399:1;5396;5389:12;5413:117;5522:1;5519;5512:12;5536:180;5584:77;5581:1;5574:88;5681:4;5678:1;5671:15;5705:4;5702:1;5695:15;5722:281;5805:27;5827:4;5805:27;:::i;:::-;5797:6;5793:40;5935:6;5923:10;5920:22;5899:18;5887:10;5884:34;5881:62;5878:88;;;5946:18;;:::i;:::-;5878:88;5986:10;5982:2;5975:22;5765:238;5722:281;;:::o;6009:129::-;6043:6;6070:20;;:::i;:::-;6060:30;;6099:33;6127:4;6119:6;6099:33;:::i;:::-;6009:129;;;:::o;6144:308::-;6206:4;6296:18;6288:6;6285:30;6282:56;;;6318:18;;:::i;:::-;6282:56;6356:29;6378:6;6356:29;:::i;:::-;6348:37;;6440:4;6434;6430:15;6422:23;;6144:308;;;:::o;6458:154::-;6542:6;6537:3;6532;6519:30;6604:1;6595:6;6590:3;6586:16;6579:27;6458:154;;;:::o;6618:412::-;6696:5;6721:66;6737:49;6779:6;6737:49;:::i;:::-;6721:66;:::i;:::-;6712:75;;6810:6;6803:5;6796:21;6848:4;6841:5;6837:16;6886:3;6877:6;6872:3;6868:16;6865:25;6862:112;;;6893:79;;:::i;:::-;6862:112;6983:41;7017:6;7012:3;7007;6983:41;:::i;:::-;6702:328;6618:412;;;;;:::o;7050:340::-;7106:5;7155:3;7148:4;7140:6;7136:17;7132:27;7122:122;;7163:79;;:::i;:::-;7122:122;7280:6;7267:20;7305:79;7380:3;7372:6;7365:4;7357:6;7353:17;7305:79;:::i;:::-;7296:88;;7112:278;7050:340;;;;:::o;7396:509::-;7465:6;7514:2;7502:9;7493:7;7489:23;7485:32;7482:119;;;7520:79;;:::i;:::-;7482:119;7668:1;7657:9;7653:17;7640:31;7698:18;7690:6;7687:30;7684:117;;;7720:79;;:::i;:::-;7684:117;7825:63;7880:7;7871:6;7860:9;7856:22;7825:63;:::i;:::-;7815:73;;7611:287;7396:509;;;;:::o;7911:116::-;7981:21;7996:5;7981:21;:::i;:::-;7974:5;7971:32;7961:60;;8017:1;8014;8007:12;7961:60;7911:116;:::o;8033:133::-;8076:5;8114:6;8101:20;8092:29;;8130:30;8154:5;8130:30;:::i;:::-;8033:133;;;;:::o;8172:323::-;8228:6;8277:2;8265:9;8256:7;8252:23;8248:32;8245:119;;;8283:79;;:::i;:::-;8245:119;8403:1;8428:50;8470:7;8461:6;8450:9;8446:22;8428:50;:::i;:::-;8418:60;;8374:114;8172:323;;;;:::o;8501:619::-;8578:6;8586;8594;8643:2;8631:9;8622:7;8618:23;8614:32;8611:119;;;8649:79;;:::i;:::-;8611:119;8769:1;8794:53;8839:7;8830:6;8819:9;8815:22;8794:53;:::i;:::-;8784:63;;8740:117;8896:2;8922:53;8967:7;8958:6;8947:9;8943:22;8922:53;:::i;:::-;8912:63;;8867:118;9024:2;9050:53;9095:7;9086:6;9075:9;9071:22;9050:53;:::i;:::-;9040:63;;8995:118;8501:619;;;;;:::o;9126:60::-;9154:3;9175:5;9168:12;;9126:60;;;:::o;9192:142::-;9242:9;9275:53;9293:34;9302:24;9320:5;9302:24;:::i;:::-;9293:34;:::i;:::-;9275:53;:::i;:::-;9262:66;;9192:142;;;:::o;9340:126::-;9390:9;9423:37;9454:5;9423:37;:::i;:::-;9410:50;;9340:126;;;:::o;9472:157::-;9553:9;9586:37;9617:5;9586:37;:::i;:::-;9573:50;;9472:157;;;:::o;9635:193::-;9753:68;9815:5;9753:68;:::i;:::-;9748:3;9741:81;9635:193;;:::o;9834:284::-;9958:4;9996:2;9985:9;9981:18;9973:26;;10009:102;10108:1;10097:9;10093:17;10084:6;10009:102;:::i;:::-;9834:284;;;;:::o;10124:329::-;10183:6;10232:2;10220:9;10211:7;10207:23;10203:32;10200:119;;;10238:79;;:::i;:::-;10200:119;10358:1;10383:53;10428:7;10419:6;10408:9;10404:22;10383:53;:::i;:::-;10373:63;;10329:117;10124:329;;;;:::o;10459:468::-;10524:6;10532;10581:2;10569:9;10560:7;10556:23;10552:32;10549:119;;;10587:79;;:::i;:::-;10549:119;10707:1;10732:53;10777:7;10768:6;10757:9;10753:22;10732:53;:::i;:::-;10722:63;;10678:117;10834:2;10860:50;10902:7;10893:6;10882:9;10878:22;10860:50;:::i;:::-;10850:60;;10805:115;10459:468;;;;;:::o;10933:307::-;10994:4;11084:18;11076:6;11073:30;11070:56;;;11106:18;;:::i;:::-;11070:56;11144:29;11166:6;11144:29;:::i;:::-;11136:37;;11228:4;11222;11218:15;11210:23;;10933:307;;;:::o;11246:410::-;11323:5;11348:65;11364:48;11405:6;11364:48;:::i;:::-;11348:65;:::i;:::-;11339:74;;11436:6;11429:5;11422:21;11474:4;11467:5;11463:16;11512:3;11503:6;11498:3;11494:16;11491:25;11488:112;;;11519:79;;:::i;:::-;11488:112;11609:41;11643:6;11638:3;11633;11609:41;:::i;:::-;11329:327;11246:410;;;;;:::o;11675:338::-;11730:5;11779:3;11772:4;11764:6;11760:17;11756:27;11746:122;;11787:79;;:::i;:::-;11746:122;11904:6;11891:20;11929:78;12003:3;11995:6;11988:4;11980:6;11976:17;11929:78;:::i;:::-;11920:87;;11736:277;11675:338;;;;:::o;12019:943::-;12114:6;12122;12130;12138;12187:3;12175:9;12166:7;12162:23;12158:33;12155:120;;;12194:79;;:::i;:::-;12155:120;12314:1;12339:53;12384:7;12375:6;12364:9;12360:22;12339:53;:::i;:::-;12329:63;;12285:117;12441:2;12467:53;12512:7;12503:6;12492:9;12488:22;12467:53;:::i;:::-;12457:63;;12412:118;12569:2;12595:53;12640:7;12631:6;12620:9;12616:22;12595:53;:::i;:::-;12585:63;;12540:118;12725:2;12714:9;12710:18;12697:32;12756:18;12748:6;12745:30;12742:117;;;12778:79;;:::i;:::-;12742:117;12883:62;12937:7;12928:6;12917:9;12913:22;12883:62;:::i;:::-;12873:72;;12668:287;12019:943;;;;;;;:::o;12968:474::-;13036:6;13044;13093:2;13081:9;13072:7;13068:23;13064:32;13061:119;;;13099:79;;:::i;:::-;13061:119;13219:1;13244:53;13289:7;13280:6;13269:9;13265:22;13244:53;:::i;:::-;13234:63;;13190:117;13346:2;13372:53;13417:7;13408:6;13397:9;13393:22;13372:53;:::i;:::-;13362:63;;13317:118;12968:474;;;;;:::o;13448:::-;13516:6;13524;13573:2;13561:9;13552:7;13548:23;13544:32;13541:119;;;13579:79;;:::i;:::-;13541:119;13699:1;13724:53;13769:7;13760:6;13749:9;13745:22;13724:53;:::i;:::-;13714:63;;13670:117;13826:2;13852:53;13897:7;13888:6;13877:9;13873:22;13852:53;:::i;:::-;13842:63;;13797:118;13448:474;;;;;:::o;13928:180::-;13976:77;13973:1;13966:88;14073:4;14070:1;14063:15;14097:4;14094:1;14087:15;14114:320;14158:6;14195:1;14189:4;14185:12;14175:22;;14242:1;14236:4;14232:12;14263:18;14253:81;;14319:4;14311:6;14307:17;14297:27;;14253:81;14381:2;14373:6;14370:14;14350:18;14347:38;14344:84;;14400:18;;:::i;:::-;14344:84;14165:269;14114:320;;;:::o;14440:182::-;14580:34;14576:1;14568:6;14564:14;14557:58;14440:182;:::o;14628:366::-;14770:3;14791:67;14855:2;14850:3;14791:67;:::i;:::-;14784:74;;14867:93;14956:3;14867:93;:::i;:::-;14985:2;14980:3;14976:12;14969:19;;14628:366;;;:::o;15000:419::-;15166:4;15204:2;15193:9;15189:18;15181:26;;15253:9;15247:4;15243:20;15239:1;15228:9;15224:17;15217:47;15281:131;15407:4;15281:131;:::i;:::-;15273:139;;15000:419;;;:::o;15425:181::-;15565:33;15561:1;15553:6;15549:14;15542:57;15425:181;:::o;15612:366::-;15754:3;15775:67;15839:2;15834:3;15775:67;:::i;:::-;15768:74;;15851:93;15940:3;15851:93;:::i;:::-;15969:2;15964:3;15960:12;15953:19;;15612:366;;;:::o;15984:419::-;16150:4;16188:2;16177:9;16173:18;16165:26;;16237:9;16231:4;16227:20;16223:1;16212:9;16208:17;16201:47;16265:131;16391:4;16265:131;:::i;:::-;16257:139;;15984:419;;;:::o;16409:147::-;16510:11;16547:3;16532:18;;16409:147;;;;:::o;16562:114::-;;:::o;16682:398::-;16841:3;16862:83;16943:1;16938:3;16862:83;:::i;:::-;16855:90;;16954:93;17043:3;16954:93;:::i;:::-;17072:1;17067:3;17063:11;17056:18;;16682:398;;;:::o;17086:379::-;17270:3;17292:147;17435:3;17292:147;:::i;:::-;17285:154;;17456:3;17449:10;;17086:379;;;:::o;17471:178::-;17611:30;17607:1;17599:6;17595:14;17588:54;17471:178;:::o;17655:366::-;17797:3;17818:67;17882:2;17877:3;17818:67;:::i;:::-;17811:74;;17894:93;17983:3;17894:93;:::i;:::-;18012:2;18007:3;18003:12;17996:19;;17655:366;;;:::o;18027:419::-;18193:4;18231:2;18220:9;18216:18;18208:26;;18280:9;18274:4;18270:20;18266:1;18255:9;18251:17;18244:47;18308:131;18434:4;18308:131;:::i;:::-;18300:139;;18027:419;;;:::o;18452:229::-;18592:34;18588:1;18580:6;18576:14;18569:58;18661:12;18656:2;18648:6;18644:15;18637:37;18452:229;:::o;18687:366::-;18829:3;18850:67;18914:2;18909:3;18850:67;:::i;:::-;18843:74;;18926:93;19015:3;18926:93;:::i;:::-;19044:2;19039:3;19035:12;19028:19;;18687:366;;;:::o;19059:419::-;19225:4;19263:2;19252:9;19248:18;19240:26;;19312:9;19306:4;19302:20;19298:1;19287:9;19283:17;19276:47;19340:131;19466:4;19340:131;:::i;:::-;19332:139;;19059:419;;;:::o;19484:180::-;19532:77;19529:1;19522:88;19629:4;19626:1;19619:15;19653:4;19650:1;19643:15;19670:305;19710:3;19729:20;19747:1;19729:20;:::i;:::-;19724:25;;19763:20;19781:1;19763:20;:::i;:::-;19758:25;;19917:1;19849:66;19845:74;19842:1;19839:81;19836:107;;;19923:18;;:::i;:::-;19836:107;19967:1;19964;19960:9;19953:16;;19670:305;;;;:::o;19981:175::-;20121:27;20117:1;20109:6;20105:14;20098:51;19981:175;:::o;20162:366::-;20304:3;20325:67;20389:2;20384:3;20325:67;:::i;:::-;20318:74;;20401:93;20490:3;20401:93;:::i;:::-;20519:2;20514:3;20510:12;20503:19;;20162:366;;;:::o;20534:419::-;20700:4;20738:2;20727:9;20723:18;20715:26;;20787:9;20781:4;20777:20;20773:1;20762:9;20758:17;20751:47;20815:131;20941:4;20815:131;:::i;:::-;20807:139;;20534:419;;;:::o;20959:181::-;21099:33;21095:1;21087:6;21083:14;21076:57;20959:181;:::o;21146:366::-;21288:3;21309:67;21373:2;21368:3;21309:67;:::i;:::-;21302:74;;21385:93;21474:3;21385:93;:::i;:::-;21503:2;21498:3;21494:12;21487:19;;21146:366;;;:::o;21518:419::-;21684:4;21722:2;21711:9;21707:18;21699:26;;21771:9;21765:4;21761:20;21757:1;21746:9;21742:17;21735:47;21799:131;21925:4;21799:131;:::i;:::-;21791:139;;21518:419;;;:::o;21943:227::-;22083:34;22079:1;22071:6;22067:14;22060:58;22152:10;22147:2;22139:6;22135:15;22128:35;21943:227;:::o;22176:366::-;22318:3;22339:67;22403:2;22398:3;22339:67;:::i;:::-;22332:74;;22415:93;22504:3;22415:93;:::i;:::-;22533:2;22528:3;22524:12;22517:19;;22176:366;;;:::o;22548:419::-;22714:4;22752:2;22741:9;22737:18;22729:26;;22801:9;22795:4;22791:20;22787:1;22776:9;22772:17;22765:47;22829:131;22955:4;22829:131;:::i;:::-;22821:139;;22548:419;;;:::o;22973:348::-;23013:7;23036:20;23054:1;23036:20;:::i;:::-;23031:25;;23070:20;23088:1;23070:20;:::i;:::-;23065:25;;23258:1;23190:66;23186:74;23183:1;23180:81;23175:1;23168:9;23161:17;23157:105;23154:131;;;23265:18;;:::i;:::-;23154:131;23313:1;23310;23306:9;23295:20;;22973:348;;;;:::o;23327:182::-;23467:34;23463:1;23455:6;23451:14;23444:58;23327:182;:::o;23515:366::-;23657:3;23678:67;23742:2;23737:3;23678:67;:::i;:::-;23671:74;;23754:93;23843:3;23754:93;:::i;:::-;23872:2;23867:3;23863:12;23856:19;;23515:366;;;:::o;23887:419::-;24053:4;24091:2;24080:9;24076:18;24068:26;;24140:9;24134:4;24130:20;24126:1;24115:9;24111:17;24104:47;24168:131;24294:4;24168:131;:::i;:::-;24160:139;;23887:419;;;:::o;24312:234::-;24452:34;24448:1;24440:6;24436:14;24429:58;24521:17;24516:2;24508:6;24504:15;24497:42;24312:234;:::o;24552:366::-;24694:3;24715:67;24779:2;24774:3;24715:67;:::i;:::-;24708:74;;24791:93;24880:3;24791:93;:::i;:::-;24909:2;24904:3;24900:12;24893:19;;24552:366;;;:::o;24924:419::-;25090:4;25128:2;25117:9;25113:18;25105:26;;25177:9;25171:4;25167:20;25163:1;25152:9;25148:17;25141:47;25205:131;25331:4;25205:131;:::i;:::-;25197:139;;24924:419;;;:::o;25349:148::-;25451:11;25488:3;25473:18;;25349:148;;;;:::o;25503:377::-;25609:3;25637:39;25670:5;25637:39;:::i;:::-;25692:89;25774:6;25769:3;25692:89;:::i;:::-;25685:96;;25790:52;25835:6;25830:3;25823:4;25816:5;25812:16;25790:52;:::i;:::-;25867:6;25862:3;25858:16;25851:23;;25613:267;25503:377;;;;:::o;25886:141::-;25935:4;25958:3;25950:11;;25981:3;25978:1;25971:14;26015:4;26012:1;26002:18;25994:26;;25886:141;;;:::o;26057:845::-;26160:3;26197:5;26191:12;26226:36;26252:9;26226:36;:::i;:::-;26278:89;26360:6;26355:3;26278:89;:::i;:::-;26271:96;;26398:1;26387:9;26383:17;26414:1;26409:137;;;;26560:1;26555:341;;;;26376:520;;26409:137;26493:4;26489:9;26478;26474:25;26469:3;26462:38;26529:6;26524:3;26520:16;26513:23;;26409:137;;26555:341;26622:38;26654:5;26622:38;:::i;:::-;26682:1;26696:154;26710:6;26707:1;26704:13;26696:154;;;26784:7;26778:14;26774:1;26769:3;26765:11;26758:35;26834:1;26825:7;26821:15;26810:26;;26732:4;26729:1;26725:12;26720:17;;26696:154;;;26879:6;26874:3;26870:16;26863:23;;26562:334;;26376:520;;26164:738;;26057:845;;;;:::o;26908:589::-;27133:3;27155:95;27246:3;27237:6;27155:95;:::i;:::-;27148:102;;27267:95;27358:3;27349:6;27267:95;:::i;:::-;27260:102;;27379:92;27467:3;27458:6;27379:92;:::i;:::-;27372:99;;27488:3;27481:10;;26908:589;;;;;;:::o;27503:170::-;27643:22;27639:1;27631:6;27627:14;27620:46;27503:170;:::o;27679:366::-;27821:3;27842:67;27906:2;27901:3;27842:67;:::i;:::-;27835:74;;27918:93;28007:3;27918:93;:::i;:::-;28036:2;28031:3;28027:12;28020:19;;27679:366;;;:::o;28051:419::-;28217:4;28255:2;28244:9;28240:18;28232:26;;28304:9;28298:4;28294:20;28290:1;28279:9;28275:17;28268:47;28332:131;28458:4;28332:131;:::i;:::-;28324:139;;28051:419;;;:::o;28476:225::-;28616:34;28612:1;28604:6;28600:14;28593:58;28685:8;28680:2;28672:6;28668:15;28661:33;28476:225;:::o;28707:366::-;28849:3;28870:67;28934:2;28929:3;28870:67;:::i;:::-;28863:74;;28946:93;29035:3;28946:93;:::i;:::-;29064:2;29059:3;29055:12;29048:19;;28707:366;;;:::o;29079:419::-;29245:4;29283:2;29272:9;29268:18;29260:26;;29332:9;29326:4;29322:20;29318:1;29307:9;29303:17;29296:47;29360:131;29486:4;29360:131;:::i;:::-;29352:139;;29079:419;;;:::o;29504:332::-;29625:4;29663:2;29652:9;29648:18;29640:26;;29676:71;29744:1;29733:9;29729:17;29720:6;29676:71;:::i;:::-;29757:72;29825:2;29814:9;29810:18;29801:6;29757:72;:::i;:::-;29504:332;;;;;:::o;29842:137::-;29896:5;29927:6;29921:13;29912:22;;29943:30;29967:5;29943:30;:::i;:::-;29842:137;;;;:::o;29985:345::-;30052:6;30101:2;30089:9;30080:7;30076:23;30072:32;30069:119;;;30107:79;;:::i;:::-;30069:119;30227:1;30252:61;30305:7;30296:6;30285:9;30281:22;30252:61;:::i;:::-;30242:71;;30198:125;29985:345;;;;:::o;30336:233::-;30375:3;30398:24;30416:5;30398:24;:::i;:::-;30389:33;;30444:66;30437:5;30434:77;30431:103;;30514:18;;:::i;:::-;30431:103;30561:1;30554:5;30550:13;30543:20;;30336:233;;;:::o;30575:180::-;30623:77;30620:1;30613:88;30720:4;30717:1;30710:15;30744:4;30741:1;30734:15;30761:185;30801:1;30818:20;30836:1;30818:20;:::i;:::-;30813:25;;30852:20;30870:1;30852:20;:::i;:::-;30847:25;;30891:1;30881:35;;30896:18;;:::i;:::-;30881:35;30938:1;30935;30931:9;30926:14;;30761:185;;;;:::o;30952:191::-;30992:4;31012:20;31030:1;31012:20;:::i;:::-;31007:25;;31046:20;31064:1;31046:20;:::i;:::-;31041:25;;31085:1;31082;31079:8;31076:34;;;31090:18;;:::i;:::-;31076:34;31135:1;31132;31128:9;31120:17;;30952:191;;;;:::o;31149:176::-;31181:1;31198:20;31216:1;31198:20;:::i;:::-;31193:25;;31232:20;31250:1;31232:20;:::i;:::-;31227:25;;31271:1;31261:35;;31276:18;;:::i;:::-;31261:35;31317:1;31314;31310:9;31305:14;;31149:176;;;;:::o;31331:180::-;31379:77;31376:1;31369:88;31476:4;31473:1;31466:15;31500:4;31497:1;31490:15;31517:98;31568:6;31602:5;31596:12;31586:22;;31517:98;;;:::o;31621:168::-;31704:11;31738:6;31733:3;31726:19;31778:4;31773:3;31769:14;31754:29;;31621:168;;;;:::o;31795:360::-;31881:3;31909:38;31941:5;31909:38;:::i;:::-;31963:70;32026:6;32021:3;31963:70;:::i;:::-;31956:77;;32042:52;32087:6;32082:3;32075:4;32068:5;32064:16;32042:52;:::i;:::-;32119:29;32141:6;32119:29;:::i;:::-;32114:3;32110:39;32103:46;;31885:270;31795:360;;;;:::o;32161:640::-;32356:4;32394:3;32383:9;32379:19;32371:27;;32408:71;32476:1;32465:9;32461:17;32452:6;32408:71;:::i;:::-;32489:72;32557:2;32546:9;32542:18;32533:6;32489:72;:::i;:::-;32571;32639:2;32628:9;32624:18;32615:6;32571:72;:::i;:::-;32690:9;32684:4;32680:20;32675:2;32664:9;32660:18;32653:48;32718:76;32789:4;32780:6;32718:76;:::i;:::-;32710:84;;32161:640;;;;;;;:::o;32807:141::-;32863:5;32894:6;32888:13;32879:22;;32910:32;32936:5;32910:32;:::i;:::-;32807:141;;;;:::o;32954:349::-;33023:6;33072:2;33060:9;33051:7;33047:23;33043:32;33040:119;;;33078:79;;:::i;:::-;33040:119;33198:1;33223:63;33278:7;33269:6;33258:9;33254:22;33223:63;:::i;:::-;33213:73;;33169:127;32954:349;;;;:::o

Swarm Source

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