ETH Price: $2,959.77 (+0.76%)

Token

BeracPoL (BPOL)

Overview

Max Total Supply

6,282 BPOL

Holders

3,236

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 BPOL
0x1a8a0adbd95487af4549df90adaad48849db5584
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
BeracPoL

Compiler Version
v0.8.24+commit.e11b9ed9

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Arbiscan.io on 2024-08-20
*/

// SPDX-License-Identifier: UNLICENSED



// File: @openzeppelin/contracts/token/ERC20/IERC20.sol
// OpenZeppelin Contracts (last updated v5.0.0) (token/ERC20/IERC20.sol)

pragma solidity ^0.8.20;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Emitted when "value" tokens are moved from one account ("from") to
     * another ("to").
     *
     * Note that "value" may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

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

    /**
     * @dev Returns the value of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

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

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

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

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

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/IERC165.sol)

pragma solidity ^0.8.20;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts (last updated v5.0.0) (utils/introspection/ERC165.sol)

pragma solidity ^0.8.20;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * """solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * """
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}




// File: @openzeppelin/contracts/utils/Context.sol
// OpenZeppelin Contracts (last updated v5.0.1) (utils/Context.sol)

pragma solidity ^0.8.20;

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

    function _contextSuffixLength() internal view virtual returns (uint256) {
        return 0;
    }
}

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v5.0.0) (access/Ownable.sol)

pragma solidity ^0.8.20;


/**
 * @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.
 *
 * The initial owner is set to the address provided by the deployer. 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;

    /**
     * @dev The caller account is not authorized to perform an operation.
     */
    error OwnableUnauthorizedAccount(address account);

    /**
     * @dev The owner is not a valid owner account. (eg. "address(0)")
     */
    error OwnableInvalidOwner(address owner);

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

    /**
     * @dev Initializes the contract setting the address provided by the deployer as the initial owner.
     */
    constructor(address initialOwner) {
        if (initialOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(initialOwner);
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        if (owner() != _msgSender()) {
            revert OwnableUnauthorizedAccount(_msgSender());
        }
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * "onlyOwner" functions. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby disabling 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 {
        if (newOwner == address(0)) {
            revert OwnableInvalidOwner(address(0));
        }
        _transferOwnership(newOwner);
    }

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

// File: IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

    /**
     * The "quantity" minted with ERC2309 exceeds the safety limit.
     */
    error MintERC2309QuantityExceedsLimit();

    /**
     * The "extraData" cannot be set on an unintialized ownership slot.
     */
    error OwnershipNotInitializedForExtraData();

    // =============================================================
    //                            STRUCTS
    // =============================================================

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Stores the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
        // Arbitrary data similar to "startTimestamp" that can be set via {_extraData}.
        uint24 extraData;
    }

    // =============================================================
    //                         TOKEN COUNTERS
    // =============================================================

    /**
     * @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() external view returns (uint256);

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * "interfaceId". See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 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",
     * 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,
        bytes calldata data
    ) external payable;

    /**
     * @dev Equivalent to "safeTransferFrom(from, to, tokenId, '')".
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

    /**
     * @dev Transfers "tokenId" 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 payable;

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

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

    // =============================================================
    //                           IERC2309
    // =============================================================

    /**
     * @dev Emitted when tokens in "fromTokenId" to "toTokenId"
     * (inclusive) is transferred from "from" to "to", as defined in the
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309) standard.
     *
     * See {_mintERC2309} for more details.
     */
    event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to);
}

// File: ERC721A.sol


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

