ETH Price: $2,526.54 (+0.13%)

Token

Pixel Danson (PD)
 

Overview

Max Total Supply

888 PD

Holders

617

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 PD
0x5F678A9B803C2c8e7616308F265f5Adf555d43C7
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
PixelDanson

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-01-12
*/

/**
 ██▓███   ██▓▒██   ██▒▓█████  ██▓                         
▓██░  ██▒▓██▒▒▒ █ █ ▒░▓█   ▀ ▓██▒                         
▓██░ ██▓▒▒██▒░░  █   ░▒███   ▒██░                         
▒██▄█▓▒ ▒░██░ ░ █ █ ▒ ▒▓█  ▄ ▒██░                         
▒██▒ ░  ░░██░▒██▒ ▒██▒░▒████▒░██████▒                     
▒▓▒░ ░  ░░▓  ▒▒ ░ ░▓ ░░░ ▒░ ░░ ▒░▓  ░                     
░▒ ░      ▒ ░░░   ░▒ ░ ░ ░  ░░ ░ ▒  ░                     
░░        ▒ ░ ░    ░     ░     ░ ░                        
          ░   ░    ░     ░  ░    ░  ░                     
                                                          
▓█████▄  ▄▄▄       ███▄    █   ██████  ▒█████   ███▄    █ 
▒██▀ ██▌▒████▄     ██ ▀█   █ ▒██    ▒ ▒██▒  ██▒ ██ ▀█   █ 
░██   █▌▒██  ▀█▄  ▓██  ▀█ ██▒░ ▓██▄   ▒██░  ██▒▓██  ▀█ ██▒
░▓█▄   ▌░██▄▄▄▄██ ▓██▒  ▐▌██▒  ▒   ██▒▒██   ██░▓██▒  ▐▌██▒
░▒████▓  ▓█   ▓██▒▒██░   ▓██░▒██████▒▒░ ████▓▒░▒██░   ▓██░
 ▒▒▓  ▒  ▒▒   ▓▒█░░ ▒░   ▒ ▒ ▒ ▒▓▒ ▒ ░░ ▒░▒░▒░ ░ ▒░   ▒ ▒ 
 ░ ▒  ▒   ▒   ▒▒ ░░ ░░   ░ ▒░░ ░▒  ░ ░  ░ ▒ ▒░ ░ ░░   ░ ▒░
 ░ ░  ░   ░   ▒      ░   ░ ░ ░  ░  ░  ░ ░ ░ ▒     ░   ░ ░ 
   ░          ░  ░         ░       ░      ░ ░           ░ 
 ░ 
https://twitter.com/PixelDanson
 */

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.7;

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

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


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


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

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

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

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);
    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

