ETH Price: $3,301.21 (-3.24%)
Gas: 20 Gwei

Token

CryptoRats (CRATS)
 

Overview

Max Total Supply

1,975 CRATS

Holders

248

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 CRATS
0x1fea38a6fd621a7e4e78d83e24252673df603a10
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:
CryptoRats

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-30
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

/**
 * @dev Provides information about the current execution context, including the
 * sender of the transaction and its data. While these are generally available
 * via msg.sender and msg.data, they should not be accessed in such a direct
 * manner, since when dealing with meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        return msg.data;
    }
}


// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Strings.sol


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

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

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

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

// File: erc721a/contracts/IERC721A.sol


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

pragma solidity ^0.8.4;

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

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

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

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

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

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

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the
     * zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

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

    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);

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

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


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

pragma solidity ^0.8.4;


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

/**
 * @title ERC721A
 *
 * @dev Implementation of the [ERC721](https://eips.ethereum.org/EIPS/eip-721)
 * Non-Fungible Token Standard, including the Metadata extension.
 * Optimized for lower gas during batch mints.
 *
 * Token IDs are minted in sequential order (e.g. 0, 1, 2, 3, ...)
 * starting from `_startTokenId()`.
 *
 * Assumptions:
 *
 * - An owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 * - The maximum token ID cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Reference type for token approval.
    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 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 {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _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]`.
        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 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 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 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.
            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`.
                )

                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 0x80 bytes to keep the free memory pointer 32-byte word aliged.
            // We will need 1 32-byte word to store the length,
            // and 3 32-byte words to store a maximum of 78 digits. Total: 0x20 + 3 * 0x20 = 0x80.
            str := add(mload(0x40), 0x80)
            // Update the free memory pointer to allocate.
            mstore(0x40, str)

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

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

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

// File: contracts/cryptorats.sol

pragma solidity ^0.8.4;

contract CryptoRats is ERC721A, Ownable {

    using Strings for uint256;

    string public baseURI = "https://bafybeig4iqszroepctq57zamq7lli5awj73uvu5ezttnmaat7sixrgiswq.ipfs.w3s.link/json/";

    uint256 public price = 0.001 ether;
    uint256 public maxPerTx = 10;
    uint256 public maxSupply = 2222;

    uint256 public maxFreePerWallet = 1;
    uint256 public totalFreeMinted = 0;
    uint256 public maxFreeSupply = 1111;

    mapping(address => uint256) public _mintedFreeAmount;

    constructor() ERC721A("CryptoRats", "CRATS") {}

    function mint(uint256 _amount) external payable {

        require(msg.value >= _amount * price, "Incorrect amount of ETH.");
        require(totalSupply() + _amount <= maxSupply, "Sold out.");
        require(tx.origin == msg.sender, "Only humans please.");
        require(_amount <= maxPerTx, "You may only mint a max of 10 per transaction");

        _mint(msg.sender, _amount);
    }

    function freeMint(uint256 _amount) external payable {
        require(_mintedFreeAmount[msg.sender] + _amount <= maxFreePerWallet, "You have minted the max free amount allowed per wallet.");
		require(totalFreeMinted + _amount <= maxFreeSupply, "Cannot exceed Free supply." );
        require(totalSupply() + _amount <= maxSupply, "Sold out.");

        _mintedFreeAmount[msg.sender]++;
        totalFreeMinted++;
        _safeMint(msg.sender, _amount);
	}

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

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

    function setPrice(uint256 _price) external onlyOwner {
        price = _price;
    }

    function setMaxPerTx(uint256 _amount) external onlyOwner {
        maxPerTx = _amount;
    }

    function setmaxFreeSupply(uint256 _newMaxFreeSupply) public onlyOwner {
        require(_newMaxFreeSupply <= maxSupply);
        maxFreeSupply = _newMaxFreeSupply;
    }

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

    function withdraw() external onlyOwner {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","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":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"_mintedFreeAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"payable","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":"maxFreePerWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxFreeSupply","type":"uint256"}],"name":"setmaxFreeSupply","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":"totalFreeMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052604051806080016040528060578152602001620034b86057913960099080519060200190620000359291906200021d565b5066038d7ea4c68000600a55600a600b556108ae600c556001600d556000600e55610457600f553480156200006957600080fd5b506040518060400160405280600a81526020017f43727970746f52617473000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f43524154530000000000000000000000000000000000000000000000000000008152508160029080519060200190620000ee9291906200021d565b508060039080519060200190620001079291906200021d565b50620001186200014660201b60201c565b600081905550505062000140620001346200014f60201b60201c565b6200015760201b60201c565b62000332565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200022b90620002cd565b90600052602060002090601f0160209004810192826200024f57600085556200029b565b82601f106200026a57805160ff19168380011785556200029b565b828001600101855582156200029b579182015b828111156200029a5782518255916020019190600101906200027d565b5b509050620002aa9190620002ae565b5090565b5b80821115620002c9576000816000905550600101620002af565b5090565b60006002820490506001821680620002e657607f821691505b60208210811415620002fd57620002fc62000303565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61317680620003426000396000f3fe6080604052600436106101e35760003560e01c806391b7f5ed11610102578063c6f6f21611610095578063e985e9c511610064578063e985e9c51461069e578063f2fde38b146106db578063f4db2acb14610704578063f968adbe14610741576101e3565b8063c6f6f216146105e2578063c87b56dd1461060b578063d5abeb0114610648578063dad7b5c914610673576101e3565b8063a22cb465116100d1578063a22cb4651461053c578063a702735714610565578063b88d4fde14610590578063bde12d73146105b9576101e3565b806391b7f5ed146104a157806395d89b41146104ca578063a035b1fe146104f5578063a0712d6814610520576101e3565b8063475133341161017a57806370a082311161014957806370a0823114610406578063715018a6146104435780637c928fe91461045a5780638da5cb5b14610476576101e3565b8063475133341461034a57806355f804b3146103755780636352211e1461039e5780636c0360eb146103db576101e3565b806318160ddd116101b657806318160ddd146102b657806323b872dd146102e15780633ccfd60b1461030a57806342842e0e14610321576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612401565b61076c565b60405161021c9190612873565b60405180910390f35b34801561023157600080fd5b5061023a6107fe565b604051610247919061288e565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906124a8565b610890565b604051610284919061280c565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af91906123c1565b61090f565b005b3480156102c257600080fd5b506102cb610a53565b6040516102d891906129f0565b60405180910390f35b3480156102ed57600080fd5b50610308600480360381019061030391906122ab565b610a6a565b005b34801561031657600080fd5b5061031f610d8f565b005b34801561032d57600080fd5b50610348600480360381019061034391906122ab565b610e46565b005b34801561035657600080fd5b5061035f610e66565b60405161036c91906129f0565b60405180910390f35b34801561038157600080fd5b5061039c6004803603810190610397919061245b565b610e6c565b005b3480156103aa57600080fd5b506103c560048036038101906103c091906124a8565b610e8a565b6040516103d2919061280c565b60405180910390f35b3480156103e757600080fd5b506103f0610e9c565b6040516103fd919061288e565b60405180910390f35b34801561041257600080fd5b5061042d6004803603810190610428919061223e565b610f2a565b60405161043a91906129f0565b60405180910390f35b34801561044f57600080fd5b50610458610fe3565b005b610474600480360381019061046f91906124a8565b610ff7565b005b34801561048257600080fd5b5061048b6111a9565b604051610498919061280c565b60405180910390f35b3480156104ad57600080fd5b506104c860048036038101906104c391906124a8565b6111d3565b005b3480156104d657600080fd5b506104df6111e5565b6040516104ec919061288e565b60405180910390f35b34801561050157600080fd5b5061050a611277565b60405161051791906129f0565b60405180910390f35b61053a600480360381019061053591906124a8565b61127d565b005b34801561054857600080fd5b50610563600480360381019061055e9190612381565b6113e4565b005b34801561057157600080fd5b5061057a61155c565b60405161058791906129f0565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b291906122fe565b611562565b005b3480156105c557600080fd5b506105e060048036038101906105db91906124a8565b6115d5565b005b3480156105ee57600080fd5b50610609600480360381019061060491906124a8565b6115f6565b005b34801561061757600080fd5b50610632600480360381019061062d91906124a8565b611608565b60405161063f919061288e565b60405180910390f35b34801561065457600080fd5b5061065d611684565b60405161066a91906129f0565b60405180910390f35b34801561067f57600080fd5b5061068861168a565b60405161069591906129f0565b60405180910390f35b3480156106aa57600080fd5b506106c560048036038101906106c0919061226b565b611690565b6040516106d29190612873565b60405180910390f35b3480156106e757600080fd5b5061070260048036038101906106fd919061223e565b611724565b005b34801561071057600080fd5b5061072b6004803603810190610726919061223e565b6117a8565b60405161073891906129f0565b60405180910390f35b34801561074d57600080fd5b506107566117c0565b60405161076391906129f0565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107c757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107f75750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461080d90612c8f565b80601f016020809104026020016040519081016040528092919081815260200182805461083990612c8f565b80156108865780601f1061085b57610100808354040283529160200191610886565b820191906000526020600020905b81548152906001019060200180831161086957829003601f168201915b5050505050905090565b600061089b826117c6565b6108d1576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061091a82610e8a565b90508073ffffffffffffffffffffffffffffffffffffffff1661093b611825565b73ffffffffffffffffffffffffffffffffffffffff161461099e5761096781610962611825565b611690565b61099d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a5d61182d565b6001546000540303905090565b6000610a7582611836565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610adc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ae884611904565b91509150610afe8187610af9611825565b61192b565b610b4a57610b1386610b0e611825565b611690565b610b49576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610bb1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bbe868686600161196f565b8015610bc957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610c9785610c73888887611975565b7c02000000000000000000000000000000000000000000000000000000001761199d565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d1f576000600185019050600060046000838152602001908152602001600020541415610d1d576000548114610d1c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610d8786868660016119c8565b505050505050565b610d976119ce565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610dbd906127f7565b60006040518083038185875af1925050503d8060008114610dfa576040519150601f19603f3d011682016040523d82523d6000602084013e610dff565b606091505b5050905080610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a906129b0565b60405180910390fd5b50565b610e6183838360405180602001604052806000815250611562565b505050565b600f5481565b610e746119ce565b818160099190610e8592919061206c565b505050565b6000610e9582611836565b9050919050565b60098054610ea990612c8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed590612c8f565b8015610f225780601f10610ef757610100808354040283529160200191610f22565b820191906000526020600020905b815481529060010190602001808311610f0557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f92576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610feb6119ce565b610ff56000611a4c565b565b600d5481601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110459190612ac4565b1115611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d906128f0565b60405180910390fd5b600f5481600e546110979190612ac4565b11156110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf90612910565b60405180910390fd5b600c54816110e4610a53565b6110ee9190612ac4565b111561112f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611126906129d0565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061117f90612cf2565b9190505550600e600081548092919061119790612cf2565b91905055506111a63382611b12565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111db6119ce565b80600a8190555050565b6060600380546111f490612c8f565b80601f016020809104026020016040519081016040528092919081815260200182805461122090612c8f565b801561126d5780601f106112425761010080835404028352916020019161126d565b820191906000526020600020905b81548152906001019060200180831161125057829003601f168201915b5050505050905090565b600a5481565b600a548161128b9190612b4b565b3410156112cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c4906128b0565b60405180910390fd5b600c54816112d9610a53565b6112e39190612ac4565b1115611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b906129d0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138990612930565b60405180910390fd5b600b548111156113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce90612990565b60405180910390fd5b6113e13382611b30565b50565b6113ec611825565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611451576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061145e611825565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661150b611825565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115509190612873565b60405180910390a35050565b600d5481565b61156d848484610a6a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115cf5761159884848484611ced565b6115ce576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6115dd6119ce565b600c548111156115ec57600080fd5b80600f8190555050565b6115fe6119ce565b80600b8190555050565b6060611613826117c6565b611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990612970565b60405180910390fd5b600961165d83611e4d565b60405160200161166e9291906127c8565b6040516020818303038152906040529050919050565b600c5481565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61172c6119ce565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561179c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611793906128d0565b60405180910390fd5b6117a581611a4c565b50565b60106020528060005260406000206000915090505481565b600b5481565b6000816117d161182d565b111580156117e0575060005482105b801561181e575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061184561182d565b116118cd576000548110156118cc5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156118ca575b60008114156118c0576004600083600190039350838152602001908152602001600020549050611895565b80925050506118ff565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861198c868684611fae565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6119d6611fb7565b73ffffffffffffffffffffffffffffffffffffffff166119f46111a9565b73ffffffffffffffffffffffffffffffffffffffff1614611a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4190612950565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611b2c828260405180602001604052806000815250611fbf565b5050565b6000805490506000821415611b71576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7e600084838561196f565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611bf583611be66000866000611975565b611bef8561205c565b1761199d565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611c9657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611c5b565b506000821415611cd2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611ce860008483856119c8565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d13611825565b8786866040518563ffffffff1660e01b8152600401611d359493929190612827565b602060405180830381600087803b158015611d4f57600080fd5b505af1925050508015611d8057506040513d601f19601f82011682018060405250810190611d7d919061242e565b60015b611dfa573d8060008114611db0576040519150601f19603f3d011682016040523d82523d6000602084013e611db5565b606091505b50600081511415611df2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415611e95576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fa9565b600082905060005b60008214611ec7578080611eb090612cf2565b915050600a82611ec09190612b1a565b9150611e9d565b60008167ffffffffffffffff811115611ee357611ee2612e28565b5b6040519080825280601f01601f191660200182016040528015611f155781602001600182028036833780820191505090505b5090505b60008514611fa257600182611f2e9190612ba5565b9150600a85611f3d9190612d3b565b6030611f499190612ac4565b60f81b818381518110611f5f57611f5e612df9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f9b9190612b1a565b9450611f19565b8093505050505b919050565b60009392505050565b600033905090565b611fc98383611b30565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461205757600080549050600083820390505b6120096000868380600101945086611ced565b61203f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611ff657816000541461205457600080fd5b50505b505050565b60006001821460e11b9050919050565b82805461207890612c8f565b90600052602060002090601f01602090048101928261209a57600085556120e1565b82601f106120b357803560ff19168380011785556120e1565b828001600101855582156120e1579182015b828111156120e05782358255916020019190600101906120c5565b5b5090506120ee91906120f2565b5090565b5b8082111561210b5760008160009055506001016120f3565b5090565b600061212261211d84612a30565b612a0b565b90508281526020810184848401111561213e5761213d612e66565b5b612149848285612c4d565b509392505050565b600081359050612160816130e4565b92915050565b600081359050612175816130fb565b92915050565b60008135905061218a81613112565b92915050565b60008151905061219f81613112565b92915050565b600082601f8301126121ba576121b9612e5c565b5b81356121ca84826020860161210f565b91505092915050565b60008083601f8401126121e9576121e8612e5c565b5b8235905067ffffffffffffffff81111561220657612205612e57565b5b60208301915083600182028301111561222257612221612e61565b5b9250929050565b60008135905061223881613129565b92915050565b60006020828403121561225457612253612e70565b5b600061226284828501612151565b91505092915050565b6000806040838503121561228257612281612e70565b5b600061229085828601612151565b92505060206122a185828601612151565b9150509250929050565b6000806000606084860312156122c4576122c3612e70565b5b60006122d286828701612151565b93505060206122e386828701612151565b92505060406122f486828701612229565b9150509250925092565b6000806000806080858703121561231857612317612e70565b5b600061232687828801612151565b945050602061233787828801612151565b935050604061234887828801612229565b925050606085013567ffffffffffffffff81111561236957612368612e6b565b5b612375878288016121a5565b91505092959194509250565b6000806040838503121561239857612397612e70565b5b60006123a685828601612151565b92505060206123b785828601612166565b9150509250929050565b600080604083850312156123d8576123d7612e70565b5b60006123e685828601612151565b92505060206123f785828601612229565b9150509250929050565b60006020828403121561241757612416612e70565b5b60006124258482850161217b565b91505092915050565b60006020828403121561244457612443612e70565b5b600061245284828501612190565b91505092915050565b6000806020838503121561247257612471612e70565b5b600083013567ffffffffffffffff8111156124905761248f612e6b565b5b61249c858286016121d3565b92509250509250929050565b6000602082840312156124be576124bd612e70565b5b60006124cc84828501612229565b91505092915050565b6124de81612bd9565b82525050565b6124ed81612beb565b82525050565b60006124fe82612a76565b6125088185612a8c565b9350612518818560208601612c5c565b61252181612e75565b840191505092915050565b600061253782612a81565b6125418185612aa8565b9350612551818560208601612c5c565b61255a81612e75565b840191505092915050565b600061257082612a81565b61257a8185612ab9565b935061258a818560208601612c5c565b80840191505092915050565b600081546125a381612c8f565b6125ad8186612ab9565b945060018216600081146125c857600181146125d95761260c565b60ff1983168652818601935061260c565b6125e285612a61565b60005b83811015612604578154818901526001820191506020810190506125e5565b838801955050505b50505092915050565b6000612622601883612aa8565b915061262d82612e86565b602082019050919050565b6000612645602683612aa8565b915061265082612eaf565b604082019050919050565b6000612668603783612aa8565b915061267382612efe565b604082019050919050565b600061268b601a83612aa8565b915061269682612f4d565b602082019050919050565b60006126ae601383612aa8565b91506126b982612f76565b602082019050919050565b60006126d1600583612ab9565b91506126dc82612f9f565b600582019050919050565b60006126f4602083612aa8565b91506126ff82612fc8565b602082019050919050565b6000612717602f83612aa8565b915061272282612ff1565b604082019050919050565b600061273a602d83612aa8565b915061274582613040565b604082019050919050565b600061275d600083612a9d565b91506127688261308f565b600082019050919050565b6000612780601083612aa8565b915061278b82613092565b602082019050919050565b60006127a3600983612aa8565b91506127ae826130bb565b602082019050919050565b6127c281612c43565b82525050565b60006127d48285612596565b91506127e08284612565565b91506127eb826126c4565b91508190509392505050565b600061280282612750565b9150819050919050565b600060208201905061282160008301846124d5565b92915050565b600060808201905061283c60008301876124d5565b61284960208301866124d5565b61285660408301856127b9565b818103606083015261286881846124f3565b905095945050505050565b600060208201905061288860008301846124e4565b92915050565b600060208201905081810360008301526128a8818461252c565b905092915050565b600060208201905081810360008301526128c981612615565b9050919050565b600060208201905081810360008301526128e981612638565b9050919050565b600060208201905081810360008301526129098161265b565b9050919050565b600060208201905081810360008301526129298161267e565b9050919050565b60006020820190508181036000830152612949816126a1565b9050919050565b60006020820190508181036000830152612969816126e7565b9050919050565b600060208201905081810360008301526129898161270a565b9050919050565b600060208201905081810360008301526129a98161272d565b9050919050565b600060208201905081810360008301526129c981612773565b9050919050565b600060208201905081810360008301526129e981612796565b9050919050565b6000602082019050612a0560008301846127b9565b92915050565b6000612a15612a26565b9050612a218282612cc1565b919050565b6000604051905090565b600067ffffffffffffffff821115612a4b57612a4a612e28565b5b612a5482612e75565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612acf82612c43565b9150612ada83612c43565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b0f57612b0e612d6c565b5b828201905092915050565b6000612b2582612c43565b9150612b3083612c43565b925082612b4057612b3f612d9b565b5b828204905092915050565b6000612b5682612c43565b9150612b6183612c43565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b9a57612b99612d6c565b5b828202905092915050565b6000612bb082612c43565b9150612bbb83612c43565b925082821015612bce57612bcd612d6c565b5b828203905092915050565b6000612be482612c23565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612c7a578082015181840152602081019050612c5f565b83811115612c89576000848401525b50505050565b60006002820490506001821680612ca757607f821691505b60208210811415612cbb57612cba612dca565b5b50919050565b612cca82612e75565b810181811067ffffffffffffffff82111715612ce957612ce8612e28565b5b80604052505050565b6000612cfd82612c43565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612d3057612d2f612d6c565b5b600182019050919050565b6000612d4682612c43565b9150612d5183612c43565b925082612d6157612d60612d9b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f496e636f727265637420616d6f756e74206f66204554482e0000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f596f752068617665206d696e74656420746865206d6178206672656520616d6f60008201527f756e7420616c6c6f776564207065722077616c6c65742e000000000000000000602082015250565b7f43616e6e6f7420657863656564204672656520737570706c792e000000000000600082015250565b7f4f6e6c792068756d616e7320706c656173652e00000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f596f75206d6179206f6e6c79206d696e742061206d6178206f6620313020706560008201527f72207472616e73616374696f6e00000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f536f6c64206f75742e0000000000000000000000000000000000000000000000600082015250565b6130ed81612bd9565b81146130f857600080fd5b50565b61310481612beb565b811461310f57600080fd5b50565b61311b81612bf7565b811461312657600080fd5b50565b61313281612c43565b811461313d57600080fd5b5056fea2646970667358221220c614fece78b096fe4514642394d66f63999e4a1657773216c9fc053fd8db300e64736f6c6343000807003368747470733a2f2f6261667962656967346971737a726f657063747135377a616d71376c6c693561776a373375767535657a74746e6d616174377369787267697377712e697066732e7733732e6c696e6b2f6a736f6e2f

Deployed Bytecode

0x6080604052600436106101e35760003560e01c806391b7f5ed11610102578063c6f6f21611610095578063e985e9c511610064578063e985e9c51461069e578063f2fde38b146106db578063f4db2acb14610704578063f968adbe14610741576101e3565b8063c6f6f216146105e2578063c87b56dd1461060b578063d5abeb0114610648578063dad7b5c914610673576101e3565b8063a22cb465116100d1578063a22cb4651461053c578063a702735714610565578063b88d4fde14610590578063bde12d73146105b9576101e3565b806391b7f5ed146104a157806395d89b41146104ca578063a035b1fe146104f5578063a0712d6814610520576101e3565b8063475133341161017a57806370a082311161014957806370a0823114610406578063715018a6146104435780637c928fe91461045a5780638da5cb5b14610476576101e3565b8063475133341461034a57806355f804b3146103755780636352211e1461039e5780636c0360eb146103db576101e3565b806318160ddd116101b657806318160ddd146102b657806323b872dd146102e15780633ccfd60b1461030a57806342842e0e14610321576101e3565b806301ffc9a7146101e857806306fdde0314610225578063081812fc14610250578063095ea7b31461028d575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612401565b61076c565b60405161021c9190612873565b60405180910390f35b34801561023157600080fd5b5061023a6107fe565b604051610247919061288e565b60405180910390f35b34801561025c57600080fd5b50610277600480360381019061027291906124a8565b610890565b604051610284919061280c565b60405180910390f35b34801561029957600080fd5b506102b460048036038101906102af91906123c1565b61090f565b005b3480156102c257600080fd5b506102cb610a53565b6040516102d891906129f0565b60405180910390f35b3480156102ed57600080fd5b50610308600480360381019061030391906122ab565b610a6a565b005b34801561031657600080fd5b5061031f610d8f565b005b34801561032d57600080fd5b50610348600480360381019061034391906122ab565b610e46565b005b34801561035657600080fd5b5061035f610e66565b60405161036c91906129f0565b60405180910390f35b34801561038157600080fd5b5061039c6004803603810190610397919061245b565b610e6c565b005b3480156103aa57600080fd5b506103c560048036038101906103c091906124a8565b610e8a565b6040516103d2919061280c565b60405180910390f35b3480156103e757600080fd5b506103f0610e9c565b6040516103fd919061288e565b60405180910390f35b34801561041257600080fd5b5061042d6004803603810190610428919061223e565b610f2a565b60405161043a91906129f0565b60405180910390f35b34801561044f57600080fd5b50610458610fe3565b005b610474600480360381019061046f91906124a8565b610ff7565b005b34801561048257600080fd5b5061048b6111a9565b604051610498919061280c565b60405180910390f35b3480156104ad57600080fd5b506104c860048036038101906104c391906124a8565b6111d3565b005b3480156104d657600080fd5b506104df6111e5565b6040516104ec919061288e565b60405180910390f35b34801561050157600080fd5b5061050a611277565b60405161051791906129f0565b60405180910390f35b61053a600480360381019061053591906124a8565b61127d565b005b34801561054857600080fd5b50610563600480360381019061055e9190612381565b6113e4565b005b34801561057157600080fd5b5061057a61155c565b60405161058791906129f0565b60405180910390f35b34801561059c57600080fd5b506105b760048036038101906105b291906122fe565b611562565b005b3480156105c557600080fd5b506105e060048036038101906105db91906124a8565b6115d5565b005b3480156105ee57600080fd5b50610609600480360381019061060491906124a8565b6115f6565b005b34801561061757600080fd5b50610632600480360381019061062d91906124a8565b611608565b60405161063f919061288e565b60405180910390f35b34801561065457600080fd5b5061065d611684565b60405161066a91906129f0565b60405180910390f35b34801561067f57600080fd5b5061068861168a565b60405161069591906129f0565b60405180910390f35b3480156106aa57600080fd5b506106c560048036038101906106c0919061226b565b611690565b6040516106d29190612873565b60405180910390f35b3480156106e757600080fd5b5061070260048036038101906106fd919061223e565b611724565b005b34801561071057600080fd5b5061072b6004803603810190610726919061223e565b6117a8565b60405161073891906129f0565b60405180910390f35b34801561074d57600080fd5b506107566117c0565b60405161076391906129f0565b60405180910390f35b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806107c757506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107f75750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461080d90612c8f565b80601f016020809104026020016040519081016040528092919081815260200182805461083990612c8f565b80156108865780601f1061085b57610100808354040283529160200191610886565b820191906000526020600020905b81548152906001019060200180831161086957829003601f168201915b5050505050905090565b600061089b826117c6565b6108d1576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061091a82610e8a565b90508073ffffffffffffffffffffffffffffffffffffffff1661093b611825565b73ffffffffffffffffffffffffffffffffffffffff161461099e5761096781610962611825565b611690565b61099d576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a5d61182d565b6001546000540303905090565b6000610a7582611836565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610adc576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610ae884611904565b91509150610afe8187610af9611825565b61192b565b610b4a57610b1386610b0e611825565b611690565b610b49576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415610bb1576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610bbe868686600161196f565b8015610bc957600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610c9785610c73888887611975565b7c02000000000000000000000000000000000000000000000000000000001761199d565b600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415610d1f576000600185019050600060046000838152602001908152602001600020541415610d1d576000548114610d1c578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610d8786868660016119c8565b505050505050565b610d976119ce565b60003373ffffffffffffffffffffffffffffffffffffffff1647604051610dbd906127f7565b60006040518083038185875af1925050503d8060008114610dfa576040519150601f19603f3d011682016040523d82523d6000602084013e610dff565b606091505b5050905080610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a906129b0565b60405180910390fd5b50565b610e6183838360405180602001604052806000815250611562565b505050565b600f5481565b610e746119ce565b818160099190610e8592919061206c565b505050565b6000610e9582611836565b9050919050565b60098054610ea990612c8f565b80601f0160208091040260200160405190810160405280929190818152602001828054610ed590612c8f565b8015610f225780601f10610ef757610100808354040283529160200191610f22565b820191906000526020600020905b815481529060010190602001808311610f0557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f92576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610feb6119ce565b610ff56000611a4c565b565b600d5481601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546110459190612ac4565b1115611086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161107d906128f0565b60405180910390fd5b600f5481600e546110979190612ac4565b11156110d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cf90612910565b60405180910390fd5b600c54816110e4610a53565b6110ee9190612ac4565b111561112f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611126906129d0565b60405180910390fd5b601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081548092919061117f90612cf2565b9190505550600e600081548092919061119790612cf2565b91905055506111a63382611b12565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6111db6119ce565b80600a8190555050565b6060600380546111f490612c8f565b80601f016020809104026020016040519081016040528092919081815260200182805461122090612c8f565b801561126d5780601f106112425761010080835404028352916020019161126d565b820191906000526020600020905b81548152906001019060200180831161125057829003601f168201915b5050505050905090565b600a5481565b600a548161128b9190612b4b565b3410156112cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112c4906128b0565b60405180910390fd5b600c54816112d9610a53565b6112e39190612ac4565b1115611324576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131b906129d0565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611392576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138990612930565b60405180910390fd5b600b548111156113d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ce90612990565b60405180910390fd5b6113e13382611b30565b50565b6113ec611825565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611451576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806007600061145e611825565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661150b611825565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115509190612873565b60405180910390a35050565b600d5481565b61156d848484610a6a565b60008373ffffffffffffffffffffffffffffffffffffffff163b146115cf5761159884848484611ced565b6115ce576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6115dd6119ce565b600c548111156115ec57600080fd5b80600f8190555050565b6115fe6119ce565b80600b8190555050565b6060611613826117c6565b611652576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164990612970565b60405180910390fd5b600961165d83611e4d565b60405160200161166e9291906127c8565b6040516020818303038152906040529050919050565b600c5481565b600e5481565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61172c6119ce565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561179c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611793906128d0565b60405180910390fd5b6117a581611a4c565b50565b60106020528060005260406000206000915090505481565b600b5481565b6000816117d161182d565b111580156117e0575060005482105b801561181e575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000808290508061184561182d565b116118cd576000548110156118cc5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821614156118ca575b60008114156118c0576004600083600190039350838152602001908152602001600020549050611895565b80925050506118ff565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861198c868684611fae565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b6119d6611fb7565b73ffffffffffffffffffffffffffffffffffffffff166119f46111a9565b73ffffffffffffffffffffffffffffffffffffffff1614611a4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4190612950565b60405180910390fd5b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611b2c828260405180602001604052806000815250611fbf565b5050565b6000805490506000821415611b71576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611b7e600084838561196f565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550611bf583611be66000866000611975565b611bef8561205c565b1761199d565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114611c9657808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050611c5b565b506000821415611cd2576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050611ce860008483856119c8565b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611d13611825565b8786866040518563ffffffff1660e01b8152600401611d359493929190612827565b602060405180830381600087803b158015611d4f57600080fd5b505af1925050508015611d8057506040513d601f19601f82011682018060405250810190611d7d919061242e565b60015b611dfa573d8060008114611db0576040519150601f19603f3d011682016040523d82523d6000602084013e611db5565b606091505b50600081511415611df2576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415611e95576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611fa9565b600082905060005b60008214611ec7578080611eb090612cf2565b915050600a82611ec09190612b1a565b9150611e9d565b60008167ffffffffffffffff811115611ee357611ee2612e28565b5b6040519080825280601f01601f191660200182016040528015611f155781602001600182028036833780820191505090505b5090505b60008514611fa257600182611f2e9190612ba5565b9150600a85611f3d9190612d3b565b6030611f499190612ac4565b60f81b818381518110611f5f57611f5e612df9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611f9b9190612b1a565b9450611f19565b8093505050505b919050565b60009392505050565b600033905090565b611fc98383611b30565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461205757600080549050600083820390505b6120096000868380600101945086611ced565b61203f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110611ff657816000541461205457600080fd5b50505b505050565b60006001821460e11b9050919050565b82805461207890612c8f565b90600052602060002090601f01602090048101928261209a57600085556120e1565b82601f106120b357803560ff19168380011785556120e1565b828001600101855582156120e1579182015b828111156120e05782358255916020019190600101906120c5565b5b5090506120ee91906120f2565b5090565b5b8082111561210b5760008160009055506001016120f3565b5090565b600061212261211d84612a30565b612a0b565b90508281526020810184848401111561213e5761213d612e66565b5b612149848285612c4d565b509392505050565b600081359050612160816130e4565b92915050565b600081359050612175816130fb565b92915050565b60008135905061218a81613112565b92915050565b60008151905061219f81613112565b92915050565b600082601f8301126121ba576121b9612e5c565b5b81356121ca84826020860161210f565b91505092915050565b60008083601f8401126121e9576121e8612e5c565b5b8235905067ffffffffffffffff81111561220657612205612e57565b5b60208301915083600182028301111561222257612221612e61565b5b9250929050565b60008135905061223881613129565b92915050565b60006020828403121561225457612253612e70565b5b600061226284828501612151565b91505092915050565b6000806040838503121561228257612281612e70565b5b600061229085828601612151565b92505060206122a185828601612151565b9150509250929050565b6000806000606084860312156122c4576122c3612e70565b5b60006122d286828701612151565b93505060206122e386828701612151565b92505060406122f486828701612229565b9150509250925092565b6000806000806080858703121561231857612317612e70565b5b600061232687828801612151565b945050602061233787828801612151565b935050604061234887828801612229565b925050606085013567ffffffffffffffff81111561236957612368612e6b565b5b612375878288016121a5565b91505092959194509250565b6000806040838503121561239857612397612e70565b5b60006123a685828601612151565b92505060206123b785828601612166565b9150509250929050565b600080604083850312156123d8576123d7612e70565b5b60006123e685828601612151565b92505060206123f785828601612229565b9150509250929050565b60006020828403121561241757612416612e70565b5b60006124258482850161217b565b91505092915050565b60006020828403121561244457612443612e70565b5b600061245284828501612190565b91505092915050565b6000806020838503121561247257612471612e70565b5b600083013567ffffffffffffffff8111156124905761248f612e6b565b5b61249c858286016121d3565b92509250509250929050565b6000602082840312156124be576124bd612e70565b5b60006124cc84828501612229565b91505092915050565b6124de81612bd9565b82525050565b6124ed81612beb565b82525050565b60006124fe82612a76565b6125088185612a8c565b9350612518818560208601612c5c565b61252181612e75565b840191505092915050565b600061253782612a81565b6125418185612aa8565b9350612551818560208601612c5c565b61255a81612e75565b840191505092915050565b600061257082612a81565b61257a8185612ab9565b935061258a818560208601612c5c565b80840191505092915050565b600081546125a381612c8f565b6125ad8186612ab9565b945060018216600081146125c857600181146125d95761260c565b60ff1983168652818601935061260c565b6125e285612a61565b60005b83811015612604578154818901526001820191506020810190506125e5565b838801955050505b50505092915050565b6000612622601883612aa8565b915061262d82612e86565b602082019050919050565b6000612645602683612aa8565b915061265082612eaf565b604082019050919050565b6000612668603783612aa8565b915061267382612efe565b604082019050919050565b600061268b601a83612aa8565b915061269682612f4d565b602082019050919050565b60006126ae601383612aa8565b91506126b982612f76565b602082019050919050565b60006126d1600583612ab9565b91506126dc82612f9f565b600582019050919050565b60006126f4602083612aa8565b91506126ff82612fc8565b602082019050919050565b6000612717602f83612aa8565b915061272282612ff1565b604082019050919050565b600061273a602d83612aa8565b915061274582613040565b604082019050919050565b600061275d600083612a9d565b91506127688261308f565b600082019050919050565b6000612780601083612aa8565b915061278b82613092565b602082019050919050565b60006127a3600983612aa8565b91506127ae826130bb565b602082019050919050565b6127c281612c43565b82525050565b60006127d48285612596565b91506127e08284612565565b91506127eb826126c4565b91508190509392505050565b600061280282612750565b9150819050919050565b600060208201905061282160008301846124d5565b92915050565b600060808201905061283c60008301876124d5565b61284960208301866124d5565b61285660408301856127b9565b818103606083015261286881846124f3565b905095945050505050565b600060208201905061288860008301846124e4565b92915050565b600060208201905081810360008301526128a8818461252c565b905092915050565b600060208201905081810360008301526128c981612615565b9050919050565b600060208201905081810360008301526128e981612638565b9050919050565b600060208201905081810360008301526129098161265b565b9050919050565b600060208201905081810360008301526129298161267e565b9050919050565b60006020820190508181036000830152612949816126a1565b9050919050565b60006020820190508181036000830152612969816126e7565b9050919050565b600060208201905081810360008301526129898161270a565b9050919050565b600060208201905081810360008301526129a98161272d565b9050919050565b600060208201905081810360008301526129c981612773565b9050919050565b600060208201905081810360008301526129e981612796565b9050919050565b6000602082019050612a0560008301846127b9565b92915050565b6000612a15612a26565b9050612a218282612cc1565b919050565b6000604051905090565b600067ffffffffffffffff821115612a4b57612a4a612e28565b5b612a5482612e75565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000612acf82612c43565b9150612ada83612c43565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612b0f57612b0e612d6c565b5b828201905092915050565b6000612b2582612c43565b9150612b3083612c43565b925082612b4057612b3f612d9b565b5b828204905092915050565b6000612b5682612c43565b9150612b6183612c43565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612b9a57612b99612d6c565b5b828202905092915050565b6000612bb082612c43565b9150612bbb83612c43565b925082821015612bce57612bcd612d6c565b5b828203905092915050565b6000612be482612c23565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015612c7a578082015181840152602081019050612c5f565b83811115612c89576000848401525b50505050565b60006002820490506001821680612ca757607f821691505b60208210811415612cbb57612cba612dca565b5b50919050565b612cca82612e75565b810181811067ffffffffffffffff82111715612ce957612ce8612e28565b5b80604052505050565b6000612cfd82612c43565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612d3057612d2f612d6c565b5b600182019050919050565b6000612d4682612c43565b9150612d5183612c43565b925082612d6157612d60612d9b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f496e636f727265637420616d6f756e74206f66204554482e0000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f596f752068617665206d696e74656420746865206d6178206672656520616d6f60008201527f756e7420616c6c6f776564207065722077616c6c65742e000000000000000000602082015250565b7f43616e6e6f7420657863656564204672656520737570706c792e000000000000600082015250565b7f4f6e6c792068756d616e7320706c656173652e00000000000000000000000000600082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f596f75206d6179206f6e6c79206d696e742061206d6178206f6620313020706560008201527f72207472616e73616374696f6e00000000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f536f6c64206f75742e0000000000000000000000000000000000000000000000600082015250565b6130ed81612bd9565b81146130f857600080fd5b50565b61310481612beb565b811461310f57600080fd5b50565b61311b81612bf7565b811461312657600080fd5b50565b61313281612c43565b811461313d57600080fd5b5056fea2646970667358221220c614fece78b096fe4514642394d66f63999e4a1657773216c9fc053fd8db300e64736f6c63430008070033

Deployed Bytecode Sourcemap

57053:2522:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;24598:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25500:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31983:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31424:400;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21251:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35690:2817;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59397:173;;;;;;;;;;;;;:::i;:::-;;38603:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57457:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58810:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26893:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57136:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22435:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5348:103;;;;;;;;;;;;;:::i;:::-;;58021:464;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4700:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58920:86;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25676:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57258:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57617:396;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32541:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57374:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39386:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59116:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59014:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58493:309;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57334:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57416:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33006:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5606:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57501:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57299:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24598:639;24683:4;25022:10;25007:25;;:11;:25;;;;:102;;;;25099:10;25084:25;;:11;:25;;;;25007:102;:179;;;;25176:10;25161:25;;:11;:25;;;;25007:179;24987:199;;24598:639;;;:::o;25500:100::-;25554:13;25587:5;25580:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25500:100;:::o;31983:218::-;32059:7;32084:16;32092:7;32084;:16::i;:::-;32079:64;;32109:34;;;;;;;;;;;;;;32079:64;32163:15;:24;32179:7;32163:24;;;;;;;;;;;:30;;;;;;;;;;;;32156:37;;31983:218;;;:::o;31424:400::-;31505:13;31521:16;31529:7;31521;:16::i;:::-;31505:32;;31577:5;31554:28;;:19;:17;:19::i;:::-;:28;;;31550:175;;31602:44;31619:5;31626:19;:17;:19::i;:::-;31602:16;:44::i;:::-;31597:128;;31674:35;;;;;;;;;;;;;;31597:128;31550:175;31770:2;31737:15;:24;31753:7;31737:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;31808:7;31804:2;31788:28;;31797:5;31788:28;;;;;;;;;;;;31494:330;31424:400;;:::o;21251:323::-;21312:7;21540:15;:13;:15::i;:::-;21525:12;;21509:13;;:28;:46;21502:53;;21251:323;:::o;35690:2817::-;35824:27;35854;35873:7;35854:18;:27::i;:::-;35824:57;;35939:4;35898:45;;35914:19;35898:45;;;35894:86;;35952:28;;;;;;;;;;;;;;35894:86;35994:27;36023:23;36050:35;36077:7;36050:26;:35::i;:::-;35993:92;;;;36185:68;36210:15;36227:4;36233:19;:17;:19::i;:::-;36185:24;:68::i;:::-;36180:180;;36273:43;36290:4;36296:19;:17;:19::i;:::-;36273:16;:43::i;:::-;36268:92;;36325:35;;;;;;;;;;;;;;36268:92;36180:180;36391:1;36377:16;;:2;:16;;;36373:52;;;36402:23;;;;;;;;;;;;;;36373:52;36438:43;36460:4;36466:2;36470:7;36479:1;36438:21;:43::i;:::-;36574:15;36571:160;;;36714:1;36693:19;36686:30;36571:160;37111:18;:24;37130:4;37111:24;;;;;;;;;;;;;;;;37109:26;;;;;;;;;;;;37180:18;:22;37199:2;37180:22;;;;;;;;;;;;;;;;37178:24;;;;;;;;;;;37502:146;37539:2;37588:45;37603:4;37609:2;37613:19;37588:14;:45::i;:::-;17650:8;37560:73;37502:18;:146::i;:::-;37473:17;:26;37491:7;37473:26;;;;;;;;;;;:175;;;;37819:1;17650:8;37768:19;:47;:52;37764:627;;;37841:19;37873:1;37863:7;:11;37841:33;;38030:1;37996:17;:30;38014:11;37996:30;;;;;;;;;;;;:35;37992:384;;;38134:13;;38119:11;:28;38115:242;;38314:19;38281:17;:30;38299:11;38281:30;;;;;;;;;;;:52;;;;38115:242;37992:384;37822:569;37764:627;38438:7;38434:2;38419:27;;38428:4;38419:27;;;;;;;;;;;;38457:42;38478:4;38484:2;38488:7;38497:1;38457:20;:42::i;:::-;35813:2694;;;35690:2817;;;:::o;59397:173::-;4586:13;:11;:13::i;:::-;59448:12:::1;59466:10;:15;;59489:21;59466:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59447:68;;;59534:7;59526:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;59436:134;59397:173::o:0;38603:185::-;38741:39;38758:4;38764:2;38768:7;38741:39;;;;;;;;;;;;:16;:39::i;:::-;38603:185;;;:::o;57457:35::-;;;;:::o;58810:102::-;4586:13;:11;:13::i;:::-;58896:8:::1;;58886:7;:18;;;;;;;:::i;:::-;;58810:102:::0;;:::o;26893:152::-;26965:7;27008:27;27027:7;27008:18;:27::i;:::-;26985:52;;26893:152;;;:::o;57136:113::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22435:233::-;22507:7;22548:1;22531:19;;:5;:19;;;22527:60;;;22559:28;;;;;;;;;;;;;;22527:60;16594:13;22605:18;:25;22624:5;22605:25;;;;;;;;;;;;;;;;:55;22598:62;;22435:233;;;:::o;5348:103::-;4586:13;:11;:13::i;:::-;5413:30:::1;5440:1;5413:18;:30::i;:::-;5348:103::o:0;58021:464::-;58135:16;;58124:7;58092:17;:29;58110:10;58092:29;;;;;;;;;;;;;;;;:39;;;;:::i;:::-;:59;;58084:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;58253:13;;58242:7;58224:15;;:25;;;;:::i;:::-;:42;;58216:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;58344:9;;58333:7;58317:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;58309:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;58380:17;:29;58398:10;58380:29;;;;;;;;;;;;;;;;:31;;;;;;;;;:::i;:::-;;;;;;58422:15;;:17;;;;;;;;;:::i;:::-;;;;;;58450:30;58460:10;58472:7;58450:9;:30::i;:::-;58021:464;:::o;4700:87::-;4746:7;4773:6;;;;;;;;;;;4766:13;;4700:87;:::o;58920:86::-;4586:13;:11;:13::i;:::-;58992:6:::1;58984:5;:14;;;;58920:86:::0;:::o;25676:104::-;25732:13;25765:7;25758:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25676:104;:::o;57258:34::-;;;;:::o;57617:396::-;57709:5;;57699:7;:15;;;;:::i;:::-;57686:9;:28;;57678:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;57789:9;;57778:7;57762:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;57754:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57844:10;57831:23;;:9;:23;;;57823:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57908:8;;57897:7;:19;;57889:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;57979:26;57985:10;57997:7;57979:5;:26::i;:::-;57617:396;:::o;32541:308::-;32652:19;:17;:19::i;:::-;32640:31;;:8;:31;;;32636:61;;;32680:17;;;;;;;;;;;;;;32636:61;32762:8;32710:18;:39;32729:19;:17;:19::i;:::-;32710:39;;;;;;;;;;;;;;;:49;32750:8;32710:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;32822:8;32786:55;;32801:19;:17;:19::i;:::-;32786:55;;;32832:8;32786:55;;;;;;:::i;:::-;;;;;;;;32541:308;;:::o;57374:35::-;;;;:::o;39386:399::-;39553:31;39566:4;39572:2;39576:7;39553:12;:31::i;:::-;39617:1;39599:2;:14;;;:19;39595:183;;39638:56;39669:4;39675:2;39679:7;39688:5;39638:30;:56::i;:::-;39633:145;;39722:40;;;;;;;;;;;;;;39633:145;39595:183;39386:399;;;;:::o;59116:172::-;4586:13;:11;:13::i;:::-;59226:9:::1;;59205:17;:30;;59197:39;;;::::0;::::1;;59263:17;59247:13;:33;;;;59116:172:::0;:::o;59014:94::-;4586:13;:11;:13::i;:::-;59093:7:::1;59082:8;:18;;;;59014:94:::0;:::o;58493:309::-;58575:13;58623:16;58631:7;58623;:16::i;:::-;58601:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;58756:7;58765:18;:7;:16;:18::i;:::-;58739:54;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58725:69;;58493:309;;;:::o;57334:31::-;;;;:::o;57416:34::-;;;;:::o;33006:164::-;33103:4;33127:18;:25;33146:5;33127:25;;;;;;;;;;;;;;;:35;33153:8;33127:35;;;;;;;;;;;;;;;;;;;;;;;;;33120:42;;33006:164;;;;:::o;5606:201::-;4586:13;:11;:13::i;:::-;5715:1:::1;5695:22;;:8;:22;;;;5687:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;5771:28;5790:8;5771:18;:28::i;:::-;5606:201:::0;:::o;57501:52::-;;;;;;;;;;;;;;;;;:::o;57299:28::-;;;;:::o;33428:282::-;33493:4;33549:7;33530:15;:13;:15::i;:::-;:26;;:66;;;;;33583:13;;33573:7;:23;33530:66;:153;;;;;33682:1;17370:8;33634:17;:26;33652:7;33634:26;;;;;;;;;;;;:44;:49;33530:153;33510:173;;33428:282;;;:::o;55194:105::-;55254:7;55281:10;55274:17;;55194:105;:::o;59296:93::-;59353:7;59380:1;59373:8;;59296:93;:::o;28048:1275::-;28115:7;28135:12;28150:7;28135:22;;28218:4;28199:15;:13;:15::i;:::-;:23;28195:1061;;28252:13;;28245:4;:20;28241:1015;;;28290:14;28307:17;:23;28325:4;28307:23;;;;;;;;;;;;28290:40;;28424:1;17370:8;28396:6;:24;:29;28392:845;;;29061:113;29078:1;29068:6;:11;29061:113;;;29121:17;:25;29139:6;;;;;;;29121:25;;;;;;;;;;;;29112:34;;29061:113;;;29207:6;29200:13;;;;;;28392:845;28267:989;28241:1015;28195:1061;29284:31;;;;;;;;;;;;;;28048:1275;;;;:::o;34591:479::-;34693:27;34722:23;34763:38;34804:15;:24;34820:7;34804:24;;;;;;;;;;;34763:65;;34975:18;34952:41;;35032:19;35026:26;35007:45;;34937:126;34591:479;;;:::o;33819:659::-;33968:11;34133:16;34126:5;34122:28;34113:37;;34293:16;34282:9;34278:32;34265:45;;34443:15;34432:9;34429:30;34421:5;34410:9;34407:20;34404:56;34394:66;;33819:659;;;;;:::o;40447:159::-;;;;;:::o;54503:311::-;54638:7;54658:16;17774:3;54684:19;:41;;54658:68;;17774:3;54752:31;54763:4;54769:2;54773:9;54752:10;:31::i;:::-;54744:40;;:62;;54737:69;;;54503:311;;;;;:::o;29871:450::-;29951:14;30119:16;30112:5;30108:28;30099:37;;30296:5;30282:11;30257:23;30253:41;30250:52;30243:5;30240:63;30230:73;;29871:450;;;;:::o;41271:158::-;;;;;:::o;4865:132::-;4940:12;:10;:12::i;:::-;4929:23;;:7;:5;:7::i;:::-;:23;;;4921:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;4865:132::o;5967:191::-;6041:16;6060:6;;;;;;;;;;;6041:25;;6086:8;6077:6;;:17;;;;;;;;;;;;;;;;;;6141:8;6110:40;;6131:8;6110:40;;;;;;;;;;;;6030:128;5967:191;:::o;49026:112::-;49103:27;49113:2;49117:8;49103:27;;;;;;;;;;;;:9;:27::i;:::-;49026:112;;:::o;43047:2454::-;43120:20;43143:13;;43120:36;;43183:1;43171:8;:13;43167:44;;;43193:18;;;;;;;;;;;;;;43167:44;43224:61;43254:1;43258:2;43262:12;43276:8;43224:21;:61::i;:::-;43768:1;16732:2;43738:1;:26;;43737:32;43725:8;:45;43699:18;:22;43718:2;43699:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;44047:139;44084:2;44138:33;44161:1;44165:2;44169:1;44138:14;:33::i;:::-;44105:30;44126:8;44105:20;:30::i;:::-;:66;44047:18;:139::i;:::-;44013:17;:31;44031:12;44013:31;;;;;;;;;;;:173;;;;44203:16;44234:11;44263:8;44248:12;:23;44234:37;;44518:16;44514:2;44510:25;44498:37;;44890:12;44850:8;44809:1;44747:25;44688:1;44627;44600:335;45015:1;45001:12;44997:20;44955:346;45056:3;45047:7;45044:16;44955:346;;45274:7;45264:8;45261:1;45234:25;45231:1;45228;45223:59;45109:1;45100:7;45096:15;45085:26;;44955:346;;;44959:77;45346:1;45334:8;:13;45330:45;;;45356:19;;;;;;;;;;;;;;45330:45;45408:3;45392:13;:19;;;;43473:1950;;45433:60;45462:1;45466:2;45470:12;45484:8;45433:20;:60::i;:::-;43109:2392;43047:2454;;:::o;41869:716::-;42032:4;42078:2;42053:45;;;42099:19;:17;:19::i;:::-;42120:4;42126:7;42135:5;42053:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42049:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42353:1;42336:6;:13;:18;42332:235;;;42382:40;;;;;;;;;;;;;;42332:235;42525:6;42519:13;42510:6;42506:2;42502:15;42495:38;42049:529;42222:54;;;42212:64;;;:6;:64;;;;42205:71;;;41869:716;;;;;;:::o;1398:723::-;1454:13;1684:1;1675:5;:10;1671:53;;;1702:10;;;;;;;;;;;;;;;;;;;;;1671:53;1734:12;1749:5;1734:20;;1765:14;1790:78;1805:1;1797:4;:9;1790:78;;1823:8;;;;;:::i;:::-;;;;1854:2;1846:10;;;;;:::i;:::-;;;1790:78;;;1878:19;1910:6;1900:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1878:39;;1928:154;1944:1;1935:5;:10;1928:154;;1972:1;1962:11;;;;;:::i;:::-;;;2039:2;2031:5;:10;;;;:::i;:::-;2018:2;:24;;;;:::i;:::-;2005:39;;1988:6;1995;1988:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2068:2;2059:11;;;;;:::i;:::-;;;1928:154;;;2106:6;2092:21;;;;;1398:723;;;;:::o;54204:147::-;54341:6;54204:147;;;;;:::o;714:98::-;767:7;794:10;787:17;;714:98;:::o;48253:689::-;48384:19;48390:2;48394:8;48384:5;:19::i;:::-;48463:1;48445:2;:14;;;:19;48441:483;;48485:11;48499:13;;48485:27;;48531:13;48553:8;48547:3;:14;48531:30;;48580:233;48611:62;48650:1;48654:2;48658:7;;;;;;48667:5;48611:30;:62::i;:::-;48606:167;;48709:40;;;;;;;;;;;;;;48606:167;48808:3;48800:5;:11;48580:233;;48895:3;48878:13;;:20;48874:34;;48900:8;;;48874:34;48466:458;;48441:483;48253:689;;;:::o;30423:324::-;30493:14;30726:1;30716:8;30713:15;30687:24;30683:46;30673:56;;30423:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:137::-;752:5;790:6;777:20;768:29;;806:32;832:5;806:32;:::i;:::-;707:137;;;;:::o;850:141::-;906:5;937:6;931:13;922:22;;953:32;979:5;953:32;:::i;:::-;850:141;;;;:::o;1010:338::-;1065:5;1114:3;1107:4;1099:6;1095:17;1091:27;1081:122;;1122:79;;:::i;:::-;1081:122;1239:6;1226:20;1264:78;1338:3;1330:6;1323:4;1315:6;1311:17;1264:78;:::i;:::-;1255:87;;1071:277;1010:338;;;;:::o;1368:553::-;1426:8;1436:6;1486:3;1479:4;1471:6;1467:17;1463:27;1453:122;;1494:79;;:::i;:::-;1453:122;1607:6;1594:20;1584:30;;1637:18;1629:6;1626:30;1623:117;;;1659:79;;:::i;:::-;1623:117;1773:4;1765:6;1761:17;1749:29;;1827:3;1819:4;1811:6;1807:17;1797:8;1793:32;1790:41;1787:128;;;1834:79;;:::i;:::-;1787:128;1368:553;;;;;:::o;1927:139::-;1973:5;2011:6;1998:20;1989:29;;2027:33;2054:5;2027:33;:::i;:::-;1927:139;;;;:::o;2072:329::-;2131:6;2180:2;2168:9;2159:7;2155:23;2151:32;2148:119;;;2186:79;;:::i;:::-;2148:119;2306:1;2331:53;2376:7;2367:6;2356:9;2352:22;2331:53;:::i;:::-;2321:63;;2277:117;2072:329;;;;:::o;2407:474::-;2475:6;2483;2532:2;2520:9;2511:7;2507:23;2503:32;2500:119;;;2538:79;;:::i;:::-;2500:119;2658:1;2683:53;2728:7;2719:6;2708:9;2704:22;2683:53;:::i;:::-;2673:63;;2629:117;2785:2;2811:53;2856:7;2847:6;2836:9;2832:22;2811:53;:::i;:::-;2801:63;;2756:118;2407:474;;;;;:::o;2887:619::-;2964:6;2972;2980;3029:2;3017:9;3008:7;3004:23;3000:32;2997:119;;;3035:79;;:::i;:::-;2997:119;3155:1;3180:53;3225:7;3216:6;3205:9;3201:22;3180:53;:::i;:::-;3170:63;;3126:117;3282:2;3308:53;3353:7;3344:6;3333:9;3329:22;3308:53;:::i;:::-;3298:63;;3253:118;3410:2;3436:53;3481:7;3472:6;3461:9;3457:22;3436:53;:::i;:::-;3426:63;;3381:118;2887:619;;;;;:::o;3512:943::-;3607:6;3615;3623;3631;3680:3;3668:9;3659:7;3655:23;3651:33;3648:120;;;3687:79;;:::i;:::-;3648:120;3807:1;3832:53;3877:7;3868:6;3857:9;3853:22;3832:53;:::i;:::-;3822:63;;3778:117;3934:2;3960:53;4005:7;3996:6;3985:9;3981:22;3960:53;:::i;:::-;3950:63;;3905:118;4062:2;4088:53;4133:7;4124:6;4113:9;4109:22;4088:53;:::i;:::-;4078:63;;4033:118;4218:2;4207:9;4203:18;4190:32;4249:18;4241:6;4238:30;4235:117;;;4271:79;;:::i;:::-;4235:117;4376:62;4430:7;4421:6;4410:9;4406:22;4376:62;:::i;:::-;4366:72;;4161:287;3512:943;;;;;;;:::o;4461:468::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:50;4904:7;4895:6;4884:9;4880:22;4862:50;:::i;:::-;4852:60;;4807:115;4461:468;;;;;:::o;4935:474::-;5003:6;5011;5060:2;5048:9;5039:7;5035:23;5031:32;5028:119;;;5066:79;;:::i;:::-;5028:119;5186:1;5211:53;5256:7;5247:6;5236:9;5232:22;5211:53;:::i;:::-;5201:63;;5157:117;5313:2;5339:53;5384:7;5375:6;5364:9;5360:22;5339:53;:::i;:::-;5329:63;;5284:118;4935:474;;;;;:::o;5415:327::-;5473:6;5522:2;5510:9;5501:7;5497:23;5493:32;5490:119;;;5528:79;;:::i;:::-;5490:119;5648:1;5673:52;5717:7;5708:6;5697:9;5693:22;5673:52;:::i;:::-;5663:62;;5619:116;5415:327;;;;:::o;5748:349::-;5817:6;5866:2;5854:9;5845:7;5841:23;5837:32;5834:119;;;5872:79;;:::i;:::-;5834:119;5992:1;6017:63;6072:7;6063:6;6052:9;6048:22;6017:63;:::i;:::-;6007:73;;5963:127;5748:349;;;;:::o;6103:529::-;6174:6;6182;6231:2;6219:9;6210:7;6206:23;6202:32;6199:119;;;6237:79;;:::i;:::-;6199:119;6385:1;6374:9;6370:17;6357:31;6415:18;6407:6;6404:30;6401:117;;;6437:79;;:::i;:::-;6401:117;6550:65;6607:7;6598:6;6587:9;6583:22;6550:65;:::i;:::-;6532:83;;;;6328:297;6103:529;;;;;:::o;6638:329::-;6697:6;6746:2;6734:9;6725:7;6721:23;6717:32;6714:119;;;6752:79;;:::i;:::-;6714:119;6872:1;6897:53;6942:7;6933:6;6922:9;6918:22;6897:53;:::i;:::-;6887:63;;6843:117;6638:329;;;;:::o;6973:118::-;7060:24;7078:5;7060:24;:::i;:::-;7055:3;7048:37;6973:118;;:::o;7097:109::-;7178:21;7193:5;7178:21;:::i;:::-;7173:3;7166:34;7097:109;;:::o;7212:360::-;7298:3;7326:38;7358:5;7326:38;:::i;:::-;7380:70;7443:6;7438:3;7380:70;:::i;:::-;7373:77;;7459:52;7504:6;7499:3;7492:4;7485:5;7481:16;7459:52;:::i;:::-;7536:29;7558:6;7536:29;:::i;:::-;7531:3;7527:39;7520:46;;7302:270;7212:360;;;;:::o;7578:364::-;7666:3;7694:39;7727:5;7694:39;:::i;:::-;7749:71;7813:6;7808:3;7749:71;:::i;:::-;7742:78;;7829:52;7874:6;7869:3;7862:4;7855:5;7851:16;7829:52;:::i;:::-;7906:29;7928:6;7906:29;:::i;:::-;7901:3;7897:39;7890:46;;7670:272;7578:364;;;;:::o;7948:377::-;8054:3;8082:39;8115:5;8082:39;:::i;:::-;8137:89;8219:6;8214:3;8137:89;:::i;:::-;8130:96;;8235:52;8280:6;8275:3;8268:4;8261:5;8257:16;8235:52;:::i;:::-;8312:6;8307:3;8303:16;8296:23;;8058:267;7948:377;;;;:::o;8355:845::-;8458:3;8495:5;8489:12;8524:36;8550:9;8524:36;:::i;:::-;8576:89;8658:6;8653:3;8576:89;:::i;:::-;8569:96;;8696:1;8685:9;8681:17;8712:1;8707:137;;;;8858:1;8853:341;;;;8674:520;;8707:137;8791:4;8787:9;8776;8772:25;8767:3;8760:38;8827:6;8822:3;8818:16;8811:23;;8707:137;;8853:341;8920:38;8952:5;8920:38;:::i;:::-;8980:1;8994:154;9008:6;9005:1;9002:13;8994:154;;;9082:7;9076:14;9072:1;9067:3;9063:11;9056:35;9132:1;9123:7;9119:15;9108:26;;9030:4;9027:1;9023:12;9018:17;;8994:154;;;9177:6;9172:3;9168:16;9161:23;;8860:334;;8674:520;;8462:738;;8355:845;;;;:::o;9206:366::-;9348:3;9369:67;9433:2;9428:3;9369:67;:::i;:::-;9362:74;;9445:93;9534:3;9445:93;:::i;:::-;9563:2;9558:3;9554:12;9547:19;;9206:366;;;:::o;9578:::-;9720:3;9741:67;9805:2;9800:3;9741:67;:::i;:::-;9734:74;;9817:93;9906:3;9817:93;:::i;:::-;9935:2;9930:3;9926:12;9919:19;;9578:366;;;:::o;9950:::-;10092:3;10113:67;10177:2;10172:3;10113:67;:::i;:::-;10106:74;;10189:93;10278:3;10189:93;:::i;:::-;10307:2;10302:3;10298:12;10291:19;;9950:366;;;:::o;10322:::-;10464:3;10485:67;10549:2;10544:3;10485:67;:::i;:::-;10478:74;;10561:93;10650:3;10561:93;:::i;:::-;10679:2;10674:3;10670:12;10663:19;;10322:366;;;:::o;10694:::-;10836:3;10857:67;10921:2;10916:3;10857:67;:::i;:::-;10850:74;;10933:93;11022:3;10933:93;:::i;:::-;11051:2;11046:3;11042:12;11035:19;;10694:366;;;:::o;11066:400::-;11226:3;11247:84;11329:1;11324:3;11247:84;:::i;:::-;11240:91;;11340:93;11429:3;11340:93;:::i;:::-;11458:1;11453:3;11449:11;11442:18;;11066:400;;;:::o;11472:366::-;11614:3;11635:67;11699:2;11694:3;11635:67;:::i;:::-;11628:74;;11711:93;11800:3;11711:93;:::i;:::-;11829:2;11824:3;11820:12;11813:19;;11472:366;;;:::o;11844:::-;11986:3;12007:67;12071:2;12066:3;12007:67;:::i;:::-;12000:74;;12083:93;12172:3;12083:93;:::i;:::-;12201:2;12196:3;12192:12;12185:19;;11844:366;;;:::o;12216:::-;12358:3;12379:67;12443:2;12438:3;12379:67;:::i;:::-;12372:74;;12455:93;12544:3;12455:93;:::i;:::-;12573:2;12568:3;12564:12;12557:19;;12216:366;;;:::o;12588:398::-;12747:3;12768:83;12849:1;12844:3;12768:83;:::i;:::-;12761:90;;12860:93;12949:3;12860:93;:::i;:::-;12978:1;12973:3;12969:11;12962:18;;12588:398;;;:::o;12992:366::-;13134:3;13155:67;13219:2;13214:3;13155:67;:::i;:::-;13148:74;;13231:93;13320:3;13231:93;:::i;:::-;13349:2;13344:3;13340:12;13333:19;;12992:366;;;:::o;13364:365::-;13506:3;13527:66;13591:1;13586:3;13527:66;:::i;:::-;13520:73;;13602:93;13691:3;13602:93;:::i;:::-;13720:2;13715:3;13711:12;13704:19;;13364:365;;;:::o;13735:118::-;13822:24;13840:5;13822:24;:::i;:::-;13817:3;13810:37;13735:118;;:::o;13859:695::-;14137:3;14159:92;14247:3;14238:6;14159:92;:::i;:::-;14152:99;;14268:95;14359:3;14350:6;14268:95;:::i;:::-;14261:102;;14380:148;14524:3;14380:148;:::i;:::-;14373:155;;14545:3;14538:10;;13859:695;;;;;:::o;14560:379::-;14744:3;14766:147;14909:3;14766:147;:::i;:::-;14759:154;;14930:3;14923:10;;14560:379;;;:::o;14945:222::-;15038:4;15076:2;15065:9;15061:18;15053:26;;15089:71;15157:1;15146:9;15142:17;15133:6;15089:71;:::i;:::-;14945:222;;;;:::o;15173:640::-;15368:4;15406:3;15395:9;15391:19;15383:27;;15420:71;15488:1;15477:9;15473:17;15464:6;15420:71;:::i;:::-;15501:72;15569:2;15558:9;15554:18;15545:6;15501:72;:::i;:::-;15583;15651:2;15640:9;15636:18;15627:6;15583:72;:::i;:::-;15702:9;15696:4;15692:20;15687:2;15676:9;15672:18;15665:48;15730:76;15801:4;15792:6;15730:76;:::i;:::-;15722:84;;15173:640;;;;;;;:::o;15819:210::-;15906:4;15944:2;15933:9;15929:18;15921:26;;15957:65;16019:1;16008:9;16004:17;15995:6;15957:65;:::i;:::-;15819:210;;;;:::o;16035:313::-;16148:4;16186:2;16175:9;16171:18;16163:26;;16235:9;16229:4;16225:20;16221:1;16210:9;16206:17;16199:47;16263:78;16336:4;16327:6;16263:78;:::i;:::-;16255:86;;16035:313;;;;:::o;16354:419::-;16520:4;16558:2;16547:9;16543:18;16535:26;;16607:9;16601:4;16597:20;16593:1;16582:9;16578:17;16571:47;16635:131;16761:4;16635:131;:::i;:::-;16627:139;;16354:419;;;:::o;16779:::-;16945:4;16983:2;16972:9;16968:18;16960:26;;17032:9;17026:4;17022:20;17018:1;17007:9;17003:17;16996:47;17060:131;17186:4;17060:131;:::i;:::-;17052:139;;16779:419;;;:::o;17204:::-;17370:4;17408:2;17397:9;17393:18;17385:26;;17457:9;17451:4;17447:20;17443:1;17432:9;17428:17;17421:47;17485:131;17611:4;17485:131;:::i;:::-;17477:139;;17204:419;;;:::o;17629:::-;17795:4;17833:2;17822:9;17818:18;17810:26;;17882:9;17876:4;17872:20;17868:1;17857:9;17853:17;17846:47;17910:131;18036:4;17910:131;:::i;:::-;17902:139;;17629:419;;;:::o;18054:::-;18220:4;18258:2;18247:9;18243:18;18235:26;;18307:9;18301:4;18297:20;18293:1;18282:9;18278:17;18271:47;18335:131;18461:4;18335:131;:::i;:::-;18327:139;;18054:419;;;:::o;18479:::-;18645:4;18683:2;18672:9;18668:18;18660:26;;18732:9;18726:4;18722:20;18718:1;18707:9;18703:17;18696:47;18760:131;18886:4;18760:131;:::i;:::-;18752:139;;18479:419;;;:::o;18904:::-;19070:4;19108:2;19097:9;19093:18;19085:26;;19157:9;19151:4;19147:20;19143:1;19132:9;19128:17;19121:47;19185:131;19311:4;19185:131;:::i;:::-;19177:139;;18904:419;;;:::o;19329:::-;19495:4;19533:2;19522:9;19518:18;19510:26;;19582:9;19576:4;19572:20;19568:1;19557:9;19553:17;19546:47;19610:131;19736:4;19610:131;:::i;:::-;19602:139;;19329:419;;;:::o;19754:::-;19920:4;19958:2;19947:9;19943:18;19935:26;;20007:9;20001:4;19997:20;19993:1;19982:9;19978:17;19971:47;20035:131;20161:4;20035:131;:::i;:::-;20027:139;;19754:419;;;:::o;20179:::-;20345:4;20383:2;20372:9;20368:18;20360:26;;20432:9;20426:4;20422:20;20418:1;20407:9;20403:17;20396:47;20460:131;20586:4;20460:131;:::i;:::-;20452:139;;20179:419;;;:::o;20604:222::-;20697:4;20735:2;20724:9;20720:18;20712:26;;20748:71;20816:1;20805:9;20801:17;20792:6;20748:71;:::i;:::-;20604:222;;;;:::o;20832:129::-;20866:6;20893:20;;:::i;:::-;20883:30;;20922:33;20950:4;20942:6;20922:33;:::i;:::-;20832:129;;;:::o;20967:75::-;21000:6;21033:2;21027:9;21017:19;;20967:75;:::o;21048:307::-;21109:4;21199:18;21191:6;21188:30;21185:56;;;21221:18;;:::i;:::-;21185:56;21259:29;21281:6;21259:29;:::i;:::-;21251:37;;21343:4;21337;21333:15;21325:23;;21048:307;;;:::o;21361:141::-;21410:4;21433:3;21425:11;;21456:3;21453:1;21446:14;21490:4;21487:1;21477:18;21469:26;;21361:141;;;:::o;21508:98::-;21559:6;21593:5;21587:12;21577:22;;21508:98;;;:::o;21612:99::-;21664:6;21698:5;21692:12;21682:22;;21612:99;;;:::o;21717:168::-;21800:11;21834:6;21829:3;21822:19;21874:4;21869:3;21865:14;21850:29;;21717:168;;;;:::o;21891:147::-;21992:11;22029:3;22014:18;;21891:147;;;;:::o;22044:169::-;22128:11;22162:6;22157:3;22150:19;22202:4;22197:3;22193:14;22178:29;;22044:169;;;;:::o;22219:148::-;22321:11;22358:3;22343:18;;22219:148;;;;:::o;22373:305::-;22413:3;22432:20;22450:1;22432:20;:::i;:::-;22427:25;;22466:20;22484:1;22466:20;:::i;:::-;22461:25;;22620:1;22552:66;22548:74;22545:1;22542:81;22539:107;;;22626:18;;:::i;:::-;22539:107;22670:1;22667;22663:9;22656:16;;22373:305;;;;:::o;22684:185::-;22724:1;22741:20;22759:1;22741:20;:::i;:::-;22736:25;;22775:20;22793:1;22775:20;:::i;:::-;22770:25;;22814:1;22804:35;;22819:18;;:::i;:::-;22804:35;22861:1;22858;22854:9;22849:14;;22684:185;;;;:::o;22875:348::-;22915:7;22938:20;22956:1;22938:20;:::i;:::-;22933:25;;22972:20;22990:1;22972:20;:::i;:::-;22967:25;;23160:1;23092:66;23088:74;23085:1;23082:81;23077:1;23070:9;23063:17;23059:105;23056:131;;;23167:18;;:::i;:::-;23056:131;23215:1;23212;23208:9;23197:20;;22875:348;;;;:::o;23229:191::-;23269:4;23289:20;23307:1;23289:20;:::i;:::-;23284:25;;23323:20;23341:1;23323:20;:::i;:::-;23318:25;;23362:1;23359;23356:8;23353:34;;;23367:18;;:::i;:::-;23353:34;23412:1;23409;23405:9;23397:17;;23229:191;;;;:::o;23426:96::-;23463:7;23492:24;23510:5;23492:24;:::i;:::-;23481:35;;23426:96;;;:::o;23528:90::-;23562:7;23605:5;23598:13;23591:21;23580:32;;23528:90;;;:::o;23624:149::-;23660:7;23700:66;23693:5;23689:78;23678:89;;23624:149;;;:::o;23779:126::-;23816:7;23856:42;23849:5;23845:54;23834:65;;23779:126;;;:::o;23911:77::-;23948:7;23977:5;23966:16;;23911:77;;;:::o;23994:154::-;24078:6;24073:3;24068;24055:30;24140:1;24131:6;24126:3;24122:16;24115:27;23994:154;;;:::o;24154:307::-;24222:1;24232:113;24246:6;24243:1;24240:13;24232:113;;;24331:1;24326:3;24322:11;24316:18;24312:1;24307:3;24303:11;24296:39;24268:2;24265:1;24261:10;24256:15;;24232:113;;;24363:6;24360:1;24357:13;24354:101;;;24443:1;24434:6;24429:3;24425:16;24418:27;24354:101;24203:258;24154:307;;;:::o;24467:320::-;24511:6;24548:1;24542:4;24538:12;24528:22;;24595:1;24589:4;24585:12;24616:18;24606:81;;24672:4;24664:6;24660:17;24650:27;;24606:81;24734:2;24726:6;24723:14;24703:18;24700:38;24697:84;;;24753:18;;:::i;:::-;24697:84;24518:269;24467:320;;;:::o;24793:281::-;24876:27;24898:4;24876:27;:::i;:::-;24868:6;24864:40;25006:6;24994:10;24991:22;24970:18;24958:10;24955:34;24952:62;24949:88;;;25017:18;;:::i;:::-;24949:88;25057:10;25053:2;25046:22;24836:238;24793:281;;:::o;25080:233::-;25119:3;25142:24;25160:5;25142:24;:::i;:::-;25133:33;;25188:66;25181:5;25178:77;25175:103;;;25258:18;;:::i;:::-;25175:103;25305:1;25298:5;25294:13;25287:20;;25080:233;;;:::o;25319:176::-;25351:1;25368:20;25386:1;25368:20;:::i;:::-;25363:25;;25402:20;25420:1;25402:20;:::i;:::-;25397:25;;25441:1;25431:35;;25446:18;;:::i;:::-;25431:35;25487:1;25484;25480:9;25475:14;;25319:176;;;;:::o;25501:180::-;25549:77;25546:1;25539:88;25646:4;25643:1;25636:15;25670:4;25667:1;25660:15;25687:180;25735:77;25732:1;25725:88;25832:4;25829:1;25822:15;25856:4;25853:1;25846:15;25873:180;25921:77;25918:1;25911:88;26018:4;26015:1;26008:15;26042:4;26039:1;26032:15;26059:180;26107:77;26104:1;26097:88;26204:4;26201:1;26194:15;26228:4;26225:1;26218:15;26245:180;26293:77;26290:1;26283:88;26390:4;26387:1;26380:15;26414:4;26411:1;26404:15;26431:117;26540:1;26537;26530:12;26554:117;26663:1;26660;26653:12;26677:117;26786:1;26783;26776:12;26800:117;26909:1;26906;26899:12;26923:117;27032:1;27029;27022:12;27046:117;27155:1;27152;27145:12;27169:102;27210:6;27261:2;27257:7;27252:2;27245:5;27241:14;27237:28;27227:38;;27169:102;;;:::o;27277:174::-;27417:26;27413:1;27405:6;27401:14;27394:50;27277:174;:::o;27457:225::-;27597:34;27593:1;27585:6;27581:14;27574:58;27666:8;27661:2;27653:6;27649:15;27642:33;27457:225;:::o;27688:242::-;27828:34;27824:1;27816:6;27812:14;27805:58;27897:25;27892:2;27884:6;27880:15;27873:50;27688:242;:::o;27936:176::-;28076:28;28072:1;28064:6;28060:14;28053:52;27936:176;:::o;28118:169::-;28258:21;28254:1;28246:6;28242:14;28235:45;28118:169;:::o;28293:155::-;28433:7;28429:1;28421:6;28417:14;28410:31;28293:155;:::o;28454:182::-;28594:34;28590:1;28582:6;28578:14;28571:58;28454:182;:::o;28642:234::-;28782:34;28778:1;28770:6;28766:14;28759:58;28851:17;28846:2;28838:6;28834:15;28827:42;28642:234;:::o;28882:232::-;29022:34;29018:1;29010:6;29006:14;28999:58;29091:15;29086:2;29078:6;29074:15;29067:40;28882:232;:::o;29120:114::-;;:::o;29240:166::-;29380:18;29376:1;29368:6;29364:14;29357:42;29240:166;:::o;29412:159::-;29552:11;29548:1;29540:6;29536:14;29529:35;29412:159;:::o;29577:122::-;29650:24;29668:5;29650:24;:::i;:::-;29643:5;29640:35;29630:63;;29689:1;29686;29679:12;29630:63;29577:122;:::o;29705:116::-;29775:21;29790:5;29775:21;:::i;:::-;29768:5;29765:32;29755:60;;29811:1;29808;29801:12;29755:60;29705:116;:::o;29827:120::-;29899:23;29916:5;29899:23;:::i;:::-;29892:5;29889:34;29879:62;;29937:1;29934;29927:12;29879:62;29827:120;:::o;29953:122::-;30026:24;30044:5;30026:24;:::i;:::-;30019:5;30016:35;30006:63;;30065:1;30062;30055:12;30006:63;29953:122;:::o

Swarm Source

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