pragma solidity ^0.8.4;


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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from "_startTokenId()".
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Bypass for a "--via-ir" bug (https://github.com/chiru-labs/ERC721A/pull/364).
    struct TokenApprovalRef {
        address value;
    }

    // =============================================================
    //                           CONSTANTS
    // =============================================================

    // 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 bit position of "extraData" in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

    // Mask of all 256 bits in a packed ownership except the 24 bits for "extraData".
    uint256 private constant _BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1;

    // The mask of the lower 160 bits for addresses.
    uint256 private constant _BITMASK_ADDRESS = (1 << 160) - 1;

    // The maximum "quantity" that can be minted with {_mintERC2309}.
    // This limit is to prevent overflows on the address data entries.
    // For a limit of 5000, a total of 3.689e15 calls to {_mintERC2309}
    // is required to cause an overflow, which is unrealistic.
    uint256 private constant _MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000;

    // The "Transfer" event signature is given by:
    // "keccak256(bytes("Transfer(address,address,uint256)"))".
    bytes32 private constant _TRANSFER_EVENT_SIGNATURE =
        0xddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef;

    // =============================================================
    //                            STORAGE
    // =============================================================

    // The next token ID 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"
    // - [232..255] "extraData"
    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 => TokenApprovalRef) private _tokenApprovals;

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

    // =============================================================
    //                          CONSTRUCTOR
    // =============================================================

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

    // =============================================================
    //                   TOKEN COUNTING OPERATIONS
    // =============================================================

    /**
     * @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 virtual 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 virtual 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 virtual 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 virtual returns (uint256) {
        return _burnCounter;
    }

    // =============================================================
    //                    ADDRESS DATA OPERATIONS
    // =============================================================

    /**
     * @dev Returns the number of tokens in "owner"'s account.
     */
    function balanceOf(address owner) public view virtual 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 auxiliary 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 auxiliary 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 virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast "aux" with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

    // =============================================================
    //                            IERC165
    // =============================================================

    /**
     * @dev Returns true if this contract implements the interface defined by
     * "interfaceId". See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    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: [ERC165](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.
    }

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

    /**
     * @dev Returns the token collection name.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for "tokenId" token.
     */
    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, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

    // =============================================================
    //                     OWNERSHIPS OPERATIONS
    // =============================================================

    /**
     * @dev Returns the owner of the "tokenId" token.
     *
     * Requirements:
     *
     * - "tokenId" must exist.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return address(uint160(_packedOwnershipOf(tokenId)));
    }

    /**
     * @dev Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around over time.
     */
    function _ownershipOf(uint256 tokenId) internal view virtual returns (TokenOwnership memory) {
        return _unpackedOwnership(_packedOwnershipOf(tokenId));
    }

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

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

    /**
     * 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 initialized ownership slot
                        // (i.e. "ownership.addr != address(0) && ownership.burned == false")
                        // before an unintialized ownership slot
                        // (i.e. "ownership.addr == address(0) && ownership.burned == false")
                        // Hence, "curr" will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev 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;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

    /**
     * @dev Packs ownership data into a single uint256.
     */
    function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) {
        assembly {
            // Mask "owner" to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // "owner | (block.timestamp << _BITPOS_START_TIMESTAMP) | flags".
            result := or(owner, or(shl(_BITPOS_START_TIMESTAMP, timestamp()), flags))
        }
    }

    /**
     * @dev Returns the "nextInitialized" flag set if "quantity" equals 1.
     */
    function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) {
        // For branchless setting of the "nextInitialized" flag.
        assembly {
            // "(quantity == 1) << _BITPOS_NEXT_INITIALIZED".
            result := shl(_BITPOS_NEXT_INITIALIZED, eq(quantity, 1))
        }
    }

    // =============================================================
    //                      APPROVAL OPERATIONS
    // =============================================================

    /**
     * @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) public payable virtual override {
        address owner = ownerOf(tokenId);

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

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

    /**
     * @dev Returns the account approved for "tokenId" token.
     *
     * Requirements:
     *
     * - "tokenId" must exist.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @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) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev Returns if the "operator" is allowed to manage all of the assets of "owner".
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @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. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

    /**
     * @dev Returns whether "msgSender" is equal to "approvedAddress" or "owner".
     */
    function _isSenderApprovedOrOwner(
        address approvedAddress,
        address owner,
        address msgSender
    ) private pure returns (bool result) {
        assembly {
            // Mask "owner" to the lower 160 bits, in case the upper bits somehow aren't clean.
            owner := and(owner, _BITMASK_ADDRESS)
            // Mask "msgSender" to the lower 160 bits, in case the upper bits somehow aren't clean.
            msgSender := and(msgSender, _BITMASK_ADDRESS)
            // "msgSender == owner || msgSender == approvedAddress".
            result := or(eq(msgSender, owner), eq(msgSender, approvedAddress))
        }
    }

    /**
     * @dev Returns the storage slot and value for the approved address of "tokenId".
     */
    function _getApprovedSlotAndAddress(uint256 tokenId)
        private
        view
        returns (uint256 approvedAddressSlot, address approvedAddress)
    {
        TokenApprovalRef storage tokenApproval = _tokenApprovals[tokenId];
        // The following is equivalent to "approvedAddress = _tokenApprovals[tokenId].value".
        assembly {
            approvedAddressSlot := tokenApproval.slot
            approvedAddress := sload(approvedAddressSlot)
        }
    }

    // =============================================================
    //                      TRANSFER OPERATIONS
    // =============================================================

    /**
     * @dev Transfers "tokenId" from "from" to "to".
     *
     * 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
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        // The nested ifs save around 20+ gas over a compound boolean condition.
        if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
            if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();

        if (to == address(0)) revert TransferToZeroAddress();

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to "delete _tokenApprovals[tokenId]".
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

            // 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 "safeTransferFrom(from, to, tokenId, '')".
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @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 memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

    /**
     * @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 Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * "from" - Previous owner of the given token ID.
     * "to" - Target address that will receive the token.
     * "tokenId" - Token ID to be transferred.
     * "_data" - Optional data to send along with the call.
     *
     * Returns 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))
                }
            }
        }
    }

    // =============================================================
    //                        MINT OPERATIONS
    // =============================================================

    /**
     * @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 for each mint.
     */
    function _mint(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // "balance" and "numberMinted" have a maximum limit of 2**64.
        // "tokenId" has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - "balance += quantity".
            // - "numberMinted += quantity".
            //
            // We can directly add to the "balance" and "numberMinted".
            _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] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

            // Use assembly to loop and emit the "Transfer" event for gas savings.
            // The duplicated "log4" removes an extra check and reduces stack juggling.
            // The assembly, together with the surrounding Solidity code, have been
            // delicately arranged to nudge the compiler into producing optimized opcodes.
            assembly {
                // Mask "to" to the lower 160 bits, in case the upper bits somehow aren't clean.
                toMasked := and(to, _BITMASK_ADDRESS)
                // Emit the "Transfer" event.
                log4(
                    0, // Start of data (0, since no data).
                    0, // End of data (0, since no data).
                    _TRANSFER_EVENT_SIGNATURE, // Signature.
                    0, // "address(0)".
                    toMasked, // "to".
                    startTokenId // "tokenId".
                )

                // The "iszero(eq(,))" check ensures that large values of "quantity"
                // that overflows uint256 will make the loop run out of gas.
                // The compiler will optimize the "iszero" away for performance.
                for {
                    let tokenId := add(startTokenId, 1)
                } iszero(eq(tokenId, end)) {
                    tokenId := add(tokenId, 1)
                } {
                    // Emit the "Transfer" event. Similar to above.
                    log4(0, 0, _TRANSFER_EVENT_SIGNATURE, 0, toMasked, tokenId)
                }
            }
            if (toMasked == 0) revert MintToZeroAddress();

            _currentIndex = end;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

    /**
     * @dev Mints "quantity" tokens and transfers them to "to".
     *
     * This function is intended for efficient minting only during contract creation.
     *
     * It emits only one {ConsecutiveTransfer} as defined in
     * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309),
     * instead of a sequence of {Transfer} event(s).
     *
     * Calling this function outside of contract creation WILL make your contract
     * non-compliant with the ERC721 standard.
     * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309
     * {ConsecutiveTransfer} event is only permissible during contract creation.
     *
     * Requirements:
     *
     * - "to" cannot be the zero address.
     * - "quantity" must be greater than 0.
     *
     * Emits a {ConsecutiveTransfer} event.
     */
    function _mintERC2309(address to, uint256 quantity) internal virtual {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();
        if (quantity > _MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit();

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

        // Overflows are unrealistic due to the above check for "quantity" to be below the limit.
        unchecked {
            // Updates:
            // - "balance += quantity".
            // - "numberMinted += quantity".
            //
            // We can directly add to the "balance" and "numberMinted".
            _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] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to);

            _currentIndex = startTokenId + quantity;
        }
        _afterTokenTransfers(address(0), to, startTokenId, 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.
     *
     * See {_mint}.
     *
     * Emits a {Transfer} event for each mint.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal virtual {
        _mint(to, quantity);

        unchecked {
            if (to.code.length != 0) {
                uint256 end = _currentIndex;
                uint256 index = end - quantity;
                do {
                    if (!_checkContractOnERC721Received(address(0), to, index++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (index < end);
                // Reentrancy protection.
                if (_currentIndex != end) revert();
            }
        }
    }

    /**
     * @dev Equivalent to "_safeMint(to, quantity, '')".
     */
    function _safeMint(address to, uint256 quantity) internal virtual {
        _safeMint(to, quantity, '');
    }

    // =============================================================
    //                        BURN OPERATIONS
    // =============================================================

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

        (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedSlotAndAddress(tokenId);

        if (approvalCheck) {
            // The nested ifs save around 20+ gas over a compound boolean condition.
            if (!_isSenderApprovedOrOwner(approvedAddress, from, _msgSenderERC721A()))
                if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        assembly {
            if approvedAddress {
                // This is equivalent to "delete _tokenApprovals[tokenId]".
                sstore(approvedAddressSlot, 0)
            }
        }

        // 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] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

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

    // =============================================================
    //                     EXTRA DATA OPERATIONS
    // =============================================================

    /**
     * @dev Directly sets the extra data for the ownership data "index".
     */
    function _setExtraDataAt(uint256 index, uint24 extraData) internal virtual {
        uint256 packed = _packedOwnerships[index];
        if (packed == 0) revert OwnershipNotInitializedForExtraData();
        uint256 extraDataCasted;
        // Cast "extraData" with assembly to avoid redundant masking.
        assembly {
            extraDataCasted := extraData
        }
        packed = (packed & _BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << _BITPOS_EXTRA_DATA);
        _packedOwnerships[index] = packed;
    }

    /**
     * @dev Called during each token transfer to set the 24bit "extraData" field.
     * Intended to be overridden by the cosumer contract.
     *
     * "previousExtraData" - the value of "extraData" before transfer.
     *
     * 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 _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

    /**
     * @dev Returns the next extra data for the packed ownership data.
     * The returned result is shifted into position.
     */
    function _nextExtraData(
        address from,
        address to,
        uint256 prevOwnershipPacked
    ) private view returns (uint256) {
        uint24 extraData = uint24(prevOwnershipPacked >> _BITPOS_EXTRA_DATA);
        return uint256(_extraData(from, to, extraData)) << _BITPOS_EXTRA_DATA;
    }

    // =============================================================
    //                       OTHER OPERATIONS
    // =============================================================

    /**
     * @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 virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the "str" to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

            // We write the string from rightmost digit to leftmost digit.
            // The following is essentially a do-while loop that also handles the zero case.
            // prettier-ignore
            for { let temp := value } 1 {} {
                str := sub(str, 1)
                // Write the character to the pointer.
                // The ASCII index of the '0' character is 48.
                mstore8(str, add(48, mod(temp, 10)))
                // Keep dividing "temp" until zero.
                temp := div(temp, 10)
                // prettier-ignore
                if iszero(temp) { break }
            }

            let length := sub(end, str)
            // Move the pointer 32 bytes leftwards to make room for the length.
            str := sub(str, 0x20)
            // Store the length.
            mstore(str, length)
        }
    }
}

// File: MasterV2.sol
 
pragma solidity ^0.8.24;

// Define custom errors at the contract level
error MintInactive();
error Unauthorized(address caller);
error InvalidOperation(string reason);
error ExceedsMaxSupply(uint256 requested, uint256 available);
error InsufficientEther(uint256 required, uint256 provided);
error ExceedsMaxPerWallet(uint256 requested, uint256 allowed); 
 
error ExceedsMaxMintGroupSupply(uint256 requested, uint256 available); // Remove when allowlist is off
error PresaleInactive(uint256 mintId); // Remove when allowlist is off
error NotInPresale(address caller, uint256 mintId); // Remove when allowlist is off
error MintGroupDoesNotExist(uint256 mintId); // Remove when allowlist is off
error ArrayLengthMismatch(); // Remove when allowlist is off 
 

contract BeracPoL is ERC721A, Ownable  {
    event BatchMetadataUpdate(
        uint256 indexed fromTokenId,
        uint256 indexed toTokenId
    );
    event TokensMinted(
        address indexed recipient,
        uint256 amount,
        uint256 mintId
        , address affiliate 
    );
    
    
    event SalePriceChanged(uint256 indexed mintId, uint256 newPrice);

    //Base variables
    mapping(address => uint256) private pendingBalances;
    uint256 public maxSupply;
    uint256 public threeDollarsEth;
    bool public mintLive = false;
    string public baseURI;
    address public feeAddress;
    address public ownerPayoutAddress;

    
    //Affiliates variables
    uint256 public affiliatePercentage;
    
  
    //Map pairings.
    mapping(uint256 => uint256) public maxMintPerWallet;  
    mapping(uint256 => uint256) public mintPrice; 
    mapping(uint256 => uint256) public maxSupplyPerMintGroup; 
    mapping(uint256 => uint256) public mintGroupMints;  
    mapping(uint256 => mapping(address => bool)) public presale; 
    mapping(uint256 => bool) public presaleActive; 
    uint256 public presaleCount = 0; //Counter to get total whitelists. Remove when allowlist is off
    uint256[] public activeMintGroups; //Array to get all active mint groups. Remove when allowlist is off

    constructor(
        //Base variables
        string memory name,
        string memory symbol,
        address _ownerPayoutAddress,
        string memory _initialBaseURI,
        uint256 _maxSupply,
        uint256 _threeDollarsEth,
        //Allowlist variables
        uint256[] memory _maxMintPerWallet, // Turn into uint256 if allowlist is off
        uint256[] memory _maxSupplyPerMintGroup, // Remove if allowlist is off
        uint256[] memory _mintPrice // Turn into uint256 if allowlist is off
        
        
        
        
    ) ERC721A(name, symbol) Ownable(msg.sender) {
        //Error handler to check if map pairs each other. Remove if allowlist is off
        if (
            _maxMintPerWallet.length != _maxSupplyPerMintGroup.length &&
            _maxMintPerWallet.length != _mintPrice.length 
            
        ) {
            revert ArrayLengthMismatch();
        }

        //Remove if allowlist is off
        uint256 totalMaxSupplyPerMintGroup = 0;
        for (uint256 i = 0; i < _maxSupplyPerMintGroup.length; i++) {
            totalMaxSupplyPerMintGroup += _maxSupplyPerMintGroup[i];
            maxSupplyPerMintGroup[i] = _maxSupplyPerMintGroup[i];
            maxMintPerWallet[i] = _maxMintPerWallet[i];
            mintPrice[i] = _mintPrice[i];
            mintGroupMints[i] = 0;
            activeMintGroups.push(i); 
             
        }

        //Checker if max supply per mint group exceeds total max supply. Remove if allowlist is off
        if (totalMaxSupplyPerMintGroup > _maxSupply) {
            revert InvalidOperation({
                reason: "Max supply per mint group exceeds total max supply"
            });
        }
        
        //Base variables
        maxSupply = _maxSupply;
        threeDollarsEth = _threeDollarsEth;
        baseURI = _initialBaseURI;
        ownerPayoutAddress = _ownerPayoutAddress;
        feeAddress = 0x428Deb81A93BeD820068724eb1fCc7503d71e417;

        
        
        
        affiliatePercentage = 0; // Adjusting this calculation as needed
        
    }


    //===================================START Allowlist Functions===================================//
    // Initializer for new mint groups for all maps
    function initializeNewMintGroup(uint256 mintId) internal {
        mintPrice[mintId] = 0;
        maxMintPerWallet[mintId] = 0;
        maxSupplyPerMintGroup[mintId] = 0;
        mintGroupMints[mintId] = 0;
        activeMintGroups.push(mintId);
        
    }

    function isMintGroupActive(uint256 mintId) private view returns (bool) {
        for (uint256 i = 0; i < activeMintGroups.length; i++) {
            if (activeMintGroups[i] == mintId) {
                return true;
            }
        }
        return false;
    }

    // Changes the max mint per mint group. Only the contract owner can call this function. Remove this function if allowlist is off
    function setNewMaxPerMintGroup(uint256 mintId, uint256 newMax)
        public
        onlyOwner
    {
        //Checks if mintId already exists inside activeMintGroups. This allows the contract to adjust the mappings for new mint groups
        if (!isMintGroupActive(mintId)) {
            initializeNewMintGroup(mintId);
        }

        // Checker if new max exceeds total supply
        uint256 totalMaxMintPerMG = 0;
        for (uint256 i = 0; i < activeMintGroups.length; i++) {
            if (activeMintGroups[i] == mintId) {
                totalMaxMintPerMG += newMax; // Use the new max for the specified mintId
            } else {
                totalMaxMintPerMG += maxSupplyPerMintGroup[activeMintGroups[i]];
            }
        }

        if (totalMaxMintPerMG > maxSupply) {
            revert InvalidOperation({
                reason: "New supply per mint group exceeds total supply."
            });
        }

        maxSupplyPerMintGroup[mintId] = newMax;
    }

    // Add to presale
    function addTopresale(address[] memory newPresale, uint256 mintId)
        external
        onlyOwner
    {
        //Checks if mintId already exists inside activeMintGroups. This allows the contract to adjust the mappings for new mint groups
        if (!isMintGroupActive(mintId)) {
            initializeNewMintGroup(mintId);
        }

        for (uint256 i = 0; i < newPresale.length; i++) {
            presale[mintId][newPresale[i]] = true;
            presaleCount = presaleCount + 1;
        }
    }

    // Remove from presale
    function removeFrompresale(address[] memory removePresale, uint256 mintId)
        external
        onlyOwner
    {
        //Checks if mintId already exists inside activeMintGroups. This allows the contract to adjust the mappings for new mint groups
        if (!isMintGroupActive(mintId)) {
            initializeNewMintGroup(mintId);
        }

        for (uint256 i = 0; i < removePresale.length; i++) {
            presale[mintId][removePresale[i]] = false;
            if (presaleCount > 0) {
                presaleCount = presaleCount - 1;
            }
        }
    }

    // Control the presale status
    function stopOrStartpresaleMint(bool presaleStatus, uint256 mintId)
        public
        onlyOwner
    {
        //Checks if mintId already exists inside activeMintGroups.
        if (!isMintGroupActive(mintId)) {
            revert MintGroupDoesNotExist({mintId: mintId});
        }
        presaleActive[mintId] = presaleStatus;
    }
    //===================================END Allowlist Functions===================================//

    // Sets the maximum number of tokens that can be minted in a batch. Only the contract owner can call this function.
    function setMaxMintPerWallet(
        uint256 newMaxMintPerWallet, uint256 mintGroupId
    ) public onlyOwner {
       maxMintPerWallet[mintGroupId] = newMaxMintPerWallet;
    }

    // Changes the price to mint a token. Only the contract owner can call this function.
    function changeSalePrice(uint256 newMintPrice, uint256 mintId)
        public
        onlyOwner
    {
        //Checks if mintId already exists inside activeMintGroups. This allows the contract to adjust the mappings for new mint groups
        if (!isMintGroupActive(mintId)) {
            initializeNewMintGroup(mintId);
        }
        mintPrice[mintId] = newMintPrice;
        emit SalePriceChanged(mintId, newMintPrice);
    }

    
    
    
    //===================================START Affiliate Functions===================================//
    // Changes the affiliate percentage. Only the contract owner can call this function. Note: 1000% = 10%
    function setAffiliatePercentage(uint256 _percentageOfMint)
        public
        onlyOwner
    {
        affiliatePercentage = _percentageOfMint;
    }

    // Allows the affiliate to withdraw their portion of the mint funds in ETH.
    function withdrawAffiliateMintFunds() public {
        uint256 affiliateBalance = pendingBalances[msg.sender];
        if (affiliateBalance < 0) {
            revert InvalidOperation({reason: "No funds to withdraw"});
        }

        // Reset the pending balance for the affiliate to zero
        pendingBalances[msg.sender] = 0;

        // Transfer the funds
        (bool success, ) = payable(msg.sender).call{value: affiliateBalance}(
            ""
        );

        if (!success) {
            revert InvalidOperation({reason: "Withdraw Transfer Failed"});
        }
    }

    //===================================END Affiliate Functions===================================//
    
    //===================================START Mint Functions===================================//
    // Cleaner and more efficient batchMint function
    function batchMint(
        uint256 amount,
        uint256 mintId // Remove if allowlist is off
        , address affiliate // Remove if affilaites is off
    ) external payable {
        // Pre-conditions checks
        if (!mintLive) {
            revert MintInactive();
        }

         
        if (mintLive && !presaleActive[mintId]) {
            revert PresaleInactive({mintId: mintId});
        }
        
        if (mintId != 0) {
            if (presale[mintId][msg.sender] == false) {
                revert NotInPresale({caller: msg.sender, mintId: mintId});
            }
            if (
                mintGroupMints[mintId] + amount > maxSupplyPerMintGroup[mintId]
            ) {
                revert ExceedsMaxMintGroupSupply({
                    requested: amount,
                    available: maxSupplyPerMintGroup[mintId] -
                        mintGroupMints[mintId]
                });
            }
        }
       

        if (amount + _numberMinted(msg.sender) > maxMintPerWallet[mintId]) {
            revert ExceedsMaxPerWallet({
                requested: amount,
                allowed: maxMintPerWallet[mintId] - _numberMinted(msg.sender)
            });
        }

        if (totalSupply() + amount > maxSupply) {
            revert ExceedsMaxSupply({
                requested: amount,
                available: maxSupply - totalSupply()
            });
        }

        // Adjusted for a 3% fee
        uint256 totalCost = mintPrice[mintId] * amount;
        uint256 feeAmount = ((totalCost * 3) / 100) +
            (threeDollarsEth * amount); // 3% + 3$ fee
        uint256 totalCostWithFee = totalCost + feeAmount;

        if (msg.value < totalCostWithFee) {
            revert InsufficientEther({
                required: totalCostWithFee,
                provided: msg.value
            });
        }

                
        // Affiliate handling
        if (affiliate != address(0) && affiliate != msg.sender) {
            uint256 affiliateAmount = (totalCost * affiliatePercentage) / 100;
            pendingBalances[affiliate] += affiliateAmount;
            totalCost -= affiliateAmount; // Adjust total cost after affiliate share
        }

        // Update balances
        pendingBalances[ownerPayoutAddress] += totalCost; // To owner
        pendingBalances[feeAddress] += feeAmount; // Fee portion

        
        

        // Finalize minting
        mintGroupMints[mintId] += amount;
        _safeMint(msg.sender, amount);
        emit TokensMinted(msg.sender, amount, mintId, affiliate);

        // Refund excess Ether, if any
        uint256 excess = msg.value - totalCostWithFee;
        if (excess > 0) {
            payable(msg.sender).transfer(excess);
        }
    }

    
    
    //===================================END Mint Functions===================================//
    //===================================START Base Functions===================================//

    // Changes the minting status. Only the contract owner can call this function.
    function changeMintStatus(bool status) public onlyOwner {
        if (mintLive == status) {
            revert InvalidOperation({
                reason: "Mint status is already the one you entered"
            });
        }
        mintLive = status;
    }

    // Sets the base URI for the token metadata. Only the contract owner can call this function.
    function setBaseURI(string memory newBaseURI) public onlyOwner {
        baseURI = newBaseURI;
        emit BatchMetadataUpdate(1, type(uint256).max); // Signal that all token metadata has been updated
    }


    // Allows the contract owner to withdraw the funds that have been paid into the contract.
    function withdrawMintFunds() public onlyOwner {
        if (pendingBalances[ownerPayoutAddress] <= 0) {
            revert InvalidOperation({reason: "There is nothing to withdraw"});
        }
        uint256 ownerPayout = pendingBalances[ownerPayoutAddress];
        uint256 fee = pendingBalances[feeAddress];

        pendingBalances[ownerPayoutAddress] = 0;
        pendingBalances[feeAddress] = 0;

        (bool success1, ) = payable(ownerPayoutAddress).call{
            value: ownerPayout
        }("");
        (bool success2, ) = payable(feeAddress).call{value: fee}("");

        if (!success1 && !success2) {
            revert InvalidOperation({reason: "Withdraw Transfer Failed"});
        }
    }

    // Allows the fee address to withdraw their portion of the funds.
    function withdrawFeeFunds() public {
        if (msg.sender != feeAddress) {
            revert Unauthorized({caller: msg.sender});
        }
        if (pendingBalances[feeAddress] <= 0) {
            revert InvalidOperation({reason: "There is nothing to withdraw"});
        }

        uint256 fee = pendingBalances[feeAddress];
        pendingBalances[feeAddress] = 0;

        (bool success, ) = payable(feeAddress).call{value: fee}("");
        if (!success) {
            revert InvalidOperation({reason: "Withdraw Transfer Failed"});
        }
    }

    // Returns the base URI for the token metadata.
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }

    // Checks the balance pending withdrawal for the sender.
    function checkPendingBalance() public view returns (uint256) {
        return pendingBalances[msg.sender];
    }

    // Overrides the start token ID function from the ERC721A contract.
    function _startTokenId() internal view virtual override returns (uint256) {
        return 1;
    }

    // Overrides the supports interface function to add support for the ERC721A interface.
    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721A)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
    //===================================END Base Functions===================================//
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"address","name":"_ownerPayoutAddress","type":"address"},{"internalType":"string","name":"_initialBaseURI","type":"string"},{"internalType":"uint256","name":"_maxSupply","type":"uint256"},{"internalType":"uint256","name":"_threeDollarsEth","type":"uint256"},{"internalType":"uint256[]","name":"_maxMintPerWallet","type":"uint256[]"},{"internalType":"uint256[]","name":"_maxSupplyPerMintGroup","type":"uint256[]"},{"internalType":"uint256[]","name":"_mintPrice","type":"uint256[]"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ArrayLengthMismatch","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"name":"ExceedsMaxMintGroupSupply","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"allowed","type":"uint256"}],"name":"ExceedsMaxPerWallet","type":"error"},{"inputs":[{"internalType":"uint256","name":"requested","type":"uint256"},{"internalType":"uint256","name":"available","type":"uint256"}],"name":"ExceedsMaxSupply","type":"error"},{"inputs":[{"internalType":"uint256","name":"required","type":"uint256"},{"internalType":"uint256","name":"provided","type":"uint256"}],"name":"InsufficientEther","type":"error"},{"inputs":[{"internalType":"string","name":"reason","type":"string"}],"name":"InvalidOperation","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[{"internalType":"uint256","name":"mintId","type":"uint256"}],"name":"MintGroupDoesNotExist","type":"error"},{"inputs":[],"name":"MintInactive","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"caller","type":"address"},{"internalType":"uint256","name":"mintId","type":"uint256"}],"name":"NotInPresale","type":"error"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"OwnableInvalidOwner","type":"error"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"OwnableUnauthorizedAccount","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[{"internalType":"uint256","name":"mintId","type":"uint256"}],"name":"PresaleInactive","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"},{"inputs":[{"internalType":"address","name":"caller","type":"address"}],"name":"Unauthorized","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":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"toTokenId","type":"uint256"}],"name":"BatchMetadataUpdate","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","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":"uint256","name":"mintId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"SalePriceChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"recipient","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"mintId","type":"uint256"},{"indexed":false,"internalType":"address","name":"affiliate","type":"address"}],"name":"TokensMinted","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"activeMintGroups","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"newPresale","type":"address[]"},{"internalType":"uint256","name":"mintId","type":"uint256"}],"name":"addTopresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"affiliatePercentage","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"uint256","name":"mintId","type":"uint256"},{"internalType":"address","name":"affiliate","type":"address"}],"name":"batchMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"changeMintStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintPrice","type":"uint256"},{"internalType":"uint256","name":"mintId","type":"uint256"}],"name":"changeSalePrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"checkPendingBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxMintPerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"maxSupplyPerMintGroup","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintGroupMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintLive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ownerPayoutAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"},{"internalType":"address","name":"","type":"address"}],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"presaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"removePresale","type":"address[]"},{"internalType":"uint256","name":"mintId","type":"uint256"}],"name":"removeFrompresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","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":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_percentageOfMint","type":"uint256"}],"name":"setAffiliatePercentage","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxMintPerWallet","type":"uint256"},{"internalType":"uint256","name":"mintGroupId","type":"uint256"}],"name":"setMaxMintPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintId","type":"uint256"},{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setNewMaxPerMintGroup","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"presaleStatus","type":"bool"},{"internalType":"uint256","name":"mintId","type":"uint256"}],"name":"stopOrStartpresaleMint","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":[],"name":"threeDollarsEth","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAffiliateMintFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFeeFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawMintFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600c805460ff191690555f6017553480156200001e575f80fd5b5060405162002c1438038062002c14833981016040819052620000419162000488565b338989600262000052838262000635565b50600362000061828262000635565b5060015f5550506001600160a01b0381166200009757604051631e4fbdf760e01b81525f60048201526024015b60405180910390fd5b620000a281620002c7565b508151835114158015620000b857508051835114155b15620000d75760405163512509d360e11b815260040160405180910390fd5b5f805b8351811015620001ed57838181518110620000f957620000f962000701565b6020026020010151826200010e919062000715565b915083818151811062000125576200012562000701565b602002602001015160135f8381526020019081526020015f208190555084818151811062000157576200015762000701565b602002602001015160115f8381526020019081526020015f208190555082818151811062000189576200018962000701565b6020908102919091018101515f83815260128352604080822092909255601490925281208190556018805460018181018355919092527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e90910182905501620000da565b50858111156200025c5760405163e066a8d760e01b815260206004820152603260248201527f4d617820737570706c7920706572206d696e742067726f7570206578636565646044820152717320746f74616c206d617820737570706c7960701b60648201526084016200008e565b600a869055600b859055600d62000274888262000635565b5050600f80546001600160a01b039098166001600160a01b03199889161790555050600e805490951673428deb81a93bed820068724eb1fcc7503d71e4171790945550505f601055506200073b92505050565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f191681016001600160401b038111828210171562000357576200035762000318565b604052919050565b5f82601f8301126200036f575f80fd5b81516001600160401b038111156200038b576200038b62000318565b6020620003a1601f8301601f191682016200032c565b8281528582848701011115620003b5575f80fd5b5f5b83811015620003d4578581018301518282018401528201620003b7565b505f928101909101919091529392505050565b80516001600160a01b0381168114620003fe575f80fd5b919050565b5f82601f83011262000413575f80fd5b815160206001600160401b0382111562000431576200043162000318565b8160051b620004428282016200032c565b92835284810182019282810190878511156200045c575f80fd5b83870192505b848310156200047d5782518252918301919083019062000462565b979650505050505050565b5f805f805f805f805f6101208a8c031215620004a2575f80fd5b89516001600160401b0380821115620004b9575f80fd5b620004c78d838e016200035f565b9a5060208c0151915080821115620004dd575f80fd5b620004eb8d838e016200035f565b9950620004fb60408d01620003e7565b985060608c015191508082111562000511575f80fd5b6200051f8d838e016200035f565b975060808c0151965060a08c0151955060c08c015191508082111562000543575f80fd5b620005518d838e0162000403565b945060e08c015191508082111562000567575f80fd5b620005758d838e0162000403565b93506101008c01519150808211156200058c575f80fd5b506200059b8c828d0162000403565b9150509295985092959850929598565b600181811c90821680620005c057607f821691505b602082108103620005df57634e487b7160e01b5f52602260045260245ffd5b50919050565b601f8211156200063057805f5260205f20601f840160051c810160208510156200060c5750805b601f840160051c820191505b818110156200062d575f815560010162000618565b50505b505050565b81516001600160401b0381111562000651576200065162000318565b6200066981620006628454620005ab565b84620005e5565b602080601f8311600181146200069f575f8415620006875750858301515b5f19600386901b1c1916600185901b178555620006f9565b5f85815260208120601f198616915b82811015620006cf57888601518255948401946001909101908401620006ae565b5085821015620006ed57878501515f19600388901b60f8161c191681555b505060018460011b0185555b505050505050565b634e487b7160e01b5f52603260045260245ffd5b808201808211156200073557634e487b7160e01b5f52601160045260245ffd5b92915050565b6124cb80620007495f395ff3fe608060405260043610610275575f3560e01c80638da5cb5b1161014a578063c82e474b116100be578063e6a72acf11610078578063e6a72acf14610730578063e8656fcc1461075b578063e985e9c514610774578063f2fde38b14610793578063fac5dbc6146107b2578063fea414b6146107d1575f80fd5b8063c82e474b14610688578063c87b56dd146106a7578063cde27a35146106c6578063ce55c66a146106db578063d5abeb01146106f0578063e5fd114514610705575f80fd5b8063a75c3ad91161010f578063a75c3ad9146105f0578063a8ddf8f614610604578063ae4e494214610623578063b3978a8614610642578063b88d4fde14610661578063c20f388f14610674575f80fd5b80638da5cb5b14610577578063905d7b331461059457806391a57544146105a857806395d89b41146105bd578063a22cb465146105d1575f80fd5b80633ef009ef116101ec5780636352211e116101a65780636352211e146104b95780636c0360eb146104d857806370a08231146104ec578063715018a61461050b5780637bd4f0711461051f5780637c2003e31461053e575f80fd5b80633ef009ef14610408578063412753581461041b57806342842e0e1461043a578063483f0a821461044d5780634a5bd2fd1461046c57806355f804b31461049a575f80fd5b806316da3bc61161023d57806316da3bc61461033957806318160ddd1461037257806320704c5a1461038c57806321af27f6146103ab57806323b872dd146103ca57806324a663c3146103dd575f80fd5b806301ffc9a71461027957806306fdde03146102ad578063081812fc146102ce578063095ea7b31461030557806311f7acb91461031a575b5f80fd5b348015610284575f80fd5b50610298610293366004611e1c565b6107f1565b60405190151581526020015b60405180910390f35b3480156102b8575f80fd5b506102c1610801565b6040516102a49190611e84565b3480156102d9575f80fd5b506102ed6102e8366004611e96565b610891565b6040516001600160a01b0390911681526020016102a4565b610318610313366004611ec8565b6108d3565b005b348015610325575f80fd5b50610318610334366004611ef0565b610971565b348015610344575f80fd5b50610364610353366004611e96565b60116020525f908152604090205481565b6040519081526020016102a4565b34801561037d575f80fd5b506001545f54035f1901610364565b348015610397575f80fd5b506103186103a6366004611f55565b610a95565b3480156103b6575f80fd5b506103186103c5366004611f55565b610b32565b6103186103d8366004612003565b610bd2565b3480156103e8575f80fd5b506103646103f7366004611e96565b60136020525f908152604090205481565b61031861041636600461203c565b610d62565b348015610426575f80fd5b50600e546102ed906001600160a01b031681565b610318610448366004612003565b6111a1565b348015610458575f80fd5b50610364610467366004611e96565b6111bb565b348015610477575f80fd5b50610298610486366004611e96565b60166020525f908152604090205460ff1681565b3480156104a5575f80fd5b506103186104b43660046120c3565b6111da565b3480156104c4575f80fd5b506102ed6104d3366004611e96565b611220565b3480156104e3575f80fd5b506102c161122a565b3480156104f7575f80fd5b50610364610506366004612108565b6112b6565b348015610516575f80fd5b50610318611303565b34801561052a575f80fd5b50610318610539366004611ef0565b611316565b348015610549575f80fd5b50610298610558366004612121565b601560209081525f928352604080842090915290825290205460ff1681565b348015610582575f80fd5b506008546001600160a01b03166102ed565b34801561059f575f80fd5b5061031861132e565b3480156105b3575f80fd5b5061036460105481565b3480156105c8575f80fd5b506102c16114d4565b3480156105dc575f80fd5b506103186105eb36600461215a565b6114e3565b3480156105fb575f80fd5b5061031861154e565b34801561060f575f80fd5b5061031861061e366004612182565b6116a0565b34801561062e575f80fd5b50600f546102ed906001600160a01b031681565b34801561064d575f80fd5b5061031861065c36600461219b565b611729565b61031861066f3660046121b5565b611778565b34801561067f575f80fd5b506103186117bc565b348015610693575f80fd5b506103186106a2366004611ef0565b6117dd565b3480156106b2575f80fd5b506102c16106c1366004611e96565b61184b565b3480156106d1575f80fd5b5061036460175481565b3480156106e6575f80fd5b50610364600b5481565b3480156106fb575f80fd5b50610364600a5481565b348015610710575f80fd5b5061036461071f366004611e96565b60146020525f908152604090205481565b34801561073b575f80fd5b5061036461074a366004611e96565b60126020525f908152604090205481565b348015610766575f80fd5b50600c546102989060ff1681565b34801561077f575f80fd5b5061029861078e36600461222c565b6118cc565b34801561079e575f80fd5b506103186107ad366004612108565b6118f9565b3480156107bd575f80fd5b506103186107cc366004611e96565b611936565b3480156107dc575f80fd5b50335f90815260096020526040902054610364565b5f6107fb82611943565b92915050565b60606002805461081090612254565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90612254565b80156108875780601f1061085e57610100808354040283529160200191610887565b820191905f5260205f20905b81548152906001019060200180831161086a57829003601f168201915b5050505050905090565b5f61089b82611990565b6108b8576040516333d1c03960e21b815260040160405180910390fd5b505f908152600660205260409020546001600160a01b031690565b5f6108dd82611220565b9050336001600160a01b03821614610916576108f981336118cc565b610916576040516367d9dca160e11b815260040160405180910390fd5b5f8281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6109796119c2565b610982826119ef565b61098f5761098f82611a37565b5f805b601854811015610a125783601882815481106109b0576109b061228c565b905f5260205f200154036109cf576109c883836122b4565b9150610a0a565b60135f601883815481106109e5576109e561228c565b905f5260205f20015481526020019081526020015f205482610a0791906122b4565b91505b600101610992565b50600a54811115610a835760405163e066a8d760e01b815260206004820152602f60248201527f4e657720737570706c7920706572206d696e742067726f75702065786365656460448201526e39903a37ba30b61039bab838363c9760891b60648201526084015b60405180910390fd5b505f9182526013602052604090912055565b610a9d6119c2565b610aa6816119ef565b610ab357610ab381611a37565b5f5b8251811015610b2d575f828152601560205260408120845160019290869085908110610ae357610ae361228c565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055601754610b229060016122b4565b601755600101610ab5565b505050565b610b3a6119c2565b610b43816119ef565b610b5057610b5081611a37565b5f5b8251811015610b2d575f82815260156020526040812084518290869085908110610b7e57610b7e61228c565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff191691151591909117905560175415610bca576001601754610bc691906122c7565b6017555b600101610b52565b5f610bdc82611a99565b9050836001600160a01b0316816001600160a01b031614610c0f5760405162a1148160e81b815260040160405180910390fd5b5f8281526006602052604090208054338082146001600160a01b03881690911417610c5b57610c3e86336118cc565b610c5b57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610c8257604051633a954ecd60e21b815260040160405180910390fd5b8015610c8c575f82555b6001600160a01b038681165f9081526005602052604080822080545f19019055918716808252919020805460010190554260a01b17600160e11b175f85815260046020526040812091909155600160e11b84169003610d1857600184015f818152600460205260408120549003610d16575f548114610d16575f8181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600c5460ff16610d8557604051630d0ca57160e21b815260040160405180910390fd5b600c5460ff168015610da557505f8281526016602052604090205460ff16155b15610dc657604051630a1a930560e11b815260048101839052602401610a7a565b8115610e84575f82815260156020908152604080832033845290915281205460ff1615159003610e125760405163043374df60e21b815233600482015260248101839052604401610a7a565b5f82815260136020908152604080832054601490925290912054610e379085906122b4565b1115610e84575f828152601460209081526040808320546013909252909120548491610e62916122c7565b60405163cc3f2f1b60e01b815260048101929092526024820152604401610a7a565b5f82815260116020526040902054610ebe336001600160a01b03165f908152600560205260409081902054901c67ffffffffffffffff1690565b610ec890856122b4565b1115610f2657335f90815260056020526040908190205484911c67ffffffffffffffff165f84815260116020526040902054610f0491906122c7565b6040516303e635fb60e11b815260048101929092526024820152604401610a7a565b600a546001545f54859190035f1901610f3f91906122b4565b1115610f80576001545f54849190035f1901600a54610f5e91906122c7565b60405163adc3cee560e01b815260048101929092526024820152604401610a7a565b5f82815260126020526040812054610f999085906122da565b90505f84600b54610faa91906122da565b6064610fb78460036122da565b610fc191906122f1565b610fcb91906122b4565b90505f610fd882846122b4565b9050803410156110045760405163c108422360e01b815260048101829052346024820152604401610a7a565b6001600160a01b0384161580159061102557506001600160a01b0384163314155b15611085575f60646010548561103b91906122da565b61104591906122f1565b6001600160a01b0386165f908152600960205260408120805492935083929091906110719084906122b4565b90915550611081905081856122c7565b9350505b600f546001600160a01b03165f90815260096020526040812080548592906110ae9084906122b4565b9091555050600e546001600160a01b03165f90815260096020526040812080548492906110dc9084906122b4565b90915550505f85815260146020526040812080548892906110fe9084906122b4565b9091555061110e90503387611b02565b60408051878152602081018790526001600160a01b03861681830152905133917f264808566929c0a2c98376a25f69f0faa85b1ce885be5fc7eee7cd639f9c0c26919081900360600190a25f61116482346122c7565b9050801561119857604051339082156108fc029083905f818181858888f19350505050158015611196573d5f803e3d5ffd5b505b50505050505050565b610b2d83838360405180602001604052805f815250611778565b601881815481106111ca575f80fd5b5f91825260209091200154905081565b6111e26119c2565b600d6111ee8282612354565b506040515f19906001907f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c905f90a350565b5f6107fb82611a99565b600d805461123790612254565b80601f016020809104026020016040519081016040528092919081815260200182805461126390612254565b80156112ae5780601f10611285576101008083540402835291602001916112ae565b820191905f5260205f20905b81548152906001019060200180831161129157829003601f168201915b505050505081565b5f6001600160a01b0382166112de576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03165f9081526005602052604090205467ffffffffffffffff1690565b61130b6119c2565b6113145f611b1b565b565b61131e6119c2565b5f90815260116020526040902055565b6113366119c2565b600f546001600160a01b03165f9081526009602052604090205461139d5760405163e066a8d760e01b815260206004820152601c60248201527f5468657265206973206e6f7468696e6720746f207769746864726177000000006044820152606401610a7a565b600f80546001600160a01b039081165f908152600960205260408082208054600e80548616855283852054928590555485168452828420849055945491519093919091169084908381818185875af1925050503d805f811461141a576040519150601f19603f3d011682016040523d82523d5f602084013e61141f565b606091505b5050600e546040519192505f916001600160a01b039091169084908381818185875af1925050503d805f8114611470576040519150601f19603f3d011682016040523d82523d5f602084013e611475565b606091505b5050905081158015611485575080155b156114ce5760405163e066a8d760e01b815260206004820152601860248201527715da5d1a191c985dc8151c985b9cd9995c8811985a5b195960421b6044820152606401610a7a565b50505050565b60606003805461081090612254565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e546001600160a01b0316331461157b5760405163472511eb60e11b8152336004820152602401610a7a565b600e546001600160a01b03165f908152600960205260409020546115e25760405163e066a8d760e01b815260206004820152601c60248201527f5468657265206973206e6f7468696e6720746f207769746864726177000000006044820152606401610a7a565b600e80546001600160a01b039081165f90815260096020526040808220805490839055935490519192169083905b5f6040518083038185875af1925050503d805f811461164a576040519150601f19603f3d011682016040523d82523d5f602084013e61164f565b606091505b505090508061169c5760405163e066a8d760e01b815260206004820152601860248201527715da5d1a191c985dc8151c985b9cd9995c8811985a5b195960421b6044820152606401610a7a565b5050565b6116a86119c2565b600c5481151560ff9091161515036117165760405163e066a8d760e01b815260206004820152602a60248201527f4d696e742073746174757320697320616c726561647920746865206f6e6520796044820152691bdd48195b9d195c995960b21b6064820152608401610a7a565b600c805460ff1916911515919091179055565b6117316119c2565b61173a816119ef565b61175a57604051635831017d60e01b815260048101829052602401610a7a565b5f908152601660205260409020805460ff1916911515919091179055565b611783848484610bd2565b6001600160a01b0383163b156114ce5761179f84848484611b6c565b6114ce576040516368d2bf6b60e11b815260040160405180910390fd5b335f8181526009602052604080822080549083905590519092908390611610565b6117e56119c2565b6117ee816119ef565b6117fb576117fb81611a37565b5f81815260126020526040908190208390555181907fa7e52343431f792020e7cb8411a08014688ca11782fd5709fa2531b3d74ba4579061183f9085815260200190565b60405180910390a25050565b606061185682611990565b61187357604051630a14c4b560e41b815260040160405180910390fd5b5f61187c611c54565b905080515f0361189a5760405180602001604052805f8152506118c5565b806118a484611c63565b6040516020016118b5929190612410565b6040516020818303038152906040525b9392505050565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b6119016119c2565b6001600160a01b03811661192a57604051631e4fbdf760e01b81525f6004820152602401610a7a565b61193381611b1b565b50565b61193e6119c2565b601055565b5f6301ffc9a760e01b6001600160e01b03198316148061197357506380ac58cd60e01b6001600160e01b03198316145b806107fb5750506001600160e01b031916635b5e139f60e01b1490565b5f816001111580156119a257505f5482105b80156107fb5750505f90815260046020526040902054600160e01b161590565b6008546001600160a01b031633146113145760405163118cdaa760e01b8152336004820152602401610a7a565b5f805b601854811015611a2f578260188281548110611a1057611a1061228c565b905f5260205f20015403611a275750600192915050565b6001016119f2565b505f92915050565b5f8181526012602090815260408083208390556011825280832083905560138252808320839055601490915281208190556018805460018101825591527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0155565b5f8180600111611ae9575f54811015611ae9575f8181526004602052604081205490600160e01b82169003611ae7575b805f036118c557505f19015f81815260046020526040902054611ac9565b505b604051636f96cda160e11b815260040160405180910390fd5b61169c828260405180602001604052805f815250611ca6565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a0290611ba090339089908890889060040161243e565b6020604051808303815f875af1925050508015611bda575060408051601f3d908101601f19168201909252611bd79181019061247a565b60015b611c36573d808015611c07576040519150601f19603f3d011682016040523d82523d5f602084013e611c0c565b606091505b5080515f03611c2e576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600d805461081090612254565b606060a06040510180604052602081039150505f815280825b600183039250600a81066030018353600a900480611c7c5750819003601f19909101908152919050565b611cb08383611d0f565b6001600160a01b0383163b15610b2d575f548281035b611cd85f868380600101945086611b6c565b611cf5576040516368d2bf6b60e11b815260040160405180910390fd5b818110611cc657815f5414611d08575f80fd5b5050505050565b5f805490829003611d335760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0383165f8181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611ddf5780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600101611da9565b50815f03611dff57604051622e076360e81b815260040160405180910390fd5b5f5550505050565b6001600160e01b031981168114611933575f80fd5b5f60208284031215611e2c575f80fd5b81356118c581611e07565b5f5b83811015611e51578181015183820152602001611e39565b50505f910152565b5f8151808452611e70816020860160208601611e37565b601f01601f19169290920160200192915050565b602081525f6118c56020830184611e59565b5f60208284031215611ea6575f80fd5b5035919050565b80356001600160a01b0381168114611ec3575f80fd5b919050565b5f8060408385031215611ed9575f80fd5b611ee283611ead565b946020939093013593505050565b5f8060408385031215611f01575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611f4d57611f4d611f10565b604052919050565b5f8060408385031215611f66575f80fd5b823567ffffffffffffffff80821115611f7d575f80fd5b818501915085601f830112611f90575f80fd5b8135602082821115611fa457611fa4611f10565b8160051b9250611fb5818401611f24565b8281529284018101928181019089851115611fce575f80fd5b948201945b84861015611ff357611fe486611ead565b82529482019490820190611fd3565b9997909101359750505050505050565b5f805f60608486031215612015575f80fd5b61201e84611ead565b925061202c60208501611ead565b9150604084013590509250925092565b5f805f6060848603121561204e575f80fd5b833592506020840135915061206560408501611ead565b90509250925092565b5f67ffffffffffffffff83111561208757612087611f10565b61209a601f8401601f1916602001611f24565b90508281528383830111156120ad575f80fd5b828260208301375f602084830101529392505050565b5f602082840312156120d3575f80fd5b813567ffffffffffffffff8111156120e9575f80fd5b8201601f810184136120f9575f80fd5b611c4c8482356020840161206e565b5f60208284031215612118575f80fd5b6118c582611ead565b5f8060408385031215612132575f80fd5b8235915061214260208401611ead565b90509250929050565b80358015158114611ec3575f80fd5b5f806040838503121561216b575f80fd5b61217483611ead565b91506121426020840161214b565b5f60208284031215612192575f80fd5b6118c58261214b565b5f80604083850312156121ac575f80fd5b611ee28361214b565b5f805f80608085870312156121c8575f80fd5b6121d185611ead565b93506121df60208601611ead565b925060408501359150606085013567ffffffffffffffff811115612201575f80fd5b8501601f81018713612211575f80fd5b6122208782356020840161206e565b91505092959194509250565b5f806040838503121561223d575f80fd5b61224683611ead565b915061214260208401611ead565b600181811c9082168061226857607f821691505b60208210810361228657634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156107fb576107fb6122a0565b818103818111156107fb576107fb6122a0565b80820281158282048414176107fb576107fb6122a0565b5f8261230b57634e487b7160e01b5f52601260045260245ffd5b500490565b601f821115610b2d57805f5260205f20601f840160051c810160208510156123355750805b601f840160051c820191505b81811015611d08575f8155600101612341565b815167ffffffffffffffff81111561236e5761236e611f10565b6123828161237c8454612254565b84612310565b602080601f8311600181146123b5575f841561239e5750858301515b5f19600386901b1c1916600185901b178555610d5a565b5f85815260208120601f198616915b828110156123e3578886015182559484019460019091019084016123c4565b508582101561240057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8351612421818460208801611e37565b835190830190612435818360208801611e37565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061247090830184611e59565b9695505050505050565b5f6020828403121561248a575f80fd5b81516118c581611e0756fea26469706673582212204c9b4fba8513a8db5a985af6c1404f85a221fa43a4e340b19fff4380e740594464736f6c6343000818003300000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000f7f1f95421ececd2df65af5cdf86d0cc2ecc374a00000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000188a0000000000000000000000000000000000000000000000000003e871b540c0000000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000084265726163506f4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442504f4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656961656362363368657a7371656e726172627277716433736c336b74337472377637737371616e6b6d74673666366867687473376d2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000188a00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405260043610610275575f3560e01c80638da5cb5b1161014a578063c82e474b116100be578063e6a72acf11610078578063e6a72acf14610730578063e8656fcc1461075b578063e985e9c514610774578063f2fde38b14610793578063fac5dbc6146107b2578063fea414b6146107d1575f80fd5b8063c82e474b14610688578063c87b56dd146106a7578063cde27a35146106c6578063ce55c66a146106db578063d5abeb01146106f0578063e5fd114514610705575f80fd5b8063a75c3ad91161010f578063a75c3ad9146105f0578063a8ddf8f614610604578063ae4e494214610623578063b3978a8614610642578063b88d4fde14610661578063c20f388f14610674575f80fd5b80638da5cb5b14610577578063905d7b331461059457806391a57544146105a857806395d89b41146105bd578063a22cb465146105d1575f80fd5b80633ef009ef116101ec5780636352211e116101a65780636352211e146104b95780636c0360eb146104d857806370a08231146104ec578063715018a61461050b5780637bd4f0711461051f5780637c2003e31461053e575f80fd5b80633ef009ef14610408578063412753581461041b57806342842e0e1461043a578063483f0a821461044d5780634a5bd2fd1461046c57806355f804b31461049a575f80fd5b806316da3bc61161023d57806316da3bc61461033957806318160ddd1461037257806320704c5a1461038c57806321af27f6146103ab57806323b872dd146103ca57806324a663c3146103dd575f80fd5b806301ffc9a71461027957806306fdde03146102ad578063081812fc146102ce578063095ea7b31461030557806311f7acb91461031a575b5f80fd5b348015610284575f80fd5b50610298610293366004611e1c565b6107f1565b60405190151581526020015b60405180910390f35b3480156102b8575f80fd5b506102c1610801565b6040516102a49190611e84565b3480156102d9575f80fd5b506102ed6102e8366004611e96565b610891565b6040516001600160a01b0390911681526020016102a4565b610318610313366004611ec8565b6108d3565b005b348015610325575f80fd5b50610318610334366004611ef0565b610971565b348015610344575f80fd5b50610364610353366004611e96565b60116020525f908152604090205481565b6040519081526020016102a4565b34801561037d575f80fd5b506001545f54035f1901610364565b348015610397575f80fd5b506103186103a6366004611f55565b610a95565b3480156103b6575f80fd5b506103186103c5366004611f55565b610b32565b6103186103d8366004612003565b610bd2565b3480156103e8575f80fd5b506103646103f7366004611e96565b60136020525f908152604090205481565b61031861041636600461203c565b610d62565b348015610426575f80fd5b50600e546102ed906001600160a01b031681565b610318610448366004612003565b6111a1565b348015610458575f80fd5b50610364610467366004611e96565b6111bb565b348015610477575f80fd5b50610298610486366004611e96565b60166020525f908152604090205460ff1681565b3480156104a5575f80fd5b506103186104b43660046120c3565b6111da565b3480156104c4575f80fd5b506102ed6104d3366004611e96565b611220565b3480156104e3575f80fd5b506102c161122a565b3480156104f7575f80fd5b50610364610506366004612108565b6112b6565b348015610516575f80fd5b50610318611303565b34801561052a575f80fd5b50610318610539366004611ef0565b611316565b348015610549575f80fd5b50610298610558366004612121565b601560209081525f928352604080842090915290825290205460ff1681565b348015610582575f80fd5b506008546001600160a01b03166102ed565b34801561059f575f80fd5b5061031861132e565b3480156105b3575f80fd5b5061036460105481565b3480156105c8575f80fd5b506102c16114d4565b3480156105dc575f80fd5b506103186105eb36600461215a565b6114e3565b3480156105fb575f80fd5b5061031861154e565b34801561060f575f80fd5b5061031861061e366004612182565b6116a0565b34801561062e575f80fd5b50600f546102ed906001600160a01b031681565b34801561064d575f80fd5b5061031861065c36600461219b565b611729565b61031861066f3660046121b5565b611778565b34801561067f575f80fd5b506103186117bc565b348015610693575f80fd5b506103186106a2366004611ef0565b6117dd565b3480156106b2575f80fd5b506102c16106c1366004611e96565b61184b565b3480156106d1575f80fd5b5061036460175481565b3480156106e6575f80fd5b50610364600b5481565b3480156106fb575f80fd5b50610364600a5481565b348015610710575f80fd5b5061036461071f366004611e96565b60146020525f908152604090205481565b34801561073b575f80fd5b5061036461074a366004611e96565b60126020525f908152604090205481565b348015610766575f80fd5b50600c546102989060ff1681565b34801561077f575f80fd5b5061029861078e36600461222c565b6118cc565b34801561079e575f80fd5b506103186107ad366004612108565b6118f9565b3480156107bd575f80fd5b506103186107cc366004611e96565b611936565b3480156107dc575f80fd5b50335f90815260096020526040902054610364565b5f6107fb82611943565b92915050565b60606002805461081090612254565b80601f016020809104026020016040519081016040528092919081815260200182805461083c90612254565b80156108875780601f1061085e57610100808354040283529160200191610887565b820191905f5260205f20905b81548152906001019060200180831161086a57829003601f168201915b5050505050905090565b5f61089b82611990565b6108b8576040516333d1c03960e21b815260040160405180910390fd5b505f908152600660205260409020546001600160a01b031690565b5f6108dd82611220565b9050336001600160a01b03821614610916576108f981336118cc565b610916576040516367d9dca160e11b815260040160405180910390fd5b5f8281526006602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6109796119c2565b610982826119ef565b61098f5761098f82611a37565b5f805b601854811015610a125783601882815481106109b0576109b061228c565b905f5260205f200154036109cf576109c883836122b4565b9150610a0a565b60135f601883815481106109e5576109e561228c565b905f5260205f20015481526020019081526020015f205482610a0791906122b4565b91505b600101610992565b50600a54811115610a835760405163e066a8d760e01b815260206004820152602f60248201527f4e657720737570706c7920706572206d696e742067726f75702065786365656460448201526e39903a37ba30b61039bab838363c9760891b60648201526084015b60405180910390fd5b505f9182526013602052604090912055565b610a9d6119c2565b610aa6816119ef565b610ab357610ab381611a37565b5f5b8251811015610b2d575f828152601560205260408120845160019290869085908110610ae357610ae361228c565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff1916911515919091179055601754610b229060016122b4565b601755600101610ab5565b505050565b610b3a6119c2565b610b43816119ef565b610b5057610b5081611a37565b5f5b8251811015610b2d575f82815260156020526040812084518290869085908110610b7e57610b7e61228c565b6020908102919091018101516001600160a01b031682528101919091526040015f20805460ff191691151591909117905560175415610bca576001601754610bc691906122c7565b6017555b600101610b52565b5f610bdc82611a99565b9050836001600160a01b0316816001600160a01b031614610c0f5760405162a1148160e81b815260040160405180910390fd5b5f8281526006602052604090208054338082146001600160a01b03881690911417610c5b57610c3e86336118cc565b610c5b57604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038516610c8257604051633a954ecd60e21b815260040160405180910390fd5b8015610c8c575f82555b6001600160a01b038681165f9081526005602052604080822080545f19019055918716808252919020805460010190554260a01b17600160e11b175f85815260046020526040812091909155600160e11b84169003610d1857600184015f818152600460205260408120549003610d16575f548114610d16575f8181526004602052604090208490555b505b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b600c5460ff16610d8557604051630d0ca57160e21b815260040160405180910390fd5b600c5460ff168015610da557505f8281526016602052604090205460ff16155b15610dc657604051630a1a930560e11b815260048101839052602401610a7a565b8115610e84575f82815260156020908152604080832033845290915281205460ff1615159003610e125760405163043374df60e21b815233600482015260248101839052604401610a7a565b5f82815260136020908152604080832054601490925290912054610e379085906122b4565b1115610e84575f828152601460209081526040808320546013909252909120548491610e62916122c7565b60405163cc3f2f1b60e01b815260048101929092526024820152604401610a7a565b5f82815260116020526040902054610ebe336001600160a01b03165f908152600560205260409081902054901c67ffffffffffffffff1690565b610ec890856122b4565b1115610f2657335f90815260056020526040908190205484911c67ffffffffffffffff165f84815260116020526040902054610f0491906122c7565b6040516303e635fb60e11b815260048101929092526024820152604401610a7a565b600a546001545f54859190035f1901610f3f91906122b4565b1115610f80576001545f54849190035f1901600a54610f5e91906122c7565b60405163adc3cee560e01b815260048101929092526024820152604401610a7a565b5f82815260126020526040812054610f999085906122da565b90505f84600b54610faa91906122da565b6064610fb78460036122da565b610fc191906122f1565b610fcb91906122b4565b90505f610fd882846122b4565b9050803410156110045760405163c108422360e01b815260048101829052346024820152604401610a7a565b6001600160a01b0384161580159061102557506001600160a01b0384163314155b15611085575f60646010548561103b91906122da565b61104591906122f1565b6001600160a01b0386165f908152600960205260408120805492935083929091906110719084906122b4565b90915550611081905081856122c7565b9350505b600f546001600160a01b03165f90815260096020526040812080548592906110ae9084906122b4565b9091555050600e546001600160a01b03165f90815260096020526040812080548492906110dc9084906122b4565b90915550505f85815260146020526040812080548892906110fe9084906122b4565b9091555061110e90503387611b02565b60408051878152602081018790526001600160a01b03861681830152905133917f264808566929c0a2c98376a25f69f0faa85b1ce885be5fc7eee7cd639f9c0c26919081900360600190a25f61116482346122c7565b9050801561119857604051339082156108fc029083905f818181858888f19350505050158015611196573d5f803e3d5ffd5b505b50505050505050565b610b2d83838360405180602001604052805f815250611778565b601881815481106111ca575f80fd5b5f91825260209091200154905081565b6111e26119c2565b600d6111ee8282612354565b506040515f19906001907f6bd5c950a8d8df17f772f5af37cb3655737899cbf903264b9795592da439661c905f90a350565b5f6107fb82611a99565b600d805461123790612254565b80601f016020809104026020016040519081016040528092919081815260200182805461126390612254565b80156112ae5780601f10611285576101008083540402835291602001916112ae565b820191905f5260205f20905b81548152906001019060200180831161129157829003601f168201915b505050505081565b5f6001600160a01b0382166112de576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03165f9081526005602052604090205467ffffffffffffffff1690565b61130b6119c2565b6113145f611b1b565b565b61131e6119c2565b5f90815260116020526040902055565b6113366119c2565b600f546001600160a01b03165f9081526009602052604090205461139d5760405163e066a8d760e01b815260206004820152601c60248201527f5468657265206973206e6f7468696e6720746f207769746864726177000000006044820152606401610a7a565b600f80546001600160a01b039081165f908152600960205260408082208054600e80548616855283852054928590555485168452828420849055945491519093919091169084908381818185875af1925050503d805f811461141a576040519150601f19603f3d011682016040523d82523d5f602084013e61141f565b606091505b5050600e546040519192505f916001600160a01b039091169084908381818185875af1925050503d805f8114611470576040519150601f19603f3d011682016040523d82523d5f602084013e611475565b606091505b5050905081158015611485575080155b156114ce5760405163e066a8d760e01b815260206004820152601860248201527715da5d1a191c985dc8151c985b9cd9995c8811985a5b195960421b6044820152606401610a7a565b50505050565b60606003805461081090612254565b335f8181526007602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b600e546001600160a01b0316331461157b5760405163472511eb60e11b8152336004820152602401610a7a565b600e546001600160a01b03165f908152600960205260409020546115e25760405163e066a8d760e01b815260206004820152601c60248201527f5468657265206973206e6f7468696e6720746f207769746864726177000000006044820152606401610a7a565b600e80546001600160a01b039081165f90815260096020526040808220805490839055935490519192169083905b5f6040518083038185875af1925050503d805f811461164a576040519150601f19603f3d011682016040523d82523d5f602084013e61164f565b606091505b505090508061169c5760405163e066a8d760e01b815260206004820152601860248201527715da5d1a191c985dc8151c985b9cd9995c8811985a5b195960421b6044820152606401610a7a565b5050565b6116a86119c2565b600c5481151560ff9091161515036117165760405163e066a8d760e01b815260206004820152602a60248201527f4d696e742073746174757320697320616c726561647920746865206f6e6520796044820152691bdd48195b9d195c995960b21b6064820152608401610a7a565b600c805460ff1916911515919091179055565b6117316119c2565b61173a816119ef565b61175a57604051635831017d60e01b815260048101829052602401610a7a565b5f908152601660205260409020805460ff1916911515919091179055565b611783848484610bd2565b6001600160a01b0383163b156114ce5761179f84848484611b6c565b6114ce576040516368d2bf6b60e11b815260040160405180910390fd5b335f8181526009602052604080822080549083905590519092908390611610565b6117e56119c2565b6117ee816119ef565b6117fb576117fb81611a37565b5f81815260126020526040908190208390555181907fa7e52343431f792020e7cb8411a08014688ca11782fd5709fa2531b3d74ba4579061183f9085815260200190565b60405180910390a25050565b606061185682611990565b61187357604051630a14c4b560e41b815260040160405180910390fd5b5f61187c611c54565b905080515f0361189a5760405180602001604052805f8152506118c5565b806118a484611c63565b6040516020016118b5929190612410565b6040516020818303038152906040525b9392505050565b6001600160a01b039182165f90815260076020908152604080832093909416825291909152205460ff1690565b6119016119c2565b6001600160a01b03811661192a57604051631e4fbdf760e01b81525f6004820152602401610a7a565b61193381611b1b565b50565b61193e6119c2565b601055565b5f6301ffc9a760e01b6001600160e01b03198316148061197357506380ac58cd60e01b6001600160e01b03198316145b806107fb5750506001600160e01b031916635b5e139f60e01b1490565b5f816001111580156119a257505f5482105b80156107fb5750505f90815260046020526040902054600160e01b161590565b6008546001600160a01b031633146113145760405163118cdaa760e01b8152336004820152602401610a7a565b5f805b601854811015611a2f578260188281548110611a1057611a1061228c565b905f5260205f20015403611a275750600192915050565b6001016119f2565b505f92915050565b5f8181526012602090815260408083208390556011825280832083905560138252808320839055601490915281208190556018805460018101825591527fb13d2d76d1f4b7be834882e410b3e3a8afaf69f83600ae24db354391d2378d2e0155565b5f8180600111611ae9575f54811015611ae9575f8181526004602052604081205490600160e01b82169003611ae7575b805f036118c557505f19015f81815260046020526040902054611ac9565b505b604051636f96cda160e11b815260040160405180910390fd5b61169c828260405180602001604052805f815250611ca6565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0905f90a35050565b604051630a85bd0160e11b81525f906001600160a01b0385169063150b7a0290611ba090339089908890889060040161243e565b6020604051808303815f875af1925050508015611bda575060408051601f3d908101601f19168201909252611bd79181019061247a565b60015b611c36573d808015611c07576040519150601f19603f3d011682016040523d82523d5f602084013e611c0c565b606091505b5080515f03611c2e576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060600d805461081090612254565b606060a06040510180604052602081039150505f815280825b600183039250600a81066030018353600a900480611c7c5750819003601f19909101908152919050565b611cb08383611d0f565b6001600160a01b0383163b15610b2d575f548281035b611cd85f868380600101945086611b6c565b611cf5576040516368d2bf6b60e11b815260040160405180910390fd5b818110611cc657815f5414611d08575f80fd5b5050505050565b5f805490829003611d335760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0383165f8181526005602090815260408083208054680100000000000000018802019055848352600490915281206001851460e11b4260a01b178317905582840190839083907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef8180a4600183015b818114611ddf5780835f7fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef5f80a4600101611da9565b50815f03611dff57604051622e076360e81b815260040160405180910390fd5b5f5550505050565b6001600160e01b031981168114611933575f80fd5b5f60208284031215611e2c575f80fd5b81356118c581611e07565b5f5b83811015611e51578181015183820152602001611e39565b50505f910152565b5f8151808452611e70816020860160208601611e37565b601f01601f19169290920160200192915050565b602081525f6118c56020830184611e59565b5f60208284031215611ea6575f80fd5b5035919050565b80356001600160a01b0381168114611ec3575f80fd5b919050565b5f8060408385031215611ed9575f80fd5b611ee283611ead565b946020939093013593505050565b5f8060408385031215611f01575f80fd5b50508035926020909101359150565b634e487b7160e01b5f52604160045260245ffd5b604051601f8201601f1916810167ffffffffffffffff81118282101715611f4d57611f4d611f10565b604052919050565b5f8060408385031215611f66575f80fd5b823567ffffffffffffffff80821115611f7d575f80fd5b818501915085601f830112611f90575f80fd5b8135602082821115611fa457611fa4611f10565b8160051b9250611fb5818401611f24565b8281529284018101928181019089851115611fce575f80fd5b948201945b84861015611ff357611fe486611ead565b82529482019490820190611fd3565b9997909101359750505050505050565b5f805f60608486031215612015575f80fd5b61201e84611ead565b925061202c60208501611ead565b9150604084013590509250925092565b5f805f6060848603121561204e575f80fd5b833592506020840135915061206560408501611ead565b90509250925092565b5f67ffffffffffffffff83111561208757612087611f10565b61209a601f8401601f1916602001611f24565b90508281528383830111156120ad575f80fd5b828260208301375f602084830101529392505050565b5f602082840312156120d3575f80fd5b813567ffffffffffffffff8111156120e9575f80fd5b8201601f810184136120f9575f80fd5b611c4c8482356020840161206e565b5f60208284031215612118575f80fd5b6118c582611ead565b5f8060408385031215612132575f80fd5b8235915061214260208401611ead565b90509250929050565b80358015158114611ec3575f80fd5b5f806040838503121561216b575f80fd5b61217483611ead565b91506121426020840161214b565b5f60208284031215612192575f80fd5b6118c58261214b565b5f80604083850312156121ac575f80fd5b611ee28361214b565b5f805f80608085870312156121c8575f80fd5b6121d185611ead565b93506121df60208601611ead565b925060408501359150606085013567ffffffffffffffff811115612201575f80fd5b8501601f81018713612211575f80fd5b6122208782356020840161206e565b91505092959194509250565b5f806040838503121561223d575f80fd5b61224683611ead565b915061214260208401611ead565b600181811c9082168061226857607f821691505b60208210810361228657634e487b7160e01b5f52602260045260245ffd5b50919050565b634e487b7160e01b5f52603260045260245ffd5b634e487b7160e01b5f52601160045260245ffd5b808201808211156107fb576107fb6122a0565b818103818111156107fb576107fb6122a0565b80820281158282048414176107fb576107fb6122a0565b5f8261230b57634e487b7160e01b5f52601260045260245ffd5b500490565b601f821115610b2d57805f5260205f20601f840160051c810160208510156123355750805b601f840160051c820191505b81811015611d08575f8155600101612341565b815167ffffffffffffffff81111561236e5761236e611f10565b6123828161237c8454612254565b84612310565b602080601f8311600181146123b5575f841561239e5750858301515b5f19600386901b1c1916600185901b178555610d5a565b5f85815260208120601f198616915b828110156123e3578886015182559484019460019091019084016123c4565b508582101561240057878501515f19600388901b60f8161c191681555b5050505050600190811b01905550565b5f8351612421818460208801611e37565b835190830190612435818360208801611e37565b01949350505050565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061247090830184611e59565b9695505050505050565b5f6020828403121561248a575f80fd5b81516118c581611e0756fea26469706673582212204c9b4fba8513a8db5a985af6c1404f85a221fa43a4e340b19fff4380e740594464736f6c63430008180033

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

00000000000000000000000000000000000000000000000000000000000001200000000000000000000000000000000000000000000000000000000000000160000000000000000000000000f7f1f95421ececd2df65af5cdf86d0cc2ecc374a00000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000000000000000000000000000000000000000188a0000000000000000000000000000000000000000000000000003e871b540c0000000000000000000000000000000000000000000000000000000000000000220000000000000000000000000000000000000000000000000000000000000026000000000000000000000000000000000000000000000000000000000000002a000000000000000000000000000000000000000000000000000000000000000084265726163506f4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000442504f4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656961656362363368657a7371656e726172627277716433736c336b74337472377637737371616e6b6d74673666366867687473376d2f0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000000000188a00000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): BeracPoL
Arg [1] : symbol (string): BPOL
Arg [2] : _ownerPayoutAddress (address): 0xF7F1f95421ECeCD2Df65af5cdF86d0cc2Ecc374a
Arg [3] : _initialBaseURI (string): ipfs://bafybeiaecb63hezsqenrarbrwqd3sl3kt3tr7v7ssqankmtg6f6hghts7m/
Arg [4] : _maxSupply (uint256): 6282
Arg [5] : _threeDollarsEth (uint256): 1100000000000000
Arg [6] : _maxMintPerWallet (uint256[]): 3
Arg [7] : _maxSupplyPerMintGroup (uint256[]): 6282
Arg [8] : _mintPrice (uint256[]): 0

-----Encoded View---------------
23 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [2] : 000000000000000000000000f7f1f95421ececd2df65af5cdf86d0cc2ecc374a
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [4] : 000000000000000000000000000000000000000000000000000000000000188a
Arg [5] : 0000000000000000000000000000000000000000000000000003e871b540c000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000220
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000260
Arg [8] : 00000000000000000000000000000000000000000000000000000000000002a0
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [10] : 4265726163506f4c000000000000000000000000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [12] : 42504f4c00000000000000000000000000000000000000000000000000000000
Arg [13] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [14] : 697066733a2f2f6261667962656961656362363368657a7371656e7261726272
Arg [15] : 77716433736c336b74337472377637737371616e6b6d74673666366867687473
Arg [16] : 376d2f0000000000000000000000000000000000000000000000000000000000
Arg [17] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [18] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [19] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [20] : 000000000000000000000000000000000000000000000000000000000000188a
Arg [21] : 0000000000000000000000000000000000000000000000000000000000000001
Arg [22] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

61198:15347:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76249:195;;;;;;;;;;-1:-1:-1;76249:195:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;76249:195:0;;;;;;;;28268:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;34759:218::-;;;;;;;;;;-1:-1:-1;34759:218:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1697:32:1;;;1679:51;;1667:2;1652:18;34759:218:0;1533:203:1;34192:408:0;;;;;;:::i;:::-;;:::i;:::-;;65519:1016;;;;;;;;;;-1:-1:-1;65519:1016:0;;;;;:::i;:::-;;:::i;61981:51::-;;;;;;;;;;-1:-1:-1;61981:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;2577:25:1;;;2565:2;2550:18;61981:51:0;2431:177:1;24019:323:0;;;;;;;;;;-1:-1:-1;76140:1:0;24293:12;24080:7;24277:13;:28;-1:-1:-1;;24277:46:0;24019:323;;66566:522;;;;;;;;;;-1:-1:-1;66566:522:0;;;;;:::i;:::-;;:::i;67124:593::-;;;;;;;;;;-1:-1:-1;67124:593:0;;;;;:::i;:::-;;:::i;38398:2825::-;;;;;;:::i;:::-;;:::i;62093:56::-;;;;;;;;;;-1:-1:-1;62093:56:0;;;;;:::i;:::-;;;;;;;;;;;;;;70418:2837;;;;;;:::i;:::-;;:::i;61801:25::-;;;;;;;;;;-1:-1:-1;61801:25:0;;;;-1:-1:-1;;;;;61801:25:0;;;41319:193;;;;;;:::i;:::-;;:::i;62437:33::-;;;;;;;;;;-1:-1:-1;62437:33:0;;;;;:::i;:::-;;:::i;62282:45::-;;;;;;;;;;-1:-1:-1;62282:45:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;73929:210;;;;;;;;;;-1:-1:-1;73929:210:0;;;;;:::i;:::-;;:::i;29661:152::-;;;;;;;;;;-1:-1:-1;29661:152:0;;;;;:::i;:::-;;:::i;61773:21::-;;;;;;;;;;;;;:::i;25203:233::-;;;;;;;;;;-1:-1:-1;25203:233:0;;;;;:::i;:::-;;:::i;8162:103::-;;;;;;;;;;;;;:::i;68339:181::-;;;;;;;;;;-1:-1:-1;68339:181:0;;;;;:::i;:::-;;:::i;62215:59::-;;;;;;;;;;-1:-1:-1;62215:59:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;7487:87;;;;;;;;;;-1:-1:-1;7560:6:0;;-1:-1:-1;;;;;7560:6:0;7487:87;;74244:728;;;;;;;;;;;;;:::i;61909:34::-;;;;;;;;;;;;;;;;28444:104;;;;;;;;;;;;;:::i;35317:234::-;;;;;;;;;;-1:-1:-1;35317:234:0;;;;;:::i;:::-;;:::i;75051:571::-;;;;;;;;;;;;;:::i;73559:264::-;;;;;;;;;;-1:-1:-1;73559:264:0;;;;;:::i;:::-;;:::i;61833:33::-;;;;;;;;;;-1:-1:-1;61833:33:0;;;;-1:-1:-1;;;;;61833:33:0;;;67760:347;;;;;;;;;;-1:-1:-1;67760:347:0;;;;;:::i;:::-;;:::i;42110:407::-;;;;;;:::i;:::-;;:::i;69547:600::-;;;;;;;;;;;;;:::i;68619:443::-;;;;;;;;;;-1:-1:-1;68619:443:0;;;;;:::i;:::-;;:::i;28654:318::-;;;;;;;;;;-1:-1:-1;28654:318:0;;;;;:::i;:::-;;:::i;62335:31::-;;;;;;;;;;;;;;;;61701:30;;;;;;;;;;;;;;;;61670:24;;;;;;;;;;;;;;;;62157:49;;;;;;;;;;-1:-1:-1;62157:49:0;;;;;:::i;:::-;;;;;;;;;;;;;;62041:44;;;;;;;;;;-1:-1:-1;62041:44:0;;;;;:::i;:::-;;;;;;;;;;;;;;61738:28;;;;;;;;;;-1:-1:-1;61738:28:0;;;;;;;;35708:164;;;;;;;;;;-1:-1:-1;35708:164:0;;;;;:::i;:::-;;:::i;8420:220::-;;;;;;;;;;-1:-1:-1;8420:220:0;;;;;:::i;:::-;;:::i;69301:157::-;;;;;;;;;;-1:-1:-1;69301:157:0;;;;;:::i;:::-;;:::i;75853:114::-;;;;;;;;;;-1:-1:-1;75948:10:0;75905:7;75932:27;;;:15;:27;;;;;;75853:114;;76249:195;76371:4;76400:36;76424:11;76400:23;:36::i;:::-;76393:43;76249:195;-1:-1:-1;;76249:195:0:o;28268:100::-;28322:13;28355:5;28348:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28268:100;:::o;34759:218::-;34835:7;34860:16;34868:7;34860;:16::i;:::-;34855:64;;34885:34;;-1:-1:-1;;;34885:34:0;;;;;;;;;;;34855:64;-1:-1:-1;34939:24:0;;;;:15;:24;;;;;:30;-1:-1:-1;;;;;34939:30:0;;34759:218::o;34192:408::-;34281:13;34297:16;34305:7;34297;:16::i;:::-;34281:32;-1:-1:-1;58525:10:0;-1:-1:-1;;;;;34330:28:0;;;34326:175;;34378:44;34395:5;58525:10;35708:164;:::i;34378:44::-;34373:128;;34450:35;;-1:-1:-1;;;34450:35:0;;;;;;;;;;;34373:128;34513:24;;;;:15;:24;;;;;;:35;;-1:-1:-1;;;;;;34513:35:0;-1:-1:-1;;;;;34513:35:0;;;;;;;;;34564:28;;34513:24;;34564:28;;;;;;;34270:330;34192:408;;:::o;65519:1016::-;7373:13;:11;:13::i;:::-;65774:25:::1;65792:6;65774:17;:25::i;:::-;65769:89;;65816:30;65839:6;65816:22;:30::i;:::-;65922:25;65967:9:::0;65962:325:::1;65986:16;:23:::0;65982:27;::::1;65962:325;;;66058:6;66035:16;66052:1;66035:19;;;;;;;;:::i;:::-;;;;;;;;;:29:::0;66031:245:::1;;66085:27;66106:6:::0;66085:27;::::1;:::i;:::-;;;66031:245;;;66218:21;:42;66240:16;66257:1;66240:19;;;;;;;;:::i;:::-;;;;;;;;;66218:42;;;;;;;;;;;;66197:63;;;;;:::i;:::-;;;66031:245;66011:3;;65962:325;;;;66323:9;;66303:17;:29;66299:178;;;66356:109;::::0;-1:-1:-1;;;66356:109:0;;8810:2:1;66356:109:0::1;::::0;::::1;8792:21:1::0;8849:2;8829:18;;;8822:30;8888:34;8868:18;;;8861:62;-1:-1:-1;;;8939:18:1;;;8932:45;8994:19;;66356:109:0::1;;;;;;;;66299:178;-1:-1:-1::0;66489:29:0::1;::::0;;;:21:::1;:29;::::0;;;;;:38;65519:1016::o;66566:522::-;7373:13;:11;:13::i;:::-;66827:25:::1;66845:6;66827:17;:25::i;:::-;66822:89;;66869:30;66892:6;66869:22;:30::i;:::-;66928:9;66923:158;66947:10;:17;66943:1;:21;66923:158;;;66986:15;::::0;;;:7:::1;:15;::::0;;;;67002:13;;67019:4:::1;::::0;66986:15;67002:10;;67013:1;;67002:13;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;66986:30:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;66986:30:0;:37;;-1:-1:-1;;66986:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;67053:12:::1;::::0;:16:::1;::::0;-1:-1:-1;67053:16:0::1;:::i;:::-;67038:12;:31:::0;66966:3:::1;;66923:158;;;;66566:522:::0;;:::o;67124:593::-;7373:13;:11;:13::i;:::-;67393:25:::1;67411:6;67393:17;:25::i;:::-;67388:89;;67435:30;67458:6;67435:22;:30::i;:::-;67494:9;67489:221;67513:13;:20;67509:1;:24;67489:221;;;67591:5;67555:15:::0;;;:7:::1;:15;::::0;;;;67571:16;;67591:5;;67571:13;;67585:1;;67571:16;::::1;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;67555:33:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;67555:33:0;:41;;-1:-1:-1;;67555:41:0::1;::::0;::::1;;::::0;;;::::1;::::0;;67615:12:::1;::::0;:16;67611:88:::1;;67682:1;67667:12;;:16;;;;:::i;:::-;67652:12;:31:::0;67611:88:::1;67535:3;;67489:221;;38398:2825:::0;38540:27;38570;38589:7;38570:18;:27::i;:::-;38540:57;;38655:4;-1:-1:-1;;;;;38614:45:0;38630:19;-1:-1:-1;;;;;38614:45:0;;38610:86;;38668:28;;-1:-1:-1;;;38668:28:0;;;;;;;;;;;38610:86;38710:27;37506:24;;;:15;:24;;;;;37734:26;;58525:10;37131:30;;;-1:-1:-1;;;;;36824:28:0;;37109:20;;;37106:56;38896:180;;38989:43;39006:4;58525:10;35708:164;:::i;38989:43::-;38984:92;;39041:35;;-1:-1:-1;;;39041:35:0;;;;;;;;;;;38984:92;-1:-1:-1;;;;;39093:16:0;;39089:52;;39118:23;;-1:-1:-1;;;39118:23:0;;;;;;;;;;;39089:52;39290:15;39287:160;;;39430:1;39409:19;39402:30;39287:160;-1:-1:-1;;;;;39827:24:0;;;;;;;:18;:24;;;;;;39825:26;;-1:-1:-1;;39825:26:0;;;39896:22;;;;;;;;;39894:24;;-1:-1:-1;39894:24:0;;;33050:11;33025:23;33021:41;33008:63;-1:-1:-1;;;33008:63:0;40189:26;;;;:17;:26;;;;;:175;;;;-1:-1:-1;;;40484:47:0;;:52;;40480:627;;40589:1;40579:11;;40557:19;40712:30;;;:17;:30;;;;;;:35;;40708:384;;40850:13;;40835:11;:28;40831:242;;40997:30;;;;:17;:30;;;;;:52;;;40831:242;40538:569;40480:627;41154:7;41150:2;-1:-1:-1;;;;;41135:27:0;41144:4;-1:-1:-1;;;;;41135:27:0;;;;;;;;;;;41173:42;38529:2694;;;38398:2825;;;:::o;70418:2837::-;70651:8;;;;70646:63;;70683:14;;-1:-1:-1;;;70683:14:0;;;;;;;;;;;70646:63;70736:8;;;;:34;;;;-1:-1:-1;70749:21:0;;;;:13;:21;;;;;;;;70748:22;70736:34;70732:107;;;70794:33;;-1:-1:-1;;;70794:33:0;;;;;2577:25:1;;;2550:18;;70794:33:0;2431:177:1;70732:107:0;70863:11;;70859:533;;70895:15;;;;:7;:15;;;;;;;;70911:10;70895:27;;;;;;;;;;:36;;;;70891:134;;70959:50;;-1:-1:-1;;;70959:50:0;;70981:10;70959:50;;;9331:51:1;9398:18;;;9391:34;;;9304:18;;70959:50:0;9157:274:1;70891:134:0;71095:29;;;;:21;:29;;;;;;;;;71061:14;:22;;;;;;;:31;;71086:6;;71061:31;:::i;:::-;:63;71039:342;;;71323:22;;;;:14;:22;;;;;;;;;71266:21;:29;;;;;;;71226:6;;71266:79;;;:::i;:::-;71166:199;;-1:-1:-1;;;71166:199:0;;;;;9610:25:1;;;;9651:18;;;9644:34;9583:18;;71166:199:0;9436:248:1;71039:342:0;71454:24;;;;:16;:24;;;;;;71426:25;71440:10;-1:-1:-1;;;;;25607:25:0;25579:7;25607:25;;;:18;:25;;19500:2;25607:25;;;;;:50;;19362:13;25606:82;;25518:178;71426:25;71417:34;;:6;:34;:::i;:::-;:61;71413:253;;;71627:10;25579:7;25607:25;;;:18;:25;;19500:2;25607:25;;;;;71552:6;;25607:50;19362:13;25606:82;71586:24;;;;:16;:24;;;;;;:52;;;;:::i;:::-;71502:152;;-1:-1:-1;;;71502:152:0;;;;;9610:25:1;;;;9651:18;;;9644:34;9583:18;;71502:152:0;9436:248:1;71413:253:0;71707:9;;76140:1;24293:12;24080:7;24277:13;71698:6;;24277:28;;-1:-1:-1;;24277:46:0;71682:22;;;;:::i;:::-;:34;71678:198;;;76140:1;24293:12;24080:7;24277:13;71787:6;;24277:28;;-1:-1:-1;;24277:46:0;71823:9;;:25;;;;:::i;:::-;71740:124;;-1:-1:-1;;;71740:124:0;;;;;9610:25:1;;;;9651:18;;;9644:34;9583:18;;71740:124:0;9436:248:1;71678:198:0;71922:17;71942;;;:9;:17;;;;;;:26;;71962:6;;71942:26;:::i;:::-;71922:46;;71979:17;72057:6;72039:15;;:24;;;;:::i;:::-;72018:3;72001:13;:9;72013:1;72001:13;:::i;:::-;72000:21;;;;:::i;:::-;71999:65;;;;:::i;:::-;71979:85;-1:-1:-1;72090:24:0;72117:21;71979:85;72117:9;:21;:::i;:::-;72090:48;;72167:16;72155:9;:28;72151:185;;;72207:117;;-1:-1:-1;;;72207:117:0;;;;;9610:25:1;;;72299:9:0;9651:18:1;;;9644:34;9583:18;;72207:117:0;9436:248:1;72151:185:0;-1:-1:-1;;;;;72401:23:0;;;;;;:50;;-1:-1:-1;;;;;;72428:23:0;;72441:10;72428:23;;72401:50;72397:294;;;72468:23;72530:3;72507:19;;72495:9;:31;;;;:::i;:::-;72494:39;;;;:::i;:::-;-1:-1:-1;;;;;72548:26:0;;;;;;:15;:26;;;;;:45;;72468:65;;-1:-1:-1;72468:65:0;;72548:26;;;:45;;72468:65;;72548:45;:::i;:::-;;;;-1:-1:-1;72608:28:0;;-1:-1:-1;72621:15:0;72608:28;;:::i;:::-;;;72453:238;72397:294;72747:18;;-1:-1:-1;;;;;72747:18:0;72731:35;;;;:15;:35;;;;;:48;;72770:9;;72731:35;:48;;72770:9;;72731:48;:::i;:::-;;;;-1:-1:-1;;72818:10:0;;-1:-1:-1;;;;;72818:10:0;72802:27;;;;:15;:27;;;;;:40;;72833:9;;72802:27;:40;;72833:9;;72802:40;:::i;:::-;;;;-1:-1:-1;;72921:22:0;;;;:14;:22;;;;;:32;;72947:6;;72921:22;:32;;72947:6;;72921:32;:::i;:::-;;;;-1:-1:-1;72964:29:0;;-1:-1:-1;72974:10:0;72986:6;72964:9;:29::i;:::-;73009:51;;;10286:25:1;;;10342:2;10327:18;;10320:34;;;-1:-1:-1;;;;;10390:32:1;;10370:18;;;10363:60;73009:51:0;;73022:10;;73009:51;;;;;;10274:2:1;73009:51:0;;;73113:14;73130:28;73142:16;73130:9;:28;:::i;:::-;73113:45;-1:-1:-1;73173:10:0;;73169:79;;73200:36;;73208:10;;73200:36;;;;;73229:6;;73200:36;;;;73229:6;73208:10;73200:36;;;;;;;;;;;;;;;;;;;;;73169:79;70601:2654;;;;70418:2837;;;:::o;41319:193::-;41465:39;41482:4;41488:2;41492:7;41465:39;;;;;;;;;;;;:16;:39::i;62437:33::-;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62437:33:0;:::o;73929:210::-;7373:13;:11;:13::i;:::-;74003:7:::1;:20;74013:10:::0;74003:7;:20:::1;:::i;:::-;-1:-1:-1::0;74039:41:0::1;::::0;-1:-1:-1;;74062:17:0;74059:1:::1;::::0;74039:41:::1;::::0;;;::::1;73929:210:::0;:::o;29661:152::-;29733:7;29776:27;29795:7;29776:18;:27::i;61773:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25203:233::-;25275:7;-1:-1:-1;;;;;25299:19:0;;25295:60;;25327:28;;-1:-1:-1;;;25327:28:0;;;;;;;;;;;25295:60;-1:-1:-1;;;;;;25373:25:0;;;;;:18;:25;;;;;;19362:13;25373:55;;25203:233::o;8162:103::-;7373:13;:11;:13::i;:::-;8227:30:::1;8254:1;8227:18;:30::i;:::-;8162:103::o:0;68339:181::-;7373:13;:11;:13::i;:::-;68461:29:::1;::::0;;;:16:::1;:29;::::0;;;;:51;68339:181::o;74244:728::-;7373:13;:11;:13::i;:::-;74321:18:::1;::::0;-1:-1:-1;;;;;74321:18:0::1;74344:1;74305:35:::0;;;:15:::1;:35;::::0;;;;;74301:138:::1;;74369:58;::::0;-1:-1:-1;;;74369:58:0;;12806:2:1;74369:58:0::1;::::0;::::1;12788:21:1::0;12845:2;12825:18;;;12818:30;12884;12864:18;;;12857:58;12932:18;;74369:58:0::1;12604:352:1::0;74301:138:0::1;74487:18;::::0;;-1:-1:-1;;;;;74487:18:0;;::::1;74449:19;74471:35:::0;;;:15:::1;:35;::::0;;;;;;;74547:10:::1;::::0;;;::::1;74531:27:::0;;;;;;74571:39;;;;74637:10;;::::1;74621:27:::0;;;;;:31;;;74693:18;;74685:80;;74531:27;;74693:18;;;::::1;::::0;74471:35;;74449:19;74685:80;74449:19;74685:80;74471:35;74693:18;74685:80:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1::0;;74804:10:0::1;::::0;74796:40:::1;::::0;74665:100;;-1:-1:-1;74777:13:0::1;::::0;-1:-1:-1;;;;;74804:10:0;;::::1;::::0;74828:3;;74777:13;74796:40;74777:13;74796:40;74828:3;74804:10;74796:40:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74776:60;;;74854:8;74853:9;:22;;;;;74867:8;74866:9;74853:22;74849:116;;;74899:54;::::0;-1:-1:-1;;;74899:54:0;;13373:2:1;74899:54:0::1;::::0;::::1;13355:21:1::0;13412:2;13392:18;;;13385:30;-1:-1:-1;;;13431:18:1;;;13424:54;13495:18;;74899:54:0::1;13171:348:1::0;74849:116:0::1;74290:682;;;;74244:728::o:0;28444:104::-;28500:13;28533:7;28526:14;;;;;:::i;35317:234::-;58525:10;35412:39;;;;:18;:39;;;;;;;;-1:-1:-1;;;;;35412:49:0;;;;;;;;;;;;:60;;-1:-1:-1;;35412:60:0;;;;;;;;;;35488:55;;540:41:1;;;35412:49:0;;58525:10;35488:55;;513:18:1;35488:55:0;;;;;;;35317:234;;:::o;75051:571::-;75115:10;;-1:-1:-1;;;;;75115:10:0;75101;:24;75097:98;;75149:34;;-1:-1:-1;;;75149:34:0;;75171:10;75149:34;;;1679:51:1;1652:18;;75149:34:0;1533:203:1;75097:98:0;75225:10;;-1:-1:-1;;;;;75225:10:0;75240:1;75209:27;;;:15;:27;;;;;;75205:130;;75265:58;;-1:-1:-1;;;75265:58:0;;12806:2:1;75265:58:0;;;12788:21:1;12845:2;12825:18;;;12818:30;12884;12864:18;;;12857:58;12932:18;;75265:58:0;12604:352:1;75205:130:0;75377:10;;;-1:-1:-1;;;;;75377:10:0;;;75347:11;75361:27;;;:15;:27;;;;;;;;75399:31;;;;75470:10;;75462:40;;75347:11;;75470:10;;75361:27;;75462:40;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75443:59;;;75518:7;75513:102;;75549:54;;-1:-1:-1;;;75549:54:0;;13373:2:1;75549:54:0;;;13355:21:1;13412:2;13392:18;;;13385:30;-1:-1:-1;;;13431:18:1;;;13424:54;13495:18;;75549:54:0;13171:348:1;75513:102:0;75086:536;;75051:571::o;73559:264::-;7373:13;:11;:13::i;:::-;73630:8:::1;::::0;:18;::::1;;:8;::::0;;::::1;:18;;::::0;73626:162:::1;;73672:104;::::0;-1:-1:-1;;;73672:104:0;;13726:2:1;73672:104:0::1;::::0;::::1;13708:21:1::0;13765:2;13745:18;;;13738:30;13804:34;13784:18;;;13777:62;-1:-1:-1;;;13855:18:1;;;13848:40;13905:19;;73672:104:0::1;13524:406:1::0;73626:162:0::1;73798:8;:17:::0;;-1:-1:-1;;73798:17:0::1;::::0;::::1;;::::0;;;::::1;::::0;;73559:264::o;67760:347::-;7373:13;:11;:13::i;:::-;67952:25:::1;67970:6;67952:17;:25::i;:::-;67947:105;;68001:39;::::0;-1:-1:-1;;;68001:39:0;;::::1;::::0;::::1;2577:25:1::0;;;2550:18;;68001:39:0::1;2431:177:1::0;67947:105:0::1;68062:21;::::0;;;:13:::1;:21;::::0;;;;:37;;-1:-1:-1;;68062:37:0::1;::::0;::::1;;::::0;;;::::1;::::0;;67760:347::o;42110:407::-;42285:31;42298:4;42304:2;42308:7;42285:12;:31::i;:::-;-1:-1:-1;;;;;42331:14:0;;;:19;42327:183;;42370:56;42401:4;42407:2;42411:7;42420:5;42370:30;:56::i;:::-;42365:145;;42454:40;;-1:-1:-1;;;42454:40:0;;;;;;;;;;;69547:600;69646:10;69603:24;69630:27;;;:15;:27;;;;;;;;69854:31;;;;69948:77;;69630:27;;69646:10;69630:27;;69948:77;12961:205:1;68619:443:0;7373:13;:11;:13::i;:::-;68874:25:::1;68892:6;68874:17;:25::i;:::-;68869:89;;68916:30;68939:6;68916:22;:30::i;:::-;68968:17;::::0;;;:9:::1;:17;::::0;;;;;;:32;;;69016:38;68978:6;;69016:38:::1;::::0;::::1;::::0;68988:12;2577:25:1;;2565:2;2550:18;;2431:177;69016:38:0::1;;;;;;;;68619:443:::0;;:::o;28654:318::-;28727:13;28758:16;28766:7;28758;:16::i;:::-;28753:59;;28783:29;;-1:-1:-1;;;28783:29:0;;;;;;;;;;;28753:59;28825:21;28849:10;:8;:10::i;:::-;28825:34;;28883:7;28877:21;28902:1;28877:26;:87;;;;;;;;;;;;;;;;;28930:7;28939:18;28949:7;28939:9;:18::i;:::-;28913:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;28877:87;28870:94;28654:318;-1:-1:-1;;;28654:318:0:o;35708:164::-;-1:-1:-1;;;;;35829:25:0;;;35805:4;35829:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;35708:164::o;8420:220::-;7373:13;:11;:13::i;:::-;-1:-1:-1;;;;;8505:22:0;::::1;8501:93;;8551:31;::::0;-1:-1:-1;;;8551:31:0;;8579:1:::1;8551:31;::::0;::::1;1679:51:1::0;1652:18;;8551:31:0::1;1533:203:1::0;8501:93:0::1;8604:28;8623:8;8604:18;:28::i;:::-;8420:220:::0;:::o;69301:157::-;7373:13;:11;:13::i;:::-;69411:19:::1;:39:::0;69301:157::o;27366:639::-;27451:4;-1:-1:-1;;;;;;;;;27775:25:0;;;;:102;;-1:-1:-1;;;;;;;;;;27852:25:0;;;27775:102;:179;;;-1:-1:-1;;;;;;;;27929:25:0;-1:-1:-1;;;27929:25:0;;27366:639::o;36130:282::-;36195:4;36251:7;76140:1;36232:26;;:66;;;;;36285:13;;36275:7;:23;36232:66;:153;;;;-1:-1:-1;;36336:26:0;;;;:17;:26;;;;;;-1:-1:-1;;;36336:44:0;:49;;36130:282::o;7652:166::-;7560:6;;-1:-1:-1;;;;;7560:6:0;58525:10;7712:23;7708:103;;7759:40;;-1:-1:-1;;;7759:40:0;;58525:10;7759:40;;;1679:51:1;1652:18;;7759:40:0;1533:203:1;65104:273:0;65169:4;;65186:161;65210:16;:23;65206:27;;65186:161;;;65282:6;65259:16;65276:1;65259:19;;;;;;;;:::i;:::-;;;;;;;;;:29;65255:81;;-1:-1:-1;65316:4:0;;65104:273;-1:-1:-1;;65104:273:0:o;65255:81::-;65235:3;;65186:161;;;-1:-1:-1;65364:5:0;;65104:273;-1:-1:-1;;65104:273:0:o;64829:267::-;64917:1;64897:17;;;:9;:17;;;;;;;;:21;;;64929:16;:24;;;;;:28;;;64968:21;:29;;;;;:33;;;65012:14;:22;;;;;:26;;;65049:16;:29;;;;;;;;;;;;64829:267::o;30816:1275::-;30883:7;30918;;76140:1;30967:23;30963:1061;;31020:13;;31013:4;:20;31009:1015;;;31058:14;31075:23;;;:17;:23;;;;;;;-1:-1:-1;;;31164:24:0;;:29;;31160:845;;31829:113;31836:6;31846:1;31836:11;31829:113;;-1:-1:-1;;;31907:6:0;31889:25;;;;:17;:25;;;;;;31829:113;;31160:845;31035:989;31009:1015;32052:31;;-1:-1:-1;;;32052:31:0;;;;;;;;;;;52270:112;52347:27;52357:2;52361:8;52347:27;;;;;;;;;;;;:9;:27::i;8800:191::-;8893:6;;;-1:-1:-1;;;;;8910:17:0;;;-1:-1:-1;;;;;;8910:17:0;;;;;;;8943:40;;8893:6;;;8910:17;8893:6;;8943:40;;8874:16;;8943:40;8863:128;8800:191;:::o;44601:716::-;44785:88;;-1:-1:-1;;;44785:88:0;;44764:4;;-1:-1:-1;;;;;44785:45:0;;;;;:88;;58525:10;;44852:4;;44858:7;;44867:5;;44785:88;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;44785:88:0;;;;;;;;-1:-1:-1;;44785:88:0;;;;;;;;;;;;:::i;:::-;;;44781:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45068:6;:13;45085:1;45068:18;45064:235;;45114:40;;-1:-1:-1;;;45114:40:0;;;;;;;;;;;45064:235;45257:6;45251:13;45242:6;45238:2;45234:15;45227:38;44781:529;-1:-1:-1;;;;;;44944:64:0;-1:-1:-1;;;44944:64:0;;-1:-1:-1;44781:529:0;44601:716;;;;;;:::o;75683:100::-;75735:13;75768:7;75761:14;;;;;:::i;58645:1745::-;58710:17;59144:4;59137;59131:11;59127:22;59236:1;59230:4;59223:15;59311:4;59308:1;59304:12;59297:19;;;59393:1;59388:3;59381:14;59497:3;59736:5;59718:428;59784:1;59779:3;59775:11;59768:18;;59955:2;59949:4;59945:13;59941:2;59937:22;59932:3;59924:36;60049:2;60039:13;;60106:25;59718:428;60106:25;-1:-1:-1;60176:13:0;;;-1:-1:-1;;60291:14:0;;;60353:19;;;60291:14;58645:1745;-1:-1:-1;58645:1745:0:o;51497:689::-;51628:19;51634:2;51638:8;51628:5;:19::i;:::-;-1:-1:-1;;;;;51689:14:0;;;:19;51685:483;;51729:11;51743:13;51791:14;;;51824:233;51855:62;51894:1;51898:2;51902:7;;;;;;51911:5;51855:30;:62::i;:::-;51850:167;;51953:40;;-1:-1:-1;;;51953:40:0;;;;;;;;;;;51850:167;52052:3;52044:5;:11;51824:233;;52139:3;52122:13;;:20;52118:34;;52144:8;;;52118:34;51710:458;;51497:689;;;:::o;45779:2966::-;45852:20;45875:13;;;45903;;;45899:44;;45925:18;;-1:-1:-1;;;45925:18:0;;;;;;;;;;;45899:44;-1:-1:-1;;;;;46431:22:0;;;;;;:18;:22;;;;19500:2;46431:22;;;:71;;46469:32;46457:45;;46431:71;;;46745:31;;;:17;:31;;;;;-1:-1:-1;33481:15:0;;33455:24;33451:46;33050:11;33025:23;33021:41;33018:52;33008:63;;46745:173;;46980:23;;;;46745:31;;46431:22;;47745:25;46431:22;;47598:335;48259:1;48245:12;48241:20;48199:346;48300:3;48291:7;48288:16;48199:346;;48518:7;48508:8;48505:1;48478:25;48475:1;48472;48467:59;48353:1;48340:15;48199:346;;;48203:77;48578:8;48590:1;48578:13;48574:45;;48600:19;;-1:-1:-1;;;48600:19:0;;;;;;;;;;;48574:45;48636:13;:19;-1:-1:-1;66923:158:0::1;66566:522:::0;;:::o;14:131:1:-;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:250::-;677:1;687:113;701:6;698:1;695:13;687:113;;;777:11;;;771:18;758:11;;;751:39;723:2;716:10;687:113;;;-1:-1:-1;;834:1:1;816:16;;809:27;592:250::o;847:271::-;889:3;927:5;921:12;954:6;949:3;942:19;970:76;1039:6;1032:4;1027:3;1023:14;1016:4;1009:5;1005:16;970:76;:::i;:::-;1100:2;1079:15;-1:-1:-1;;1075:29:1;1066:39;;;;1107:4;1062:50;;847:271;-1:-1:-1;;847:271:1:o;1123:220::-;1272:2;1261:9;1254:21;1235:4;1292:45;1333:2;1322:9;1318:18;1310:6;1292:45;:::i;1348:180::-;1407:6;1460:2;1448:9;1439:7;1435:23;1431:32;1428:52;;;1476:1;1473;1466:12;1428:52;-1:-1:-1;1499:23:1;;1348:180;-1:-1:-1;1348:180:1:o;1741:173::-;1809:20;;-1:-1:-1;;;;;1858:31:1;;1848:42;;1838:70;;1904:1;1901;1894:12;1838:70;1741:173;;;:::o;1919:254::-;1987:6;1995;2048:2;2036:9;2027:7;2023:23;2019:32;2016:52;;;2064:1;2061;2054:12;2016:52;2087:29;2106:9;2087:29;:::i;:::-;2077:39;2163:2;2148:18;;;;2135:32;;-1:-1:-1;;;1919:254:1:o;2178:248::-;2246:6;2254;2307:2;2295:9;2286:7;2282:23;2278:32;2275:52;;;2323:1;2320;2313:12;2275:52;-1:-1:-1;;2346:23:1;;;2416:2;2401:18;;;2388:32;;-1:-1:-1;2178:248:1:o;2613:127::-;2674:10;2669:3;2665:20;2662:1;2655:31;2705:4;2702:1;2695:15;2729:4;2726:1;2719:15;2745:275;2816:2;2810:9;2881:2;2862:13;;-1:-1:-1;;2858:27:1;2846:40;;2916:18;2901:34;;2937:22;;;2898:62;2895:88;;;2963:18;;:::i;:::-;2999:2;2992:22;2745:275;;-1:-1:-1;2745:275:1:o;3025:1022::-;3118:6;3126;3179:2;3167:9;3158:7;3154:23;3150:32;3147:52;;;3195:1;3192;3185:12;3147:52;3235:9;3222:23;3264:18;3305:2;3297:6;3294:14;3291:34;;;3321:1;3318;3311:12;3291:34;3359:6;3348:9;3344:22;3334:32;;3404:7;3397:4;3393:2;3389:13;3385:27;3375:55;;3426:1;3423;3416:12;3375:55;3462:2;3449:16;3484:4;3507:2;3503;3500:10;3497:36;;;3513:18;;:::i;:::-;3559:2;3556:1;3552:10;3542:20;;3582:28;3606:2;3602;3598:11;3582:28;:::i;:::-;3644:15;;;3714:11;;;3710:20;;;3675:12;;;;3742:19;;;3739:39;;;3774:1;3771;3764:12;3739:39;3798:11;;;;3818:148;3834:6;3829:3;3826:15;3818:148;;;3900:23;3919:3;3900:23;:::i;:::-;3888:36;;3851:12;;;;3944;;;;3818:148;;;3985:5;4022:18;;;;4009:32;;-1:-1:-1;;;;;;;3025:1022:1:o;4052:328::-;4129:6;4137;4145;4198:2;4186:9;4177:7;4173:23;4169:32;4166:52;;;4214:1;4211;4204:12;4166:52;4237:29;4256:9;4237:29;:::i;:::-;4227:39;;4285:38;4319:2;4308:9;4304:18;4285:38;:::i;:::-;4275:48;;4370:2;4359:9;4355:18;4342:32;4332:42;;4052:328;;;;;:::o;4385:322::-;4462:6;4470;4478;4531:2;4519:9;4510:7;4506:23;4502:32;4499:52;;;4547:1;4544;4537:12;4499:52;4583:9;4570:23;4560:33;;4640:2;4629:9;4625:18;4612:32;4602:42;;4663:38;4697:2;4686:9;4682:18;4663:38;:::i;:::-;4653:48;;4385:322;;;;;:::o;4712:407::-;4777:5;4811:18;4803:6;4800:30;4797:56;;;4833:18;;:::i;:::-;4871:57;4916:2;4895:15;;-1:-1:-1;;4891:29:1;4922:4;4887:40;4871:57;:::i;:::-;4862:66;;4951:6;4944:5;4937:21;4991:3;4982:6;4977:3;4973:16;4970:25;4967:45;;;5008:1;5005;4998:12;4967:45;5057:6;5052:3;5045:4;5038:5;5034:16;5021:43;5111:1;5104:4;5095:6;5088:5;5084:18;5080:29;5073:40;4712:407;;;;;:::o;5124:451::-;5193:6;5246:2;5234:9;5225:7;5221:23;5217:32;5214:52;;;5262:1;5259;5252:12;5214:52;5302:9;5289:23;5335:18;5327:6;5324:30;5321:50;;;5367:1;5364;5357:12;5321:50;5390:22;;5443:4;5435:13;;5431:27;-1:-1:-1;5421:55:1;;5472:1;5469;5462:12;5421:55;5495:74;5561:7;5556:2;5543:16;5538:2;5534;5530:11;5495:74;:::i;5580:186::-;5639:6;5692:2;5680:9;5671:7;5667:23;5663:32;5660:52;;;5708:1;5705;5698:12;5660:52;5731:29;5750:9;5731:29;:::i;5771:254::-;5839:6;5847;5900:2;5888:9;5879:7;5875:23;5871:32;5868:52;;;5916:1;5913;5906:12;5868:52;5952:9;5939:23;5929:33;;5981:38;6015:2;6004:9;6000:18;5981:38;:::i;:::-;5971:48;;5771:254;;;;;:::o;6030:160::-;6095:20;;6151:13;;6144:21;6134:32;;6124:60;;6180:1;6177;6170:12;6195:254;6260:6;6268;6321:2;6309:9;6300:7;6296:23;6292:32;6289:52;;;6337:1;6334;6327:12;6289:52;6360:29;6379:9;6360:29;:::i;:::-;6350:39;;6408:35;6439:2;6428:9;6424:18;6408:35;:::i;6454:180::-;6510:6;6563:2;6551:9;6542:7;6538:23;6534:32;6531:52;;;6579:1;6576;6569:12;6531:52;6602:26;6618:9;6602:26;:::i;6639:248::-;6704:6;6712;6765:2;6753:9;6744:7;6740:23;6736:32;6733:52;;;6781:1;6778;6771:12;6733:52;6804:26;6820:9;6804:26;:::i;6892:667::-;6987:6;6995;7003;7011;7064:3;7052:9;7043:7;7039:23;7035:33;7032:53;;;7081:1;7078;7071:12;7032:53;7104:29;7123:9;7104:29;:::i;:::-;7094:39;;7152:38;7186:2;7175:9;7171:18;7152:38;:::i;:::-;7142:48;;7237:2;7226:9;7222:18;7209:32;7199:42;;7292:2;7281:9;7277:18;7264:32;7319:18;7311:6;7308:30;7305:50;;;7351:1;7348;7341:12;7305:50;7374:22;;7427:4;7419:13;;7415:27;-1:-1:-1;7405:55:1;;7456:1;7453;7446:12;7405:55;7479:74;7545:7;7540:2;7527:16;7522:2;7518;7514:11;7479:74;:::i;:::-;7469:84;;;6892:667;;;;;;;:::o;7564:260::-;7632:6;7640;7693:2;7681:9;7672:7;7668:23;7664:32;7661:52;;;7709:1;7706;7699:12;7661:52;7732:29;7751:9;7732:29;:::i;:::-;7722:39;;7780:38;7814:2;7803:9;7799:18;7780:38;:::i;7829:380::-;7908:1;7904:12;;;;7951;;;7972:61;;8026:4;8018:6;8014:17;8004:27;;7972:61;8079:2;8071:6;8068:14;8048:18;8045:38;8042:161;;8125:10;8120:3;8116:20;8113:1;8106:31;8160:4;8157:1;8150:15;8188:4;8185:1;8178:15;8042:161;;7829:380;;;:::o;8214:127::-;8275:10;8270:3;8266:20;8263:1;8256:31;8306:4;8303:1;8296:15;8330:4;8327:1;8320:15;8346:127;8407:10;8402:3;8398:20;8395:1;8388:31;8438:4;8435:1;8428:15;8462:4;8459:1;8452:15;8478:125;8543:9;;;8564:10;;;8561:36;;;8577:18;;:::i;9024:128::-;9091:9;;;9112:11;;;9109:37;;;9126:18;;:::i;9689:168::-;9762:9;;;9793;;9810:15;;;9804:22;;9790:37;9780:71;;9831:18;;:::i;9862:217::-;9902:1;9928;9918:132;;9972:10;9967:3;9963:20;9960:1;9953:31;10007:4;10004:1;9997:15;10035:4;10032:1;10025:15;9918:132;-1:-1:-1;10064:9:1;;9862:217::o;10560:518::-;10662:2;10657:3;10654:11;10651:421;;;10698:5;10695:1;10688:16;10742:4;10739:1;10729:18;10812:2;10800:10;10796:19;10793:1;10789:27;10783:4;10779:38;10848:4;10836:10;10833:20;10830:47;;;-1:-1:-1;10871:4:1;10830:47;10926:2;10921:3;10917:12;10914:1;10910:20;10904:4;10900:31;10890:41;;10981:81;10999:2;10992:5;10989:13;10981:81;;;11058:1;11044:16;;11025:1;11014:13;10981:81;;11254:1345;11380:3;11374:10;11407:18;11399:6;11396:30;11393:56;;;11429:18;;:::i;:::-;11458:97;11548:6;11508:38;11540:4;11534:11;11508:38;:::i;:::-;11502:4;11458:97;:::i;:::-;11610:4;;11667:2;11656:14;;11684:1;11679:663;;;;12386:1;12403:6;12400:89;;;-1:-1:-1;12455:19:1;;;12449:26;12400:89;-1:-1:-1;;11211:1:1;11207:11;;;11203:24;11199:29;11189:40;11235:1;11231:11;;;11186:57;12502:81;;11649:944;;11679:663;10507:1;10500:14;;;10544:4;10531:18;;-1:-1:-1;;11715:20:1;;;11833:236;11847:7;11844:1;11841:14;11833:236;;;11936:19;;;11930:26;11915:42;;12028:27;;;;11996:1;11984:14;;;;11863:19;;11833:236;;;11837:3;12097:6;12088:7;12085:19;12082:201;;;12158:19;;;12152:26;-1:-1:-1;;12241:1:1;12237:14;;;12253:3;12233:24;12229:37;12225:42;12210:58;12195:74;;12082:201;-1:-1:-1;;;;;12329:1:1;12313:14;;;12309:22;12296:36;;-1:-1:-1;11254:1345:1:o;14284:496::-;14463:3;14501:6;14495:13;14517:66;14576:6;14571:3;14564:4;14556:6;14552:17;14517:66;:::i;:::-;14646:13;;14605:16;;;;14668:70;14646:13;14605:16;14715:4;14703:17;;14668:70;:::i;:::-;14754:20;;14284:496;-1:-1:-1;;;;14284:496:1:o;14785:489::-;-1:-1:-1;;;;;15054:15:1;;;15036:34;;15106:15;;15101:2;15086:18;;15079:43;15153:2;15138:18;;15131:34;;;15201:3;15196:2;15181:18;;15174:31;;;14979:4;;15222:46;;15248:19;;15240:6;15222:46;:::i;:::-;15214:54;14785:489;-1:-1:-1;;;;;;14785:489:1:o;15279:249::-;15348:6;15401:2;15389:9;15380:7;15376:23;15372:32;15369:52;;;15417:1;15414;15407:12;15369:52;15449:9;15443:16;15468:30;15492:5;15468:30;:::i

Swarm Source

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