contract PixelDanson is ERC721A, DefaultOperatorFilterer {
    mapping(uint256 => uint256) blockFree;

    mapping(address => bool) minted;

    uint256 public maxSupply = 888;

    uint256 public maxPerTx = 8;    

    uint256 public price = 0.0025 ether;

    uint256 public royalty = 50;

    bool pause;

    function mint(uint256 amount) payable public {
        require(totalSupply() + amount <= maxSupply);
        require(amount <= maxPerTx);
        _mint(amount);
    }

    string uri = "ipfs://bafybeidb7aaope3v73h3tuh2vn3e2ivfxmk3u2gehw4sxfbim6axep3c4i/";
    function setUri(string memory _uri) external onlyOwner {
        uri = _uri;
    }

    address owner;
    modifier onlyOwner {
        require(owner == msg.sender);
        _;
    }
    
    constructor() ERC721A("Pixel Danson", "PD") {
        owner = msg.sender;
    }

    function _mint(uint256 amount) internal {
        require(msg.sender == tx.origin);
        if (msg.value == 0) {
            uint256 freeNum = (maxSupply - totalSupply()) / 12;
            require(blockFree[block.number] + 1 <= freeNum);
            blockFree[block.number] += 1;
            _safeMint(msg.sender, 1);
            return;
        }
        require(msg.value >= amount * price);
        _safeMint(msg.sender, amount);
    }

    function reserve(uint16 _mintAmount, address _receiver) external onlyOwner {
        uint16 totalSupply = uint16(totalSupply());
        require(totalSupply + _mintAmount <= maxSupply, "Exceeds max supply.");
        _safeMint(_receiver , _mintAmount);
    }

    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual returns (address, uint256) {
        uint256 royaltyAmount = (_salePrice * royalty) / 1000;
        return (owner, royaltyAmount);
    }

    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        return string(abi.encodePacked(uri, _toString(tokenId), ".json"));
    }

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

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

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

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

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPerTx","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":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"_mintAmount","type":"uint16"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"reserve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"royalty","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052610378600a556008600b556608e1bc9bf04000600c556032600d55604051806080016040528060438152602001620035de60439139600f9081620000499190620005d4565b503480156200005757600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600c81526020017f506978656c2044616e736f6e00000000000000000000000000000000000000008152506040518060400160405280600281526020017f50440000000000000000000000000000000000000000000000000000000000008152508160029081620000ec9190620005d4565b508060039081620000fe9190620005d4565b506200010f6200035560201b60201c565b600081905550505060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200030c578015620001d2576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b81526004016200019892919062000700565b600060405180830381600087803b158015620001b357600080fd5b505af1158015620001c8573d6000803e3d6000fd5b505050506200030b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146200028c576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200025292919062000700565b600060405180830381600087803b1580156200026d57600080fd5b505af115801562000282573d6000803e3d6000fd5b505050506200030a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002d591906200072d565b600060405180830381600087803b158015620002f057600080fd5b505af115801562000305573d6000803e3d6000fd5b505050505b5b5b505033601060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506200074a565b600090565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003dc57607f821691505b602082108103620003f257620003f162000394565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200045c7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200041d565b6200046886836200041d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004b5620004af620004a98462000480565b6200048a565b62000480565b9050919050565b6000819050919050565b620004d18362000494565b620004e9620004e082620004bc565b8484546200042a565b825550505050565b600090565b62000500620004f1565b6200050d818484620004c6565b505050565b5b81811015620005355762000529600082620004f6565b60018101905062000513565b5050565b601f82111562000584576200054e81620003f8565b62000559846200040d565b8101602085101562000569578190505b6200058162000578856200040d565b83018262000512565b50505b505050565b600082821c905092915050565b6000620005a96000198460080262000589565b1980831691505092915050565b6000620005c4838362000596565b9150826002028217905092915050565b620005df826200035a565b67ffffffffffffffff811115620005fb57620005fa62000365565b5b620006078254620003c3565b6200061482828562000539565b600060209050601f8311600181146200064c576000841562000637578287015190505b620006438582620005b6565b865550620006b3565b601f1984166200065c86620003f8565b60005b8281101562000686578489015182556001820191506020850194506020810190506200065f565b86831015620006a65784890151620006a2601f89168262000596565b8355505b6001600288020188555050505b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620006e882620006bb565b9050919050565b620006fa81620006db565b82525050565b6000604082019050620007176000830185620006ef565b620007266020830184620006ef565b9392505050565b6000602082019050620007446000830184620006ef565b92915050565b612e84806200075a6000396000f3fe60806040526004361061014b5760003560e01c806370a08231116100b6578063b88d4fde1161006f578063b88d4fde1461045d578063bad0ba6f14610479578063c87b56dd146104a2578063d5abeb01146104df578063e985e9c51461050a578063f968adbe146105475761014b565b806370a082311461035c57806395d89b41146103995780639b642de1146103c4578063a035b1fe146103ed578063a0712d6814610418578063a22cb465146104345761014b565b806329ee566c1161010857806329ee566c146102585780632a55205a146102835780633ccfd60b146102c157806341f43434146102d857806342842e0e146103035780636352211e1461031f5761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021157806323b872dd1461023c575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190611f82565b610572565b6040516101849190611fca565b60405180910390f35b34801561019957600080fd5b506101a2610604565b6040516101af9190612075565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da91906120cd565b610696565b6040516101ec919061213b565b60405180910390f35b61020f600480360381019061020a9190612182565b610715565b005b34801561021d57600080fd5b5061022661081f565b60405161023391906121d1565b60405180910390f35b610256600480360381019061025191906121ec565b610836565b005b34801561026457600080fd5b5061026d610986565b60405161027a91906121d1565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a5919061223f565b61098c565b6040516102b892919061227f565b60405180910390f35b3480156102cd57600080fd5b506102d66109de565b005b3480156102e457600080fd5b506102ed610a81565b6040516102fa9190612307565b60405180910390f35b61031d600480360381019061031891906121ec565b610a93565b005b34801561032b57600080fd5b50610346600480360381019061034191906120cd565b610be3565b604051610353919061213b565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e9190612322565b610bf5565b60405161039091906121d1565b60405180910390f35b3480156103a557600080fd5b506103ae610cad565b6040516103bb9190612075565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190612484565b610d3f565b005b3480156103f957600080fd5b50610402610dac565b60405161040f91906121d1565b60405180910390f35b610432600480360381019061042d91906120cd565b610db2565b005b34801561044057600080fd5b5061045b600480360381019061045691906124f9565b610dee565b005b610477600480360381019061047291906125da565b610ef8565b005b34801561048557600080fd5b506104a0600480360381019061049b9190612697565b61104b565b005b3480156104ae57600080fd5b506104c960048036038101906104c491906120cd565b611118565b6040516104d69190612075565b60405180910390f35b3480156104eb57600080fd5b506104f461114c565b60405161050191906121d1565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906126d7565b611152565b60405161053e9190611fca565b60405180910390f35b34801561055357600080fd5b5061055c6111e6565b60405161056991906121d1565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105cd57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105fd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461061390612746565b80601f016020809104026020016040519081016040528092919081815260200182805461063f90612746565b801561068c5780601f106106615761010080835404028352916020019161068c565b820191906000526020600020905b81548152906001019060200180831161066f57829003601f168201915b5050505050905090565b60006106a1826111ec565b6106d7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610810576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161078d929190612777565b602060405180830381865afa1580156107aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ce91906127b5565b61080f57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610806919061213b565b60405180910390fd5b5b61081a838361124b565b505050565b600061082961138f565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610974573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108a8576108a3848484611394565b610980565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016108f1929190612777565b602060405180830381865afa15801561090e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093291906127b5565b61097357336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161096a919061213b565b60405180910390fd5b5b61097f848484611394565b5b50505050565b600d5481565b60008060006103e8600d54856109a29190612811565b6109ac9190612882565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a3857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610a7e573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610bd1573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b0557610b008484846116b6565b610bdd565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610b4e929190612777565b602060405180830381865afa158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f91906127b5565b610bd057336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610bc7919061213b565b60405180910390fd5b5b610bdc8484846116b6565b5b50505050565b6000610bee826116d6565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c5c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b606060038054610cbc90612746565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce890612746565b8015610d355780601f10610d0a57610100808354040283529160200191610d35565b820191906000526020600020905b815481529060010190602001808311610d1857829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d9957600080fd5b80600f9081610da89190612a55565b5050565b600c5481565b600a5481610dbe61081f565b610dc89190612b27565b1115610dd357600080fd5b600b54811115610de257600080fd5b610deb816117a2565b50565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610ee9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610e66929190612777565b602060405180830381865afa158015610e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea791906127b5565b610ee857806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610edf919061213b565b60405180910390fd5b5b610ef38383611897565b505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611037573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f6b57610f66858585856119a2565b611044565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610fb4929190612777565b602060405180830381865afa158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff591906127b5565b61103657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161102d919061213b565b60405180910390fd5b5b611043858585856119a2565b5b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110a557600080fd5b60006110af61081f565b9050600a5483826110c09190612b5b565b61ffff161115611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc90612bdd565b60405180910390fd5b611113828461ffff16611a15565b505050565b6060600f61112583611a33565b604051602001611136929190612d08565b6040516020818303038152906040529050919050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b6000816111f761138f565b11158015611206575060005482105b8015611244575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600061125682610be3565b90508073ffffffffffffffffffffffffffffffffffffffff16611277611a83565b73ffffffffffffffffffffffffffffffffffffffff16146112da576112a38161129e611a83565b611152565b6112d9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061139f826116d6565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611406576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061141284611a8b565b915091506114288187611423611a83565b611ab2565b6114745761143d86611438611a83565b611152565b611473576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114da576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114e78686866001611af6565b80156114f257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506115c08561159c888887611afc565b7c020000000000000000000000000000000000000000000000000000000017611b24565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036116465760006001850190506000600460008381526020019081526020016000205403611644576000548114611643578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116ae8686866001611b4f565b505050505050565b6116d183838360405180602001604052806000815250610ef8565b505050565b600080829050806116e561138f565b1161176b5760005481101561176a5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611768575b6000810361175e576004600083600190039350838152602001908152602001600020549050611734565b809250505061179d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117da57600080fd5b6000340361186f576000600c6117ee61081f565b600a546117fb9190612d37565b6118059190612882565b905080600160086000438152602001908152602001600020546118289190612b27565b111561183357600080fd5b60016008600043815260200190815260200160002060008282546118579190612b27565b92505081905550611869336001611a15565b50611894565b600c548161187d9190612811565b34101561188957600080fd5b6118933382611a15565b5b50565b80600760006118a4611a83565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611951611a83565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119969190611fca565b60405180910390a35050565b6119ad848484610836565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a0f576119d884848484611b55565b611a0e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611a2f828260405180602001604052806000815250611ca5565b5050565b606060a060405101806040526020810391506000825281835b600115611a6e57600184039350600a81066030018453600a8104905080611a4c575b50828103602084039350808452505050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611b13868684611d42565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b7b611a83565b8786866040518563ffffffff1660e01b8152600401611b9d9493929190612dc0565b6020604051808303816000875af1925050508015611bd957506040513d601f19601f82011682018060405250810190611bd69190612e21565b60015b611c52573d8060008114611c09576040519150601f19603f3d011682016040523d82523d6000602084013e611c0e565b606091505b506000815103611c4a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b611caf8383611d4b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d3d57600080549050600083820390505b611cef6000868380600101945086611b55565b611d25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611cdc578160005414611d3a57600080fd5b50505b505050565b60009392505050565b60008054905060008203611d8b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d986000848385611af6565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611e0f83611e006000866000611afc565b611e0985611f06565b17611b24565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611eb057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611e75565b5060008203611eeb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611f016000848385611b4f565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f5f81611f2a565b8114611f6a57600080fd5b50565b600081359050611f7c81611f56565b92915050565b600060208284031215611f9857611f97611f20565b5b6000611fa684828501611f6d565b91505092915050565b60008115159050919050565b611fc481611faf565b82525050565b6000602082019050611fdf6000830184611fbb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561201f578082015181840152602081019050612004565b60008484015250505050565b6000601f19601f8301169050919050565b600061204782611fe5565b6120518185611ff0565b9350612061818560208601612001565b61206a8161202b565b840191505092915050565b6000602082019050818103600083015261208f818461203c565b905092915050565b6000819050919050565b6120aa81612097565b81146120b557600080fd5b50565b6000813590506120c7816120a1565b92915050565b6000602082840312156120e3576120e2611f20565b5b60006120f1848285016120b8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612125826120fa565b9050919050565b6121358161211a565b82525050565b6000602082019050612150600083018461212c565b92915050565b61215f8161211a565b811461216a57600080fd5b50565b60008135905061217c81612156565b92915050565b6000806040838503121561219957612198611f20565b5b60006121a78582860161216d565b92505060206121b8858286016120b8565b9150509250929050565b6121cb81612097565b82525050565b60006020820190506121e660008301846121c2565b92915050565b60008060006060848603121561220557612204611f20565b5b60006122138682870161216d565b93505060206122248682870161216d565b9250506040612235868287016120b8565b9150509250925092565b6000806040838503121561225657612255611f20565b5b6000612264858286016120b8565b9250506020612275858286016120b8565b9150509250929050565b6000604082019050612294600083018561212c565b6122a160208301846121c2565b9392505050565b6000819050919050565b60006122cd6122c86122c3846120fa565b6122a8565b6120fa565b9050919050565b60006122df826122b2565b9050919050565b60006122f1826122d4565b9050919050565b612301816122e6565b82525050565b600060208201905061231c60008301846122f8565b92915050565b60006020828403121561233857612337611f20565b5b60006123468482850161216d565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123918261202b565b810181811067ffffffffffffffff821117156123b0576123af612359565b5b80604052505050565b60006123c3611f16565b90506123cf8282612388565b919050565b600067ffffffffffffffff8211156123ef576123ee612359565b5b6123f88261202b565b9050602081019050919050565b82818337600083830152505050565b6000612427612422846123d4565b6123b9565b90508281526020810184848401111561244357612442612354565b5b61244e848285612405565b509392505050565b600082601f83011261246b5761246a61234f565b5b813561247b848260208601612414565b91505092915050565b60006020828403121561249a57612499611f20565b5b600082013567ffffffffffffffff8111156124b8576124b7611f25565b5b6124c484828501612456565b91505092915050565b6124d681611faf565b81146124e157600080fd5b50565b6000813590506124f3816124cd565b92915050565b600080604083850312156125105761250f611f20565b5b600061251e8582860161216d565b925050602061252f858286016124e4565b9150509250929050565b600067ffffffffffffffff82111561255457612553612359565b5b61255d8261202b565b9050602081019050919050565b600061257d61257884612539565b6123b9565b90508281526020810184848401111561259957612598612354565b5b6125a4848285612405565b509392505050565b600082601f8301126125c1576125c061234f565b5b81356125d184826020860161256a565b91505092915050565b600080600080608085870312156125f4576125f3611f20565b5b60006126028782880161216d565b94505060206126138782880161216d565b9350506040612624878288016120b8565b925050606085013567ffffffffffffffff81111561264557612644611f25565b5b612651878288016125ac565b91505092959194509250565b600061ffff82169050919050565b6126748161265d565b811461267f57600080fd5b50565b6000813590506126918161266b565b92915050565b600080604083850312156126ae576126ad611f20565b5b60006126bc85828601612682565b92505060206126cd8582860161216d565b9150509250929050565b600080604083850312156126ee576126ed611f20565b5b60006126fc8582860161216d565b925050602061270d8582860161216d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061275e57607f821691505b60208210810361277157612770612717565b5b50919050565b600060408201905061278c600083018561212c565b612799602083018461212c565b9392505050565b6000815190506127af816124cd565b92915050565b6000602082840312156127cb576127ca611f20565b5b60006127d9848285016127a0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061281c82612097565b915061282783612097565b925082820261283581612097565b9150828204841483151761284c5761284b6127e2565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061288d82612097565b915061289883612097565b9250826128a8576128a7612853565b5b828204905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128d8565b61291f86836128d8565b95508019841693508086168417925050509392505050565b600061295261294d61294884612097565b6122a8565b612097565b9050919050565b6000819050919050565b61296c83612937565b61298061297882612959565b8484546128e5565b825550505050565b600090565b612995612988565b6129a0818484612963565b505050565b5b818110156129c4576129b960008261298d565b6001810190506129a6565b5050565b601f821115612a09576129da816128b3565b6129e3846128c8565b810160208510156129f2578190505b612a066129fe856128c8565b8301826129a5565b50505b505050565b600082821c905092915050565b6000612a2c60001984600802612a0e565b1980831691505092915050565b6000612a458383612a1b565b9150826002028217905092915050565b612a5e82611fe5565b67ffffffffffffffff811115612a7757612a76612359565b5b612a818254612746565b612a8c8282856129c8565b600060209050601f831160018114612abf5760008415612aad578287015190505b612ab78582612a39565b865550612b1f565b601f198416612acd866128b3565b60005b82811015612af557848901518255600182019150602085019450602081019050612ad0565b86831015612b125784890151612b0e601f891682612a1b565b8355505b6001600288020188555050505b505050505050565b6000612b3282612097565b9150612b3d83612097565b9250828201905080821115612b5557612b546127e2565b5b92915050565b6000612b668261265d565b9150612b718361265d565b9250828201905061ffff811115612b8b57612b8a6127e2565b5b92915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b6000612bc7601383611ff0565b9150612bd282612b91565b602082019050919050565b60006020820190508181036000830152612bf681612bba565b9050919050565b600081905092915050565b60008154612c1581612746565b612c1f8186612bfd565b94506001821660008114612c3a5760018114612c4f57612c82565b60ff1983168652811515820286019350612c82565b612c58856128b3565b60005b83811015612c7a57815481890152600182019150602081019050612c5b565b838801955050505b50505092915050565b6000612c9682611fe5565b612ca08185612bfd565b9350612cb0818560208601612001565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612cf2600583612bfd565b9150612cfd82612cbc565b600582019050919050565b6000612d148285612c08565b9150612d208284612c8b565b9150612d2b82612ce5565b91508190509392505050565b6000612d4282612097565b9150612d4d83612097565b9250828203905081811115612d6557612d646127e2565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000612d9282612d6b565b612d9c8185612d76565b9350612dac818560208601612001565b612db58161202b565b840191505092915050565b6000608082019050612dd5600083018761212c565b612de2602083018661212c565b612def60408301856121c2565b8181036060830152612e018184612d87565b905095945050505050565b600081519050612e1b81611f56565b92915050565b600060208284031215612e3757612e36611f20565b5b6000612e4584828501612e0c565b9150509291505056fea26469706673582212203b40a0e03cd3ed3950963516a6dc6e7c99798e5cb2285dec2d2b0d511893967264736f6c63430008110033697066733a2f2f6261667962656964623761616f706533763733683374756832766e336532697666786d6b337532676568773473786662696d3661786570336334692f

