ETH Price: $3,355.87 (-3.40%)

Token

Peace on Marz (POM)
 

Overview

Max Total Supply

4,500 POM

Holders

1,108

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
4 POM
0xe89c7ff9d7c289fe7816cf7a36632d662b35c7f7
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:
PeaceOnMarz

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.17;

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


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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the total number of tokens in existence.
     * Burned tokens will reduce the count.
     * To get the total number of tokens minted, please see {_totalMinted}.
     */
    function totalSupply() external view returns (uint256);

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);

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

    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables
     * (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`,
     * checking first that contract recipients are aware of the ERC721 protocol
     * to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move
     * this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external payable;

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom}
     * whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external payable;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Mask of an entry in packed address data.
    uint256 private constant _BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

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

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

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

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

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

    // The bit mask of the `burned` bit in packed ownership.
    uint256 private constant _BITMASK_BURNED = 1 << 224;

    // The bit position of the `nextInitialized` bit in packed ownership.
    uint256 private constant _BITPOS_NEXT_INITIALIZED = 225;

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

    // The bit position of `extraData` in packed ownership.
    uint256 private constant _BITPOS_EXTRA_DATA = 232;

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

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

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

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

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

    // The next token ID to be minted.
    uint256 private _currentIndex;

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to ownership details
    // An empty struct value does not necessarily mean the token is unowned.
    // See {_packedOwnershipOf} implementation for details.
    //
    // Bits Layout:
    // - [0..159]   `addr`
    // - [160..223] `startTimestamp`
    // - [224]      `burned`
    // - [225]      `nextInitialized`
    // - [232..255] `extraData`
    mapping(uint256 => uint256) private _packedOwnerships;

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

    // Mapping from token ID to approved address.
    mapping(uint256 => TokenApprovalRef) private _tokenApprovals;

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

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

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

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

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

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

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

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

    /**
     * @dev Returns the total number of tokens burned.
     */
    function _totalBurned() internal view virtual returns (uint256) {
        return _burnCounter;
    }

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

    /**
     * @dev Returns the number of tokens in `owner`'s account.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        if (owner == address(0)) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & _BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

    /**
     * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return uint64(_packedAddressData[owner] >> _BITPOS_AUX);
    }

    /**
     * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used).
     * If there are multiple variables, please pack them into a uint64.
     */
    function _setAux(address owner, uint64 aux) internal virtual {
        uint256 packed = _packedAddressData[owner];
        uint256 auxCasted;
        // Cast `aux` with assembly to avoid redundant masking.
        assembly {
            auxCasted := aux
        }
        packed = (packed & _BITMASK_AUX_COMPLEMENT) | (auxCasted << _BITPOS_AUX);
        _packedAddressData[owner] = packed;
    }

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

    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * [EIP section](https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified)
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        // The interface IDs are constants representing the first 4 bytes
        // of the XOR of all function selectors in the interface.
        // See: [ERC165](https://eips.ethereum.org/EIPS/eip-165)
        // (e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)`)
        return
            interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165.
            interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721.
            interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata.
    }

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

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

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

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

        string memory baseURI = _baseURI();
        return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : '';
    }

    /**
     * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
     * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
     * by default, it can be overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return '';
    }

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

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

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

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

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

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & _BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an initialized ownership slot
                        // (i.e. `ownership.addr != address(0) && ownership.burned == false`)
                        // before an unintialized ownership slot
                        // (i.e. `ownership.addr == address(0) && ownership.burned == false`)
                        // Hence, `curr` will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed will be zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

    /**
     * @dev Returns the unpacked `TokenOwnership` struct from `packed`.
     */
    function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) {
        ownership.addr = address(uint160(packed));
        ownership.startTimestamp = uint64(packed >> _BITPOS_START_TIMESTAMP);
        ownership.burned = packed & _BITMASK_BURNED != 0;
        ownership.extraData = uint24(packed >> _BITPOS_EXTRA_DATA);
    }

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId].value;
    }

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom}
     * for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted. See {_mint}.
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return
            _startTokenId() <= tokenId &&
            tokenId < _currentIndex && // If within bounds,
            _packedOwnerships[tokenId] & _BITMASK_BURNED == 0; // and not burned.
    }

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

            // Updates:
            // - `address` to the next owner.
            // - `startTimestamp` to the timestamp of transfering.
            // - `burned` to `false`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                to,
                _BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked)
            );

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

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

    /**
     * @dev Equivalent to `safeTransferFrom(from, to, tokenId, '')`.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public payable virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token
     * by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement
     * {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public payable virtual override {
        transferFrom(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

    /**
     * @dev Private function to invoke {IERC721Receiver-onERC721Received} on a target contract.
     *
     * `from` - Previous owner of the given token ID.
     * `to` - Target address that will receive the token.
     * `tokenId` - Token ID to be transferred.
     * `_data` - Optional data to send along with the call.
     *
     * Returns whether the call correctly returned the expected magic value.
     */
    function _checkContractOnERC721Received(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) private returns (bool) {
        try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns (
            bytes4 retval
        ) {
            return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector;
        } catch (bytes memory reason) {
            if (reason.length == 0) {
                revert TransferToNonERC721ReceiverImplementer();
            } else {
                assembly {
                    revert(add(32, reason), mload(reason))
                }
            }
        }
    }

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

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

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

        // Overflows are incredibly unrealistic.
        // `balance` and `numberMinted` have a maximum limit of 2**64.
        // `tokenId` has a maximum limit of 2**256.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

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

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

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

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

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

        // Overflows are unrealistic due to the above check for `quantity` to be below the limit.
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the `balance` and `numberMinted`.
            _packedAddressData[to] += quantity * ((1 << _BITPOS_NUMBER_MINTED) | 1);

            // Updates:
            // - `address` to the owner.
            // - `startTimestamp` to the timestamp of minting.
            // - `burned` to `false`.
            // - `nextInitialized` to `quantity == 1`.
            _packedOwnerships[startTokenId] = _packOwnershipData(
                to,
                _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0)
            );

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

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256.
        unchecked {
            // Updates:
            // - `balance -= 1`.
            // - `numberBurned += 1`.
            //
            // We can directly decrement the balance, and increment the number burned.
            // This is equivalent to `packed -= 1; packed += 1 << _BITPOS_NUMBER_BURNED;`.
            _packedAddressData[from] += (1 << _BITPOS_NUMBER_BURNED) - 1;

            // Updates:
            // - `address` to the last owner.
            // - `startTimestamp` to the timestamp of burning.
            // - `burned` to `true`.
            // - `nextInitialized` to `true`.
            _packedOwnerships[tokenId] = _packOwnershipData(
                from,
                (_BITMASK_BURNED | _BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked)
            );

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

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

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

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

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

    /**
     * @dev Called during each token transfer to set the 24bit `extraData` field.
     * Intended to be overridden by the cosumer contract.
     *
     * `previousExtraData` - the value of `extraData` before transfer.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, `tokenId` will be burned by `from`.
     * - `from` and `to` are never both zero.
     */
    function _extraData(
        address from,
        address to,
        uint24 previousExtraData
    ) internal view virtual returns (uint24) {}

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

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

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

    /**
     * @dev Converts a uint256 to its ASCII string decimal representation.
     */
    function _toString(uint256 value) internal pure virtual returns (string memory str) {
        assembly {
            // The maximum value of a uint256 contains 78 digits (1 byte per digit), but
            // we allocate 0xa0 bytes to keep the free memory pointer 32-byte word aligned.
            // We will need 1 word for the trailing zeros padding, 1 word for the length,
            // and 3 words for a maximum of 78 digits. Total: 5 * 0x20 = 0xa0.
            let m := add(mload(0x40), 0xa0)
            // Update the free memory pointer to allocate.
            mstore(0x40, m)
            // Assign the `str` to the end.
            str := sub(m, 0x20)
            // Zeroize the slot after the string.
            mstore(str, 0)

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

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

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

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _status will be _NOT_ENTERED
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;
    }

    function _nonReentrantAfter() private {
        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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

contract PeaceOnMarz is Ownable, ERC721A, ReentrancyGuard {
    uint256 constant RESERVE_MINTS = 250; // Reserve for Vault
    uint256 constant MAX_SUPPLY = 4500;
    uint256 constant FREE_MINT = 4;

    string private _baseTokenURI;

    uint256 public MINT_START;

    address public WITHDRAW_ADDRESS;

    address public COMMUNITY_VAULT;

    address public whitelister;

    address[] public TEAM_ADDRESSES;

    mapping(address => uint256) public whitelistAddresses;

    constructor(address withdrawAddress, address vault,address _whitelister) ERC721A("Peace on Marz", "POM") {
        _baseTokenURI = "https://metadata.peaceonmarz.com/";
        MINT_START = 1670374800; // Launch Time
        COMMUNITY_VAULT = vault;
        whitelister = _whitelister;
        WITHDRAW_ADDRESS = withdrawAddress;

    }

    modifier onlyWhitelister() {
        require(whitelister == _msgSender(), "POM: caller != whitelister");
        _;
    }

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

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

    function contractURI() external view returns (string memory) {
        return _baseTokenURI;
    }

    function mintStarted() public view returns (bool) {
        return block.timestamp >= MINT_START;
    }

    /**
     * Returns the price of NFT.
     */
    function price(uint256 quantity) public pure returns (uint256) {
        return quantity * 0.005 ether;
    }

    function _beforeTokenTransfers(
        address,
        address,
        uint256,
        uint256 quantity
    ) internal override {
        if (owner() != _msgSender()) {
            require(_totalMinted() >= RESERVE_MINTS, "Vault reserve !minted");
            require(quantity <= 5, "batch mints > 5");

            require(mintStarted(), "Minting !started");
            require(_msgSender() == tx.origin, "Caller is not EOA");
            require(
                _totalMinted() + quantity <= MAX_SUPPLY,
                "Minting > max supply"
            );

            if (whitelistAddresses[_msgSender()] >= quantity) {
                whitelistAddresses[_msgSender()] =
                    whitelistAddresses[_msgSender()] -
                    quantity;
            } else {
                // Allow 3 free mint for
                uint256 minted = _numberMinted(_msgSender());
                uint256 chargedQuantity = 0;
                if(minted != 0 || quantity > FREE_MINT){
                    if(minted >= FREE_MINT || quantity >= (FREE_MINT - minted)){
                        chargedQuantity = minted < FREE_MINT
                            ? quantity - (FREE_MINT - minted)
                            : quantity;
                    }
                }

                require(
                    msg.value >= price(chargedQuantity),
                    "Did not send enough eth."
                );
            }
        }
    }

    function freeMintLeft(address _user) external view returns (uint256){
        uint mintLeft = 0;
        if(whitelistAddresses[_user] > 0) {
            return whitelistAddresses[_user];
        }

        uint256 minted = _numberMinted(_user);
        if(minted < FREE_MINT){
            mintLeft = FREE_MINT - minted;
        }

        return mintLeft;
    }

    function mint(uint256 quantity) external payable {
        _safeMint(_msgSender(), quantity);
    }

    function burn(uint256 tokenId) external {
        _burn(tokenId, true);
    }

    function totalMinted() external view returns (uint256) {
        return _totalMinted();
    }

    function totalBurned() external view returns (uint256) {
        return _totalBurned();
    }

    function mintToVault() external {
        require(_totalMinted() == 0, "NFTs minted to vault");
        require(TEAM_ADDRESSES.length > 0, "team addr empty");
        _safeMint(COMMUNITY_VAULT, RESERVE_MINTS);

        for (uint8 i = 0; i < TEAM_ADDRESSES.length; i++) {
            _safeMint(TEAM_ADDRESSES[i], 25);
        }
    }

    /// Admin Functions

    function setBaseTokenURI(string memory baseTokenURI) external onlyOwner {
        _baseTokenURI = baseTokenURI;
    }

    function withdraw() external onlyOwner nonReentrant {
        uint256 balance = address(this).balance;
        require(balance > 0, "NOTHING_TO_WITHDRAW");

        (bool success, ) = payable(WITHDRAW_ADDRESS).call{
            value: address(this).balance
        }("");
        require(success, "Transfer failed.");
    }

    function setWhitesaleAddresses(address[] calldata whitesales, uint8 quantity)
        external
        onlyWhitelister
    {
        for (uint256 i = 0; i < whitesales.length; i++) {
            if (whitelistAddresses[whitesales[i]] == 0) {
                // Avoid overriding balance
                whitelistAddresses[whitesales[i]] = quantity;
            }
        }
    }

    function setTeamAddresses(address[] calldata team_addresses)
        external
        onlyOwner
    {
        TEAM_ADDRESSES = team_addresses;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"withdrawAddress","type":"address"},{"internalType":"address","name":"vault","type":"address"},{"internalType":"address","name":"_whitelister","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"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":[],"name":"COMMUNITY_VAULT","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_START","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"TEAM_ADDRESSES","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"WITHDRAW_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"}],"name":"freeMintLeft","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintToVault","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseTokenURI","type":"string"}],"name":"setBaseTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"team_addresses","type":"address[]"}],"name":"setTeamAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"whitesales","type":"address[]"},{"internalType":"uint8","name":"quantity","type":"uint8"}],"name":"setWhitesaleAddresses","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":"totalBurned","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalMinted","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":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelistAddresses","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelister","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620044e2380380620044e2833981810160405281019062000037919062000348565b6040518060400160405280600d81526020017f5065616365206f6e204d61727a000000000000000000000000000000000000008152506040518060400160405280600381526020017f504f4d0000000000000000000000000000000000000000000000000000000000815250620000c3620000b76200020960201b60201c565b6200021160201b60201c565b8160039081620000d491906200061e565b508060049081620000e691906200061e565b50620000f7620002d560201b60201c565b60018190555050506001600981905550604051806060016040528060218152602001620044c160219139600a90816200013191906200061e565b5063638fe590600b8190555081600d60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600e60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050505062000705565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60006001905090565b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200031082620002e3565b9050919050565b620003228162000303565b81146200032e57600080fd5b50565b600081519050620003428162000317565b92915050565b600080600060608486031215620003645762000363620002de565b5b6000620003748682870162000331565b9350506020620003878682870162000331565b92505060406200039a8682870162000331565b9150509250925092565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200042657607f821691505b6020821081036200043c576200043b620003de565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004a67fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000467565b620004b2868362000467565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004ff620004f9620004f384620004ca565b620004d4565b620004ca565b9050919050565b6000819050919050565b6200051b83620004de565b620005336200052a8262000506565b84845462000474565b825550505050565b600090565b6200054a6200053b565b6200055781848462000510565b505050565b5b818110156200057f576200057360008262000540565b6001810190506200055d565b5050565b601f821115620005ce57620005988162000442565b620005a38462000457565b81016020851015620005b3578190505b620005cb620005c28562000457565b8301826200055c565b50505b505050565b600082821c905092915050565b6000620005f360001984600802620005d3565b1980831691505092915050565b60006200060e8383620005e0565b9150826002028217905092915050565b6200062982620003a4565b67ffffffffffffffff811115620006455762000644620003af565b5b6200065182546200040d565b6200065e82828562000583565b600060209050601f83116001811462000696576000841562000681578287015190505b6200068d858262000600565b865550620006fd565b601f198416620006a68662000442565b60005b82811015620006d057848901518255600182019150602085019450602081019050620006a9565b86831015620006f05784890151620006ec601f891682620005e0565b8355505b6001600288020188555050505b505050505050565b613dac80620007156000396000f3fe60806040526004361061020f5760003560e01c8063715018a611610118578063a9722cf3116100a0578063d89135cd1161006f578063d89135cd1461075c578063e8a3d48514610787578063e985e9c5146107b2578063f2fde38b146107ef578063fe625fb6146108185761020f565b8063a9722cf3146106ad578063b88d4fde146106d8578063c6374d0c146106f4578063c87b56dd1461071f5761020f565b806395d89b41116100e757806395d89b41146105e75780639bcae51014610612578063a0712d681461063d578063a22cb46514610659578063a2309ff8146106825761020f565b8063715018a61461053f5780637da104cf1461055657806387108a4d1461057f5780638da5cb5b146105bc5761020f565b806326a49e371161019b57806342966c681161016a57806342966c68146104225780634b20b7a71461044b5780636352211e1461048857806369ddd67d146104c557806370a08231146105025761020f565b806326a49e371461038957806330176e13146103c65780633ccfd60b146103ef57806342842e0e146104065761020f565b8063122e04a8116101e2578063122e04a8146102d557806318160ddd1461030057806319caedd01461032b57806322758a4a1461034257806323b872dd1461036d5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612a0a565b610841565b6040516102489190612a52565b60405180910390f35b34801561025d57600080fd5b506102666108d3565b6040516102739190612afd565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612b55565b610965565b6040516102b09190612bc3565b60405180910390f35b6102d360048036038101906102ce9190612c0a565b6109e4565b005b3480156102e157600080fd5b506102ea610b28565b6040516102f79190612bc3565b60405180910390f35b34801561030c57600080fd5b50610315610b4e565b6040516103229190612c59565b60405180910390f35b34801561033757600080fd5b50610340610b65565b005b34801561034e57600080fd5b50610357610c99565b6040516103649190612bc3565b60405180910390f35b61038760048036038101906103829190612c74565b610cbf565b005b34801561039557600080fd5b506103b060048036038101906103ab9190612b55565b610fe1565b6040516103bd9190612c59565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e89190612dfc565b610ffd565b005b3480156103fb57600080fd5b50610404611018565b005b610420600480360381019061041b9190612c74565b61114a565b005b34801561042e57600080fd5b5061044960048036038101906104449190612b55565b61116a565b005b34801561045757600080fd5b50610472600480360381019061046d9190612e45565b611178565b60405161047f9190612c59565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190612b55565b611240565b6040516104bc9190612bc3565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612e45565b611252565b6040516104f99190612c59565b60405180910390f35b34801561050e57600080fd5b5061052960048036038101906105249190612e45565b61126a565b6040516105369190612c59565b60405180910390f35b34801561054b57600080fd5b50610554611322565b005b34801561056257600080fd5b5061057d60048036038101906105789190612f0b565b611336565b005b34801561058b57600080fd5b506105a660048036038101906105a19190612b55565b6114d1565b6040516105b39190612bc3565b60405180910390f35b3480156105c857600080fd5b506105d1611510565b6040516105de9190612bc3565b60405180910390f35b3480156105f357600080fd5b506105fc611539565b6040516106099190612afd565b60405180910390f35b34801561061e57600080fd5b506106276115cb565b6040516106349190612bc3565b60405180910390f35b61065760048036038101906106529190612b55565b6115f1565b005b34801561066557600080fd5b50610680600480360381019061067b9190612f97565b611605565b005b34801561068e57600080fd5b50610697611710565b6040516106a49190612c59565b60405180910390f35b3480156106b957600080fd5b506106c261171f565b6040516106cf9190612a52565b60405180910390f35b6106f260048036038101906106ed9190613078565b61172c565b005b34801561070057600080fd5b5061070961179f565b6040516107169190612c59565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190612b55565b6117a5565b6040516107539190612afd565b60405180910390f35b34801561076857600080fd5b50610771611843565b60405161077e9190612c59565b60405180910390f35b34801561079357600080fd5b5061079c611852565b6040516107a99190612afd565b60405180910390f35b3480156107be57600080fd5b506107d960048036038101906107d491906130fb565b6118e4565b6040516107e69190612a52565b60405180910390f35b3480156107fb57600080fd5b5061081660048036038101906108119190612e45565b611978565b005b34801561082457600080fd5b5061083f600480360381019061083a919061313b565b6119fb565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108cc5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546108e2906131b7565b80601f016020809104026020016040519081016040528092919081815260200182805461090e906131b7565b801561095b5780601f106109305761010080835404028352916020019161095b565b820191906000526020600020905b81548152906001019060200180831161093e57829003601f168201915b5050505050905090565b600061097082611a19565b6109a6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109ef82611240565b90508073ffffffffffffffffffffffffffffffffffffffff16610a10611a78565b73ffffffffffffffffffffffffffffffffffffffff1614610a7357610a3c81610a37611a78565b6118e4565b610a72576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610b58611a80565b6002546001540303905090565b6000610b6f611a89565b14610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba690613234565b60405180910390fd5b6000600f8054905011610bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bee906132a0565b60405180910390fd5b610c24600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660fa611a9c565b60005b600f805490508160ff161015610c9657610c83600f8260ff1681548110610c5157610c506132c0565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166019611a9c565b8080610c8e9061331e565b915050610c27565b50565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610cca82611aba565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d31576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d3d84611b86565b91509150610d538187610d4e611a78565b611bad565b610d9f57610d6886610d63611a78565b6118e4565b610d9e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e05576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e128686866001611bf1565b8015610e1d57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610eeb85610ec7888887611f8d565b7c020000000000000000000000000000000000000000000000000000000017611fb5565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f715760006001850190506000600560008381526020019081526020016000205403610f6f576001548114610f6e578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fd98686866001611fe0565b505050505050565b60006611c37937e0800082610ff69190613347565b9050919050565b611005611fe6565b80600a90816110149190613535565b5050565b611020611fe6565b611028612064565b600047905060008111611070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106790613653565b60405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516110b8906136a4565b60006040518083038185875af1925050503d80600081146110f5576040519150601f19603f3d011682016040523d82523d6000602084013e6110fa565b606091505b505090508061113e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113590613705565b60405180910390fd5b50506111486120b3565b565b6111658383836040518060200160405280600081525061172c565b505050565b6111758160016120bd565b50565b600080600090506000601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561120f57601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491505061123b565b600061121a8461230f565b90506004811015611235578060046112329190613725565b91505b81925050505b919050565b600061124b82611aba565b9050919050565b60106020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112d1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61132a611fe6565b6113346000612366565b565b61133e61242a565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c4906137a5565b60405180910390fd5b60005b838390508110156114cb576000601060008686858181106113f4576113f36132c0565b5b90506020020160208101906114099190612e45565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036114b8578160ff1660106000868685818110611464576114636132c0565b5b90506020020160208101906114799190612e45565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b80806114c3906137c5565b9150506113d0565b50505050565b600f81815481106114e157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611548906131b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611574906131b7565b80156115c15780601f10611596576101008083540402835291602001916115c1565b820191906000526020600020905b8154815290600101906020018083116115a457829003601f168201915b5050505050905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6116026115fc61242a565b82611a9c565b50565b8060086000611612611a78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116bf611a78565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117049190612a52565b60405180910390a35050565b600061171a611a89565b905090565b6000600b54421015905090565b611737848484610cbf565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117995761176284848484612432565b611798576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600b5481565b60606117b082611a19565b6117e6576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117f0612582565b90506000815103611810576040518060200160405280600081525061183b565b8061181a84612614565b60405160200161182b929190613849565b6040516020818303038152906040525b915050919050565b600061184d612664565b905090565b6060600a8054611861906131b7565b80601f016020809104026020016040519081016040528092919081815260200182805461188d906131b7565b80156118da5780601f106118af576101008083540402835291602001916118da565b820191906000526020600020905b8154815290600101906020018083116118bd57829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611980611fe6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e6906138df565b60405180910390fd5b6119f881612366565b50565b611a03611fe6565b8181600f9190611a149291906128e1565b505050565b600081611a24611a80565b11158015611a33575060015482105b8015611a71575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000611a93611a80565b60015403905090565b611ab682826040518060200160405280600081525061266e565b5050565b60008082905080611ac9611a80565b11611b4f57600154811015611b4e5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611b4c575b60008103611b42576005600083600190039350838152602001908152602001600020549050611b18565b8092505050611b81565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b611bf961242a565b73ffffffffffffffffffffffffffffffffffffffff16611c17611510565b73ffffffffffffffffffffffffffffffffffffffff1614611f875760fa611c3c611a89565b1015611c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c749061394b565b60405180910390fd5b6005811115611cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb8906139b7565b60405180910390fd5b611cc961171f565b611d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cff90613a23565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff16611d2761242a565b73ffffffffffffffffffffffffffffffffffffffff1614611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7490613a8f565b60405180910390fd5b61119481611d89611a89565b611d939190613aaf565b1115611dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcb90613b2f565b60405180910390fd5b8060106000611de161242a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611ec2578060106000611e2e61242a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e739190613725565b60106000611e7f61242a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f86565b6000611ed4611ecf61242a565b61230f565b905060008082141580611ee75750600483115b15611f3857600482101580611f085750816004611f049190613725565b8310155b15611f375760048210611f1b5782611f34565b816004611f289190613725565b83611f339190613725565b5b90505b5b611f4181610fe1565b341015611f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7a90613b9b565b60405180910390fd5b50505b5b50505050565b60008060e883901c905060e8611fa486868461270c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611fee61242a565b73ffffffffffffffffffffffffffffffffffffffff1661200c611510565b73ffffffffffffffffffffffffffffffffffffffff1614612062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205990613c07565b60405180910390fd5b565b6002600954036120a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a090613c73565b60405180910390fd5b6002600981905550565b6001600981905550565b60006120c883611aba565b905060008190506000806120db86611b86565b915091508415612144576120f781846120f2611a78565b611bad565b6121435761210c83612107611a78565b6118e4565b612142576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612152836000886001611bf1565b801561215d57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612205836121c285600088611f8d565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717611fb5565b600560008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085160361228b5760006001870190506000600560008381526020019081526020016000205403612289576001548114612288578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122f5836000886001611fe0565b600260008154809291906001019190505550505050505050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612458611a78565b8786866040518563ffffffff1660e01b815260040161247a9493929190613ce8565b6020604051808303816000875af19250505080156124b657506040513d601f19601f820116820180604052508101906124b39190613d49565b60015b61252f573d80600081146124e6576040519150601f19603f3d011682016040523d82523d6000602084013e6124eb565b606091505b506000815103612527576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054612591906131b7565b80601f01602080910402602001604051908101604052809291908181526020018280546125bd906131b7565b801561260a5780601f106125df5761010080835404028352916020019161260a565b820191906000526020600020905b8154815290600101906020018083116125ed57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561264f57600184039350600a81066030018453600a810490508061262d575b50828103602084039350808452505050919050565b6000600254905090565b6126788383612715565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127075760006001549050600083820390505b6126b96000868380600101945086612432565b6126ef576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106126a657816001541461270457600080fd5b50505b505050565b60009392505050565b6000600154905060008203612756576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127636000848385611bf1565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506127da836127cb6000866000611f8d565b6127d4856128d1565b17611fb5565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461287b57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612840565b50600082036128b6576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506128cc6000848385611fe0565b505050565b60006001821460e11b9050919050565b828054828255906000526020600020908101928215612970579160200282015b8281111561296f57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612901565b5b50905061297d9190612981565b5090565b5b8082111561299a576000816000905550600101612982565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129e7816129b2565b81146129f257600080fd5b50565b600081359050612a04816129de565b92915050565b600060208284031215612a2057612a1f6129a8565b5b6000612a2e848285016129f5565b91505092915050565b60008115159050919050565b612a4c81612a37565b82525050565b6000602082019050612a676000830184612a43565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612aa7578082015181840152602081019050612a8c565b60008484015250505050565b6000601f19601f8301169050919050565b6000612acf82612a6d565b612ad98185612a78565b9350612ae9818560208601612a89565b612af281612ab3565b840191505092915050565b60006020820190508181036000830152612b178184612ac4565b905092915050565b6000819050919050565b612b3281612b1f565b8114612b3d57600080fd5b50565b600081359050612b4f81612b29565b92915050565b600060208284031215612b6b57612b6a6129a8565b5b6000612b7984828501612b40565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bad82612b82565b9050919050565b612bbd81612ba2565b82525050565b6000602082019050612bd86000830184612bb4565b92915050565b612be781612ba2565b8114612bf257600080fd5b50565b600081359050612c0481612bde565b92915050565b60008060408385031215612c2157612c206129a8565b5b6000612c2f85828601612bf5565b9250506020612c4085828601612b40565b9150509250929050565b612c5381612b1f565b82525050565b6000602082019050612c6e6000830184612c4a565b92915050565b600080600060608486031215612c8d57612c8c6129a8565b5b6000612c9b86828701612bf5565b9350506020612cac86828701612bf5565b9250506040612cbd86828701612b40565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d0982612ab3565b810181811067ffffffffffffffff82111715612d2857612d27612cd1565b5b80604052505050565b6000612d3b61299e565b9050612d478282612d00565b919050565b600067ffffffffffffffff821115612d6757612d66612cd1565b5b612d7082612ab3565b9050602081019050919050565b82818337600083830152505050565b6000612d9f612d9a84612d4c565b612d31565b905082815260208101848484011115612dbb57612dba612ccc565b5b612dc6848285612d7d565b509392505050565b600082601f830112612de357612de2612cc7565b5b8135612df3848260208601612d8c565b91505092915050565b600060208284031215612e1257612e116129a8565b5b600082013567ffffffffffffffff811115612e3057612e2f6129ad565b5b612e3c84828501612dce565b91505092915050565b600060208284031215612e5b57612e5a6129a8565b5b6000612e6984828501612bf5565b91505092915050565b600080fd5b600080fd5b60008083601f840112612e9257612e91612cc7565b5b8235905067ffffffffffffffff811115612eaf57612eae612e72565b5b602083019150836020820283011115612ecb57612eca612e77565b5b9250929050565b600060ff82169050919050565b612ee881612ed2565b8114612ef357600080fd5b50565b600081359050612f0581612edf565b92915050565b600080600060408486031215612f2457612f236129a8565b5b600084013567ffffffffffffffff811115612f4257612f416129ad565b5b612f4e86828701612e7c565b93509350506020612f6186828701612ef6565b9150509250925092565b612f7481612a37565b8114612f7f57600080fd5b50565b600081359050612f9181612f6b565b92915050565b60008060408385031215612fae57612fad6129a8565b5b6000612fbc85828601612bf5565b9250506020612fcd85828601612f82565b9150509250929050565b600067ffffffffffffffff821115612ff257612ff1612cd1565b5b612ffb82612ab3565b9050602081019050919050565b600061301b61301684612fd7565b612d31565b90508281526020810184848401111561303757613036612ccc565b5b613042848285612d7d565b509392505050565b600082601f83011261305f5761305e612cc7565b5b813561306f848260208601613008565b91505092915050565b60008060008060808587031215613092576130916129a8565b5b60006130a087828801612bf5565b94505060206130b187828801612bf5565b93505060406130c287828801612b40565b925050606085013567ffffffffffffffff8111156130e3576130e26129ad565b5b6130ef8782880161304a565b91505092959194509250565b60008060408385031215613112576131116129a8565b5b600061312085828601612bf5565b925050602061313185828601612bf5565b9150509250929050565b60008060208385031215613152576131516129a8565b5b600083013567ffffffffffffffff8111156131705761316f6129ad565b5b61317c85828601612e7c565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131cf57607f821691505b6020821081036131e2576131e1613188565b5b50919050565b7f4e465473206d696e74656420746f207661756c74000000000000000000000000600082015250565b600061321e601483612a78565b9150613229826131e8565b602082019050919050565b6000602082019050818103600083015261324d81613211565b9050919050565b7f7465616d206164647220656d7074790000000000000000000000000000000000600082015250565b600061328a600f83612a78565b915061329582613254565b602082019050919050565b600060208201905081810360008301526132b98161327d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061332982612ed2565b915060ff820361333c5761333b6132ef565b5b600182019050919050565b600061335282612b1f565b915061335d83612b1f565b925082820261336b81612b1f565b91508282048414831517613382576133816132ef565b5b5092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026133eb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826133ae565b6133f586836133ae565b95508019841693508086168417925050509392505050565b6000819050919050565b600061343261342d61342884612b1f565b61340d565b612b1f565b9050919050565b6000819050919050565b61344c83613417565b61346061345882613439565b8484546133bb565b825550505050565b600090565b613475613468565b613480818484613443565b505050565b5b818110156134a45761349960008261346d565b600181019050613486565b5050565b601f8211156134e9576134ba81613389565b6134c38461339e565b810160208510156134d2578190505b6134e66134de8561339e565b830182613485565b50505b505050565b600082821c905092915050565b600061350c600019846008026134ee565b1980831691505092915050565b600061352583836134fb565b9150826002028217905092915050565b61353e82612a6d565b67ffffffffffffffff81111561355757613556612cd1565b5b61356182546131b7565b61356c8282856134a8565b600060209050601f83116001811461359f576000841561358d578287015190505b6135978582613519565b8655506135ff565b601f1984166135ad86613389565b60005b828110156135d5578489015182556001820191506020850194506020810190506135b0565b868310156135f257848901516135ee601f8916826134fb565b8355505b6001600288020188555050505b505050505050565b7f4e4f5448494e475f544f5f574954484452415700000000000000000000000000600082015250565b600061363d601383612a78565b915061364882613607565b602082019050919050565b6000602082019050818103600083015261366c81613630565b9050919050565b600081905092915050565b50565b600061368e600083613673565b91506136998261367e565b600082019050919050565b60006136af82613681565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006136ef601083612a78565b91506136fa826136b9565b602082019050919050565b6000602082019050818103600083015261371e816136e2565b9050919050565b600061373082612b1f565b915061373b83612b1f565b9250828203905081811115613753576137526132ef565b5b92915050565b7f504f4d3a2063616c6c657220213d2077686974656c6973746572000000000000600082015250565b600061378f601a83612a78565b915061379a82613759565b602082019050919050565b600060208201905081810360008301526137be81613782565b9050919050565b60006137d082612b1f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613802576138016132ef565b5b600182019050919050565b600081905092915050565b600061382382612a6d565b61382d818561380d565b935061383d818560208601612a89565b80840191505092915050565b60006138558285613818565b91506138618284613818565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006138c9602683612a78565b91506138d48261386d565b604082019050919050565b600060208201905081810360008301526138f8816138bc565b9050919050565b7f5661756c74207265736572766520216d696e7465640000000000000000000000600082015250565b6000613935601583612a78565b9150613940826138ff565b602082019050919050565b6000602082019050818103600083015261396481613928565b9050919050565b7f6261746368206d696e7473203e20350000000000000000000000000000000000600082015250565b60006139a1600f83612a78565b91506139ac8261396b565b602082019050919050565b600060208201905081810360008301526139d081613994565b9050919050565b7f4d696e74696e6720217374617274656400000000000000000000000000000000600082015250565b6000613a0d601083612a78565b9150613a18826139d7565b602082019050919050565b60006020820190508181036000830152613a3c81613a00565b9050919050565b7f43616c6c6572206973206e6f7420454f41000000000000000000000000000000600082015250565b6000613a79601183612a78565b9150613a8482613a43565b602082019050919050565b60006020820190508181036000830152613aa881613a6c565b9050919050565b6000613aba82612b1f565b9150613ac583612b1f565b9250828201905080821115613add57613adc6132ef565b5b92915050565b7f4d696e74696e67203e206d617820737570706c79000000000000000000000000600082015250565b6000613b19601483612a78565b9150613b2482613ae3565b602082019050919050565b60006020820190508181036000830152613b4881613b0c565b9050919050565b7f446964206e6f742073656e6420656e6f756768206574682e0000000000000000600082015250565b6000613b85601883612a78565b9150613b9082613b4f565b602082019050919050565b60006020820190508181036000830152613bb481613b78565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bf1602083612a78565b9150613bfc82613bbb565b602082019050919050565b60006020820190508181036000830152613c2081613be4565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613c5d601f83612a78565b9150613c6882613c27565b602082019050919050565b60006020820190508181036000830152613c8c81613c50565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613cba82613c93565b613cc48185613c9e565b9350613cd4818560208601612a89565b613cdd81612ab3565b840191505092915050565b6000608082019050613cfd6000830187612bb4565b613d0a6020830186612bb4565b613d176040830185612c4a565b8181036060830152613d298184613caf565b905095945050505050565b600081519050613d43816129de565b92915050565b600060208284031215613d5f57613d5e6129a8565b5b6000613d6d84828501613d34565b9150509291505056fea2646970667358221220bde4c82cf06989eafe00724b9ae23d7fce0e089dd46aa2ff09951cc8bfdb6e8464736f6c6343000811003368747470733a2f2f6d657461646174612e70656163656f6e6d61727a2e636f6d2f0000000000000000000000007007aeeac69204505a91acdc7ee0afd84a011edf0000000000000000000000007007aeeac69204505a91acdc7ee0afd84a011edf000000000000000000000000f41584610884054c86825ffcd5af4b6060327750

Deployed Bytecode

0x60806040526004361061020f5760003560e01c8063715018a611610118578063a9722cf3116100a0578063d89135cd1161006f578063d89135cd1461075c578063e8a3d48514610787578063e985e9c5146107b2578063f2fde38b146107ef578063fe625fb6146108185761020f565b8063a9722cf3146106ad578063b88d4fde146106d8578063c6374d0c146106f4578063c87b56dd1461071f5761020f565b806395d89b41116100e757806395d89b41146105e75780639bcae51014610612578063a0712d681461063d578063a22cb46514610659578063a2309ff8146106825761020f565b8063715018a61461053f5780637da104cf1461055657806387108a4d1461057f5780638da5cb5b146105bc5761020f565b806326a49e371161019b57806342966c681161016a57806342966c68146104225780634b20b7a71461044b5780636352211e1461048857806369ddd67d146104c557806370a08231146105025761020f565b806326a49e371461038957806330176e13146103c65780633ccfd60b146103ef57806342842e0e146104065761020f565b8063122e04a8116101e2578063122e04a8146102d557806318160ddd1461030057806319caedd01461032b57806322758a4a1461034257806323b872dd1461036d5761020f565b806301ffc9a71461021457806306fdde0314610251578063081812fc1461027c578063095ea7b3146102b9575b600080fd5b34801561022057600080fd5b5061023b60048036038101906102369190612a0a565b610841565b6040516102489190612a52565b60405180910390f35b34801561025d57600080fd5b506102666108d3565b6040516102739190612afd565b60405180910390f35b34801561028857600080fd5b506102a3600480360381019061029e9190612b55565b610965565b6040516102b09190612bc3565b60405180910390f35b6102d360048036038101906102ce9190612c0a565b6109e4565b005b3480156102e157600080fd5b506102ea610b28565b6040516102f79190612bc3565b60405180910390f35b34801561030c57600080fd5b50610315610b4e565b6040516103229190612c59565b60405180910390f35b34801561033757600080fd5b50610340610b65565b005b34801561034e57600080fd5b50610357610c99565b6040516103649190612bc3565b60405180910390f35b61038760048036038101906103829190612c74565b610cbf565b005b34801561039557600080fd5b506103b060048036038101906103ab9190612b55565b610fe1565b6040516103bd9190612c59565b60405180910390f35b3480156103d257600080fd5b506103ed60048036038101906103e89190612dfc565b610ffd565b005b3480156103fb57600080fd5b50610404611018565b005b610420600480360381019061041b9190612c74565b61114a565b005b34801561042e57600080fd5b5061044960048036038101906104449190612b55565b61116a565b005b34801561045757600080fd5b50610472600480360381019061046d9190612e45565b611178565b60405161047f9190612c59565b60405180910390f35b34801561049457600080fd5b506104af60048036038101906104aa9190612b55565b611240565b6040516104bc9190612bc3565b60405180910390f35b3480156104d157600080fd5b506104ec60048036038101906104e79190612e45565b611252565b6040516104f99190612c59565b60405180910390f35b34801561050e57600080fd5b5061052960048036038101906105249190612e45565b61126a565b6040516105369190612c59565b60405180910390f35b34801561054b57600080fd5b50610554611322565b005b34801561056257600080fd5b5061057d60048036038101906105789190612f0b565b611336565b005b34801561058b57600080fd5b506105a660048036038101906105a19190612b55565b6114d1565b6040516105b39190612bc3565b60405180910390f35b3480156105c857600080fd5b506105d1611510565b6040516105de9190612bc3565b60405180910390f35b3480156105f357600080fd5b506105fc611539565b6040516106099190612afd565b60405180910390f35b34801561061e57600080fd5b506106276115cb565b6040516106349190612bc3565b60405180910390f35b61065760048036038101906106529190612b55565b6115f1565b005b34801561066557600080fd5b50610680600480360381019061067b9190612f97565b611605565b005b34801561068e57600080fd5b50610697611710565b6040516106a49190612c59565b60405180910390f35b3480156106b957600080fd5b506106c261171f565b6040516106cf9190612a52565b60405180910390f35b6106f260048036038101906106ed9190613078565b61172c565b005b34801561070057600080fd5b5061070961179f565b6040516107169190612c59565b60405180910390f35b34801561072b57600080fd5b5061074660048036038101906107419190612b55565b6117a5565b6040516107539190612afd565b60405180910390f35b34801561076857600080fd5b50610771611843565b60405161077e9190612c59565b60405180910390f35b34801561079357600080fd5b5061079c611852565b6040516107a99190612afd565b60405180910390f35b3480156107be57600080fd5b506107d960048036038101906107d491906130fb565b6118e4565b6040516107e69190612a52565b60405180910390f35b3480156107fb57600080fd5b5061081660048036038101906108119190612e45565b611978565b005b34801561082457600080fd5b5061083f600480360381019061083a919061313b565b6119fb565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089c57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108cc5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600380546108e2906131b7565b80601f016020809104026020016040519081016040528092919081815260200182805461090e906131b7565b801561095b5780601f106109305761010080835404028352916020019161095b565b820191906000526020600020905b81548152906001019060200180831161093e57829003601f168201915b5050505050905090565b600061097082611a19565b6109a6576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6007600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109ef82611240565b90508073ffffffffffffffffffffffffffffffffffffffff16610a10611a78565b73ffffffffffffffffffffffffffffffffffffffff1614610a7357610a3c81610a37611a78565b6118e4565b610a72576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826007600084815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610b58611a80565b6002546001540303905090565b6000610b6f611a89565b14610baf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba690613234565b60405180910390fd5b6000600f8054905011610bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bee906132a0565b60405180910390fd5b610c24600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1660fa611a9c565b60005b600f805490508160ff161015610c9657610c83600f8260ff1681548110610c5157610c506132c0565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff166019611a9c565b8080610c8e9061331e565b915050610c27565b50565b600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6000610cca82611aba565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d31576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610d3d84611b86565b91509150610d538187610d4e611a78565b611bad565b610d9f57610d6886610d63611a78565b6118e4565b610d9e576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610e05576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610e128686866001611bf1565b8015610e1d57600082555b600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610eeb85610ec7888887611f8d565b7c020000000000000000000000000000000000000000000000000000000017611fb5565b600560008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f715760006001850190506000600560008381526020019081526020016000205403610f6f576001548114610f6e578360056000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610fd98686866001611fe0565b505050505050565b60006611c37937e0800082610ff69190613347565b9050919050565b611005611fe6565b80600a90816110149190613535565b5050565b611020611fe6565b611028612064565b600047905060008111611070576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106790613653565b60405180910390fd5b6000600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516110b8906136a4565b60006040518083038185875af1925050503d80600081146110f5576040519150601f19603f3d011682016040523d82523d6000602084013e6110fa565b606091505b505090508061113e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113590613705565b60405180910390fd5b50506111486120b3565b565b6111658383836040518060200160405280600081525061172c565b505050565b6111758160016120bd565b50565b600080600090506000601060008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054111561120f57601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205491505061123b565b600061121a8461230f565b90506004811015611235578060046112329190613725565b91505b81925050505b919050565b600061124b82611aba565b9050919050565b60106020528060005260406000206000915090505481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112d1576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61132a611fe6565b6113346000612366565b565b61133e61242a565b73ffffffffffffffffffffffffffffffffffffffff16600e60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146113cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113c4906137a5565b60405180910390fd5b60005b838390508110156114cb576000601060008686858181106113f4576113f36132c0565b5b90506020020160208101906114099190612e45565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054036114b8578160ff1660106000868685818110611464576114636132c0565b5b90506020020160208101906114799190612e45565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505b80806114c3906137c5565b9150506113d0565b50505050565b600f81815481106114e157600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060048054611548906131b7565b80601f0160208091040260200160405190810160405280929190818152602001828054611574906131b7565b80156115c15780601f10611596576101008083540402835291602001916115c1565b820191906000526020600020905b8154815290600101906020018083116115a457829003601f168201915b5050505050905090565b600d60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6116026115fc61242a565b82611a9c565b50565b8060086000611612611a78565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166116bf611a78565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516117049190612a52565b60405180910390a35050565b600061171a611a89565b905090565b6000600b54421015905090565b611737848484610cbf565b60008373ffffffffffffffffffffffffffffffffffffffff163b146117995761176284848484612432565b611798576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b600b5481565b60606117b082611a19565b6117e6576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006117f0612582565b90506000815103611810576040518060200160405280600081525061183b565b8061181a84612614565b60405160200161182b929190613849565b6040516020818303038152906040525b915050919050565b600061184d612664565b905090565b6060600a8054611861906131b7565b80601f016020809104026020016040519081016040528092919081815260200182805461188d906131b7565b80156118da5780601f106118af576101008083540402835291602001916118da565b820191906000526020600020905b8154815290600101906020018083116118bd57829003601f168201915b5050505050905090565b6000600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611980611fe6565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16036119ef576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119e6906138df565b60405180910390fd5b6119f881612366565b50565b611a03611fe6565b8181600f9190611a149291906128e1565b505050565b600081611a24611a80565b11158015611a33575060015482105b8015611a71575060007c0100000000000000000000000000000000000000000000000000000000600560008581526020019081526020016000205416145b9050919050565b600033905090565b60006001905090565b6000611a93611a80565b60015403905090565b611ab682826040518060200160405280600081525061266e565b5050565b60008082905080611ac9611a80565b11611b4f57600154811015611b4e5760006005600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611b4c575b60008103611b42576005600083600190039350838152602001908152602001600020549050611b18565b8092505050611b81565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b60008060006007600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b611bf961242a565b73ffffffffffffffffffffffffffffffffffffffff16611c17611510565b73ffffffffffffffffffffffffffffffffffffffff1614611f875760fa611c3c611a89565b1015611c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c749061394b565b60405180910390fd5b6005811115611cc1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb8906139b7565b60405180910390fd5b611cc961171f565b611d08576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cff90613a23565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff16611d2761242a565b73ffffffffffffffffffffffffffffffffffffffff1614611d7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7490613a8f565b60405180910390fd5b61119481611d89611a89565b611d939190613aaf565b1115611dd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dcb90613b2f565b60405180910390fd5b8060106000611de161242a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410611ec2578060106000611e2e61242a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e739190613725565b60106000611e7f61242a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550611f86565b6000611ed4611ecf61242a565b61230f565b905060008082141580611ee75750600483115b15611f3857600482101580611f085750816004611f049190613725565b8310155b15611f375760048210611f1b5782611f34565b816004611f289190613725565b83611f339190613725565b5b90505b5b611f4181610fe1565b341015611f83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f7a90613b9b565b60405180910390fd5b50505b5b50505050565b60008060e883901c905060e8611fa486868461270c565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b611fee61242a565b73ffffffffffffffffffffffffffffffffffffffff1661200c611510565b73ffffffffffffffffffffffffffffffffffffffff1614612062576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205990613c07565b60405180910390fd5b565b6002600954036120a9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a090613c73565b60405180910390fd5b6002600981905550565b6001600981905550565b60006120c883611aba565b905060008190506000806120db86611b86565b915091508415612144576120f781846120f2611a78565b611bad565b6121435761210c83612107611a78565b6118e4565b612142576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b5b612152836000886001611bf1565b801561215d57600082555b600160806001901b03600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612205836121c285600088611f8d565b7c02000000000000000000000000000000000000000000000000000000007c01000000000000000000000000000000000000000000000000000000001717611fb5565b600560008881526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000085160361228b5760006001870190506000600560008381526020019081526020016000205403612289576001548114612288578460056000838152602001908152602001600020819055505b5b505b85600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46122f5836000886001611fe0565b600260008154809291906001019190505550505050505050565b600067ffffffffffffffff6040600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054901c169050919050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600033905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612458611a78565b8786866040518563ffffffff1660e01b815260040161247a9493929190613ce8565b6020604051808303816000875af19250505080156124b657506040513d601f19601f820116820180604052508101906124b39190613d49565b60015b61252f573d80600081146124e6576040519150601f19603f3d011682016040523d82523d6000602084013e6124eb565b606091505b506000815103612527576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600a8054612591906131b7565b80601f01602080910402602001604051908101604052809291908181526020018280546125bd906131b7565b801561260a5780601f106125df5761010080835404028352916020019161260a565b820191906000526020600020905b8154815290600101906020018083116125ed57829003601f168201915b5050505050905090565b606060a060405101806040526020810391506000825281835b60011561264f57600184039350600a81066030018453600a810490508061262d575b50828103602084039350808452505050919050565b6000600254905090565b6126788383612715565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127075760006001549050600083820390505b6126b96000868380600101945086612432565b6126ef576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8181106126a657816001541461270457600080fd5b50505b505050565b60009392505050565b6000600154905060008203612756576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127636000848385611bf1565b600160406001901b178202600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055506127da836127cb6000866000611f8d565b6127d4856128d1565b17611fb5565b6005600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461287b57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612840565b50600082036128b6576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060018190555050506128cc6000848385611fe0565b505050565b60006001821460e11b9050919050565b828054828255906000526020600020908101928215612970579160200282015b8281111561296f57823573ffffffffffffffffffffffffffffffffffffffff168260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555091602001919060010190612901565b5b50905061297d9190612981565b5090565b5b8082111561299a576000816000905550600101612982565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129e7816129b2565b81146129f257600080fd5b50565b600081359050612a04816129de565b92915050565b600060208284031215612a2057612a1f6129a8565b5b6000612a2e848285016129f5565b91505092915050565b60008115159050919050565b612a4c81612a37565b82525050565b6000602082019050612a676000830184612a43565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612aa7578082015181840152602081019050612a8c565b60008484015250505050565b6000601f19601f8301169050919050565b6000612acf82612a6d565b612ad98185612a78565b9350612ae9818560208601612a89565b612af281612ab3565b840191505092915050565b60006020820190508181036000830152612b178184612ac4565b905092915050565b6000819050919050565b612b3281612b1f565b8114612b3d57600080fd5b50565b600081359050612b4f81612b29565b92915050565b600060208284031215612b6b57612b6a6129a8565b5b6000612b7984828501612b40565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bad82612b82565b9050919050565b612bbd81612ba2565b82525050565b6000602082019050612bd86000830184612bb4565b92915050565b612be781612ba2565b8114612bf257600080fd5b50565b600081359050612c0481612bde565b92915050565b60008060408385031215612c2157612c206129a8565b5b6000612c2f85828601612bf5565b9250506020612c4085828601612b40565b9150509250929050565b612c5381612b1f565b82525050565b6000602082019050612c6e6000830184612c4a565b92915050565b600080600060608486031215612c8d57612c8c6129a8565b5b6000612c9b86828701612bf5565b9350506020612cac86828701612bf5565b9250506040612cbd86828701612b40565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612d0982612ab3565b810181811067ffffffffffffffff82111715612d2857612d27612cd1565b5b80604052505050565b6000612d3b61299e565b9050612d478282612d00565b919050565b600067ffffffffffffffff821115612d6757612d66612cd1565b5b612d7082612ab3565b9050602081019050919050565b82818337600083830152505050565b6000612d9f612d9a84612d4c565b612d31565b905082815260208101848484011115612dbb57612dba612ccc565b5b612dc6848285612d7d565b509392505050565b600082601f830112612de357612de2612cc7565b5b8135612df3848260208601612d8c565b91505092915050565b600060208284031215612e1257612e116129a8565b5b600082013567ffffffffffffffff811115612e3057612e2f6129ad565b5b612e3c84828501612dce565b91505092915050565b600060208284031215612e5b57612e5a6129a8565b5b6000612e6984828501612bf5565b91505092915050565b600080fd5b600080fd5b60008083601f840112612e9257612e91612cc7565b5b8235905067ffffffffffffffff811115612eaf57612eae612e72565b5b602083019150836020820283011115612ecb57612eca612e77565b5b9250929050565b600060ff82169050919050565b612ee881612ed2565b8114612ef357600080fd5b50565b600081359050612f0581612edf565b92915050565b600080600060408486031215612f2457612f236129a8565b5b600084013567ffffffffffffffff811115612f4257612f416129ad565b5b612f4e86828701612e7c565b93509350506020612f6186828701612ef6565b9150509250925092565b612f7481612a37565b8114612f7f57600080fd5b50565b600081359050612f9181612f6b565b92915050565b60008060408385031215612fae57612fad6129a8565b5b6000612fbc85828601612bf5565b9250506020612fcd85828601612f82565b9150509250929050565b600067ffffffffffffffff821115612ff257612ff1612cd1565b5b612ffb82612ab3565b9050602081019050919050565b600061301b61301684612fd7565b612d31565b90508281526020810184848401111561303757613036612ccc565b5b613042848285612d7d565b509392505050565b600082601f83011261305f5761305e612cc7565b5b813561306f848260208601613008565b91505092915050565b60008060008060808587031215613092576130916129a8565b5b60006130a087828801612bf5565b94505060206130b187828801612bf5565b93505060406130c287828801612b40565b925050606085013567ffffffffffffffff8111156130e3576130e26129ad565b5b6130ef8782880161304a565b91505092959194509250565b60008060408385031215613112576131116129a8565b5b600061312085828601612bf5565b925050602061313185828601612bf5565b9150509250929050565b60008060208385031215613152576131516129a8565b5b600083013567ffffffffffffffff8111156131705761316f6129ad565b5b61317c85828601612e7c565b92509250509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131cf57607f821691505b6020821081036131e2576131e1613188565b5b50919050565b7f4e465473206d696e74656420746f207661756c74000000000000000000000000600082015250565b600061321e601483612a78565b9150613229826131e8565b602082019050919050565b6000602082019050818103600083015261324d81613211565b9050919050565b7f7465616d206164647220656d7074790000000000000000000000000000000000600082015250565b600061328a600f83612a78565b915061329582613254565b602082019050919050565b600060208201905081810360008301526132b98161327d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061332982612ed2565b915060ff820361333c5761333b6132ef565b5b600182019050919050565b600061335282612b1f565b915061335d83612b1f565b925082820261336b81612b1f565b91508282048414831517613382576133816132ef565b5b5092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026133eb7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826133ae565b6133f586836133ae565b95508019841693508086168417925050509392505050565b6000819050919050565b600061343261342d61342884612b1f565b61340d565b612b1f565b9050919050565b6000819050919050565b61344c83613417565b61346061345882613439565b8484546133bb565b825550505050565b600090565b613475613468565b613480818484613443565b505050565b5b818110156134a45761349960008261346d565b600181019050613486565b5050565b601f8211156134e9576134ba81613389565b6134c38461339e565b810160208510156134d2578190505b6134e66134de8561339e565b830182613485565b50505b505050565b600082821c905092915050565b600061350c600019846008026134ee565b1980831691505092915050565b600061352583836134fb565b9150826002028217905092915050565b61353e82612a6d565b67ffffffffffffffff81111561355757613556612cd1565b5b61356182546131b7565b61356c8282856134a8565b600060209050601f83116001811461359f576000841561358d578287015190505b6135978582613519565b8655506135ff565b601f1984166135ad86613389565b60005b828110156135d5578489015182556001820191506020850194506020810190506135b0565b868310156135f257848901516135ee601f8916826134fb565b8355505b6001600288020188555050505b505050505050565b7f4e4f5448494e475f544f5f574954484452415700000000000000000000000000600082015250565b600061363d601383612a78565b915061364882613607565b602082019050919050565b6000602082019050818103600083015261366c81613630565b9050919050565b600081905092915050565b50565b600061368e600083613673565b91506136998261367e565b600082019050919050565b60006136af82613681565b9150819050919050565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b60006136ef601083612a78565b91506136fa826136b9565b602082019050919050565b6000602082019050818103600083015261371e816136e2565b9050919050565b600061373082612b1f565b915061373b83612b1f565b9250828203905081811115613753576137526132ef565b5b92915050565b7f504f4d3a2063616c6c657220213d2077686974656c6973746572000000000000600082015250565b600061378f601a83612a78565b915061379a82613759565b602082019050919050565b600060208201905081810360008301526137be81613782565b9050919050565b60006137d082612b1f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613802576138016132ef565b5b600182019050919050565b600081905092915050565b600061382382612a6d565b61382d818561380d565b935061383d818560208601612a89565b80840191505092915050565b60006138558285613818565b91506138618284613818565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006138c9602683612a78565b91506138d48261386d565b604082019050919050565b600060208201905081810360008301526138f8816138bc565b9050919050565b7f5661756c74207265736572766520216d696e7465640000000000000000000000600082015250565b6000613935601583612a78565b9150613940826138ff565b602082019050919050565b6000602082019050818103600083015261396481613928565b9050919050565b7f6261746368206d696e7473203e20350000000000000000000000000000000000600082015250565b60006139a1600f83612a78565b91506139ac8261396b565b602082019050919050565b600060208201905081810360008301526139d081613994565b9050919050565b7f4d696e74696e6720217374617274656400000000000000000000000000000000600082015250565b6000613a0d601083612a78565b9150613a18826139d7565b602082019050919050565b60006020820190508181036000830152613a3c81613a00565b9050919050565b7f43616c6c6572206973206e6f7420454f41000000000000000000000000000000600082015250565b6000613a79601183612a78565b9150613a8482613a43565b602082019050919050565b60006020820190508181036000830152613aa881613a6c565b9050919050565b6000613aba82612b1f565b9150613ac583612b1f565b9250828201905080821115613add57613adc6132ef565b5b92915050565b7f4d696e74696e67203e206d617820737570706c79000000000000000000000000600082015250565b6000613b19601483612a78565b9150613b2482613ae3565b602082019050919050565b60006020820190508181036000830152613b4881613b0c565b9050919050565b7f446964206e6f742073656e6420656e6f756768206574682e0000000000000000600082015250565b6000613b85601883612a78565b9150613b9082613b4f565b602082019050919050565b60006020820190508181036000830152613bb481613b78565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613bf1602083612a78565b9150613bfc82613bbb565b602082019050919050565b60006020820190508181036000830152613c2081613be4565b9050919050565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b6000613c5d601f83612a78565b9150613c6882613c27565b602082019050919050565b60006020820190508181036000830152613c8c81613c50565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613cba82613c93565b613cc48185613c9e565b9350613cd4818560208601612a89565b613cdd81612ab3565b840191505092915050565b6000608082019050613cfd6000830187612bb4565b613d0a6020830186612bb4565b613d176040830185612c4a565b8181036060830152613d298184613caf565b905095945050505050565b600081519050613d43816129de565b92915050565b600060208284031215613d5f57613d5e6129a8565b5b6000613d6d84828501613d34565b9150509291505056fea2646970667358221220bde4c82cf06989eafe00724b9ae23d7fce0e089dd46aa2ff09951cc8bfdb6e8464736f6c63430008110033

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

0000000000000000000000007007aeeac69204505a91acdc7ee0afd84a011edf0000000000000000000000007007aeeac69204505a91acdc7ee0afd84a011edf000000000000000000000000f41584610884054c86825ffcd5af4b6060327750

-----Decoded View---------------
Arg [0] : withdrawAddress (address): 0x7007aeeAc69204505A91aCdC7Ee0aFd84A011EDf
Arg [1] : vault (address): 0x7007aeeAc69204505A91aCdC7Ee0aFd84A011EDf
Arg [2] : _whitelister (address): 0xF41584610884054C86825fFCD5AF4B6060327750

-----Encoded View---------------
3 Constructor Arguments found :
Arg [0] : 0000000000000000000000007007aeeac69204505a91acdc7ee0afd84a011edf
Arg [1] : 0000000000000000000000007007aeeac69204505a91acdc7ee0afd84a011edf
Arg [2] : 000000000000000000000000f41584610884054c86825ffcd5af4b6060327750


Deployed Bytecode Sourcemap

57366:5260:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19023:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19925:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26416:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25849:408;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57646:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15676:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61235:340;;;;;;;;;;;;;:::i;:::-;;57725:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;30055:2825;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58832:111;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61610:119;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61737:331;;;;;;;;;;;;;:::i;:::-;;32976:193;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60942:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60452:373;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21318:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57800:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;16860:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56549:103;;;;;;;;;;;;;:::i;:::-;;62076:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57760:31;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55901:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20101:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57686:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60833:101;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26974:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61029:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58667:105;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33767:407;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57612:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20311:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61132:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58559:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27365:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56807:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62470:153;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;19023:639;19108:4;19447:10;19432:25;;:11;:25;;;;:102;;;;19524:10;19509:25;;:11;:25;;;;19432:102;:179;;;;19601:10;19586:25;;:11;:25;;;;19432:179;19412:199;;19023:639;;;:::o;19925:100::-;19979:13;20012:5;20005:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19925:100;:::o;26416:218::-;26492:7;26517:16;26525:7;26517;:16::i;:::-;26512:64;;26542:34;;;;;;;;;;;;;;26512:64;26596:15;:24;26612:7;26596:24;;;;;;;;;;;:30;;;;;;;;;;;;26589:37;;26416:218;;;:::o;25849:408::-;25938:13;25954:16;25962:7;25954;:16::i;:::-;25938:32;;26010:5;25987:28;;:19;:17;:19::i;:::-;:28;;;25983:175;;26035:44;26052:5;26059:19;:17;:19::i;:::-;26035:16;:44::i;:::-;26030:128;;26107:35;;;;;;;;;;;;;;26030:128;25983:175;26203:2;26170:15;:24;26186:7;26170:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;26241:7;26237:2;26221:28;;26230:5;26221:28;;;;;;;;;;;;25927:330;25849:408;;:::o;57646:31::-;;;;;;;;;;;;;:::o;15676:323::-;15737:7;15965:15;:13;:15::i;:::-;15950:12;;15934:13;;:28;:46;15927:53;;15676:323;:::o;61235:340::-;61304:1;61286:14;:12;:14::i;:::-;:19;61278:52;;;;;;;;;;;;:::i;:::-;;;;;;;;;61373:1;61349:14;:21;;;;:25;61341:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;61405:41;61415:15;;;;;;;;;;;57464:3;61405:9;:41::i;:::-;61464:7;61459:109;61481:14;:21;;;;61477:1;:25;;;61459:109;;;61524:32;61534:14;61549:1;61534:17;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;61553:2;61524:9;:32::i;:::-;61504:3;;;;;:::i;:::-;;;;61459:109;;;;61235:340::o;57725:26::-;;;;;;;;;;;;;:::o;30055:2825::-;30197:27;30227;30246:7;30227:18;:27::i;:::-;30197:57;;30312:4;30271:45;;30287:19;30271:45;;;30267:86;;30325:28;;;;;;;;;;;;;;30267:86;30367:27;30396:23;30423:35;30450:7;30423:26;:35::i;:::-;30366:92;;;;30558:68;30583:15;30600:4;30606:19;:17;:19::i;:::-;30558:24;:68::i;:::-;30553:180;;30646:43;30663:4;30669:19;:17;:19::i;:::-;30646:16;:43::i;:::-;30641:92;;30698:35;;;;;;;;;;;;;;30641:92;30553:180;30764:1;30750:16;;:2;:16;;;30746:52;;30775:23;;;;;;;;;;;;;;30746:52;30811:43;30833:4;30839:2;30843:7;30852:1;30811:21;:43::i;:::-;30947:15;30944:160;;;31087:1;31066:19;31059:30;30944:160;31484:18;:24;31503:4;31484:24;;;;;;;;;;;;;;;;31482:26;;;;;;;;;;;;31553:18;:22;31572:2;31553:22;;;;;;;;;;;;;;;;31551:24;;;;;;;;;;;31875:146;31912:2;31961:45;31976:4;31982:2;31986:19;31961:14;:45::i;:::-;12075:8;31933:73;31875:18;:146::i;:::-;31846:17;:26;31864:7;31846:26;;;;;;;;;;;:175;;;;32192:1;12075:8;32141:19;:47;:52;32137:627;;32214:19;32246:1;32236:7;:11;32214:33;;32403:1;32369:17;:30;32387:11;32369:30;;;;;;;;;;;;:35;32365:384;;32507:13;;32492:11;:28;32488:242;;32687:19;32654:17;:30;32672:11;32654:30;;;;;;;;;;;:52;;;;32488:242;32365:384;32195:569;32137:627;32811:7;32807:2;32792:27;;32801:4;32792:27;;;;;;;;;;;;32830:42;32851:4;32857:2;32861:7;32870:1;32830:20;:42::i;:::-;30186:2694;;;30055:2825;;;:::o;58832:111::-;58886:7;58924:11;58913:8;:22;;;;:::i;:::-;58906:29;;58832:111;;;:::o;61610:119::-;55787:13;:11;:13::i;:::-;61709:12:::1;61693:13;:28;;;;;;:::i;:::-;;61610:119:::0;:::o;61737:331::-;55787:13;:11;:13::i;:::-;54223:21:::1;:19;:21::i;:::-;61800:15:::2;61818:21;61800:39;;61868:1;61858:7;:11;61850:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;61907:12;61933:16;;;;;;;;;;;61925:30;;61977:21;61925:88;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61906:107;;;62032:7;62024:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;61789:279;;54267:20:::1;:18;:20::i;:::-;61737:331::o:0;32976:193::-;33122:39;33139:4;33145:2;33149:7;33122:39;;;;;;;;;;;;:16;:39::i;:::-;32976:193;;;:::o;60942:79::-;60993:20;60999:7;61008:4;60993:5;:20::i;:::-;60942:79;:::o;60452:373::-;60512:7;60531:13;60547:1;60531:17;;60590:1;60562:18;:25;60581:5;60562:25;;;;;;;;;;;;;;;;:29;60559:93;;;60615:18;:25;60634:5;60615:25;;;;;;;;;;;;;;;;60608:32;;;;;60559:93;60664:14;60681:20;60695:5;60681:13;:20::i;:::-;60664:37;;57565:1;60715:6;:18;60712:78;;;60772:6;57565:1;60760:18;;;;:::i;:::-;60749:29;;60712:78;60809:8;60802:15;;;;60452:373;;;;:::o;21318:152::-;21390:7;21433:27;21452:7;21433:18;:27::i;:::-;21410:52;;21318:152;;;:::o;57800:53::-;;;;;;;;;;;;;;;;;:::o;16860:233::-;16932:7;16973:1;16956:19;;:5;:19;;;16952:60;;16984:28;;;;;;;;;;;;;;16952:60;11019:13;17030:18;:25;17049:5;17030:25;;;;;;;;;;;;;;;;:55;17023:62;;16860:233;;;:::o;56549:103::-;55787:13;:11;:13::i;:::-;56614:30:::1;56641:1;56614:18;:30::i;:::-;56549:103::o:0;62076:386::-;58273:12;:10;:12::i;:::-;58258:27;;:11;;;;;;;;;;;:27;;;58250:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;62218:9:::1;62213:242;62237:10;;:17;;62233:1;:21;62213:242;;;62317:1;62280:18;:33;62299:10;;62310:1;62299:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;62280:33;;;;;;;;;;;;;;;;:38:::0;62276:168:::1;;62420:8;62384:44;;:18;:33;62403:10;;62414:1;62403:13;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;62384:33;;;;;;;;;;;;;;;:44;;;;62276:168;62256:3;;;;;:::i;:::-;;;;62213:242;;;;62076:386:::0;;;:::o;57760:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;55901:87::-;55947:7;55974:6;;;;;;;;;;;55967:13;;55901:87;:::o;20101:104::-;20157:13;20190:7;20183:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20101:104;:::o;57686:30::-;;;;;;;;;;;;;:::o;60833:101::-;60893:33;60903:12;:10;:12::i;:::-;60917:8;60893:9;:33::i;:::-;60833:101;:::o;26974:234::-;27121:8;27069:18;:39;27088:19;:17;:19::i;:::-;27069:39;;;;;;;;;;;;;;;:49;27109:8;27069:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;27181:8;27145:55;;27160:19;:17;:19::i;:::-;27145:55;;;27191:8;27145:55;;;;;;:::i;:::-;;;;;;;;26974:234;;:::o;61029:95::-;61075:7;61102:14;:12;:14::i;:::-;61095:21;;61029:95;:::o;58667:105::-;58711:4;58754:10;;58735:15;:29;;58728:36;;58667:105;:::o;33767:407::-;33942:31;33955:4;33961:2;33965:7;33942:12;:31::i;:::-;34006:1;33988:2;:14;;;:19;33984:183;;34027:56;34058:4;34064:2;34068:7;34077:5;34027:30;:56::i;:::-;34022:145;;34111:40;;;;;;;;;;;;;;34022:145;33984:183;33767:407;;;;:::o;57612:25::-;;;;:::o;20311:318::-;20384:13;20415:16;20423:7;20415;:16::i;:::-;20410:59;;20440:29;;;;;;;;;;;;;;20410:59;20482:21;20506:10;:8;:10::i;:::-;20482:34;;20559:1;20540:7;20534:21;:26;:87;;;;;;;;;;;;;;;;;20587:7;20596:18;20606:7;20596:9;:18::i;:::-;20570:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;20534:87;20527:94;;;20311:318;;;:::o;61132:95::-;61178:7;61205:14;:12;:14::i;:::-;61198:21;;61132:95;:::o;58559:100::-;58605:13;58638;58631:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58559:100;:::o;27365:164::-;27462:4;27486:18;:25;27505:5;27486:25;;;;;;;;;;;;;;;:35;27512:8;27486:35;;;;;;;;;;;;;;;;;;;;;;;;;27479:42;;27365:164;;;;:::o;56807:201::-;55787:13;:11;:13::i;:::-;56916:1:::1;56896:22;;:8;:22;;::::0;56888:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;56972:28;56991:8;56972:18;:28::i;:::-;56807:201:::0;:::o;62470:153::-;55787:13;:11;:13::i;:::-;62601:14:::1;;62584;:31;;;;;;;:::i;:::-;;62470:153:::0;;:::o;27787:282::-;27852:4;27908:7;27889:15;:13;:15::i;:::-;:26;;:66;;;;;27942:13;;27932:7;:23;27889:66;:153;;;;;28041:1;11795:8;27993:17;:26;28011:7;27993:26;;;;;;;;;;;;:44;:49;27889:153;27869:173;;27787:282;;;:::o;50095:105::-;50155:7;50182:10;50175:17;;50095:105;:::o;58344:93::-;58401:7;58428:1;58421:8;;58344:93;:::o;16097:296::-;16152:7;16359:15;:13;:15::i;:::-;16343:13;;:31;16336:38;;16097:296;:::o;43927:112::-;44004:27;44014:2;44018:8;44004:27;;;;;;;;;;;;:9;:27::i;:::-;43927:112;;:::o;22473:1275::-;22540:7;22560:12;22575:7;22560:22;;22643:4;22624:15;:13;:15::i;:::-;:23;22620:1061;;22677:13;;22670:4;:20;22666:1015;;;22715:14;22732:17;:23;22750:4;22732:23;;;;;;;;;;;;22715:40;;22849:1;11795:8;22821:6;:24;:29;22817:845;;23486:113;23503:1;23493:6;:11;23486:113;;23546:17;:25;23564:6;;;;;;;23546:25;;;;;;;;;;;;23537:34;;23486:113;;;23632:6;23625:13;;;;;;22817:845;22692:989;22666:1015;22620:1061;23709:31;;;;;;;;;;;;;;22473:1275;;;;:::o;28950:485::-;29052:27;29081:23;29122:38;29163:15;:24;29179:7;29163:24;;;;;;;;;;;29122:65;;29340:18;29317:41;;29397:19;29391:26;29372:45;;29302:126;28950:485;;;:::o;28178:659::-;28327:11;28492:16;28485:5;28481:28;28472:37;;28652:16;28641:9;28637:32;28624:45;;28802:15;28791:9;28788:30;28780:5;28769:9;28766:20;28763:56;28753:66;;28178:659;;;;;:::o;58951:1493::-;59114:12;:10;:12::i;:::-;59103:23;;:7;:5;:7::i;:::-;:23;;;59099:1338;;57464:3;59151:14;:12;:14::i;:::-;:31;;59143:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;59243:1;59231:8;:13;;59223:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;59289:13;:11;:13::i;:::-;59281:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;59362:9;59346:25;;:12;:10;:12::i;:::-;:25;;;59338:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;57525:4;59451:8;59434:14;:12;:14::i;:::-;:25;;;;:::i;:::-;:39;;59408:121;;;;;;;;;;;;:::i;:::-;;;;;;;;;59586:8;59550:18;:32;59569:12;:10;:12::i;:::-;59550:32;;;;;;;;;;;;;;;;:44;59546:880;;59727:8;59671:18;:32;59690:12;:10;:12::i;:::-;59671:32;;;;;;;;;;;;;;;;:64;;;;:::i;:::-;59615:18;:32;59634:12;:10;:12::i;:::-;59615:32;;;;;;;;;;;;;;;:120;;;;59546:880;;;59818:14;59835:27;59849:12;:10;:12::i;:::-;59835:13;:27::i;:::-;59818:44;;59881:23;59940:1;59930:6;:11;;:35;;;;57565:1;59945:8;:20;59930:35;59927:330;;;57565:1;59992:6;:19;;:55;;;;60040:6;57565:1;60028:18;;;;:::i;:::-;60015:8;:32;;59992:55;59989:249;;;57565:1;60093:6;:18;:121;;60206:8;60093:121;;;60167:6;57565:1;60155:18;;;;:::i;:::-;60143:8;:31;;;;:::i;:::-;60093:121;60075:139;;59989:249;59927:330;60320:22;60326:15;60320:5;:22::i;:::-;60307:9;:35;;60277:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;59757:669;;59546:880;59099:1338;58951:1493;;;;:::o;49404:311::-;49539:7;49559:16;12199:3;49585:19;:41;;49559:68;;12199:3;49653:31;49664:4;49670:2;49674:9;49653:10;:31::i;:::-;49645:40;;:62;;49638:69;;;49404:311;;;;;:::o;24296:450::-;24376:14;24544:16;24537:5;24533:28;24524:37;;24721:5;24707:11;24682:23;24678:41;24675:52;24668:5;24665:63;24655:73;;24296:450;;;;:::o;35660:158::-;;;;;:::o;56066:132::-;56141:12;:10;:12::i;:::-;56130:23;;:7;:5;:7::i;:::-;:23;;;56122:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56066:132::o;54303:293::-;53705:1;54437:7;;:19;54429:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;53705:1;54570:7;:18;;;;54303:293::o;54604:213::-;53661:1;54787:7;:22;;;;54604:213::o;44624:3081::-;44704:27;44734;44753:7;44734:18;:27::i;:::-;44704:57;;44774:12;44805:19;44774:52;;44840:27;44869:23;44896:35;44923:7;44896:26;:35::i;:::-;44839:92;;;;44948:13;44944:316;;;45069:68;45094:15;45111:4;45117:19;:17;:19::i;:::-;45069:24;:68::i;:::-;45064:184;;45161:43;45178:4;45184:19;:17;:19::i;:::-;45161:16;:43::i;:::-;45156:92;;45213:35;;;;;;;;;;;;;;45156:92;45064:184;44944:316;45272:51;45294:4;45308:1;45312:7;45321:1;45272:21;:51::i;:::-;45416:15;45413:160;;;45556:1;45535:19;45528:30;45413:160;46234:1;11284:3;46204:1;:26;;46203:32;46175:18;:24;46194:4;46175:24;;;;;;;;;;;;;;;;:60;;;;;;;;;;;46502:176;46539:4;46610:53;46625:4;46639:1;46643:19;46610:14;:53::i;:::-;12075:8;11795;46563:43;46562:101;46502:18;:176::i;:::-;46473:17;:26;46491:7;46473:26;;;;;;;;;;;:205;;;;46849:1;12075:8;46798:19;:47;:52;46794:627;;46871:19;46903:1;46893:7;:11;46871:33;;47060:1;47026:17;:30;47044:11;47026:30;;;;;;;;;;;;:35;47022:384;;47164:13;;47149:11;:28;47145:242;;47344:19;47311:17;:30;47329:11;47311:30;;;;;;;;;;;:52;;;;47145:242;47022:384;46852:569;46794:627;47476:7;47472:1;47449:35;;47458:4;47449:35;;;;;;;;;;;;47495:50;47516:4;47530:1;47534:7;47543:1;47495:20;:50::i;:::-;47672:12;;:14;;;;;;;;;;;;;44693:3012;;;;44624:3081;;:::o;17175:178::-;17236:7;11019:13;11157:2;17264:18;:25;17283:5;17264:25;;;;;;;;;;;;;;;;:50;;17263:82;17256:89;;17175:178;;;:::o;57168:191::-;57242:16;57261:6;;;;;;;;;;;57242:25;;57287:8;57278:6;;:17;;;;;;;;;;;;;;;;;;57342:8;57311:40;;57332:8;57311:40;;;;;;;;;;;;57231:128;57168:191;:::o;9542:98::-;9595:7;9622:10;9615:17;;9542:98;:::o;36258:716::-;36421:4;36467:2;36442:45;;;36488:19;:17;:19::i;:::-;36509:4;36515:7;36524:5;36442:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36438:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36742:1;36725:6;:13;:18;36721:235;;36771:40;;;;;;;;;;;;;;36721:235;36914:6;36908:13;36899:6;36895:2;36891:15;36884:38;36438:529;36611:54;;;36601:64;;;:6;:64;;;;36594:71;;;36258:716;;;;;;:::o;58445:106::-;58497:13;58530;58523:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58445:106;:::o;50302:1745::-;50367:17;50801:4;50794;50788:11;50784:22;50893:1;50887:4;50880:15;50968:4;50965:1;50961:12;50954:19;;51050:1;51045:3;51038:14;51154:3;51393:5;51375:428;51401:1;51375:428;;;51441:1;51436:3;51432:11;51425:18;;51612:2;51606:4;51602:13;51598:2;51594:22;51589:3;51581:36;51706:2;51700:4;51696:13;51688:21;;51773:4;51375:428;51763:25;51375:428;51379:21;51842:3;51837;51833:13;51957:4;51952:3;51948:14;51941:21;;52022:6;52017:3;52010:19;50406:1634;;;50302:1745;;;:::o;16475:102::-;16530:7;16557:12;;16550:19;;16475:102;:::o;43154:689::-;43285:19;43291:2;43295:8;43285:5;:19::i;:::-;43364:1;43346:2;:14;;;:19;43342:483;;43386:11;43400:13;;43386:27;;43432:13;43454:8;43448:3;:14;43432:30;;43481:233;43512:62;43551:1;43555:2;43559:7;;;;;;43568:5;43512:30;:62::i;:::-;43507:167;;43610:40;;;;;;;;;;;;;;43507:167;43709:3;43701:5;:11;43481:233;;43796:3;43779:13;;:20;43775:34;;43801:8;;;43775:34;43367:458;;43342:483;43154:689;;;:::o;49105:147::-;49242:6;49105:147;;;;;:::o;37436:2966::-;37509:20;37532:13;;37509:36;;37572:1;37560:8;:13;37556:44;;37582:18;;;;;;;;;;;;;;37556:44;37613:61;37643:1;37647:2;37651:12;37665:8;37613:21;:61::i;:::-;38157:1;11157:2;38127:1;:26;;38126:32;38114:8;:45;38088:18;:22;38107:2;38088:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;38436:139;38473:2;38527:33;38550:1;38554:2;38558:1;38527:14;:33::i;:::-;38494:30;38515:8;38494:20;:30::i;:::-;:66;38436:18;:139::i;:::-;38402:17;:31;38420:12;38402:31;;;;;;;;;;;:173;;;;38592:16;38623:11;38652:8;38637:12;:23;38623:37;;39173:16;39169:2;39165:25;39153:37;;39545:12;39505:8;39464:1;39402:25;39343:1;39282;39255:335;39916:1;39902:12;39898:20;39856:346;39957:3;39948:7;39945:16;39856:346;;40175:7;40165:8;40162:1;40135:25;40132:1;40129;40124:59;40010:1;40001:7;39997:15;39986:26;;39856:346;;;39860:77;40247:1;40235:8;:13;40231:45;;40257:19;;;;;;;;;;;;;;40231:45;40309:3;40293:13;:19;;;;37862:2462;;40334:60;40363:1;40367:2;40371:12;40385:8;40334:20;:60::i;:::-;37498:2904;37436:2966;;:::o;24848:324::-;24918:14;25151:1;25141:8;25138:15;25112:24;25108:46;25098:56;;24848:324;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:117::-;5976:1;5973;5966:12;5990:117;6099:1;6096;6089:12;6113:180;6161:77;6158:1;6151:88;6258:4;6255:1;6248:15;6282:4;6279:1;6272:15;6299:281;6382:27;6404:4;6382:27;:::i;:::-;6374:6;6370:40;6512:6;6500:10;6497:22;6476:18;6464:10;6461:34;6458:62;6455:88;;;6523:18;;:::i;:::-;6455:88;6563:10;6559:2;6552:22;6342:238;6299:281;;:::o;6586:129::-;6620:6;6647:20;;:::i;:::-;6637:30;;6676:33;6704:4;6696:6;6676:33;:::i;:::-;6586:129;;;:::o;6721:308::-;6783:4;6873:18;6865:6;6862:30;6859:56;;;6895:18;;:::i;:::-;6859:56;6933:29;6955:6;6933:29;:::i;:::-;6925:37;;7017:4;7011;7007:15;6999:23;;6721:308;;;:::o;7035:146::-;7132:6;7127:3;7122;7109:30;7173:1;7164:6;7159:3;7155:16;7148:27;7035:146;;;:::o;7187:425::-;7265:5;7290:66;7306:49;7348:6;7306:49;:::i;:::-;7290:66;:::i;:::-;7281:75;;7379:6;7372:5;7365:21;7417:4;7410:5;7406:16;7455:3;7446:6;7441:3;7437:16;7434:25;7431:112;;;7462:79;;:::i;:::-;7431:112;7552:54;7599:6;7594:3;7589;7552:54;:::i;:::-;7271:341;7187:425;;;;;:::o;7632:340::-;7688:5;7737:3;7730:4;7722:6;7718:17;7714:27;7704:122;;7745:79;;:::i;:::-;7704:122;7862:6;7849:20;7887:79;7962:3;7954:6;7947:4;7939:6;7935:17;7887:79;:::i;:::-;7878:88;;7694:278;7632:340;;;;:::o;7978:509::-;8047:6;8096:2;8084:9;8075:7;8071:23;8067:32;8064:119;;;8102:79;;:::i;:::-;8064:119;8250:1;8239:9;8235:17;8222:31;8280:18;8272:6;8269:30;8266:117;;;8302:79;;:::i;:::-;8266:117;8407:63;8462:7;8453:6;8442:9;8438:22;8407:63;:::i;:::-;8397:73;;8193:287;7978:509;;;;:::o;8493:329::-;8552:6;8601:2;8589:9;8580:7;8576:23;8572:32;8569:119;;;8607:79;;:::i;:::-;8569:119;8727:1;8752:53;8797:7;8788:6;8777:9;8773:22;8752:53;:::i;:::-;8742:63;;8698:117;8493:329;;;;:::o;8828:117::-;8937:1;8934;8927:12;8951:117;9060:1;9057;9050:12;9091:568;9164:8;9174:6;9224:3;9217:4;9209:6;9205:17;9201:27;9191:122;;9232:79;;:::i;:::-;9191:122;9345:6;9332:20;9322:30;;9375:18;9367:6;9364:30;9361:117;;;9397:79;;:::i;:::-;9361:117;9511:4;9503:6;9499:17;9487:29;;9565:3;9557:4;9549:6;9545:17;9535:8;9531:32;9528:41;9525:128;;;9572:79;;:::i;:::-;9525:128;9091:568;;;;;:::o;9665:86::-;9700:7;9740:4;9733:5;9729:16;9718:27;;9665:86;;;:::o;9757:118::-;9828:22;9844:5;9828:22;:::i;:::-;9821:5;9818:33;9808:61;;9865:1;9862;9855:12;9808:61;9757:118;:::o;9881:135::-;9925:5;9963:6;9950:20;9941:29;;9979:31;10004:5;9979:31;:::i;:::-;9881:135;;;;:::o;10022:700::-;10115:6;10123;10131;10180:2;10168:9;10159:7;10155:23;10151:32;10148:119;;;10186:79;;:::i;:::-;10148:119;10334:1;10323:9;10319:17;10306:31;10364:18;10356:6;10353:30;10350:117;;;10386:79;;:::i;:::-;10350:117;10499:80;10571:7;10562:6;10551:9;10547:22;10499:80;:::i;:::-;10481:98;;;;10277:312;10628:2;10654:51;10697:7;10688:6;10677:9;10673:22;10654:51;:::i;:::-;10644:61;;10599:116;10022:700;;;;;:::o;10728:116::-;10798:21;10813:5;10798:21;:::i;:::-;10791:5;10788:32;10778:60;;10834:1;10831;10824:12;10778:60;10728:116;:::o;10850:133::-;10893:5;10931:6;10918:20;10909:29;;10947:30;10971:5;10947:30;:::i;:::-;10850:133;;;;:::o;10989:468::-;11054:6;11062;11111:2;11099:9;11090:7;11086:23;11082:32;11079:119;;;11117:79;;:::i;:::-;11079:119;11237:1;11262:53;11307:7;11298:6;11287:9;11283:22;11262:53;:::i;:::-;11252:63;;11208:117;11364:2;11390:50;11432:7;11423:6;11412:9;11408:22;11390:50;:::i;:::-;11380:60;;11335:115;10989:468;;;;;:::o;11463:307::-;11524:4;11614:18;11606:6;11603:30;11600:56;;;11636:18;;:::i;:::-;11600:56;11674:29;11696:6;11674:29;:::i;:::-;11666:37;;11758:4;11752;11748:15;11740:23;;11463:307;;;:::o;11776:423::-;11853:5;11878:65;11894:48;11935:6;11894:48;:::i;:::-;11878:65;:::i;:::-;11869:74;;11966:6;11959:5;11952:21;12004:4;11997:5;11993:16;12042:3;12033:6;12028:3;12024:16;12021:25;12018:112;;;12049:79;;:::i;:::-;12018:112;12139:54;12186:6;12181:3;12176;12139:54;:::i;:::-;11859:340;11776:423;;;;;:::o;12218:338::-;12273:5;12322:3;12315:4;12307:6;12303:17;12299:27;12289:122;;12330:79;;:::i;:::-;12289:122;12447:6;12434:20;12472:78;12546:3;12538:6;12531:4;12523:6;12519:17;12472:78;:::i;:::-;12463:87;;12279:277;12218:338;;;;:::o;12562:943::-;12657:6;12665;12673;12681;12730:3;12718:9;12709:7;12705:23;12701:33;12698:120;;;12737:79;;:::i;:::-;12698:120;12857:1;12882:53;12927:7;12918:6;12907:9;12903:22;12882:53;:::i;:::-;12872:63;;12828:117;12984:2;13010:53;13055:7;13046:6;13035:9;13031:22;13010:53;:::i;:::-;13000:63;;12955:118;13112:2;13138:53;13183:7;13174:6;13163:9;13159:22;13138:53;:::i;:::-;13128:63;;13083:118;13268:2;13257:9;13253:18;13240:32;13299:18;13291:6;13288:30;13285:117;;;13321:79;;:::i;:::-;13285:117;13426:62;13480:7;13471:6;13460:9;13456:22;13426:62;:::i;:::-;13416:72;;13211:287;12562:943;;;;;;;:::o;13511:474::-;13579:6;13587;13636:2;13624:9;13615:7;13611:23;13607:32;13604:119;;;13642:79;;:::i;:::-;13604:119;13762:1;13787:53;13832:7;13823:6;13812:9;13808:22;13787:53;:::i;:::-;13777:63;;13733:117;13889:2;13915:53;13960:7;13951:6;13940:9;13936:22;13915:53;:::i;:::-;13905:63;;13860:118;13511:474;;;;;:::o;13991:559::-;14077:6;14085;14134:2;14122:9;14113:7;14109:23;14105:32;14102:119;;;14140:79;;:::i;:::-;14102:119;14288:1;14277:9;14273:17;14260:31;14318:18;14310:6;14307:30;14304:117;;;14340:79;;:::i;:::-;14304:117;14453:80;14525:7;14516:6;14505:9;14501:22;14453:80;:::i;:::-;14435:98;;;;14231:312;13991:559;;;;;:::o;14556:180::-;14604:77;14601:1;14594:88;14701:4;14698:1;14691:15;14725:4;14722:1;14715:15;14742:320;14786:6;14823:1;14817:4;14813:12;14803:22;;14870:1;14864:4;14860:12;14891:18;14881:81;;14947:4;14939:6;14935:17;14925:27;;14881:81;15009:2;15001:6;14998:14;14978:18;14975:38;14972:84;;15028:18;;:::i;:::-;14972:84;14793:269;14742:320;;;:::o;15068:170::-;15208:22;15204:1;15196:6;15192:14;15185:46;15068:170;:::o;15244:366::-;15386:3;15407:67;15471:2;15466:3;15407:67;:::i;:::-;15400:74;;15483:93;15572:3;15483:93;:::i;:::-;15601:2;15596:3;15592:12;15585:19;;15244:366;;;:::o;15616:419::-;15782:4;15820:2;15809:9;15805:18;15797:26;;15869:9;15863:4;15859:20;15855:1;15844:9;15840:17;15833:47;15897:131;16023:4;15897:131;:::i;:::-;15889:139;;15616:419;;;:::o;16041:165::-;16181:17;16177:1;16169:6;16165:14;16158:41;16041:165;:::o;16212:366::-;16354:3;16375:67;16439:2;16434:3;16375:67;:::i;:::-;16368:74;;16451:93;16540:3;16451:93;:::i;:::-;16569:2;16564:3;16560:12;16553:19;;16212:366;;;:::o;16584:419::-;16750:4;16788:2;16777:9;16773:18;16765:26;;16837:9;16831:4;16827:20;16823:1;16812:9;16808:17;16801:47;16865:131;16991:4;16865:131;:::i;:::-;16857:139;;16584:419;;;:::o;17009:180::-;17057:77;17054:1;17047:88;17154:4;17151:1;17144:15;17178:4;17175:1;17168:15;17195:180;17243:77;17240:1;17233:88;17340:4;17337:1;17330:15;17364:4;17361:1;17354:15;17381:167;17418:3;17441:22;17457:5;17441:22;:::i;:::-;17432:31;;17485:4;17478:5;17475:15;17472:41;;17493:18;;:::i;:::-;17472:41;17540:1;17533:5;17529:13;17522:20;;17381:167;;;:::o;17554:410::-;17594:7;17617:20;17635:1;17617:20;:::i;:::-;17612:25;;17651:20;17669:1;17651:20;:::i;:::-;17646:25;;17706:1;17703;17699:9;17728:30;17746:11;17728:30;:::i;:::-;17717:41;;17907:1;17898:7;17894:15;17891:1;17888:22;17868:1;17861:9;17841:83;17818:139;;17937:18;;:::i;:::-;17818:139;17602:362;17554:410;;;;:::o;17970:141::-;18019:4;18042:3;18034:11;;18065:3;18062:1;18055:14;18099:4;18096:1;18086:18;18078:26;;17970:141;;;:::o;18117:93::-;18154:6;18201:2;18196;18189:5;18185:14;18181:23;18171:33;;18117:93;;;:::o;18216:107::-;18260:8;18310:5;18304:4;18300:16;18279:37;;18216:107;;;;:::o;18329:393::-;18398:6;18448:1;18436:10;18432:18;18471:97;18501:66;18490:9;18471:97;:::i;:::-;18589:39;18619:8;18608:9;18589:39;:::i;:::-;18577:51;;18661:4;18657:9;18650:5;18646:21;18637:30;;18710:4;18700:8;18696:19;18689:5;18686:30;18676:40;;18405:317;;18329:393;;;;;:::o;18728:60::-;18756:3;18777:5;18770:12;;18728:60;;;:::o;18794:142::-;18844:9;18877:53;18895:34;18904:24;18922:5;18904:24;:::i;:::-;18895:34;:::i;:::-;18877:53;:::i;:::-;18864:66;;18794:142;;;:::o;18942:75::-;18985:3;19006:5;18999:12;;18942:75;;;:::o;19023:269::-;19133:39;19164:7;19133:39;:::i;:::-;19194:91;19243:41;19267:16;19243:41;:::i;:::-;19235:6;19228:4;19222:11;19194:91;:::i;:::-;19188:4;19181:105;19099:193;19023:269;;;:::o;19298:73::-;19343:3;19298:73;:::o;19377:189::-;19454:32;;:::i;:::-;19495:65;19553:6;19545;19539:4;19495:65;:::i;:::-;19430:136;19377:189;;:::o;19572:186::-;19632:120;19649:3;19642:5;19639:14;19632:120;;;19703:39;19740:1;19733:5;19703:39;:::i;:::-;19676:1;19669:5;19665:13;19656:22;;19632:120;;;19572:186;;:::o;19764:543::-;19865:2;19860:3;19857:11;19854:446;;;19899:38;19931:5;19899:38;:::i;:::-;19983:29;20001:10;19983:29;:::i;:::-;19973:8;19969:44;20166:2;20154:10;20151:18;20148:49;;;20187:8;20172:23;;20148:49;20210:80;20266:22;20284:3;20266:22;:::i;:::-;20256:8;20252:37;20239:11;20210:80;:::i;:::-;19869:431;;19854:446;19764:543;;;:::o;20313:117::-;20367:8;20417:5;20411:4;20407:16;20386:37;;20313:117;;;;:::o;20436:169::-;20480:6;20513:51;20561:1;20557:6;20549:5;20546:1;20542:13;20513:51;:::i;:::-;20509:56;20594:4;20588;20584:15;20574:25;;20487:118;20436:169;;;;:::o;20610:295::-;20686:4;20832:29;20857:3;20851:4;20832:29;:::i;:::-;20824:37;;20894:3;20891:1;20887:11;20881:4;20878:21;20870:29;;20610:295;;;;:::o;20910:1395::-;21027:37;21060:3;21027:37;:::i;:::-;21129:18;21121:6;21118:30;21115:56;;;21151:18;;:::i;:::-;21115:56;21195:38;21227:4;21221:11;21195:38;:::i;:::-;21280:67;21340:6;21332;21326:4;21280:67;:::i;:::-;21374:1;21398:4;21385:17;;21430:2;21422:6;21419:14;21447:1;21442:618;;;;22104:1;22121:6;22118:77;;;22170:9;22165:3;22161:19;22155:26;22146:35;;22118:77;22221:67;22281:6;22274:5;22221:67;:::i;:::-;22215:4;22208:81;22077:222;21412:887;;21442:618;21494:4;21490:9;21482:6;21478:22;21528:37;21560:4;21528:37;:::i;:::-;21587:1;21601:208;21615:7;21612:1;21609:14;21601:208;;;21694:9;21689:3;21685:19;21679:26;21671:6;21664:42;21745:1;21737:6;21733:14;21723:24;;21792:2;21781:9;21777:18;21764:31;;21638:4;21635:1;21631:12;21626:17;;21601:208;;;21837:6;21828:7;21825:19;21822:179;;;21895:9;21890:3;21886:19;21880:26;21938:48;21980:4;21972:6;21968:17;21957:9;21938:48;:::i;:::-;21930:6;21923:64;21845:156;21822:179;22047:1;22043;22035:6;22031:14;22027:22;22021:4;22014:36;21449:611;;;21412:887;;21002:1303;;;20910:1395;;:::o;22311:169::-;22451:21;22447:1;22439:6;22435:14;22428:45;22311:169;:::o;22486:366::-;22628:3;22649:67;22713:2;22708:3;22649:67;:::i;:::-;22642:74;;22725:93;22814:3;22725:93;:::i;:::-;22843:2;22838:3;22834:12;22827:19;;22486:366;;;:::o;22858:419::-;23024:4;23062:2;23051:9;23047:18;23039:26;;23111:9;23105:4;23101:20;23097:1;23086:9;23082:17;23075:47;23139:131;23265:4;23139:131;:::i;:::-;23131:139;;22858:419;;;:::o;23283:147::-;23384:11;23421:3;23406:18;;23283:147;;;;:::o;23436:114::-;;:::o;23556:398::-;23715:3;23736:83;23817:1;23812:3;23736:83;:::i;:::-;23729:90;;23828:93;23917:3;23828:93;:::i;:::-;23946:1;23941:3;23937:11;23930:18;;23556:398;;;:::o;23960:379::-;24144:3;24166:147;24309:3;24166:147;:::i;:::-;24159:154;;24330:3;24323:10;;23960:379;;;:::o;24345:166::-;24485:18;24481:1;24473:6;24469:14;24462:42;24345:166;:::o;24517:366::-;24659:3;24680:67;24744:2;24739:3;24680:67;:::i;:::-;24673:74;;24756:93;24845:3;24756:93;:::i;:::-;24874:2;24869:3;24865:12;24858:19;;24517:366;;;:::o;24889:419::-;25055:4;25093:2;25082:9;25078:18;25070:26;;25142:9;25136:4;25132:20;25128:1;25117:9;25113:17;25106:47;25170:131;25296:4;25170:131;:::i;:::-;25162:139;;24889:419;;;:::o;25314:194::-;25354:4;25374:20;25392:1;25374:20;:::i;:::-;25369:25;;25408:20;25426:1;25408:20;:::i;:::-;25403:25;;25452:1;25449;25445:9;25437:17;;25476:1;25470:4;25467:11;25464:37;;;25481:18;;:::i;:::-;25464:37;25314:194;;;;:::o;25514:176::-;25654:28;25650:1;25642:6;25638:14;25631:52;25514:176;:::o;25696:366::-;25838:3;25859:67;25923:2;25918:3;25859:67;:::i;:::-;25852:74;;25935:93;26024:3;25935:93;:::i;:::-;26053:2;26048:3;26044:12;26037:19;;25696:366;;;:::o;26068:419::-;26234:4;26272:2;26261:9;26257:18;26249:26;;26321:9;26315:4;26311:20;26307:1;26296:9;26292:17;26285:47;26349:131;26475:4;26349:131;:::i;:::-;26341:139;;26068:419;;;:::o;26493:233::-;26532:3;26555:24;26573:5;26555:24;:::i;:::-;26546:33;;26601:66;26594:5;26591:77;26588:103;;26671:18;;:::i;:::-;26588:103;26718:1;26711:5;26707:13;26700:20;;26493:233;;;:::o;26732:148::-;26834:11;26871:3;26856:18;;26732:148;;;;:::o;26886:390::-;26992:3;27020:39;27053:5;27020:39;:::i;:::-;27075:89;27157:6;27152:3;27075:89;:::i;:::-;27068:96;;27173:65;27231:6;27226:3;27219:4;27212:5;27208:16;27173:65;:::i;:::-;27263:6;27258:3;27254:16;27247:23;;26996:280;26886:390;;;;:::o;27282:435::-;27462:3;27484:95;27575:3;27566:6;27484:95;:::i;:::-;27477:102;;27596:95;27687:3;27678:6;27596:95;:::i;:::-;27589:102;;27708:3;27701:10;;27282:435;;;;;:::o;27723:225::-;27863:34;27859:1;27851:6;27847:14;27840:58;27932:8;27927:2;27919:6;27915:15;27908:33;27723:225;:::o;27954:366::-;28096:3;28117:67;28181:2;28176:3;28117:67;:::i;:::-;28110:74;;28193:93;28282:3;28193:93;:::i;:::-;28311:2;28306:3;28302:12;28295:19;;27954:366;;;:::o;28326:419::-;28492:4;28530:2;28519:9;28515:18;28507:26;;28579:9;28573:4;28569:20;28565:1;28554:9;28550:17;28543:47;28607:131;28733:4;28607:131;:::i;:::-;28599:139;;28326:419;;;:::o;28751:171::-;28891:23;28887:1;28879:6;28875:14;28868:47;28751:171;:::o;28928:366::-;29070:3;29091:67;29155:2;29150:3;29091:67;:::i;:::-;29084:74;;29167:93;29256:3;29167:93;:::i;:::-;29285:2;29280:3;29276:12;29269:19;;28928:366;;;:::o;29300:419::-;29466:4;29504:2;29493:9;29489:18;29481:26;;29553:9;29547:4;29543:20;29539:1;29528:9;29524:17;29517:47;29581:131;29707:4;29581:131;:::i;:::-;29573:139;;29300:419;;;:::o;29725:165::-;29865:17;29861:1;29853:6;29849:14;29842:41;29725:165;:::o;29896:366::-;30038:3;30059:67;30123:2;30118:3;30059:67;:::i;:::-;30052:74;;30135:93;30224:3;30135:93;:::i;:::-;30253:2;30248:3;30244:12;30237:19;;29896:366;;;:::o;30268:419::-;30434:4;30472:2;30461:9;30457:18;30449:26;;30521:9;30515:4;30511:20;30507:1;30496:9;30492:17;30485:47;30549:131;30675:4;30549:131;:::i;:::-;30541:139;;30268:419;;;:::o;30693:166::-;30833:18;30829:1;30821:6;30817:14;30810:42;30693:166;:::o;30865:366::-;31007:3;31028:67;31092:2;31087:3;31028:67;:::i;:::-;31021:74;;31104:93;31193:3;31104:93;:::i;:::-;31222:2;31217:3;31213:12;31206:19;;30865:366;;;:::o;31237:419::-;31403:4;31441:2;31430:9;31426:18;31418:26;;31490:9;31484:4;31480:20;31476:1;31465:9;31461:17;31454:47;31518:131;31644:4;31518:131;:::i;:::-;31510:139;;31237:419;;;:::o;31662:167::-;31802:19;31798:1;31790:6;31786:14;31779:43;31662:167;:::o;31835:366::-;31977:3;31998:67;32062:2;32057:3;31998:67;:::i;:::-;31991:74;;32074:93;32163:3;32074:93;:::i;:::-;32192:2;32187:3;32183:12;32176:19;;31835:366;;;:::o;32207:419::-;32373:4;32411:2;32400:9;32396:18;32388:26;;32460:9;32454:4;32450:20;32446:1;32435:9;32431:17;32424:47;32488:131;32614:4;32488:131;:::i;:::-;32480:139;;32207:419;;;:::o;32632:191::-;32672:3;32691:20;32709:1;32691:20;:::i;:::-;32686:25;;32725:20;32743:1;32725:20;:::i;:::-;32720:25;;32768:1;32765;32761:9;32754:16;;32789:3;32786:1;32783:10;32780:36;;;32796:18;;:::i;:::-;32780:36;32632:191;;;;:::o;32829:170::-;32969:22;32965:1;32957:6;32953:14;32946:46;32829:170;:::o;33005:366::-;33147:3;33168:67;33232:2;33227:3;33168:67;:::i;:::-;33161:74;;33244:93;33333:3;33244:93;:::i;:::-;33362:2;33357:3;33353:12;33346:19;;33005:366;;;:::o;33377:419::-;33543:4;33581:2;33570:9;33566:18;33558:26;;33630:9;33624:4;33620:20;33616:1;33605:9;33601:17;33594:47;33658:131;33784:4;33658:131;:::i;:::-;33650:139;;33377:419;;;:::o;33802:174::-;33942:26;33938:1;33930:6;33926:14;33919:50;33802:174;:::o;33982:366::-;34124:3;34145:67;34209:2;34204:3;34145:67;:::i;:::-;34138:74;;34221:93;34310:3;34221:93;:::i;:::-;34339:2;34334:3;34330:12;34323:19;;33982:366;;;:::o;34354:419::-;34520:4;34558:2;34547:9;34543:18;34535:26;;34607:9;34601:4;34597:20;34593:1;34582:9;34578:17;34571:47;34635:131;34761:4;34635:131;:::i;:::-;34627:139;;34354:419;;;:::o;34779:182::-;34919:34;34915:1;34907:6;34903:14;34896:58;34779:182;:::o;34967:366::-;35109:3;35130:67;35194:2;35189:3;35130:67;:::i;:::-;35123:74;;35206:93;35295:3;35206:93;:::i;:::-;35324:2;35319:3;35315:12;35308:19;;34967:366;;;:::o;35339:419::-;35505:4;35543:2;35532:9;35528:18;35520:26;;35592:9;35586:4;35582:20;35578:1;35567:9;35563:17;35556:47;35620:131;35746:4;35620:131;:::i;:::-;35612:139;;35339:419;;;:::o;35764:181::-;35904:33;35900:1;35892:6;35888:14;35881:57;35764:181;:::o;35951:366::-;36093:3;36114:67;36178:2;36173:3;36114:67;:::i;:::-;36107:74;;36190:93;36279:3;36190:93;:::i;:::-;36308:2;36303:3;36299:12;36292:19;;35951:366;;;:::o;36323:419::-;36489:4;36527:2;36516:9;36512:18;36504:26;;36576:9;36570:4;36566:20;36562:1;36551:9;36547:17;36540:47;36604:131;36730:4;36604:131;:::i;:::-;36596:139;;36323:419;;;:::o;36748:98::-;36799:6;36833:5;36827:12;36817:22;;36748:98;;;:::o;36852:168::-;36935:11;36969:6;36964:3;36957:19;37009:4;37004:3;37000:14;36985:29;;36852:168;;;;:::o;37026:373::-;37112:3;37140:38;37172:5;37140:38;:::i;:::-;37194:70;37257:6;37252:3;37194:70;:::i;:::-;37187:77;;37273:65;37331:6;37326:3;37319:4;37312:5;37308:16;37273:65;:::i;:::-;37363:29;37385:6;37363:29;:::i;:::-;37358:3;37354:39;37347:46;;37116:283;37026:373;;;;:::o;37405:640::-;37600:4;37638:3;37627:9;37623:19;37615:27;;37652:71;37720:1;37709:9;37705:17;37696:6;37652:71;:::i;:::-;37733:72;37801:2;37790:9;37786:18;37777:6;37733:72;:::i;:::-;37815;37883:2;37872:9;37868:18;37859:6;37815:72;:::i;:::-;37934:9;37928:4;37924:20;37919:2;37908:9;37904:18;37897:48;37962:76;38033:4;38024:6;37962:76;:::i;:::-;37954:84;;37405:640;;;;;;;:::o;38051:141::-;38107:5;38138:6;38132:13;38123:22;;38154:32;38180:5;38154:32;:::i;:::-;38051:141;;;;:::o;38198:349::-;38267:6;38316:2;38304:9;38295:7;38291:23;38287:32;38284:119;;;38322:79;;:::i;:::-;38284:119;38442:1;38467:63;38522:7;38513:6;38502:9;38498:22;38467:63;:::i;:::-;38457:73;;38413:127;38198:349;;;;:::o

Swarm Source

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