Deployed Bytecode

0x60806040526004361061014b5760003560e01c806370a08231116100b6578063b88d4fde1161006f578063b88d4fde1461045d578063bad0ba6f14610479578063c87b56dd146104a2578063d5abeb01146104df578063e985e9c51461050a578063f968adbe146105475761014b565b806370a082311461035c57806395d89b41146103995780639b642de1146103c4578063a035b1fe146103ed578063a0712d6814610418578063a22cb465146104345761014b565b806329ee566c1161010857806329ee566c146102585780632a55205a146102835780633ccfd60b146102c157806341f43434146102d857806342842e0e146103035780636352211e1461031f5761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021157806323b872dd1461023c575b600080fd5b34801561015c57600080fd5b5061017760048036038101906101729190611f82565b610572565b6040516101849190611fca565b60405180910390f35b34801561019957600080fd5b506101a2610604565b6040516101af9190612075565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da91906120cd565b610696565b6040516101ec919061213b565b60405180910390f35b61020f600480360381019061020a9190612182565b610715565b005b34801561021d57600080fd5b5061022661081f565b60405161023391906121d1565b60405180910390f35b610256600480360381019061025191906121ec565b610836565b005b34801561026457600080fd5b5061026d610986565b60405161027a91906121d1565b60405180910390f35b34801561028f57600080fd5b506102aa60048036038101906102a5919061223f565b61098c565b6040516102b892919061227f565b60405180910390f35b3480156102cd57600080fd5b506102d66109de565b005b3480156102e457600080fd5b506102ed610a81565b6040516102fa9190612307565b60405180910390f35b61031d600480360381019061031891906121ec565b610a93565b005b34801561032b57600080fd5b50610346600480360381019061034191906120cd565b610be3565b604051610353919061213b565b60405180910390f35b34801561036857600080fd5b50610383600480360381019061037e9190612322565b610bf5565b60405161039091906121d1565b60405180910390f35b3480156103a557600080fd5b506103ae610cad565b6040516103bb9190612075565b60405180910390f35b3480156103d057600080fd5b506103eb60048036038101906103e69190612484565b610d3f565b005b3480156103f957600080fd5b50610402610dac565b60405161040f91906121d1565b60405180910390f35b610432600480360381019061042d91906120cd565b610db2565b005b34801561044057600080fd5b5061045b600480360381019061045691906124f9565b610dee565b005b610477600480360381019061047291906125da565b610ef8565b005b34801561048557600080fd5b506104a0600480360381019061049b9190612697565b61104b565b005b3480156104ae57600080fd5b506104c960048036038101906104c491906120cd565b611118565b6040516104d69190612075565b60405180910390f35b3480156104eb57600080fd5b506104f461114c565b60405161050191906121d1565b60405180910390f35b34801561051657600080fd5b50610531600480360381019061052c91906126d7565b611152565b60405161053e9190611fca565b60405180910390f35b34801561055357600080fd5b5061055c6111e6565b60405161056991906121d1565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105cd57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105fd5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461061390612746565b80601f016020809104026020016040519081016040528092919081815260200182805461063f90612746565b801561068c5780601f106106615761010080835404028352916020019161068c565b820191906000526020600020905b81548152906001019060200180831161066f57829003601f168201915b5050505050905090565b60006106a1826111ec565b6106d7576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610810576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b815260040161078d929190612777565b602060405180830381865afa1580156107aa573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906107ce91906127b5565b61080f57806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610806919061213b565b60405180910390fd5b5b61081a838361124b565b505050565b600061082961138f565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610974573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036108a8576108a3848484611394565b610980565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016108f1929190612777565b602060405180830381865afa15801561090e573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061093291906127b5565b61097357336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161096a919061213b565b60405180910390fd5b5b61097f848484611394565b5b50505050565b600d5481565b60008060006103e8600d54856109a29190612811565b6109ac9190612882565b9050601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff168192509250509250929050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610a3857600080fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610a7e573d6000803e3d6000fd5b50565b6daaeb6d7670e522a718067333cd4e81565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610bd1573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610b0557610b008484846116b6565b610bdd565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610b4e929190612777565b602060405180830381865afa158015610b6b573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b8f91906127b5565b610bd057336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610bc7919061213b565b60405180910390fd5b5b610bdc8484846116b6565b5b50505050565b6000610bee826116d6565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610c5c576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b606060038054610cbc90612746565b80601f0160208091040260200160405190810160405280929190818152602001828054610ce890612746565b8015610d355780601f10610d0a57610100808354040283529160200191610d35565b820191906000526020600020905b815481529060010190602001808311610d1857829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610d9957600080fd5b80600f9081610da89190612a55565b5050565b600c5481565b600a5481610dbe61081f565b610dc89190612b27565b1115610dd357600080fd5b600b54811115610de257600080fd5b610deb816117a2565b50565b8160006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610ee9576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610e66929190612777565b602060405180830381865afa158015610e83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ea791906127b5565b610ee857806040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610edf919061213b565b60405180910390fd5b5b610ef38383611897565b505050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611037573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f6b57610f66858585856119a2565b611044565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610fb4929190612777565b602060405180830381865afa158015610fd1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ff591906127b5565b61103657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161102d919061213b565b60405180910390fd5b5b611043858585856119a2565b5b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16601060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110a557600080fd5b60006110af61081f565b9050600a5483826110c09190612b5b565b61ffff161115611105576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110fc90612bdd565b60405180910390fd5b611113828461ffff16611a15565b505050565b6060600f61112583611a33565b604051602001611136929190612d08565b6040516020818303038152906040529050919050565b600a5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b5481565b6000816111f761138f565b11158015611206575060005482105b8015611244575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600061125682610be3565b90508073ffffffffffffffffffffffffffffffffffffffff16611277611a83565b73ffffffffffffffffffffffffffffffffffffffff16146112da576112a38161129e611a83565b611152565b6112d9576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b600061139f826116d6565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611406576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061141284611a8b565b915091506114288187611423611a83565b611ab2565b6114745761143d86611438611a83565b611152565b611473576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036114da576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6114e78686866001611af6565b80156114f257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506115c08561159c888887611afc565b7c020000000000000000000000000000000000000000000000000000000017611b24565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036116465760006001850190506000600460008381526020019081526020016000205403611644576000548114611643578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46116ae8686866001611b4f565b505050505050565b6116d183838360405180602001604052806000815250610ef8565b505050565b600080829050806116e561138f565b1161176b5760005481101561176a5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611768575b6000810361175e576004600083600190039350838152602001908152602001600020549050611734565b809250505061179d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146117da57600080fd5b6000340361186f576000600c6117ee61081f565b600a546117fb9190612d37565b6118059190612882565b905080600160086000438152602001908152602001600020546118289190612b27565b111561183357600080fd5b60016008600043815260200190815260200160002060008282546118579190612b27565b92505081905550611869336001611a15565b50611894565b600c548161187d9190612811565b34101561188957600080fd5b6118933382611a15565b5b50565b80600760006118a4611a83565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611951611a83565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516119969190611fca565b60405180910390a35050565b6119ad848484610836565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611a0f576119d884848484611b55565b611a0e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611a2f828260405180602001604052806000815250611ca5565b5050565b606060a060405101806040526020810391506000825281835b600115611a6e57600184039350600a81066030018453600a8104905080611a4c575b50828103602084039350808452505050919050565b600033905090565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8611b13868684611d42565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611b7b611a83565b8786866040518563ffffffff1660e01b8152600401611b9d9493929190612dc0565b6020604051808303816000875af1925050508015611bd957506040513d601f19601f82011682018060405250810190611bd69190612e21565b60015b611c52573d8060008114611c09576040519150601f19603f3d011682016040523d82523d6000602084013e611c0e565b606091505b506000815103611c4a576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b611caf8383611d4b565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611d3d57600080549050600083820390505b611cef6000868380600101945086611b55565b611d25576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611cdc578160005414611d3a57600080fd5b50505b505050565b60009392505050565b60008054905060008203611d8b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d986000848385611af6565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611e0f83611e006000866000611afc565b611e0985611f06565b17611b24565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611eb057808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611e75565b5060008203611eeb576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611f016000848385611b4f565b505050565b60006001821460e11b9050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b611f5f81611f2a565b8114611f6a57600080fd5b50565b600081359050611f7c81611f56565b92915050565b600060208284031215611f9857611f97611f20565b5b6000611fa684828501611f6d565b91505092915050565b60008115159050919050565b611fc481611faf565b82525050565b6000602082019050611fdf6000830184611fbb565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561201f578082015181840152602081019050612004565b60008484015250505050565b6000601f19601f8301169050919050565b600061204782611fe5565b6120518185611ff0565b9350612061818560208601612001565b61206a8161202b565b840191505092915050565b6000602082019050818103600083015261208f818461203c565b905092915050565b6000819050919050565b6120aa81612097565b81146120b557600080fd5b50565b6000813590506120c7816120a1565b92915050565b6000602082840312156120e3576120e2611f20565b5b60006120f1848285016120b8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612125826120fa565b9050919050565b6121358161211a565b82525050565b6000602082019050612150600083018461212c565b92915050565b61215f8161211a565b811461216a57600080fd5b50565b60008135905061217c81612156565b92915050565b6000806040838503121561219957612198611f20565b5b60006121a78582860161216d565b92505060206121b8858286016120b8565b9150509250929050565b6121cb81612097565b82525050565b60006020820190506121e660008301846121c2565b92915050565b60008060006060848603121561220557612204611f20565b5b60006122138682870161216d565b93505060206122248682870161216d565b9250506040612235868287016120b8565b9150509250925092565b6000806040838503121561225657612255611f20565b5b6000612264858286016120b8565b9250506020612275858286016120b8565b9150509250929050565b6000604082019050612294600083018561212c565b6122a160208301846121c2565b9392505050565b6000819050919050565b60006122cd6122c86122c3846120fa565b6122a8565b6120fa565b9050919050565b60006122df826122b2565b9050919050565b60006122f1826122d4565b9050919050565b612301816122e6565b82525050565b600060208201905061231c60008301846122f8565b92915050565b60006020828403121561233857612337611f20565b5b60006123468482850161216d565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6123918261202b565b810181811067ffffffffffffffff821117156123b0576123af612359565b5b80604052505050565b60006123c3611f16565b90506123cf8282612388565b919050565b600067ffffffffffffffff8211156123ef576123ee612359565b5b6123f88261202b565b9050602081019050919050565b82818337600083830152505050565b6000612427612422846123d4565b6123b9565b90508281526020810184848401111561244357612442612354565b5b61244e848285612405565b509392505050565b600082601f83011261246b5761246a61234f565b5b813561247b848260208601612414565b91505092915050565b60006020828403121561249a57612499611f20565b5b600082013567ffffffffffffffff8111156124b8576124b7611f25565b5b6124c484828501612456565b91505092915050565b6124d681611faf565b81146124e157600080fd5b50565b6000813590506124f3816124cd565b92915050565b600080604083850312156125105761250f611f20565b5b600061251e8582860161216d565b925050602061252f858286016124e4565b9150509250929050565b600067ffffffffffffffff82111561255457612553612359565b5b61255d8261202b565b9050602081019050919050565b600061257d61257884612539565b6123b9565b90508281526020810184848401111561259957612598612354565b5b6125a4848285612405565b509392505050565b600082601f8301126125c1576125c061234f565b5b81356125d184826020860161256a565b91505092915050565b600080600080608085870312156125f4576125f3611f20565b5b60006126028782880161216d565b94505060206126138782880161216d565b9350506040612624878288016120b8565b925050606085013567ffffffffffffffff81111561264557612644611f25565b5b612651878288016125ac565b91505092959194509250565b600061ffff82169050919050565b6126748161265d565b811461267f57600080fd5b50565b6000813590506126918161266b565b92915050565b600080604083850312156126ae576126ad611f20565b5b60006126bc85828601612682565b92505060206126cd8582860161216d565b9150509250929050565b600080604083850312156126ee576126ed611f20565b5b60006126fc8582860161216d565b925050602061270d8582860161216d565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061275e57607f821691505b60208210810361277157612770612717565b5b50919050565b600060408201905061278c600083018561212c565b612799602083018461212c565b9392505050565b6000815190506127af816124cd565b92915050565b6000602082840312156127cb576127ca611f20565b5b60006127d9848285016127a0565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061281c82612097565b915061282783612097565b925082820261283581612097565b9150828204841483151761284c5761284b6127e2565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061288d82612097565b915061289883612097565b9250826128a8576128a7612853565b5b828204905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026129157fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826128d8565b61291f86836128d8565b95508019841693508086168417925050509392505050565b600061295261294d61294884612097565b6122a8565b612097565b9050919050565b6000819050919050565b61296c83612937565b61298061297882612959565b8484546128e5565b825550505050565b600090565b612995612988565b6129a0818484612963565b505050565b5b818110156129c4576129b960008261298d565b6001810190506129a6565b5050565b601f821115612a09576129da816128b3565b6129e3846128c8565b810160208510156129f2578190505b612a066129fe856128c8565b8301826129a5565b50505b505050565b600082821c905092915050565b6000612a2c60001984600802612a0e565b1980831691505092915050565b6000612a458383612a1b565b9150826002028217905092915050565b612a5e82611fe5565b67ffffffffffffffff811115612a7757612a76612359565b5b612a818254612746565b612a8c8282856129c8565b600060209050601f831160018114612abf5760008415612aad578287015190505b612ab78582612a39565b865550612b1f565b601f198416612acd866128b3565b60005b82811015612af557848901518255600182019150602085019450602081019050612ad0565b86831015612b125784890151612b0e601f891682612a1b565b8355505b6001600288020188555050505b505050505050565b6000612b3282612097565b9150612b3d83612097565b9250828201905080821115612b5557612b546127e2565b5b92915050565b6000612b668261265d565b9150612b718361265d565b9250828201905061ffff811115612b8b57612b8a6127e2565b5b92915050565b7f45786365656473206d617820737570706c792e00000000000000000000000000600082015250565b6000612bc7601383611ff0565b9150612bd282612b91565b602082019050919050565b60006020820190508181036000830152612bf681612bba565b9050919050565b600081905092915050565b60008154612c1581612746565b612c1f8186612bfd565b94506001821660008114612c3a5760018114612c4f57612c82565b60ff1983168652811515820286019350612c82565b612c58856128b3565b60005b83811015612c7a57815481890152600182019150602081019050612c5b565b838801955050505b50505092915050565b6000612c9682611fe5565b612ca08185612bfd565b9350612cb0818560208601612001565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000612cf2600583612bfd565b9150612cfd82612cbc565b600582019050919050565b6000612d148285612c08565b9150612d208284612c8b565b9150612d2b82612ce5565b91508190509392505050565b6000612d4282612097565b9150612d4d83612097565b9250828203905081811115612d6557612d646127e2565b5b92915050565b600081519050919050565b600082825260208201905092915050565b6000612d9282612d6b565b612d9c8185612d76565b9350612dac818560208601612001565b612db58161202b565b840191505092915050565b6000608082019050612dd5600083018761212c565b612de2602083018661212c565b612def60408301856121c2565b8181036060830152612e018184612d87565b905095945050505050565b600081519050612e1b81611f56565b92915050565b600060208284031215612e3757612e36611f20565b5b6000612e4584828501612e0c565b9150509291505056fea26469706673582212203b40a0e03cd3ed3950963516a6dc6e7c99798e5cb2285dec2d2b0d511893967264736f6c63430008110033

Deployed Bytecode Sourcemap

59198:3100:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20798:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21700:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28191:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61511:165;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17451:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61684:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59471:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60812:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;61210:109;;;;;;;;;;;;;:::i;:::-;;56567:143;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61863:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23093:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18635:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21876:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59793:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59427:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59526:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61327:176;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62050:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60542:262;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61038:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59348:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29140:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59387:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20798:639;20883:4;21222:10;21207:25;;:11;:25;;;;:102;;;;21299:10;21284:25;;:11;:25;;;;21207:102;:179;;;;21376:10;21361:25;;:11;:25;;;;21207:179;21187:199;;20798:639;;;:::o;21700:100::-;21754:13;21787:5;21780:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21700:100;:::o;28191:218::-;28267:7;28292:16;28300:7;28292;:16::i;:::-;28287:64;;28317:34;;;;;;;;;;;;;;28287:64;28371:15;:24;28387:7;28371:24;;;;;;;;;;;:30;;;;;;;;;;;;28364:37;;28191:218;;;:::o;61511:165::-;61615:8;58609:1;56667:42;58561:45;;;:49;58557:225;;;56667:42;58632;;;58683:4;58690:8;58632:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58627:144;;58746:8;58727:28;;;;;;;;;;;:::i;:::-;;;;;;;;58627:144;58557:225;61636:32:::1;61650:8;61660:7;61636:13;:32::i;:::-;61511:165:::0;;;:::o;17451:323::-;17512:7;17740:15;:13;:15::i;:::-;17725:12;;17709:13;;:28;:46;17702:53;;17451:323;:::o;61684:171::-;61793:4;57863:1;56667:42;57815:45;;;:49;57811:539;;;58104:10;58096:18;;:4;:18;;;58092:85;;61810:37:::1;61829:4;61835:2;61839:7;61810:18;:37::i;:::-;58155:7:::0;;58092:85;56667:42;58196;;;58247:4;58254:10;58196:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58191:148;;58312:10;58293:30;;;;;;;;;;;:::i;:::-;;;;;;;;58191:148;57811:539;61810:37:::1;61829:4;61835:2;61839:7;61810:18;:37::i;:::-;61684:171:::0;;;;;:::o;59471:27::-;;;;:::o;60812:218::-;60900:7;60909;60929:21;60978:4;60967:7;;60954:10;:20;;;;:::i;:::-;60953:29;;;;:::i;:::-;60929:53;;61001:5;;;;;;;;;;;61008:13;60993:29;;;;;60812:218;;;;;:::o;61210:109::-;59952:10;59943:19;;:5;;;;;;;;;;;:19;;;59935:28;;;;;;61268:10:::1;61260:28;;:51;61289:21;61260:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;61210:109::o:0;56567:143::-;56667:42;56567:143;:::o;61863:179::-;61976:4;57863:1;56667:42;57815:45;;;:49;57811:539;;;58104:10;58096:18;;:4;:18;;;58092:85;;61993:41:::1;62016:4;62022:2;62026:7;61993:22;:41::i;:::-;58155:7:::0;;58092:85;56667:42;58196;;;58247:4;58254:10;58196:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58191:148;;58312:10;58293:30;;;;;;;;;;;:::i;:::-;;;;;;;;58191:148;57811:539;61993:41:::1;62016:4;62022:2;62026:7;61993:22;:41::i;:::-;61863:179:::0;;;;;:::o;23093:152::-;23165:7;23208:27;23227:7;23208:18;:27::i;:::-;23185:52;;23093:152;;;:::o;18635:233::-;18707:7;18748:1;18731:19;;:5;:19;;;18727:60;;18759:28;;;;;;;;;;;;;;18727:60;12794:13;18805:18;:25;18824:5;18805:25;;;;;;;;;;;;;;;;:55;18798:62;;18635:233;;;:::o;21876:104::-;21932:13;21965:7;21958:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21876:104;:::o;59793:84::-;59952:10;59943:19;;:5;;;;;;;;;;;:19;;;59935:28;;;;;;59865:4:::1;59859:3;:10;;;;;;:::i;:::-;;59793:84:::0;:::o;59427:35::-;;;;:::o;59526:170::-;59616:9;;59606:6;59590:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;59582:44;;;;;;59655:8;;59645:6;:18;;59637:27;;;;;;59675:13;59681:6;59675:5;:13::i;:::-;59526:170;:::o;61327:176::-;61431:8;58609:1;56667:42;58561:45;;;:49;58557:225;;;56667:42;58632;;;58683:4;58690:8;58632:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58627:144;;58746:8;58727:28;;;;;;;;;;;:::i;:::-;;;;;;;;58627:144;58557:225;61452:43:::1;61476:8;61486;61452:23;:43::i;:::-;61327:176:::0;;;:::o;62050:245::-;62218:4;57863:1;56667:42;57815:45;;;:49;57811:539;;;58104:10;58096:18;;:4;:18;;;58092:85;;62240:47:::1;62263:4;62269:2;62273:7;62282:4;62240:22;:47::i;:::-;58155:7:::0;;58092:85;56667:42;58196;;;58247:4;58254:10;58196:69;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58191:148;;58312:10;58293:30;;;;;;;;;;;:::i;:::-;;;;;;;;58191:148;57811:539;62240:47:::1;62263:4;62269:2;62273:7;62282:4;62240:22;:47::i;:::-;62050:245:::0;;;;;;:::o;60542:262::-;59952:10;59943:19;;:5;;;;;;;;;;;:19;;;59935:28;;;;;;60628:18:::1;60656:13;:11;:13::i;:::-;60628:42;;60718:9;;60703:11;60689;:25;;;;:::i;:::-;:38;;;;60681:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;60762:34;60772:9;60784:11;60762:34;;:9;:34::i;:::-;60617:187;60542:262:::0;;:::o;61038:164::-;61103:13;61160:3;61165:18;61175:7;61165:9;:18::i;:::-;61143:50;;;;;;;;;:::i;:::-;;;;;;;;;;;;;61129:65;;61038:164;;;:::o;59348:30::-;;;;:::o;29140:164::-;29237:4;29261:18;:25;29280:5;29261:25;;;;;;;;;;;;;;;:35;29287:8;29261:35;;;;;;;;;;;;;;;;;;;;;;;;;29254:42;;29140:164;;;;:::o;59387:27::-;;;;:::o;29562:282::-;29627:4;29683:7;29664:15;:13;:15::i;:::-;:26;;:66;;;;;29717:13;;29707:7;:23;29664:66;:153;;;;;29816:1;13570:8;29768:17;:26;29786:7;29768:26;;;;;;;;;;;;:44;:49;29664:153;29644:173;;29562:282;;;:::o;27624:408::-;27713:13;27729:16;27737:7;27729;:16::i;:::-;27713:32;;27785:5;27762:28;;:19;:17;:19::i;:::-;:28;;;27758:175;;27810:44;27827:5;27834:19;:17;:19::i;:::-;27810:16;:44::i;:::-;27805:128;;27882:35;;;;;;;;;;;;;;27805:128;27758:175;27978:2;27945:15;:24;27961:7;27945:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;28016:7;28012:2;27996:28;;28005:5;27996:28;;;;;;;;;;;;27702:330;27624:408;;:::o;16967:92::-;17023:7;16967:92;:::o;31830:2825::-;31972:27;32002;32021:7;32002:18;:27::i;:::-;31972:57;;32087:4;32046:45;;32062:19;32046:45;;;32042:86;;32100:28;;;;;;;;;;;;;;32042:86;32142:27;32171:23;32198:35;32225:7;32198:26;:35::i;:::-;32141:92;;;;32333:68;32358:15;32375:4;32381:19;:17;:19::i;:::-;32333:24;:68::i;:::-;32328:180;;32421:43;32438:4;32444:19;:17;:19::i;:::-;32421:16;:43::i;:::-;32416:92;;32473:35;;;;;;;;;;;;;;32416:92;32328:180;32539:1;32525:16;;:2;:16;;;32521:52;;32550:23;;;;;;;;;;;;;;32521:52;32586:43;32608:4;32614:2;32618:7;32627:1;32586:21;:43::i;:::-;32722:15;32719:160;;;32862:1;32841:19;32834:30;32719:160;33259:18;:24;33278:4;33259:24;;;;;;;;;;;;;;;;33257:26;;;;;;;;;;;;33328:18;:22;33347:2;33328:22;;;;;;;;;;;;;;;;33326:24;;;;;;;;;;;33650:146;33687:2;33736:45;33751:4;33757:2;33761:19;33736:14;:45::i;:::-;13850:8;33708:73;33650:18;:146::i;:::-;33621:17;:26;33639:7;33621:26;;;;;;;;;;;:175;;;;33967:1;13850:8;33916:19;:47;:52;33912:627;;33989:19;34021:1;34011:7;:11;33989:33;;34178:1;34144:17;:30;34162:11;34144:30;;;;;;;;;;;;:35;34140:384;;34282:13;;34267:11;:28;34263:242;;34462:19;34429:17;:30;34447:11;34429:30;;;;;;;;;;;:52;;;;34263:242;34140:384;33970:569;33912:627;34586:7;34582:2;34567:27;;34576:4;34567:27;;;;;;;;;;;;34605:42;34626:4;34632:2;34636:7;34645:1;34605:20;:42::i;:::-;31961:2694;;;31830:2825;;;:::o;34751:193::-;34897:39;34914:4;34920:2;34924:7;34897:39;;;;;;;;;;;;:16;:39::i;:::-;34751:193;;;:::o;24248:1275::-;24315:7;24335:12;24350:7;24335:22;;24418:4;24399:15;:13;:15::i;:::-;:23;24395:1061;;24452:13;;24445:4;:20;24441:1015;;;24490:14;24507:17;:23;24525:4;24507:23;;;;;;;;;;;;24490:40;;24624:1;13570:8;24596:6;:24;:29;24592:845;;25261:113;25278:1;25268:6;:11;25261:113;;25321:17;:25;25339:6;;;;;;;25321:25;;;;;;;;;;;;25312:34;;25261:113;;;25407:6;25400:13;;;;;;24592:845;24467:989;24441:1015;24395:1061;25484:31;;;;;;;;;;;;;;24248:1275;;;;:::o;60084:450::-;60157:9;60143:23;;:10;:23;;;60135:32;;;;;;60195:1;60182:9;:14;60178:262;;60213:15;60261:2;60244:13;:11;:13::i;:::-;60232:9;;:25;;;;:::i;:::-;60231:32;;;;:::i;:::-;60213:50;;60317:7;60312:1;60286:9;:23;60296:12;60286:23;;;;;;;;;;;;:27;;;;:::i;:::-;:38;;60278:47;;;;;;60367:1;60340:9;:23;60350:12;60340:23;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;60383:24;60393:10;60405:1;60383:9;:24::i;:::-;60422:7;;;60178:262;60480:5;;60471:6;:14;;;;:::i;:::-;60458:9;:27;;60450:36;;;;;;60497:29;60507:10;60519:6;60497:9;:29::i;:::-;60084:450;;:::o;28749:234::-;28896:8;28844:18;:39;28863:19;:17;:19::i;:::-;28844:39;;;;;;;;;;;;;;;:49;28884:8;28844:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;28956:8;28920:55;;28935:19;:17;:19::i;:::-;28920:55;;;28966:8;28920:55;;;;;;:::i;:::-;;;;;;;;28749:234;;:::o;35542:407::-;35717:31;35730:4;35736:2;35740:7;35717:12;:31::i;:::-;35781:1;35763:2;:14;;;:19;35759:183;;35802:56;35833:4;35839:2;35843:7;35852:5;35802:30;:56::i;:::-;35797:145;;35886:40;;;;;;;;;;;;;;35797:145;35759:183;35542:407;;;;:::o;45702:112::-;45779:27;45789:2;45793:8;45779:27;;;;;;;;;;;;:9;:27::i;:::-;45702:112;;:::o;52077:1745::-;52142:17;52576:4;52569;52563:11;52559:22;52668:1;52662:4;52655:15;52743:4;52740:1;52736:12;52729:19;;52825:1;52820:3;52813:14;52929:3;53168:5;53150:428;53176:1;53150:428;;;53216:1;53211:3;53207:11;53200:18;;53387:2;53381:4;53377:13;53373:2;53369:22;53364:3;53356:36;53481:2;53475:4;53471:13;53463:21;;53548:4;53150:428;53538:25;53150:428;53154:21;53617:3;53612;53608:13;53732:4;53727:3;53723:14;53716:21;;53797:6;53792:3;53785:19;52181:1634;;;52077:1745;;;:::o;51870:105::-;51930:7;51957:10;51950:17;;51870:105;:::o;30725:485::-;30827:27;30856:23;30897:38;30938:15;:24;30954:7;30938:24;;;;;;;;;;;30897:65;;31115:18;31092:41;;31172:19;31166:26;31147:45;;31077:126;30725:485;;;:::o;29953:659::-;30102:11;30267:16;30260:5;30256:28;30247:37;;30427:16;30416:9;30412:32;30399:45;;30577:15;30566:9;30563:30;30555:5;30544:9;30541:20;30538:56;30528:66;;29953:659;;;;;:::o;36611:159::-;;;;;:::o;51179:311::-;51314:7;51334:16;13974:3;51360:19;:41;;51334:68;;13974:3;51428:31;51439:4;51445:2;51449:9;51428:10;:31::i;:::-;51420:40;;:62;;51413:69;;;51179:311;;;;;:::o;26071:450::-;26151:14;26319:16;26312:5;26308:28;26299:37;;26496:5;26482:11;26457:23;26453:41;26450:52;26443:5;26440:63;26430:73;;26071:450;;;;:::o;37435:158::-;;;;;:::o;38033:716::-;38196:4;38242:2;38217:45;;;38263:19;:17;:19::i;:::-;38284:4;38290:7;38299:5;38217:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38213:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38517:1;38500:6;:13;:18;38496:235;;38546:40;;;;;;;;;;;;;;38496:235;38689:6;38683:13;38674:6;38670:2;38666:15;38659:38;38213:529;38386:54;;;38376:64;;;:6;:64;;;;38369:71;;;38033:716;;;;;;:::o;44929:689::-;45060:19;45066:2;45070:8;45060:5;:19::i;:::-;45139:1;45121:2;:14;;;:19;45117:483;;45161:11;45175:13;;45161:27;;45207:13;45229:8;45223:3;:14;45207:30;;45256:233;45287:62;45326:1;45330:2;45334:7;;;;;;45343:5;45287:30;:62::i;:::-;45282:167;;45385:40;;;;;;;;;;;;;;45282:167;45484:3;45476:5;:11;45256:233;;45571:3;45554:13;;:20;45550:34;;45576:8;;;45550:34;45142:458;;45117:483;44929:689;;;:::o;50880:147::-;51017:6;50880:147;;;;;:::o;39211:2966::-;39284:20;39307:13;;39284:36;;39347:1;39335:8;:13;39331:44;;39357:18;;;;;;;;;;;;;;39331:44;39388:61;39418:1;39422:2;39426:12;39440:8;39388:21;:61::i;:::-;39932:1;12932:2;39902:1;:26;;39901:32;39889:8;:45;39863:18;:22;39882:2;39863:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;40211:139;40248:2;40302:33;40325:1;40329:2;40333:1;40302:14;:33::i;:::-;40269:30;40290:8;40269:20;:30::i;:::-;:66;40211:18;:139::i;:::-;40177:17;:31;40195:12;40177:31;;;;;;;;;;;:173;;;;40367:16;40398:11;40427:8;40412:12;:23;40398:37;;40948:16;40944:2;40940:25;40928:37;;41320:12;41280:8;41239:1;41177:25;41118:1;41057;41030:335;41691:1;41677:12;41673:20;41631:346;41732:3;41723:7;41720:16;41631:346;;41950:7;41940:8;41937:1;41910:25;41907:1;41904;41899:59;41785:1;41776:7;41772:15;41761:26;;41631:346;;;41635:77;42022:1;42010:8;:13;42006:45;;42032:19;;;;;;;;;;;;;;42006:45;42084:3;42068:13;:19;;;;39637:2462;;42109:60;42138:1;42142:2;42146:12;42160:8;42109:20;:60::i;:::-;39273:2904;39211:2966;;:::o;26623:324::-;26693:14;26926:1;26916:8;26913:15;26887:24;26883:46;26873:56;;26623:324;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:474::-;5935:6;5943;5992:2;5980:9;5971:7;5967:23;5963:32;5960:119;;;5998:79;;:::i;:::-;5960:119;6118:1;6143:53;6188:7;6179:6;6168:9;6164:22;6143:53;:::i;:::-;6133:63;;6089:117;6245:2;6271:53;6316:7;6307:6;6296:9;6292:22;6271:53;:::i;:::-;6261:63;;6216:118;5867:474;;;;;:::o;6347:332::-;6468:4;6506:2;6495:9;6491:18;6483:26;;6519:71;6587:1;6576:9;6572:17;6563:6;6519:71;:::i;:::-;6600:72;6668:2;6657:9;6653:18;6644:6;6600:72;:::i;:::-;6347:332;;;;;:::o;6685:60::-;6713:3;6734:5;6727:12;;6685:60;;;:::o;6751:142::-;6801:9;6834:53;6852:34;6861:24;6879:5;6861:24;:::i;:::-;6852:34;:::i;:::-;6834:53;:::i;:::-;6821:66;;6751:142;;;:::o;6899:126::-;6949:9;6982:37;7013:5;6982:37;:::i;:::-;6969:50;;6899:126;;;:::o;7031:158::-;7113:9;7146:37;7177:5;7146:37;:::i;:::-;7133:50;;7031:158;;;:::o;7195:195::-;7314:69;7377:5;7314:69;:::i;:::-;7309:3;7302:82;7195:195;;:::o;7396:286::-;7521:4;7559:2;7548:9;7544:18;7536:26;;7572:103;7672:1;7661:9;7657:17;7648:6;7572:103;:::i;:::-;7396:286;;;;:::o;7688:329::-;7747:6;7796:2;7784:9;7775:7;7771:23;7767:32;7764:119;;;7802:79;;:::i;:::-;7764:119;7922:1;7947:53;7992:7;7983:6;7972:9;7968:22;7947:53;:::i;:::-;7937:63;;7893:117;7688:329;;;;:::o;8023:117::-;8132:1;8129;8122:12;8146:117;8255:1;8252;8245:12;8269:180;8317:77;8314:1;8307:88;8414:4;8411:1;8404:15;8438:4;8435:1;8428:15;8455:281;8538:27;8560:4;8538:27;:::i;:::-;8530:6;8526:40;8668:6;8656:10;8653:22;8632:18;8620:10;8617:34;8614:62;8611:88;;;8679:18;;:::i;:::-;8611:88;8719:10;8715:2;8708:22;8498:238;8455:281;;:::o;8742:129::-;8776:6;8803:20;;:::i;:::-;8793:30;;8832:33;8860:4;8852:6;8832:33;:::i;:::-;8742:129;;;:::o;8877:308::-;8939:4;9029:18;9021:6;9018:30;9015:56;;;9051:18;;:::i;:::-;9015:56;9089:29;9111:6;9089:29;:::i;:::-;9081:37;;9173:4;9167;9163:15;9155:23;;8877:308;;;:::o;9191:146::-;9288:6;9283:3;9278;9265:30;9329:1;9320:6;9315:3;9311:16;9304:27;9191:146;;;:::o;9343:425::-;9421:5;9446:66;9462:49;9504:6;9462:49;:::i;:::-;9446:66;:::i;:::-;9437:75;;9535:6;9528:5;9521:21;9573:4;9566:5;9562:16;9611:3;9602:6;9597:3;9593:16;9590:25;9587:112;;;9618:79;;:::i;:::-;9587:112;9708:54;9755:6;9750:3;9745;9708:54;:::i;:::-;9427:341;9343:425;;;;;:::o;9788:340::-;9844:5;9893:3;9886:4;9878:6;9874:17;9870:27;9860:122;;9901:79;;:::i;:::-;9860:122;10018:6;10005:20;10043:79;10118:3;10110:6;10103:4;10095:6;10091:17;10043:79;:::i;:::-;10034:88;;9850:278;9788:340;;;;:::o;10134:509::-;10203:6;10252:2;10240:9;10231:7;10227:23;10223:32;10220:119;;;10258:79;;:::i;:::-;10220:119;10406:1;10395:9;10391:17;10378:31;10436:18;10428:6;10425:30;10422:117;;;10458:79;;:::i;:::-;10422:117;10563:63;10618:7;10609:6;10598:9;10594:22;10563:63;:::i;:::-;10553:73;;10349:287;10134:509;;;;:::o;10649:116::-;10719:21;10734:5;10719:21;:::i;:::-;10712:5;10709:32;10699:60;;10755:1;10752;10745:12;10699:60;10649:116;:::o;10771:133::-;10814:5;10852:6;10839:20;10830:29;;10868:30;10892:5;10868:30;:::i;:::-;10771:133;;;;:::o;10910:468::-;10975:6;10983;11032:2;11020:9;11011:7;11007:23;11003:32;11000:119;;;11038:79;;:::i;:::-;11000:119;11158:1;11183:53;11228:7;11219:6;11208:9;11204:22;11183:53;:::i;:::-;11173:63;;11129:117;11285:2;11311:50;11353:7;11344:6;11333:9;11329:22;11311:50;:::i;:::-;11301:60;;11256:115;10910:468;;;;;:::o;11384:307::-;11445:4;11535:18;11527:6;11524:30;11521:56;;;11557:18;;:::i;:::-;11521:56;11595:29;11617:6;11595:29;:::i;:::-;11587:37;;11679:4;11673;11669:15;11661:23;;11384:307;;;:::o;11697:423::-;11774:5;11799:65;11815:48;11856:6;11815:48;:::i;:::-;11799:65;:::i;:::-;11790:74;;11887:6;11880:5;11873:21;11925:4;11918:5;11914:16;11963:3;11954:6;11949:3;11945:16;11942:25;11939:112;;;11970:79;;:::i;:::-;11939:112;12060:54;12107:6;12102:3;12097;12060:54;:::i;:::-;11780:340;11697:423;;;;;:::o;12139:338::-;12194:5;12243:3;12236:4;12228:6;12224:17;12220:27;12210:122;;12251:79;;:::i;:::-;12210:122;12368:6;12355:20;12393:78;12467:3;12459:6;12452:4;12444:6;12440:17;12393:78;:::i;:::-;12384:87;;12200:277;12139:338;;;;:::o;12483:943::-;12578:6;12586;12594;12602;12651:3;12639:9;12630:7;12626:23;12622:33;12619:120;;;12658:79;;:::i;:::-;12619:120;12778:1;12803:53;12848:7;12839:6;12828:9;12824:22;12803:53;:::i;:::-;12793:63;;12749:117;12905:2;12931:53;12976:7;12967:6;12956:9;12952:22;12931:53;:::i;:::-;12921:63;;12876:118;13033:2;13059:53;13104:7;13095:6;13084:9;13080:22;13059:53;:::i;:::-;13049:63;;13004:118;13189:2;13178:9;13174:18;13161:32;13220:18;13212:6;13209:30;13206:117;;;13242:79;;:::i;:::-;13206:117;13347:62;13401:7;13392:6;13381:9;13377:22;13347:62;:::i;:::-;13337:72;;13132:287;12483:943;;;;;;;:::o;13432:89::-;13468:7;13508:6;13501:5;13497:18;13486:29;;13432:89;;;:::o;13527:120::-;13599:23;13616:5;13599:23;:::i;:::-;13592:5;13589:34;13579:62;;13637:1;13634;13627:12;13579:62;13527:120;:::o;13653:137::-;13698:5;13736:6;13723:20;13714:29;;13752:32;13778:5;13752:32;:::i;:::-;13653:137;;;;:::o;13796:472::-;13863:6;13871;13920:2;13908:9;13899:7;13895:23;13891:32;13888:119;;;13926:79;;:::i;:::-;13888:119;14046:1;14071:52;14115:7;14106:6;14095:9;14091:22;14071:52;:::i;:::-;14061:62;;14017:116;14172:2;14198:53;14243:7;14234:6;14223:9;14219:22;14198:53;:::i;:::-;14188:63;;14143:118;13796:472;;;;;:::o;14274:474::-;14342:6;14350;14399:2;14387:9;14378:7;14374:23;14370:32;14367:119;;;14405:79;;:::i;:::-;14367:119;14525:1;14550:53;14595:7;14586:6;14575:9;14571:22;14550:53;:::i;:::-;14540:63;;14496:117;14652:2;14678:53;14723:7;14714:6;14703:9;14699:22;14678:53;:::i;:::-;14668:63;;14623:118;14274:474;;;;;:::o;14754:180::-;14802:77;14799:1;14792:88;14899:4;14896:1;14889:15;14923:4;14920:1;14913:15;14940:320;14984:6;15021:1;15015:4;15011:12;15001:22;;15068:1;15062:4;15058:12;15089:18;15079:81;;15145:4;15137:6;15133:17;15123:27;;15079:81;15207:2;15199:6;15196:14;15176:18;15173:38;15170:84;;15226:18;;:::i;:::-;15170:84;14991:269;14940:320;;;:::o;15266:332::-;15387:4;15425:2;15414:9;15410:18;15402:26;;15438:71;15506:1;15495:9;15491:17;15482:6;15438:71;:::i;:::-;15519:72;15587:2;15576:9;15572:18;15563:6;15519:72;:::i;:::-;15266:332;;;;;:::o;15604:137::-;15658:5;15689:6;15683:13;15674:22;;15705:30;15729:5;15705:30;:::i;:::-;15604:137;;;;:::o;15747:345::-;15814:6;15863:2;15851:9;15842:7;15838:23;15834:32;15831:119;;;15869:79;;:::i;:::-;15831:119;15989:1;16014:61;16067:7;16058:6;16047:9;16043:22;16014:61;:::i;:::-;16004:71;;15960:125;15747:345;;;;:::o;16098:180::-;16146:77;16143:1;16136:88;16243:4;16240:1;16233:15;16267:4;16264:1;16257:15;16284:410;16324:7;16347:20;16365:1;16347:20;:::i;:::-;16342:25;;16381:20;16399:1;16381:20;:::i;:::-;16376:25;;16436:1;16433;16429:9;16458:30;16476:11;16458:30;:::i;:::-;16447:41;;16637:1;16628:7;16624:15;16621:1;16618:22;16598:1;16591:9;16571:83;16548:139;;16667:18;;:::i;:::-;16548:139;16332:362;16284:410;;;;:::o;16700:180::-;16748:77;16745:1;16738:88;16845:4;16842:1;16835:15;16869:4;16866:1;16859:15;16886:185;16926:1;16943:20;16961:1;16943:20;:::i;:::-;16938:25;;16977:20;16995:1;16977:20;:::i;:::-;16972:25;;17016:1;17006:35;;17021:18;;:::i;:::-;17006:35;17063:1;17060;17056:9;17051:14;;16886:185;;;;:::o;17077:141::-;17126:4;17149:3;17141:11;;17172:3;17169:1;17162:14;17206:4;17203:1;17193:18;17185:26;;17077:141;;;:::o;17224:93::-;17261:6;17308:2;17303;17296:5;17292:14;17288:23;17278:33;;17224:93;;;:::o;17323:107::-;17367:8;17417:5;17411:4;17407:16;17386:37;;17323:107;;;;:::o;17436:393::-;17505:6;17555:1;17543:10;17539:18;17578:97;17608:66;17597:9;17578:97;:::i;:::-;17696:39;17726:8;17715:9;17696:39;:::i;:::-;17684:51;;17768:4;17764:9;17757:5;17753:21;17744:30;;17817:4;17807:8;17803:19;17796:5;17793:30;17783:40;;17512:317;;17436:393;;;;;:::o;17835:142::-;17885:9;17918:53;17936:34;17945:24;17963:5;17945:24;:::i;:::-;17936:34;:::i;:::-;17918:53;:::i;:::-;17905:66;;17835:142;;;:::o;17983:75::-;18026:3;18047:5;18040:12;;17983:75;;;:::o;18064:269::-;18174:39;18205:7;18174:39;:::i;:::-;18235:91;18284:41;18308:16;18284:41;:::i;:::-;18276:6;18269:4;18263:11;18235:91;:::i;:::-;18229:4;18222:105;18140:193;18064:269;;;:::o;18339:73::-;18384:3;18339:73;:::o;18418:189::-;18495:32;;:::i;:::-;18536:65;18594:6;18586;18580:4;18536:65;:::i;:::-;18471:136;18418:189;;:::o;18613:186::-;18673:120;18690:3;18683:5;18680:14;18673:120;;;18744:39;18781:1;18774:5;18744:39;:::i;:::-;18717:1;18710:5;18706:13;18697:22;;18673:120;;;18613:186;;:::o;18805:543::-;18906:2;18901:3;18898:11;18895:446;;;18940:38;18972:5;18940:38;:::i;:::-;19024:29;19042:10;19024:29;:::i;:::-;19014:8;19010:44;19207:2;19195:10;19192:18;19189:49;;;19228:8;19213:23;;19189:49;19251:80;19307:22;19325:3;19307:22;:::i;:::-;19297:8;19293:37;19280:11;19251:80;:::i;:::-;18910:431;;18895:446;18805:543;;;:::o;19354:117::-;19408:8;19458:5;19452:4;19448:16;19427:37;;19354:117;;;;:::o;19477:169::-;19521:6;19554:51;19602:1;19598:6;19590:5;19587:1;19583:13;19554:51;:::i;:::-;19550:56;19635:4;19629;19625:15;19615:25;;19528:118;19477:169;;;;:::o;19651:295::-;19727:4;19873:29;19898:3;19892:4;19873:29;:::i;:::-;19865:37;;19935:3;19932:1;19928:11;19922:4;19919:21;19911:29;;19651:295;;;;:::o;19951:1395::-;20068:37;20101:3;20068:37;:::i;:::-;20170:18;20162:6;20159:30;20156:56;;;20192:18;;:::i;:::-;20156:56;20236:38;20268:4;20262:11;20236:38;:::i;:::-;20321:67;20381:6;20373;20367:4;20321:67;:::i;:::-;20415:1;20439:4;20426:17;;20471:2;20463:6;20460:14;20488:1;20483:618;;;;21145:1;21162:6;21159:77;;;21211:9;21206:3;21202:19;21196:26;21187:35;;21159:77;21262:67;21322:6;21315:5;21262:67;:::i;:::-;21256:4;21249:81;21118:222;20453:887;;20483:618;20535:4;20531:9;20523:6;20519:22;20569:37;20601:4;20569:37;:::i;:::-;20628:1;20642:208;20656:7;20653:1;20650:14;20642:208;;;20735:9;20730:3;20726:19;20720:26;20712:6;20705:42;20786:1;20778:6;20774:14;20764:24;;20833:2;20822:9;20818:18;20805:31;;20679:4;20676:1;20672:12;20667:17;;20642:208;;;20878:6;20869:7;20866:19;20863:179;;;20936:9;20931:3;20927:19;20921:26;20979:48;21021:4;21013:6;21009:17;20998:9;20979:48;:::i;:::-;20971:6;20964:64;20886:156;20863:179;21088:1;21084;21076:6;21072:14;21068:22;21062:4;21055:36;20490:611;;;20453:887;;20043:1303;;;19951:1395;;:::o;21352:191::-;21392:3;21411:20;21429:1;21411:20;:::i;:::-;21406:25;;21445:20;21463:1;21445:20;:::i;:::-;21440:25;;21488:1;21485;21481:9;21474:16;;21509:3;21506:1;21503:10;21500:36;;;21516:18;;:::i;:::-;21500:36;21352:191;;;;:::o;21549:193::-;21588:3;21607:19;21624:1;21607:19;:::i;:::-;21602:24;;21640:19;21657:1;21640:19;:::i;:::-;21635:24;;21682:1;21679;21675:9;21668:16;;21705:6;21700:3;21697:15;21694:41;;;21715:18;;:::i;:::-;21694:41;21549:193;;;;:::o;21748:169::-;21888:21;21884:1;21876:6;21872:14;21865:45;21748:169;:::o;21923:366::-;22065:3;22086:67;22150:2;22145:3;22086:67;:::i;:::-;22079:74;;22162:93;22251:3;22162:93;:::i;:::-;22280:2;22275:3;22271:12;22264:19;;21923:366;;;:::o;22295:419::-;22461:4;22499:2;22488:9;22484:18;22476:26;;22548:9;22542:4;22538:20;22534:1;22523:9;22519:17;22512:47;22576:131;22702:4;22576:131;:::i;:::-;22568:139;;22295:419;;;:::o;22720:148::-;22822:11;22859:3;22844:18;;22720:148;;;;:::o;22898:874::-;23001:3;23038:5;23032:12;23067:36;23093:9;23067:36;:::i;:::-;23119:89;23201:6;23196:3;23119:89;:::i;:::-;23112:96;;23239:1;23228:9;23224:17;23255:1;23250:166;;;;23430:1;23425:341;;;;23217:549;;23250:166;23334:4;23330:9;23319;23315:25;23310:3;23303:38;23396:6;23389:14;23382:22;23374:6;23370:35;23365:3;23361:45;23354:52;;23250:166;;23425:341;23492:38;23524:5;23492:38;:::i;:::-;23552:1;23566:154;23580:6;23577:1;23574:13;23566:154;;;23654:7;23648:14;23644:1;23639:3;23635:11;23628:35;23704:1;23695:7;23691:15;23680:26;;23602:4;23599:1;23595:12;23590:17;;23566:154;;;23749:6;23744:3;23740:16;23733:23;;23432:334;;23217:549;;23005:767;;22898:874;;;;:::o;23778:390::-;23884:3;23912:39;23945:5;23912:39;:::i;:::-;23967:89;24049:6;24044:3;23967:89;:::i;:::-;23960:96;;24065:65;24123:6;24118:3;24111:4;24104:5;24100:16;24065:65;:::i;:::-;24155:6;24150:3;24146:16;24139:23;;23888:280;23778:390;;;;:::o;24174:155::-;24314:7;24310:1;24302:6;24298:14;24291:31;24174:155;:::o;24335:400::-;24495:3;24516:84;24598:1;24593:3;24516:84;:::i;:::-;24509:91;;24609:93;24698:3;24609:93;:::i;:::-;24727:1;24722:3;24718:11;24711:18;;24335:400;;;:::o;24741:695::-;25019:3;25041:92;25129:3;25120:6;25041:92;:::i;:::-;25034:99;;25150:95;25241:3;25232:6;25150:95;:::i;:::-;25143:102;;25262:148;25406:3;25262:148;:::i;:::-;25255:155;;25427:3;25420:10;;24741:695;;;;;:::o;25442:194::-;25482:4;25502:20;25520:1;25502:20;:::i;:::-;25497:25;;25536:20;25554:1;25536:20;:::i;:::-;25531:25;;25580:1;25577;25573:9;25565:17;;25604:1;25598:4;25595:11;25592:37;;;25609:18;;:::i;:::-;25592:37;25442:194;;;;:::o;25642:98::-;25693:6;25727:5;25721:12;25711:22;;25642:98;;;:::o;25746:168::-;25829:11;25863:6;25858:3;25851:19;25903:4;25898:3;25894:14;25879:29;;25746:168;;;;:::o;25920:373::-;26006:3;26034:38;26066:5;26034:38;:::i;:::-;26088:70;26151:6;26146:3;26088:70;:::i;:::-;26081:77;;26167:65;26225:6;26220:3;26213:4;26206:5;26202:16;26167:65;:::i;:::-;26257:29;26279:6;26257:29;:::i;:::-;26252:3;26248:39;26241:46;;26010:283;25920:373;;;;:::o;26299:640::-;26494:4;26532:3;26521:9;26517:19;26509:27;;26546:71;26614:1;26603:9;26599:17;26590:6;26546:71;:::i;:::-;26627:72;26695:2;26684:9;26680:18;26671:6;26627:72;:::i;:::-;26709;26777:2;26766:9;26762:18;26753:6;26709:72;:::i;:::-;26828:9;26822:4;26818:20;26813:2;26802:9;26798:18;26791:48;26856:76;26927:4;26918:6;26856:76;:::i;:::-;26848:84;;26299:640;;;;;;;:::o;26945:141::-;27001:5;27032:6;27026:13;27017:22;;27048:32;27074:5;27048:32;:::i;:::-;26945:141;;;;:::o;27092:349::-;27161:6;27210:2;27198:9;27189:7;27185:23;27181:32;27178:119;;;27216:79;;:::i;:::-;27178:119;27336:1;27361:63;27416:7;27407:6;27396:9;27392:22;27361:63;:::i;:::-;27351:73;;27307:127;27092:349;;;;:::o

Swarm Source

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