ETH Price: $3,083.33 (+0.74%)
Gas: 4 Gwei

Token

Freemint Pass (FP)
 

Overview

Max Total Supply

44 FP

Holders

29

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
schrodingrrr.eth
Balance
3 FP
0x3b745b58f7CE01BC08999584B438acAee72c0091
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:
NFT

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

/**

    #######                                               ######                       
    #       #####  ###### ###### #    # # #    # #####    #     #   ##    ####   ####  
    #       #    # #      #      ##  ## # ##   #   #      #     #  #  #  #      #      
    #####   #    # #####  #####  # ## # # # #  #   #      ######  #    #  ####   ####  
    #       #####  #      #      #    # # #  # #   #      #       ######      #      # 
    #       #   #  #      #      #    # # #   ##   #      #       #    # #    # #    # 
    #       #    # ###### ###### #    # # #    #   #      #       #    #  ####   ####  

*/

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

// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

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

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

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    struct TokenOwnership {
        // The address of the owner.
        address addr;
        // Keeps track of the start time of ownership with minimal overhead for tokenomics.
        uint64 startTimestamp;
        // Whether the token has been burned.
        bool burned;
    }

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

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

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

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

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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;

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

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

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

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

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

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

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

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

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

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

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

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).
 *
 * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.
 *
 * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).
 */
contract ERC721A is IERC721A {
    // Mask of an entry in packed address data.
    uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1;

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        unchecked {
            if (_startTokenId() <= curr)
                if (curr < _currentIndex) {
                    uint256 packed = _packedOwnerships[curr];
                    // If not burned.
                    if (packed & BITMASK_BURNED == 0) {
                        // Invariant:
                        // There will always be an ownership that has an address and is not burned
                        // before an ownership that does not have an address and is not burned.
                        // Hence, curr will not underflow.
                        //
                        // We can directly compare the packed value.
                        // If the address is zero, packed is zero.
                        while (packed == 0) {
                            packed = _packedOwnerships[--curr];
                        }
                        return packed;
                    }
                }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-name}.
     */
    function name() public view virtual override returns (string memory) {
        return _name;
    }

    /**
     * @dev See {IERC721Metadata-symbol}.
     */
    function symbol() public view virtual override returns (string memory) {
        return _symbol;
    }

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        if (!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    /**
     * @dev Casts the address to uint256 without masking.
     */
    function _addressToUint256(address value) private pure returns (uint256 result) {
        assembly {
            result := value
        }
    }

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

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

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

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

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view override returns (address) {
        if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        if (operator == _msgSenderERC721A()) revert ApproveToCaller();

        _operatorApprovals[_msgSenderERC721A()][operator] = approved;
        emit ApprovalForAll(_msgSenderERC721A(), operator, approved);
    }

    /**
     * @dev See {IERC721-isApprovedForAll}.
     */
    function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {
        return _operatorApprovals[owner][operator];
    }

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        _transfer(from, to, tokenId);
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        safeTransferFrom(from, to, tokenId, '');
    }

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        _transfer(from, to, tokenId);
        if (to.code.length != 0)
            if (!_checkContractOnERC721Received(from, to, tokenId, _data)) {
                revert TransferToNonERC721ReceiverImplementer();
            }
    }

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

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

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

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

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

            if (to.code.length != 0) {
                do {
                    emit Transfer(address(0), to, updatedIndex);
                    if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {
                        revert TransferToNonERC721ReceiverImplementer();
                    }
                } while (updatedIndex < end);
                // Reentrancy protection
                if (_currentIndex != startTokenId) revert();
            } else {
                do {
                    emit Transfer(address(0), to, updatedIndex++);
                } while (updatedIndex < end);
            }
            _currentIndex = updatedIndex;
        }
        _afterTokenTransfers(address(0), to, startTokenId, quantity);
    }

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

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            // Updates:
            // - `balance += quantity`.
            // - `numberMinted += quantity`.
            //
            // We can directly add to the balance and number minted.
            _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1);

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

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

            do {
                emit Transfer(address(0), to, updatedIndex++);
            } while (updatedIndex < end);

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) private {
        uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId);

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

/**

    #######                                               ######                       
    #       #####  ###### ###### #    # # #    # #####    #     #   ##    ####   ####  
    #       #    # #      #      ##  ## # ##   #   #      #     #  #  #  #      #      
    #####   #    # #####  #####  # ## # # # #  #   #      ######  #    #  ####   ####  
    #       #####  #      #      #    # # #  # #   #      #       ######      #      # 
    #       #   #  #      #      #    # # #   ##   #      #       #    # #    # #    # 
    #       #    # ###### ###### #    # # #    #   #      #       #    #  ####   ####  

*/


contract NFT is ERC721A, Ownable {
    // 1 Slot - gas saving
    uint32 public maxSupply = 3333;
    uint16 public maxNFTPerAddress = 10;
    uint64 public price = 0.01 ether;
    // 1 Slot - gas saving

    bool public isSaleOpen;
    string private notRevealedURI_;
    string private baseURI_;
    string private baseExtension_;

    constructor(string memory _notRevealedURI) ERC721A("Freemint Pass", "FP") {
        notRevealedURI_ = _notRevealedURI;

        // First 1 NFT to the team
        _safeMint(msg.sender, 1);
    }

    function mint(uint256 quantity) external payable {
        require(isSaleOpen, "sale is not started yet");
        require(tx.origin == msg.sender, "can not be called by a contract"); 
        require(totalSupply() + quantity <= maxSupply, "amount exceeds max supply");
        require(balanceOf(msg.sender) + quantity <= maxNFTPerAddress, "amount exceeds your allocation");
        require(msg.value >= quantity * price, "unsufficient payment");

        _safeMint(msg.sender, quantity);
    }

    function tokenURI(uint256 tokenId) public view override returns(string memory) {
        if(!_exists(tokenId)) revert URIQueryForNonexistentToken();

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

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

    // Only  OwnerFunctions
    function withdraw(uint256 _amount) external onlyOwner {
        payable(msg.sender).transfer(_amount);
    }

    function setNotRevealedURI(string memory _newURI) external onlyOwner {
        notRevealedURI_ = _newURI;
    }
  
    function setBaseExtension(string memory _newExtension) external onlyOwner {
        baseExtension_ = _newExtension;
    }

    function toggleSaleOpen() external onlyOwner {
        isSaleOpen = !isSaleOpen;
    }

    function setMaxSupply(uint32 _newSupply) external onlyOwner {
        maxSupply = _newSupply;
    }

    function setMaxNFTPerAddress(uint16 _newMaxAmount) external onlyOwner {
        maxNFTPerAddress = _newMaxAmount;
    }

    function setPrice(uint64 _newPrice) external onlyOwner {
        price = _newPrice;
    }

    function ownerMint(address _to, uint256 _amount) external onlyOwner {
        _safeMint(_to, _amount);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_notRevealedURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxNFTPerAddress","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_newMaxAmount","type":"uint16"}],"name":"setMaxNFTPerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"_newSupply","type":"uint32"}],"name":"setMaxSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newURI","type":"string"}],"name":"setNotRevealedURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint64","name":"_newPrice","type":"uint64"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleSaleOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052610d05600860146101000a81548163ffffffff021916908363ffffffff160217905550600a600860186101000a81548161ffff021916908361ffff160217905550662386f26fc10000600960006101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055503480156200008257600080fd5b5060405162003eaa38038062003eaa8339818101604052810190620000a8919062000967565b6040518060400160405280600d81526020017f467265656d696e742050617373000000000000000000000000000000000000008152506040518060400160405280600281526020017f465000000000000000000000000000000000000000000000000000000000000081525081600290805190602001906200012c9291906200071a565b508060039080519060200190620001459291906200071a565b5062000156620001b160201b60201c565b60008190555050506200017e62000172620001ba60201b60201c565b620001c260201b60201c565b80600a9080519060200190620001969291906200071a565b50620001aa3360016200028860201b60201c565b5062000bbc565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002aa828260405180602001604052806000815250620002ae60201b60201c565b5050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036200031b576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000830362000356576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200036b60008583866200059160201b60201c565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1620003d8600185146200059760201b60201c565b901b60a042901b620003f086620005a160201b60201c565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b1462000501575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620004ad6000878480600101955087620005ab60201b60201c565b620004e4576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821062000436578260005414620004fb57600080fd5b6200056d565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821062000502575b8160008190555050506200058b60008583866200070c60201b60201c565b50505050565b50505050565b6000819050919050565b6000819050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620005d96200071260201b60201c565b8786866040518563ffffffff1660e01b8152600401620005fd949392919062000a75565b6020604051808303816000875af19250505080156200063c57506040513d601f19601f8201168201806040525081019062000639919062000b26565b60015b620006b9573d80600081146200066f576040519150601f19603f3d011682016040523d82523d6000602084013e62000674565b606091505b506000815103620006b1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b600033905090565b828054620007289062000b87565b90600052602060002090601f0160209004810192826200074c576000855562000798565b82601f106200076757805160ff191683800117855562000798565b8280016001018555821562000798579182015b82811115620007975782518255916020019190600101906200077a565b5b509050620007a79190620007ab565b5090565b5b80821115620007c6576000816000905550600101620007ac565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6200083382620007e8565b810181811067ffffffffffffffff82111715620008555762000854620007f9565b5b80604052505050565b60006200086a620007ca565b905062000878828262000828565b919050565b600067ffffffffffffffff8211156200089b576200089a620007f9565b5b620008a682620007e8565b9050602081019050919050565b60005b83811015620008d3578082015181840152602081019050620008b6565b83811115620008e3576000848401525b50505050565b600062000900620008fa846200087d565b6200085e565b9050828152602081018484840111156200091f576200091e620007e3565b5b6200092c848285620008b3565b509392505050565b600082601f8301126200094c576200094b620007de565b5b81516200095e848260208601620008e9565b91505092915050565b60006020828403121562000980576200097f620007d4565b5b600082015167ffffffffffffffff811115620009a157620009a0620007d9565b5b620009af8482850162000934565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620009e582620009b8565b9050919050565b620009f781620009d8565b82525050565b6000819050919050565b62000a1281620009fd565b82525050565b600081519050919050565b600082825260208201905092915050565b600062000a418262000a18565b62000a4d818562000a23565b935062000a5f818560208601620008b3565b62000a6a81620007e8565b840191505092915050565b600060808201905062000a8c6000830187620009ec565b62000a9b6020830186620009ec565b62000aaa604083018562000a07565b818103606083015262000abe818462000a34565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b62000b008162000ac9565b811462000b0c57600080fd5b50565b60008151905062000b208162000af5565b92915050565b60006020828403121562000b3f5762000b3e620007d4565b5b600062000b4f8482850162000b0f565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000ba057607f821691505b60208210810362000bb65762000bb562000b58565b5b50919050565b6132de8062000bcc6000396000f3fe6080604052600436106101cd5760003560e01c8063837aea6c116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461063f578063f2c4ce1e1461067c578063f2fde38b146106a5578063f9da3224146106ce576101cd565b8063b88d4fde14610585578063c87b56dd146105ae578063d5abeb01146105eb578063da3ef23f14610616576101cd565b806395d89b41116100d157806395d89b41146104ea578063a035b1fe14610515578063a0712d6814610540578063a22cb4651461055c576101cd565b8063837aea6c1461047d5780638393634c146104a85780638da5cb5b146104bf576101cd565b806323b872dd1161016f5780636352211e1161013e5780636352211e146103c357806370a0823114610400578063715018a61461043d57806377b6cb0e14610454576101cd565b806323b872dd1461031f5780632e1a7d4d1461034857806342842e0e14610371578063484b973c1461039a576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a05780631a081330146102cb578063229c2048146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f4919061246f565b6106f7565b60405161020691906124b7565b60405180910390f35b34801561021b57600080fd5b50610224610789565b604051610231919061256b565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906125c3565b61081b565b60405161026e9190612631565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612678565b610897565b005b3480156102ac57600080fd5b506102b5610a3d565b6040516102c291906126c7565b60405180910390f35b3480156102d757600080fd5b506102e0610a54565b6040516102ed91906124b7565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190612722565b610a67565b005b34801561032b57600080fd5b506103466004803603810190610341919061274f565b610b0f565b005b34801561035457600080fd5b5061036f600480360381019061036a91906125c3565b610b1f565b005b34801561037d57600080fd5b506103986004803603810190610393919061274f565b610be5565b005b3480156103a657600080fd5b506103c160048036038101906103bc9190612678565b610c05565b005b3480156103cf57600080fd5b506103ea60048036038101906103e591906125c3565b610c8f565b6040516103f79190612631565b60405180910390f35b34801561040c57600080fd5b50610427600480360381019061042291906127a2565b610ca1565b60405161043491906126c7565b60405180910390f35b34801561044957600080fd5b50610452610d59565b005b34801561046057600080fd5b5061047b60048036038101906104769190612809565b610de1565b005b34801561048957600080fd5b50610492610e7d565b60405161049f9190612845565b60405180910390f35b3480156104b457600080fd5b506104bd610e91565b005b3480156104cb57600080fd5b506104d4610f39565b6040516104e19190612631565b60405180910390f35b3480156104f657600080fd5b506104ff610f63565b60405161050c919061256b565b60405180910390f35b34801561052157600080fd5b5061052a610ff5565b604051610537919061286f565b60405180910390f35b61055a600480360381019061055591906125c3565b61100f565b005b34801561056857600080fd5b50610583600480360381019061057e91906128b6565b61121e565b005b34801561059157600080fd5b506105ac60048036038101906105a79190612a2b565b611395565b005b3480156105ba57600080fd5b506105d560048036038101906105d091906125c3565b611408565b6040516105e2919061256b565b60405180910390f35b3480156105f757600080fd5b506106006115a7565b60405161060d9190612acd565b60405180910390f35b34801561062257600080fd5b5061063d60048036038101906106389190612b89565b6115bd565b005b34801561064b57600080fd5b5061066660048036038101906106619190612bd2565b611653565b60405161067391906124b7565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e9190612b89565b6116e7565b005b3480156106b157600080fd5b506106cc60048036038101906106c791906127a2565b61177d565b005b3480156106da57600080fd5b506106f560048036038101906106f09190612c3e565b611874565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061075257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107825750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461079890612c9a565b80601f01602080910402602001604051908101604052809291908181526020018280546107c490612c9a565b80156108115780601f106107e657610100808354040283529160200191610811565b820191906000526020600020905b8154815290600101906020018083116107f457829003601f168201915b5050505050905090565b600061082682611914565b61085c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108a282611973565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610909576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610928611a3f565b73ffffffffffffffffffffffffffffffffffffffff161461098b576109548161094f611a3f565b611653565b61098a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a47611a47565b6001546000540303905090565b600960089054906101000a900460ff1681565b610a6f611a50565b73ffffffffffffffffffffffffffffffffffffffff16610a8d610f39565b73ffffffffffffffffffffffffffffffffffffffff1614610ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ada90612d17565b60405180910390fd5b80600960006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b610b1a838383611a58565b505050565b610b27611a50565b73ffffffffffffffffffffffffffffffffffffffff16610b45610f39565b73ffffffffffffffffffffffffffffffffffffffff1614610b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9290612d17565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610be1573d6000803e3d6000fd5b5050565b610c0083838360405180602001604052806000815250611395565b505050565b610c0d611a50565b73ffffffffffffffffffffffffffffffffffffffff16610c2b610f39565b73ffffffffffffffffffffffffffffffffffffffff1614610c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7890612d17565b60405180910390fd5b610c8b8282611dff565b5050565b6000610c9a82611973565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d08576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d61611a50565b73ffffffffffffffffffffffffffffffffffffffff16610d7f610f39565b73ffffffffffffffffffffffffffffffffffffffff1614610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc90612d17565b60405180910390fd5b610ddf6000611e1d565b565b610de9611a50565b73ffffffffffffffffffffffffffffffffffffffff16610e07610f39565b73ffffffffffffffffffffffffffffffffffffffff1614610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5490612d17565b60405180910390fd5b80600860186101000a81548161ffff021916908361ffff16021790555050565b600860189054906101000a900461ffff1681565b610e99611a50565b73ffffffffffffffffffffffffffffffffffffffff16610eb7610f39565b73ffffffffffffffffffffffffffffffffffffffff1614610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490612d17565b60405180910390fd5b600960089054906101000a900460ff1615600960086101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610f7290612c9a565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9e90612c9a565b8015610feb5780601f10610fc057610100808354040283529160200191610feb565b820191906000526020600020905b815481529060010190602001808311610fce57829003601f168201915b5050505050905090565b600960009054906101000a900467ffffffffffffffff1681565b600960089054906101000a900460ff1661105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590612d83565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c390612def565b60405180910390fd5b600860149054906101000a900463ffffffff1663ffffffff16816110ee610a3d565b6110f89190612e3e565b1115611139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113090612ee0565b60405180910390fd5b600860189054906101000a900461ffff1661ffff168161115833610ca1565b6111629190612e3e565b11156111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90612f4c565b60405180910390fd5b600960009054906101000a900467ffffffffffffffff1667ffffffffffffffff16816111cf9190612f6c565b341015611211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120890613012565b60405180910390fd5b61121b3382611dff565b50565b611226611a3f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361128a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611297611a3f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611344611a3f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161138991906124b7565b60405180910390a35050565b6113a0848484611a58565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611402576113cb84848484611ee3565b611401576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061141382611914565b611449576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600b805461145890612c9a565b80601f016020809104026020016040519081016040528092919081815260200182805461148490612c9a565b80156114d15780601f106114a6576101008083540402835291602001916114d1565b820191906000526020600020905b8154815290600101906020018083116114b457829003601f168201915b50505050509050600081510361157157600a80546114ee90612c9a565b80601f016020809104026020016040519081016040528092919081815260200182805461151a90612c9a565b80156115675780601f1061153c57610100808354040283529160200191611567565b820191906000526020600020905b81548152906001019060200180831161154a57829003601f168201915b505050505061159f565b8061157b84612033565b600c60405160200161158f93929190613102565b6040516020818303038152906040525b915050919050565b600860149054906101000a900463ffffffff1681565b6115c5611a50565b73ffffffffffffffffffffffffffffffffffffffff166115e3610f39565b73ffffffffffffffffffffffffffffffffffffffff1614611639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163090612d17565b60405180910390fd5b80600c908051906020019061164f929190612360565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116ef611a50565b73ffffffffffffffffffffffffffffffffffffffff1661170d610f39565b73ffffffffffffffffffffffffffffffffffffffff1614611763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175a90612d17565b60405180910390fd5b80600a9080519060200190611779929190612360565b5050565b611785611a50565b73ffffffffffffffffffffffffffffffffffffffff166117a3610f39565b73ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f090612d17565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185f906131a5565b60405180910390fd5b61187181611e1d565b50565b61187c611a50565b73ffffffffffffffffffffffffffffffffffffffff1661189a610f39565b73ffffffffffffffffffffffffffffffffffffffff16146118f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e790612d17565b60405180910390fd5b80600860146101000a81548163ffffffff021916908363ffffffff16021790555050565b60008161191f611a47565b1115801561192e575060005482105b801561196c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611982611a47565b11611a0857600054811015611a075760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611a05575b600081036119fb5760046000836001900393508381526020019081526020016000205490506119d1565b8092505050611a3a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600033905090565b6000611a6382611973565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611aca576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611aeb611a3f565b73ffffffffffffffffffffffffffffffffffffffff161480611b1a5750611b1985611b14611a3f565b611653565b5b80611b5f5750611b28611a3f565b73ffffffffffffffffffffffffffffffffffffffff16611b478461081b565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611b98576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611bfe576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c0b858585600161208d565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611d0886612093565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611d905760006001840190506000600460008381526020019081526020016000205403611d8e576000548114611d8d578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611df8858585600161209d565b5050505050565b611e198282604051806020016040528060008152506120a3565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f09611a3f565b8786866040518563ffffffff1660e01b8152600401611f2b949392919061321a565b6020604051808303816000875af1925050508015611f6757506040513d601f19601f82011682018060405250810190611f64919061327b565b60015b611fe0573d8060008114611f97576040519150601f19603f3d011682016040523d82523d6000602084013e611f9c565b606091505b506000815103611fd8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561207957600183039250600a81066030018353600a81049050612059565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361210f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612149576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612156600085838661208d565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16121bb60018514612356565b901b60a042901b6121cb86612093565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146122cf575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461227f6000878480600101955087611ee3565b6122b5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106122105782600054146122ca57600080fd5b61233a565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106122d0575b816000819055505050612350600085838661209d565b50505050565b6000819050919050565b82805461236c90612c9a565b90600052602060002090601f01602090048101928261238e57600085556123d5565b82601f106123a757805160ff19168380011785556123d5565b828001600101855582156123d5579182015b828111156123d45782518255916020019190600101906123b9565b5b5090506123e291906123e6565b5090565b5b808211156123ff5760008160009055506001016123e7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61244c81612417565b811461245757600080fd5b50565b60008135905061246981612443565b92915050565b6000602082840312156124855761248461240d565b5b60006124938482850161245a565b91505092915050565b60008115159050919050565b6124b18161249c565b82525050565b60006020820190506124cc60008301846124a8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561250c5780820151818401526020810190506124f1565b8381111561251b576000848401525b50505050565b6000601f19601f8301169050919050565b600061253d826124d2565b61254781856124dd565b93506125578185602086016124ee565b61256081612521565b840191505092915050565b600060208201905081810360008301526125858184612532565b905092915050565b6000819050919050565b6125a08161258d565b81146125ab57600080fd5b50565b6000813590506125bd81612597565b92915050565b6000602082840312156125d9576125d861240d565b5b60006125e7848285016125ae565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061261b826125f0565b9050919050565b61262b81612610565b82525050565b60006020820190506126466000830184612622565b92915050565b61265581612610565b811461266057600080fd5b50565b6000813590506126728161264c565b92915050565b6000806040838503121561268f5761268e61240d565b5b600061269d85828601612663565b92505060206126ae858286016125ae565b9150509250929050565b6126c18161258d565b82525050565b60006020820190506126dc60008301846126b8565b92915050565b600067ffffffffffffffff82169050919050565b6126ff816126e2565b811461270a57600080fd5b50565b60008135905061271c816126f6565b92915050565b6000602082840312156127385761273761240d565b5b60006127468482850161270d565b91505092915050565b6000806000606084860312156127685761276761240d565b5b600061277686828701612663565b935050602061278786828701612663565b9250506040612798868287016125ae565b9150509250925092565b6000602082840312156127b8576127b761240d565b5b60006127c684828501612663565b91505092915050565b600061ffff82169050919050565b6127e6816127cf565b81146127f157600080fd5b50565b600081359050612803816127dd565b92915050565b60006020828403121561281f5761281e61240d565b5b600061282d848285016127f4565b91505092915050565b61283f816127cf565b82525050565b600060208201905061285a6000830184612836565b92915050565b612869816126e2565b82525050565b60006020820190506128846000830184612860565b92915050565b6128938161249c565b811461289e57600080fd5b50565b6000813590506128b08161288a565b92915050565b600080604083850312156128cd576128cc61240d565b5b60006128db85828601612663565b92505060206128ec858286016128a1565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61293882612521565b810181811067ffffffffffffffff8211171561295757612956612900565b5b80604052505050565b600061296a612403565b9050612976828261292f565b919050565b600067ffffffffffffffff82111561299657612995612900565b5b61299f82612521565b9050602081019050919050565b82818337600083830152505050565b60006129ce6129c98461297b565b612960565b9050828152602081018484840111156129ea576129e96128fb565b5b6129f58482856129ac565b509392505050565b600082601f830112612a1257612a116128f6565b5b8135612a228482602086016129bb565b91505092915050565b60008060008060808587031215612a4557612a4461240d565b5b6000612a5387828801612663565b9450506020612a6487828801612663565b9350506040612a75878288016125ae565b925050606085013567ffffffffffffffff811115612a9657612a95612412565b5b612aa2878288016129fd565b91505092959194509250565b600063ffffffff82169050919050565b612ac781612aae565b82525050565b6000602082019050612ae26000830184612abe565b92915050565b600067ffffffffffffffff821115612b0357612b02612900565b5b612b0c82612521565b9050602081019050919050565b6000612b2c612b2784612ae8565b612960565b905082815260208101848484011115612b4857612b476128fb565b5b612b538482856129ac565b509392505050565b600082601f830112612b7057612b6f6128f6565b5b8135612b80848260208601612b19565b91505092915050565b600060208284031215612b9f57612b9e61240d565b5b600082013567ffffffffffffffff811115612bbd57612bbc612412565b5b612bc984828501612b5b565b91505092915050565b60008060408385031215612be957612be861240d565b5b6000612bf785828601612663565b9250506020612c0885828601612663565b9150509250929050565b612c1b81612aae565b8114612c2657600080fd5b50565b600081359050612c3881612c12565b92915050565b600060208284031215612c5457612c5361240d565b5b6000612c6284828501612c29565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cb257607f821691505b602082108103612cc557612cc4612c6b565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612d016020836124dd565b9150612d0c82612ccb565b602082019050919050565b60006020820190508181036000830152612d3081612cf4565b9050919050565b7f73616c65206973206e6f74207374617274656420796574000000000000000000600082015250565b6000612d6d6017836124dd565b9150612d7882612d37565b602082019050919050565b60006020820190508181036000830152612d9c81612d60565b9050919050565b7f63616e206e6f742062652063616c6c6564206279206120636f6e747261637400600082015250565b6000612dd9601f836124dd565b9150612de482612da3565b602082019050919050565b60006020820190508181036000830152612e0881612dcc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e498261258d565b9150612e548361258d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e8957612e88612e0f565b5b828201905092915050565b7f616d6f756e742065786365656473206d617820737570706c7900000000000000600082015250565b6000612eca6019836124dd565b9150612ed582612e94565b602082019050919050565b60006020820190508181036000830152612ef981612ebd565b9050919050565b7f616d6f756e74206578636565647320796f757220616c6c6f636174696f6e0000600082015250565b6000612f36601e836124dd565b9150612f4182612f00565b602082019050919050565b60006020820190508181036000830152612f6581612f29565b9050919050565b6000612f778261258d565b9150612f828361258d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612fbb57612fba612e0f565b5b828202905092915050565b7f756e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b6000612ffc6014836124dd565b915061300782612fc6565b602082019050919050565b6000602082019050818103600083015261302b81612fef565b9050919050565b600081905092915050565b6000613048826124d2565b6130528185613032565b93506130628185602086016124ee565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461309081612c9a565b61309a8186613032565b945060018216600081146130b557600181146130c6576130f9565b60ff198316865281860193506130f9565b6130cf8561306e565b60005b838110156130f1578154818901526001820191506020810190506130d2565b838801955050505b50505092915050565b600061310e828661303d565b915061311a828561303d565b91506131268284613083565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061318f6026836124dd565b915061319a82613133565b604082019050919050565b600060208201905081810360008301526131be81613182565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006131ec826131c5565b6131f681856131d0565b93506132068185602086016124ee565b61320f81612521565b840191505092915050565b600060808201905061322f6000830187612622565b61323c6020830186612622565b61324960408301856126b8565b818103606083015261325b81846131e1565b905095945050505050565b60008151905061327581612443565b92915050565b6000602082840312156132915761329061240d565b5b600061329f84828501613266565b9150509291505056fea26469706673582212201c5b40d86646a1fd1461b38a337efc592116c552b200874238090e4a4ce1923e64736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f516d58616e4a4c3868735156514169394c446739786d676b4651645459547a32707473435841703637556e7465342f6d657461646174612e6a736f6e0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c8063837aea6c116100f7578063b88d4fde11610095578063e985e9c511610064578063e985e9c51461063f578063f2c4ce1e1461067c578063f2fde38b146106a5578063f9da3224146106ce576101cd565b8063b88d4fde14610585578063c87b56dd146105ae578063d5abeb01146105eb578063da3ef23f14610616576101cd565b806395d89b41116100d157806395d89b41146104ea578063a035b1fe14610515578063a0712d6814610540578063a22cb4651461055c576101cd565b8063837aea6c1461047d5780638393634c146104a85780638da5cb5b146104bf576101cd565b806323b872dd1161016f5780636352211e1161013e5780636352211e146103c357806370a0823114610400578063715018a61461043d57806377b6cb0e14610454576101cd565b806323b872dd1461031f5780632e1a7d4d1461034857806342842e0e14610371578063484b973c1461039a576101cd565b8063095ea7b3116101ab578063095ea7b31461027757806318160ddd146102a05780631a081330146102cb578063229c2048146102f6576101cd565b806301ffc9a7146101d257806306fdde031461020f578063081812fc1461023a575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f4919061246f565b6106f7565b60405161020691906124b7565b60405180910390f35b34801561021b57600080fd5b50610224610789565b604051610231919061256b565b60405180910390f35b34801561024657600080fd5b50610261600480360381019061025c91906125c3565b61081b565b60405161026e9190612631565b60405180910390f35b34801561028357600080fd5b5061029e60048036038101906102999190612678565b610897565b005b3480156102ac57600080fd5b506102b5610a3d565b6040516102c291906126c7565b60405180910390f35b3480156102d757600080fd5b506102e0610a54565b6040516102ed91906124b7565b60405180910390f35b34801561030257600080fd5b5061031d60048036038101906103189190612722565b610a67565b005b34801561032b57600080fd5b506103466004803603810190610341919061274f565b610b0f565b005b34801561035457600080fd5b5061036f600480360381019061036a91906125c3565b610b1f565b005b34801561037d57600080fd5b506103986004803603810190610393919061274f565b610be5565b005b3480156103a657600080fd5b506103c160048036038101906103bc9190612678565b610c05565b005b3480156103cf57600080fd5b506103ea60048036038101906103e591906125c3565b610c8f565b6040516103f79190612631565b60405180910390f35b34801561040c57600080fd5b50610427600480360381019061042291906127a2565b610ca1565b60405161043491906126c7565b60405180910390f35b34801561044957600080fd5b50610452610d59565b005b34801561046057600080fd5b5061047b60048036038101906104769190612809565b610de1565b005b34801561048957600080fd5b50610492610e7d565b60405161049f9190612845565b60405180910390f35b3480156104b457600080fd5b506104bd610e91565b005b3480156104cb57600080fd5b506104d4610f39565b6040516104e19190612631565b60405180910390f35b3480156104f657600080fd5b506104ff610f63565b60405161050c919061256b565b60405180910390f35b34801561052157600080fd5b5061052a610ff5565b604051610537919061286f565b60405180910390f35b61055a600480360381019061055591906125c3565b61100f565b005b34801561056857600080fd5b50610583600480360381019061057e91906128b6565b61121e565b005b34801561059157600080fd5b506105ac60048036038101906105a79190612a2b565b611395565b005b3480156105ba57600080fd5b506105d560048036038101906105d091906125c3565b611408565b6040516105e2919061256b565b60405180910390f35b3480156105f757600080fd5b506106006115a7565b60405161060d9190612acd565b60405180910390f35b34801561062257600080fd5b5061063d60048036038101906106389190612b89565b6115bd565b005b34801561064b57600080fd5b5061066660048036038101906106619190612bd2565b611653565b60405161067391906124b7565b60405180910390f35b34801561068857600080fd5b506106a3600480360381019061069e9190612b89565b6116e7565b005b3480156106b157600080fd5b506106cc60048036038101906106c791906127a2565b61177d565b005b3480156106da57600080fd5b506106f560048036038101906106f09190612c3e565b611874565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061075257506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806107825750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461079890612c9a565b80601f01602080910402602001604051908101604052809291908181526020018280546107c490612c9a565b80156108115780601f106107e657610100808354040283529160200191610811565b820191906000526020600020905b8154815290600101906020018083116107f457829003601f168201915b5050505050905090565b600061082682611914565b61085c576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006108a282611973565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610909576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610928611a3f565b73ffffffffffffffffffffffffffffffffffffffff161461098b576109548161094f611a3f565b611653565b61098a576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610a47611a47565b6001546000540303905090565b600960089054906101000a900460ff1681565b610a6f611a50565b73ffffffffffffffffffffffffffffffffffffffff16610a8d610f39565b73ffffffffffffffffffffffffffffffffffffffff1614610ae3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ada90612d17565b60405180910390fd5b80600960006101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555050565b610b1a838383611a58565b505050565b610b27611a50565b73ffffffffffffffffffffffffffffffffffffffff16610b45610f39565b73ffffffffffffffffffffffffffffffffffffffff1614610b9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9290612d17565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610be1573d6000803e3d6000fd5b5050565b610c0083838360405180602001604052806000815250611395565b505050565b610c0d611a50565b73ffffffffffffffffffffffffffffffffffffffff16610c2b610f39565b73ffffffffffffffffffffffffffffffffffffffff1614610c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c7890612d17565b60405180910390fd5b610c8b8282611dff565b5050565b6000610c9a82611973565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610d08576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610d61611a50565b73ffffffffffffffffffffffffffffffffffffffff16610d7f610f39565b73ffffffffffffffffffffffffffffffffffffffff1614610dd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dcc90612d17565b60405180910390fd5b610ddf6000611e1d565b565b610de9611a50565b73ffffffffffffffffffffffffffffffffffffffff16610e07610f39565b73ffffffffffffffffffffffffffffffffffffffff1614610e5d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5490612d17565b60405180910390fd5b80600860186101000a81548161ffff021916908361ffff16021790555050565b600860189054906101000a900461ffff1681565b610e99611a50565b73ffffffffffffffffffffffffffffffffffffffff16610eb7610f39565b73ffffffffffffffffffffffffffffffffffffffff1614610f0d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0490612d17565b60405180910390fd5b600960089054906101000a900460ff1615600960086101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610f7290612c9a565b80601f0160208091040260200160405190810160405280929190818152602001828054610f9e90612c9a565b8015610feb5780601f10610fc057610100808354040283529160200191610feb565b820191906000526020600020905b815481529060010190602001808311610fce57829003601f168201915b5050505050905090565b600960009054906101000a900467ffffffffffffffff1681565b600960089054906101000a900460ff1661105e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105590612d83565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff16146110cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c390612def565b60405180910390fd5b600860149054906101000a900463ffffffff1663ffffffff16816110ee610a3d565b6110f89190612e3e565b1115611139576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113090612ee0565b60405180910390fd5b600860189054906101000a900461ffff1661ffff168161115833610ca1565b6111629190612e3e565b11156111a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161119a90612f4c565b60405180910390fd5b600960009054906101000a900467ffffffffffffffff1667ffffffffffffffff16816111cf9190612f6c565b341015611211576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120890613012565b60405180910390fd5b61121b3382611dff565b50565b611226611a3f565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361128a576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611297611a3f565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611344611a3f565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161138991906124b7565b60405180910390a35050565b6113a0848484611a58565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611402576113cb84848484611ee3565b611401576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606061141382611914565b611449576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600b805461145890612c9a565b80601f016020809104026020016040519081016040528092919081815260200182805461148490612c9a565b80156114d15780601f106114a6576101008083540402835291602001916114d1565b820191906000526020600020905b8154815290600101906020018083116114b457829003601f168201915b50505050509050600081510361157157600a80546114ee90612c9a565b80601f016020809104026020016040519081016040528092919081815260200182805461151a90612c9a565b80156115675780601f1061153c57610100808354040283529160200191611567565b820191906000526020600020905b81548152906001019060200180831161154a57829003601f168201915b505050505061159f565b8061157b84612033565b600c60405160200161158f93929190613102565b6040516020818303038152906040525b915050919050565b600860149054906101000a900463ffffffff1681565b6115c5611a50565b73ffffffffffffffffffffffffffffffffffffffff166115e3610f39565b73ffffffffffffffffffffffffffffffffffffffff1614611639576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163090612d17565b60405180910390fd5b80600c908051906020019061164f929190612360565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6116ef611a50565b73ffffffffffffffffffffffffffffffffffffffff1661170d610f39565b73ffffffffffffffffffffffffffffffffffffffff1614611763576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175a90612d17565b60405180910390fd5b80600a9080519060200190611779929190612360565b5050565b611785611a50565b73ffffffffffffffffffffffffffffffffffffffff166117a3610f39565b73ffffffffffffffffffffffffffffffffffffffff16146117f9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f090612d17565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611868576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161185f906131a5565b60405180910390fd5b61187181611e1d565b50565b61187c611a50565b73ffffffffffffffffffffffffffffffffffffffff1661189a610f39565b73ffffffffffffffffffffffffffffffffffffffff16146118f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118e790612d17565b60405180910390fd5b80600860146101000a81548163ffffffff021916908363ffffffff16021790555050565b60008161191f611a47565b1115801561192e575060005482105b801561196c575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611982611a47565b11611a0857600054811015611a075760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603611a05575b600081036119fb5760046000836001900393508381526020019081526020016000205490506119d1565b8092505050611a3a565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b60006001905090565b600033905090565b6000611a6382611973565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611aca576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611aeb611a3f565b73ffffffffffffffffffffffffffffffffffffffff161480611b1a5750611b1985611b14611a3f565b611653565b5b80611b5f5750611b28611a3f565b73ffffffffffffffffffffffffffffffffffffffff16611b478461081b565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611b98576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611bfe576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611c0b858585600161208d565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b611d0886612093565b1717600460008581526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000831603611d905760006001840190506000600460008381526020019081526020016000205403611d8e576000548114611d8d578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611df8858585600161209d565b5050505050565b611e198282604051806020016040528060008152506120a3565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611f09611a3f565b8786866040518563ffffffff1660e01b8152600401611f2b949392919061321a565b6020604051808303816000875af1925050508015611f6757506040513d601f19601f82011682018060405250810190611f64919061327b565b60015b611fe0573d8060008114611f97576040519150601f19603f3d011682016040523d82523d6000602084013e611f9c565b606091505b506000815103611fd8576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b801561207957600183039250600a81066030018353600a81049050612059565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361210f576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008303612149576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612156600085838661208d565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16121bb60018514612356565b901b60a042901b6121cb86612093565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b146122cf575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461227f6000878480600101955087611ee3565b6122b5576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8082106122105782600054146122ca57600080fd5b61233a565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a48082106122d0575b816000819055505050612350600085838661209d565b50505050565b6000819050919050565b82805461236c90612c9a565b90600052602060002090601f01602090048101928261238e57600085556123d5565b82601f106123a757805160ff19168380011785556123d5565b828001600101855582156123d5579182015b828111156123d45782518255916020019190600101906123b9565b5b5090506123e291906123e6565b5090565b5b808211156123ff5760008160009055506001016123e7565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61244c81612417565b811461245757600080fd5b50565b60008135905061246981612443565b92915050565b6000602082840312156124855761248461240d565b5b60006124938482850161245a565b91505092915050565b60008115159050919050565b6124b18161249c565b82525050565b60006020820190506124cc60008301846124a8565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b8381101561250c5780820151818401526020810190506124f1565b8381111561251b576000848401525b50505050565b6000601f19601f8301169050919050565b600061253d826124d2565b61254781856124dd565b93506125578185602086016124ee565b61256081612521565b840191505092915050565b600060208201905081810360008301526125858184612532565b905092915050565b6000819050919050565b6125a08161258d565b81146125ab57600080fd5b50565b6000813590506125bd81612597565b92915050565b6000602082840312156125d9576125d861240d565b5b60006125e7848285016125ae565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061261b826125f0565b9050919050565b61262b81612610565b82525050565b60006020820190506126466000830184612622565b92915050565b61265581612610565b811461266057600080fd5b50565b6000813590506126728161264c565b92915050565b6000806040838503121561268f5761268e61240d565b5b600061269d85828601612663565b92505060206126ae858286016125ae565b9150509250929050565b6126c18161258d565b82525050565b60006020820190506126dc60008301846126b8565b92915050565b600067ffffffffffffffff82169050919050565b6126ff816126e2565b811461270a57600080fd5b50565b60008135905061271c816126f6565b92915050565b6000602082840312156127385761273761240d565b5b60006127468482850161270d565b91505092915050565b6000806000606084860312156127685761276761240d565b5b600061277686828701612663565b935050602061278786828701612663565b9250506040612798868287016125ae565b9150509250925092565b6000602082840312156127b8576127b761240d565b5b60006127c684828501612663565b91505092915050565b600061ffff82169050919050565b6127e6816127cf565b81146127f157600080fd5b50565b600081359050612803816127dd565b92915050565b60006020828403121561281f5761281e61240d565b5b600061282d848285016127f4565b91505092915050565b61283f816127cf565b82525050565b600060208201905061285a6000830184612836565b92915050565b612869816126e2565b82525050565b60006020820190506128846000830184612860565b92915050565b6128938161249c565b811461289e57600080fd5b50565b6000813590506128b08161288a565b92915050565b600080604083850312156128cd576128cc61240d565b5b60006128db85828601612663565b92505060206128ec858286016128a1565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61293882612521565b810181811067ffffffffffffffff8211171561295757612956612900565b5b80604052505050565b600061296a612403565b9050612976828261292f565b919050565b600067ffffffffffffffff82111561299657612995612900565b5b61299f82612521565b9050602081019050919050565b82818337600083830152505050565b60006129ce6129c98461297b565b612960565b9050828152602081018484840111156129ea576129e96128fb565b5b6129f58482856129ac565b509392505050565b600082601f830112612a1257612a116128f6565b5b8135612a228482602086016129bb565b91505092915050565b60008060008060808587031215612a4557612a4461240d565b5b6000612a5387828801612663565b9450506020612a6487828801612663565b9350506040612a75878288016125ae565b925050606085013567ffffffffffffffff811115612a9657612a95612412565b5b612aa2878288016129fd565b91505092959194509250565b600063ffffffff82169050919050565b612ac781612aae565b82525050565b6000602082019050612ae26000830184612abe565b92915050565b600067ffffffffffffffff821115612b0357612b02612900565b5b612b0c82612521565b9050602081019050919050565b6000612b2c612b2784612ae8565b612960565b905082815260208101848484011115612b4857612b476128fb565b5b612b538482856129ac565b509392505050565b600082601f830112612b7057612b6f6128f6565b5b8135612b80848260208601612b19565b91505092915050565b600060208284031215612b9f57612b9e61240d565b5b600082013567ffffffffffffffff811115612bbd57612bbc612412565b5b612bc984828501612b5b565b91505092915050565b60008060408385031215612be957612be861240d565b5b6000612bf785828601612663565b9250506020612c0885828601612663565b9150509250929050565b612c1b81612aae565b8114612c2657600080fd5b50565b600081359050612c3881612c12565b92915050565b600060208284031215612c5457612c5361240d565b5b6000612c6284828501612c29565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cb257607f821691505b602082108103612cc557612cc4612c6b565b5b50919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612d016020836124dd565b9150612d0c82612ccb565b602082019050919050565b60006020820190508181036000830152612d3081612cf4565b9050919050565b7f73616c65206973206e6f74207374617274656420796574000000000000000000600082015250565b6000612d6d6017836124dd565b9150612d7882612d37565b602082019050919050565b60006020820190508181036000830152612d9c81612d60565b9050919050565b7f63616e206e6f742062652063616c6c6564206279206120636f6e747261637400600082015250565b6000612dd9601f836124dd565b9150612de482612da3565b602082019050919050565b60006020820190508181036000830152612e0881612dcc565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e498261258d565b9150612e548361258d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e8957612e88612e0f565b5b828201905092915050565b7f616d6f756e742065786365656473206d617820737570706c7900000000000000600082015250565b6000612eca6019836124dd565b9150612ed582612e94565b602082019050919050565b60006020820190508181036000830152612ef981612ebd565b9050919050565b7f616d6f756e74206578636565647320796f757220616c6c6f636174696f6e0000600082015250565b6000612f36601e836124dd565b9150612f4182612f00565b602082019050919050565b60006020820190508181036000830152612f6581612f29565b9050919050565b6000612f778261258d565b9150612f828361258d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615612fbb57612fba612e0f565b5b828202905092915050565b7f756e73756666696369656e74207061796d656e74000000000000000000000000600082015250565b6000612ffc6014836124dd565b915061300782612fc6565b602082019050919050565b6000602082019050818103600083015261302b81612fef565b9050919050565b600081905092915050565b6000613048826124d2565b6130528185613032565b93506130628185602086016124ee565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461309081612c9a565b61309a8186613032565b945060018216600081146130b557600181146130c6576130f9565b60ff198316865281860193506130f9565b6130cf8561306e565b60005b838110156130f1578154818901526001820191506020810190506130d2565b838801955050505b50505092915050565b600061310e828661303d565b915061311a828561303d565b91506131268284613083565b9150819050949350505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b600061318f6026836124dd565b915061319a82613133565b604082019050919050565b600060208201905081810360008301526131be81613182565b9050919050565b600081519050919050565b600082825260208201905092915050565b60006131ec826131c5565b6131f681856131d0565b93506132068185602086016124ee565b61320f81612521565b840191505092915050565b600060808201905061322f6000830187612622565b61323c6020830186612622565b61324960408301856126b8565b818103606083015261325b81846131e1565b905095945050505050565b60008151905061327581612443565b92915050565b6000602082840312156132915761329061240d565b5b600061329f84828501613266565b9150509291505056fea26469706673582212201c5b40d86646a1fd1461b38a337efc592116c552b200874238090e4a4ce1923e64736f6c634300080d0033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000043697066733a2f2f516d58616e4a4c3868735156514169394c446739786d676b4651645459547a32707473435841703637556e7465342f6d657461646174612e6a736f6e0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _notRevealedURI (string): ipfs://QmXanJL8hsQVQAi9LDg9xmgkFQdTYTz2ptsCXAp67Unte4/metadata.json

-----Encoded View---------------
5 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [2] : 697066733a2f2f516d58616e4a4c3868735156514169394c446739786d676b46
Arg [3] : 51645459547a32707473435841703637556e7465342f6d657461646174612e6a
Arg [4] : 736f6e0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

42642:2457:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16728:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21741:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23809:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23269:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15782:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42858:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44887:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24695:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44181:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24936:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44986:110;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21530:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17407:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3093:103;;;;;;;;;;;;;:::i;:::-;;44758:121;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42747:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44553:88;;;;;;;;;;;;;:::i;:::-;;2442:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21910:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42789:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43199:502;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24085:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25192:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43709:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42710:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44422:123;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24464:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44299:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3351:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44649:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16728:615;16813:4;17128:10;17113:25;;:11;:25;;;;:102;;;;17205:10;17190:25;;:11;:25;;;;17113:102;:179;;;;17282:10;17267:25;;:11;:25;;;;17113:179;17093:199;;16728:615;;;:::o;21741:100::-;21795:13;21828:5;21821:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21741:100;:::o;23809:204::-;23877:7;23902:16;23910:7;23902;:16::i;:::-;23897:64;;23927:34;;;;;;;;;;;;;;23897:64;23981:15;:24;23997:7;23981:24;;;;;;;;;;;;;;;;;;;;;23974:31;;23809:204;;;:::o;23269:474::-;23342:13;23374:27;23393:7;23374:18;:27::i;:::-;23342:61;;23424:5;23418:11;;:2;:11;;;23414:48;;23438:24;;;;;;;;;;;;;;23414:48;23502:5;23479:28;;:19;:17;:19::i;:::-;:28;;;23475:175;;23527:44;23544:5;23551:19;:17;:19::i;:::-;23527:16;:44::i;:::-;23522:128;;23599:35;;;;;;;;;;;;;;23522:128;23475:175;23689:2;23662:15;:24;23678:7;23662:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;23727:7;23723:2;23707:28;;23716:5;23707:28;;;;;;;;;;;;23331:412;23269:474;;:::o;15782:315::-;15835:7;16063:15;:13;:15::i;:::-;16048:12;;16032:13;;:28;:46;16025:53;;15782:315;:::o;42858:22::-;;;;;;;;;;;;;:::o;44887:91::-;2673:12;:10;:12::i;:::-;2662:23;;:7;:5;:7::i;:::-;:23;;;2654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44961:9:::1;44953:5;;:17;;;;;;;;;;;;;;;;;;44887:91:::0;:::o;24695:170::-;24829:28;24839:4;24845:2;24849:7;24829:9;:28::i;:::-;24695:170;;;:::o;44181:110::-;2673:12;:10;:12::i;:::-;2662:23;;:7;:5;:7::i;:::-;:23;;;2654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44254:10:::1;44246:28;;:37;44275:7;44246:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;44181:110:::0;:::o;24936:185::-;25074:39;25091:4;25097:2;25101:7;25074:39;;;;;;;;;;;;:16;:39::i;:::-;24936:185;;;:::o;44986:110::-;2673:12;:10;:12::i;:::-;2662:23;;:7;:5;:7::i;:::-;:23;;;2654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45065:23:::1;45075:3;45080:7;45065:9;:23::i;:::-;44986:110:::0;;:::o;21530:144::-;21594:7;21637:27;21656:7;21637:18;:27::i;:::-;21614:52;;21530:144;;;:::o;17407:224::-;17471:7;17512:1;17495:19;;:5;:19;;;17491:60;;17523:28;;;;;;;;;;;;;;17491:60;12746:13;17569:18;:25;17588:5;17569:25;;;;;;;;;;;;;;;;:54;17562:61;;17407:224;;;:::o;3093:103::-;2673:12;:10;:12::i;:::-;2662:23;;:7;:5;:7::i;:::-;:23;;;2654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3158:30:::1;3185:1;3158:18;:30::i;:::-;3093:103::o:0;44758:121::-;2673:12;:10;:12::i;:::-;2662:23;;:7;:5;:7::i;:::-;:23;;;2654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44858:13:::1;44839:16;;:32;;;;;;;;;;;;;;;;;;44758:121:::0;:::o;42747:35::-;;;;;;;;;;;;;:::o;44553:88::-;2673:12;:10;:12::i;:::-;2662:23;;:7;:5;:7::i;:::-;:23;;;2654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44623:10:::1;;;;;;;;;;;44622:11;44609:10;;:24;;;;;;;;;;;;;;;;;;44553:88::o:0;2442:87::-;2488:7;2515:6;;;;;;;;;;;2508:13;;2442:87;:::o;21910:104::-;21966:13;21999:7;21992:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21910:104;:::o;42789:32::-;;;;;;;;;;;;;:::o;43199:502::-;43267:10;;;;;;;;;;;43259:46;;;;;;;;;;;;:::i;:::-;;;;;;;;;43337:10;43324:23;;:9;:23;;;43316:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;43431:9;;;;;;;;;;;43403:37;;43419:8;43403:13;:11;:13::i;:::-;:24;;;;:::i;:::-;:37;;43395:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;43525:16;;;;;;;;;;;43489:52;;43513:8;43489:21;43499:10;43489:9;:21::i;:::-;:32;;;;:::i;:::-;:52;;43481:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;43619:5;;;;;;;;;;;43608:16;;:8;:16;;;;:::i;:::-;43595:9;:29;;43587:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;43662:31;43672:10;43684:8;43662:9;:31::i;:::-;43199:502;:::o;24085:308::-;24196:19;:17;:19::i;:::-;24184:31;;:8;:31;;;24180:61;;24224:17;;;;;;;;;;;;;;24180:61;24306:8;24254:18;:39;24273:19;:17;:19::i;:::-;24254:39;;;;;;;;;;;;;;;:49;24294:8;24254:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;24366:8;24330:55;;24345:19;:17;:19::i;:::-;24330:55;;;24376:8;24330:55;;;;;;:::i;:::-;;;;;;;;24085:308;;:::o;25192:396::-;25359:28;25369:4;25375:2;25379:7;25359:9;:28::i;:::-;25420:1;25402:2;:14;;;:19;25398:183;;25441:56;25472:4;25478:2;25482:7;25491:5;25441:30;:56::i;:::-;25436:145;;25525:40;;;;;;;;;;;;;;25436:145;25398:183;25192:396;;;;:::o;43709:335::-;43773:13;43803:16;43811:7;43803;:16::i;:::-;43799:58;;43828:29;;;;;;;;;;;;;;43799:58;43870:21;43894:8;43870:32;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43945:1;43926:7;43920:21;:26;:116;;44021:15;43920:116;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43973:7;43982:18;43992:7;43982:9;:18::i;:::-;44002:14;43956:61;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43920:116;43913:123;;;43709:335;;;:::o;42710:30::-;;;;;;;;;;;;;:::o;44422:123::-;2673:12;:10;:12::i;:::-;2662:23;;:7;:5;:7::i;:::-;:23;;;2654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44524:13:::1;44507:14;:30;;;;;;;;;;;;:::i;:::-;;44422:123:::0;:::o;24464:164::-;24561:4;24585:18;:25;24604:5;24585:25;;;;;;;;;;;;;;;:35;24611:8;24585:35;;;;;;;;;;;;;;;;;;;;;;;;;24578:42;;24464:164;;;;:::o;44299:113::-;2673:12;:10;:12::i;:::-;2662:23;;:7;:5;:7::i;:::-;:23;;;2654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44397:7:::1;44379:15;:25;;;;;;;;;;;;:::i;:::-;;44299:113:::0;:::o;3351:201::-;2673:12;:10;:12::i;:::-;2662:23;;:7;:5;:7::i;:::-;:23;;;2654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;3460:1:::1;3440:22;;:8;:22;;::::0;3432:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;3516:28;3535:8;3516:18;:28::i;:::-;3351:201:::0;:::o;44649:101::-;2673:12;:10;:12::i;:::-;2662:23;;:7;:5;:7::i;:::-;:23;;;2654:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44732:10:::1;44720:9;;:22;;;;;;;;;;;;;;;;;;44649:101:::0;:::o;25843:273::-;25900:4;25956:7;25937:15;:13;:15::i;:::-;:26;;:66;;;;;25990:13;;25980:7;:23;25937:66;:152;;;;;26088:1;13516:8;26041:17;:26;26059:7;26041:26;;;;;;;;;;;;:43;:48;25937:152;25917:172;;25843:273;;;:::o;19045:1129::-;19112:7;19132:12;19147:7;19132:22;;19215:4;19196:15;:13;:15::i;:::-;:23;19192:915;;19249:13;;19242:4;:20;19238:869;;;19287:14;19304:17;:23;19322:4;19304:23;;;;;;;;;;;;19287:40;;19420:1;13516:8;19393:6;:23;:28;19389:699;;19912:113;19929:1;19919:6;:11;19912:113;;19972:17;:25;19990:6;;;;;;;19972:25;;;;;;;;;;;;19963:34;;19912:113;;;20058:6;20051:13;;;;;;19389:699;19264:843;19238:869;19192:915;20135:31;;;;;;;;;;;;;;19045:1129;;;;:::o;39825:105::-;39885:7;39912:10;39905:17;;39825:105;:::o;44052:92::-;44108:7;44135:1;44128:8;;44052:92;:::o;1309:98::-;1362:7;1389:10;1382:17;;1309:98;:::o;31082:2515::-;31197:27;31227;31246:7;31227:18;:27::i;:::-;31197:57;;31312:4;31271:45;;31287:19;31271:45;;;31267:86;;31325:28;;;;;;;;;;;;;;31267:86;31366:22;31415:4;31392:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;31436:43;31453:4;31459:19;:17;:19::i;:::-;31436:16;:43::i;:::-;31392:87;:147;;;;31520:19;:17;:19::i;:::-;31496:43;;:20;31508:7;31496:11;:20::i;:::-;:43;;;31392:147;31366:174;;31558:17;31553:66;;31584:35;;;;;;;;;;;;;;31553:66;31648:1;31634:16;;:2;:16;;;31630:52;;31659:23;;;;;;;;;;;;;;31630:52;31695:43;31717:4;31723:2;31727:7;31736:1;31695:21;:43::i;:::-;31811:15;:24;31827:7;31811:24;;;;;;;;;;;;31804:31;;;;;;;;;;;32203:18;:24;32222:4;32203:24;;;;;;;;;;;;;;;;32201:26;;;;;;;;;;;;32272:18;:22;32291:2;32272:22;;;;;;;;;;;;;;;;32270:24;;;;;;;;;;;13798:8;13400:3;32653:15;:41;;32611:21;32629:2;32611:17;:21::i;:::-;:84;:128;32565:17;:26;32583:7;32565:26;;;;;;;;;;;:174;;;;32909:1;13798:8;32859:19;:46;:51;32855:626;;32931:19;32963:1;32953:7;:11;32931:33;;33120:1;33086:17;:30;33104:11;33086:30;;;;;;;;;;;;:35;33082:384;;33224:13;;33209:11;:28;33205:242;;33404:19;33371:17;:30;33389:11;33371:30;;;;;;;;;;;:52;;;;33205:242;33082:384;32912:569;32855:626;33528:7;33524:2;33509:27;;33518:4;33509:27;;;;;;;;;;;;33547:42;33568:4;33574:2;33578:7;33587:1;33547:20;:42::i;:::-;31186:2411;;31082:2515;;;:::o;26200:104::-;26269:27;26279:2;26283:8;26269:27;;;;;;;;;;;;:9;:27::i;:::-;26200:104;;:::o;3712:191::-;3786:16;3805:6;;;;;;;;;;;3786:25;;3831:8;3822:6;;:17;;;;;;;;;;;;;;;;;;3886:8;3855:40;;3876:8;3855:40;;;;;;;;;;;;3775:128;3712:191;:::o;37294:716::-;37457:4;37503:2;37478:45;;;37524:19;:17;:19::i;:::-;37545:4;37551:7;37560:5;37478:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37474:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37778:1;37761:6;:13;:18;37757:235;;37807:40;;;;;;;;;;;;;;37757:235;37950:6;37944:13;37935:6;37931:2;37927:15;37920:38;37474:529;37647:54;;;37637:64;;;:6;:64;;;;37630:71;;;37294:716;;;;;;:::o;40036:1959::-;40093:17;40514:3;40507:4;40501:11;40497:21;40490:28;;40605:3;40599:4;40592:17;40711:3;41168:5;41298:1;41293:3;41289:11;41282:18;;41435:2;41429:4;41425:13;41421:2;41417:22;41412:3;41404:36;41476:2;41470:4;41466:13;41458:21;;41059:682;41495:4;41059:682;;;41670:1;41665:3;41661:11;41654:18;;41721:2;41715:4;41711:13;41707:2;41703:22;41698:3;41690:36;41591:2;41585:4;41581:13;41573:21;;41059:682;;;41063:431;41792:3;41787;41783:13;41907:2;41902:3;41898:12;41891:19;;41970:6;41965:3;41958:19;40132:1856;;40036:1959;;;:::o;38658:159::-;;;;;:::o;22830:148::-;22894:14;22955:5;22945:15;;22830:148;;;:::o;39476:158::-;;;;;:::o;26677:2236::-;26800:20;26823:13;;26800:36;;26865:1;26851:16;;:2;:16;;;26847:48;;26876:19;;;;;;;;;;;;;;26847:48;26922:1;26910:8;:13;26906:44;;26932:18;;;;;;;;;;;;;;26906:44;26963:61;26993:1;26997:2;27001:12;27015:8;26963:21;:61::i;:::-;27567:1;12883:2;27538:1;:25;;27537:31;27525:8;:44;27499:18;:22;27518:2;27499:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;13663:3;27968:29;27995:1;27983:8;:13;27968:14;:29::i;:::-;:56;;13400:3;27905:15;:41;;27863:21;27881:2;27863:17;:21::i;:::-;:84;:162;27812:17;:31;27830:12;27812:31;;;;;;;;;;;:213;;;;28042:20;28065:12;28042:35;;28092:11;28121:8;28106:12;:23;28092:37;;28168:1;28150:2;:14;;;:19;28146:635;;28190:313;28246:12;28242:2;28221:38;;28238:1;28221:38;;;;;;;;;;;;28287:69;28326:1;28330:2;28334:14;;;;;;28350:5;28287:30;:69::i;:::-;28282:174;;28392:40;;;;;;;;;;;;;;28282:174;28498:3;28483:12;:18;28190:313;;28584:12;28567:13;;:29;28563:43;;28598:8;;;28563:43;28146:635;;;28647:119;28703:14;;;;;;28699:2;28678:40;;28695:1;28678:40;;;;;;;;;;;;28761:3;28746:12;:18;28647:119;;28146:635;28811:12;28795:13;:28;;;;27276:1559;;28845:60;28874:1;28878:2;28882:12;28896:8;28845:20;:60::i;:::-;26789:2124;26677:2236;;;:::o;23065:142::-;23123:14;23184:5;23174:15;;23065:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:101::-;5326:7;5366:18;5359:5;5355:30;5344:41;;5290:101;;;:::o;5397:120::-;5469:23;5486:5;5469:23;:::i;:::-;5462:5;5459:34;5449:62;;5507:1;5504;5497:12;5449:62;5397:120;:::o;5523:137::-;5568:5;5606:6;5593:20;5584:29;;5622:32;5648:5;5622:32;:::i;:::-;5523:137;;;;:::o;5666:327::-;5724:6;5773:2;5761:9;5752:7;5748:23;5744:32;5741:119;;;5779:79;;:::i;:::-;5741:119;5899:1;5924:52;5968:7;5959:6;5948:9;5944:22;5924:52;:::i;:::-;5914:62;;5870:116;5666:327;;;;:::o;5999:619::-;6076:6;6084;6092;6141:2;6129:9;6120:7;6116:23;6112:32;6109:119;;;6147:79;;:::i;:::-;6109:119;6267:1;6292:53;6337:7;6328:6;6317:9;6313:22;6292:53;:::i;:::-;6282:63;;6238:117;6394:2;6420:53;6465:7;6456:6;6445:9;6441:22;6420:53;:::i;:::-;6410:63;;6365:118;6522:2;6548:53;6593:7;6584:6;6573:9;6569:22;6548:53;:::i;:::-;6538:63;;6493:118;5999:619;;;;;:::o;6624:329::-;6683:6;6732:2;6720:9;6711:7;6707:23;6703:32;6700:119;;;6738:79;;:::i;:::-;6700:119;6858:1;6883:53;6928:7;6919:6;6908:9;6904:22;6883:53;:::i;:::-;6873:63;;6829:117;6624:329;;;;:::o;6959:89::-;6995:7;7035:6;7028:5;7024:18;7013:29;;6959:89;;;:::o;7054:120::-;7126:23;7143:5;7126:23;:::i;:::-;7119:5;7116:34;7106:62;;7164:1;7161;7154:12;7106:62;7054:120;:::o;7180:137::-;7225:5;7263:6;7250:20;7241:29;;7279:32;7305:5;7279:32;:::i;:::-;7180:137;;;;:::o;7323:327::-;7381:6;7430:2;7418:9;7409:7;7405:23;7401:32;7398:119;;;7436:79;;:::i;:::-;7398:119;7556:1;7581:52;7625:7;7616:6;7605:9;7601:22;7581:52;:::i;:::-;7571:62;;7527:116;7323:327;;;;:::o;7656:115::-;7741:23;7758:5;7741:23;:::i;:::-;7736:3;7729:36;7656:115;;:::o;7777:218::-;7868:4;7906:2;7895:9;7891:18;7883:26;;7919:69;7985:1;7974:9;7970:17;7961:6;7919:69;:::i;:::-;7777:218;;;;:::o;8001:115::-;8086:23;8103:5;8086:23;:::i;:::-;8081:3;8074:36;8001:115;;:::o;8122:218::-;8213:4;8251:2;8240:9;8236:18;8228:26;;8264:69;8330:1;8319:9;8315:17;8306:6;8264:69;:::i;:::-;8122:218;;;;:::o;8346:116::-;8416:21;8431:5;8416:21;:::i;:::-;8409:5;8406:32;8396:60;;8452:1;8449;8442:12;8396:60;8346:116;:::o;8468:133::-;8511:5;8549:6;8536:20;8527:29;;8565:30;8589:5;8565:30;:::i;:::-;8468:133;;;;:::o;8607:468::-;8672:6;8680;8729:2;8717:9;8708:7;8704:23;8700:32;8697:119;;;8735:79;;:::i;:::-;8697:119;8855:1;8880:53;8925:7;8916:6;8905:9;8901:22;8880:53;:::i;:::-;8870:63;;8826:117;8982:2;9008:50;9050:7;9041:6;9030:9;9026:22;9008:50;:::i;:::-;8998:60;;8953:115;8607:468;;;;;:::o;9081:117::-;9190:1;9187;9180:12;9204:117;9313:1;9310;9303:12;9327:180;9375:77;9372:1;9365:88;9472:4;9469:1;9462:15;9496:4;9493:1;9486:15;9513:281;9596:27;9618:4;9596:27;:::i;:::-;9588:6;9584:40;9726:6;9714:10;9711:22;9690:18;9678:10;9675:34;9672:62;9669:88;;;9737:18;;:::i;:::-;9669:88;9777:10;9773:2;9766:22;9556:238;9513:281;;:::o;9800:129::-;9834:6;9861:20;;:::i;:::-;9851:30;;9890:33;9918:4;9910:6;9890:33;:::i;:::-;9800:129;;;:::o;9935:307::-;9996:4;10086:18;10078:6;10075:30;10072:56;;;10108:18;;:::i;:::-;10072:56;10146:29;10168:6;10146:29;:::i;:::-;10138:37;;10230:4;10224;10220:15;10212:23;;9935:307;;;:::o;10248:154::-;10332:6;10327:3;10322;10309:30;10394:1;10385:6;10380:3;10376:16;10369:27;10248:154;;;:::o;10408:410::-;10485:5;10510:65;10526:48;10567:6;10526:48;:::i;:::-;10510:65;:::i;:::-;10501:74;;10598:6;10591:5;10584:21;10636:4;10629:5;10625:16;10674:3;10665:6;10660:3;10656:16;10653:25;10650:112;;;10681:79;;:::i;:::-;10650:112;10771:41;10805:6;10800:3;10795;10771:41;:::i;:::-;10491:327;10408:410;;;;;:::o;10837:338::-;10892:5;10941:3;10934:4;10926:6;10922:17;10918:27;10908:122;;10949:79;;:::i;:::-;10908:122;11066:6;11053:20;11091:78;11165:3;11157:6;11150:4;11142:6;11138:17;11091:78;:::i;:::-;11082:87;;10898:277;10837:338;;;;:::o;11181:943::-;11276:6;11284;11292;11300;11349:3;11337:9;11328:7;11324:23;11320:33;11317:120;;;11356:79;;:::i;:::-;11317:120;11476:1;11501:53;11546:7;11537:6;11526:9;11522:22;11501:53;:::i;:::-;11491:63;;11447:117;11603:2;11629:53;11674:7;11665:6;11654:9;11650:22;11629:53;:::i;:::-;11619:63;;11574:118;11731:2;11757:53;11802:7;11793:6;11782:9;11778:22;11757:53;:::i;:::-;11747:63;;11702:118;11887:2;11876:9;11872:18;11859:32;11918:18;11910:6;11907:30;11904:117;;;11940:79;;:::i;:::-;11904:117;12045:62;12099:7;12090:6;12079:9;12075:22;12045:62;:::i;:::-;12035:72;;11830:287;11181:943;;;;;;;:::o;12130:93::-;12166:7;12206:10;12199:5;12195:22;12184:33;;12130:93;;;:::o;12229:115::-;12314:23;12331:5;12314:23;:::i;:::-;12309:3;12302:36;12229:115;;:::o;12350:218::-;12441:4;12479:2;12468:9;12464:18;12456:26;;12492:69;12558:1;12547:9;12543:17;12534:6;12492:69;:::i;:::-;12350:218;;;;:::o;12574:308::-;12636:4;12726:18;12718:6;12715:30;12712:56;;;12748:18;;:::i;:::-;12712:56;12786:29;12808:6;12786:29;:::i;:::-;12778:37;;12870:4;12864;12860:15;12852:23;;12574:308;;;:::o;12888:412::-;12966:5;12991:66;13007:49;13049:6;13007:49;:::i;:::-;12991:66;:::i;:::-;12982:75;;13080:6;13073:5;13066:21;13118:4;13111:5;13107:16;13156:3;13147:6;13142:3;13138:16;13135:25;13132:112;;;13163:79;;:::i;:::-;13132:112;13253:41;13287:6;13282:3;13277;13253:41;:::i;:::-;12972:328;12888:412;;;;;:::o;13320:340::-;13376:5;13425:3;13418:4;13410:6;13406:17;13402:27;13392:122;;13433:79;;:::i;:::-;13392:122;13550:6;13537:20;13575:79;13650:3;13642:6;13635:4;13627:6;13623:17;13575:79;:::i;:::-;13566:88;;13382:278;13320:340;;;;:::o;13666:509::-;13735:6;13784:2;13772:9;13763:7;13759:23;13755:32;13752:119;;;13790:79;;:::i;:::-;13752:119;13938:1;13927:9;13923:17;13910:31;13968:18;13960:6;13957:30;13954:117;;;13990:79;;:::i;:::-;13954:117;14095:63;14150:7;14141:6;14130:9;14126:22;14095:63;:::i;:::-;14085:73;;13881:287;13666:509;;;;:::o;14181:474::-;14249:6;14257;14306:2;14294:9;14285:7;14281:23;14277:32;14274:119;;;14312:79;;:::i;:::-;14274:119;14432:1;14457:53;14502:7;14493:6;14482:9;14478:22;14457:53;:::i;:::-;14447:63;;14403:117;14559:2;14585:53;14630:7;14621:6;14610:9;14606:22;14585:53;:::i;:::-;14575:63;;14530:118;14181:474;;;;;:::o;14661:120::-;14733:23;14750:5;14733:23;:::i;:::-;14726:5;14723:34;14713:62;;14771:1;14768;14761:12;14713:62;14661:120;:::o;14787:137::-;14832:5;14870:6;14857:20;14848:29;;14886:32;14912:5;14886:32;:::i;:::-;14787:137;;;;:::o;14930:327::-;14988:6;15037:2;15025:9;15016:7;15012:23;15008:32;15005:119;;;15043:79;;:::i;:::-;15005:119;15163:1;15188:52;15232:7;15223:6;15212:9;15208:22;15188:52;:::i;:::-;15178:62;;15134:116;14930:327;;;;:::o;15263:180::-;15311:77;15308:1;15301:88;15408:4;15405:1;15398:15;15432:4;15429:1;15422:15;15449:320;15493:6;15530:1;15524:4;15520:12;15510:22;;15577:1;15571:4;15567:12;15598:18;15588:81;;15654:4;15646:6;15642:17;15632:27;;15588:81;15716:2;15708:6;15705:14;15685:18;15682:38;15679:84;;15735:18;;:::i;:::-;15679:84;15500:269;15449:320;;;:::o;15775:182::-;15915:34;15911:1;15903:6;15899:14;15892:58;15775:182;:::o;15963:366::-;16105:3;16126:67;16190:2;16185:3;16126:67;:::i;:::-;16119:74;;16202:93;16291:3;16202:93;:::i;:::-;16320:2;16315:3;16311:12;16304:19;;15963:366;;;:::o;16335:419::-;16501:4;16539:2;16528:9;16524:18;16516:26;;16588:9;16582:4;16578:20;16574:1;16563:9;16559:17;16552:47;16616:131;16742:4;16616:131;:::i;:::-;16608:139;;16335:419;;;:::o;16760:173::-;16900:25;16896:1;16888:6;16884:14;16877:49;16760:173;:::o;16939:366::-;17081:3;17102:67;17166:2;17161:3;17102:67;:::i;:::-;17095:74;;17178:93;17267:3;17178:93;:::i;:::-;17296:2;17291:3;17287:12;17280:19;;16939:366;;;:::o;17311:419::-;17477:4;17515:2;17504:9;17500:18;17492:26;;17564:9;17558:4;17554:20;17550:1;17539:9;17535:17;17528:47;17592:131;17718:4;17592:131;:::i;:::-;17584:139;;17311:419;;;:::o;17736:181::-;17876:33;17872:1;17864:6;17860:14;17853:57;17736:181;:::o;17923:366::-;18065:3;18086:67;18150:2;18145:3;18086:67;:::i;:::-;18079:74;;18162:93;18251:3;18162:93;:::i;:::-;18280:2;18275:3;18271:12;18264:19;;17923:366;;;:::o;18295:419::-;18461:4;18499:2;18488:9;18484:18;18476:26;;18548:9;18542:4;18538:20;18534:1;18523:9;18519:17;18512:47;18576:131;18702:4;18576:131;:::i;:::-;18568:139;;18295:419;;;:::o;18720:180::-;18768:77;18765:1;18758:88;18865:4;18862:1;18855:15;18889:4;18886:1;18879:15;18906:305;18946:3;18965:20;18983:1;18965:20;:::i;:::-;18960:25;;18999:20;19017:1;18999:20;:::i;:::-;18994:25;;19153:1;19085:66;19081:74;19078:1;19075:81;19072:107;;;19159:18;;:::i;:::-;19072:107;19203:1;19200;19196:9;19189:16;;18906:305;;;;:::o;19217:175::-;19357:27;19353:1;19345:6;19341:14;19334:51;19217:175;:::o;19398:366::-;19540:3;19561:67;19625:2;19620:3;19561:67;:::i;:::-;19554:74;;19637:93;19726:3;19637:93;:::i;:::-;19755:2;19750:3;19746:12;19739:19;;19398:366;;;:::o;19770:419::-;19936:4;19974:2;19963:9;19959:18;19951:26;;20023:9;20017:4;20013:20;20009:1;19998:9;19994:17;19987:47;20051:131;20177:4;20051:131;:::i;:::-;20043:139;;19770:419;;;:::o;20195:180::-;20335:32;20331:1;20323:6;20319:14;20312:56;20195:180;:::o;20381:366::-;20523:3;20544:67;20608:2;20603:3;20544:67;:::i;:::-;20537:74;;20620:93;20709:3;20620:93;:::i;:::-;20738:2;20733:3;20729:12;20722:19;;20381:366;;;:::o;20753:419::-;20919:4;20957:2;20946:9;20942:18;20934:26;;21006:9;21000:4;20996:20;20992:1;20981:9;20977:17;20970:47;21034:131;21160:4;21034:131;:::i;:::-;21026:139;;20753:419;;;:::o;21178:348::-;21218:7;21241:20;21259:1;21241:20;:::i;:::-;21236:25;;21275:20;21293:1;21275:20;:::i;:::-;21270:25;;21463:1;21395:66;21391:74;21388:1;21385:81;21380:1;21373:9;21366:17;21362:105;21359:131;;;21470:18;;:::i;:::-;21359:131;21518:1;21515;21511:9;21500:20;;21178:348;;;;:::o;21532:170::-;21672:22;21668:1;21660:6;21656:14;21649:46;21532:170;:::o;21708:366::-;21850:3;21871:67;21935:2;21930:3;21871:67;:::i;:::-;21864:74;;21947:93;22036:3;21947:93;:::i;:::-;22065:2;22060:3;22056:12;22049:19;;21708:366;;;:::o;22080:419::-;22246:4;22284:2;22273:9;22269:18;22261:26;;22333:9;22327:4;22323:20;22319:1;22308:9;22304:17;22297:47;22361:131;22487:4;22361:131;:::i;:::-;22353:139;;22080:419;;;:::o;22505:148::-;22607:11;22644:3;22629:18;;22505:148;;;;:::o;22659:377::-;22765:3;22793:39;22826:5;22793:39;:::i;:::-;22848:89;22930:6;22925:3;22848:89;:::i;:::-;22841:96;;22946:52;22991:6;22986:3;22979:4;22972:5;22968:16;22946:52;:::i;:::-;23023:6;23018:3;23014:16;23007:23;;22769:267;22659:377;;;;:::o;23042:141::-;23091:4;23114:3;23106:11;;23137:3;23134:1;23127:14;23171:4;23168:1;23158:18;23150:26;;23042:141;;;:::o;23213:845::-;23316:3;23353:5;23347:12;23382:36;23408:9;23382:36;:::i;:::-;23434:89;23516:6;23511:3;23434:89;:::i;:::-;23427:96;;23554:1;23543:9;23539:17;23570:1;23565:137;;;;23716:1;23711:341;;;;23532:520;;23565:137;23649:4;23645:9;23634;23630:25;23625:3;23618:38;23685:6;23680:3;23676:16;23669:23;;23565:137;;23711:341;23778:38;23810:5;23778:38;:::i;:::-;23838:1;23852:154;23866:6;23863:1;23860:13;23852:154;;;23940:7;23934:14;23930:1;23925:3;23921:11;23914:35;23990:1;23981:7;23977:15;23966:26;;23888:4;23885:1;23881:12;23876:17;;23852:154;;;24035:6;24030:3;24026:16;24019:23;;23718:334;;23532:520;;23320:738;;23213:845;;;;:::o;24064:589::-;24289:3;24311:95;24402:3;24393:6;24311:95;:::i;:::-;24304:102;;24423:95;24514:3;24505:6;24423:95;:::i;:::-;24416:102;;24535:92;24623:3;24614:6;24535:92;:::i;:::-;24528:99;;24644:3;24637:10;;24064:589;;;;;;:::o;24659:225::-;24799:34;24795:1;24787:6;24783:14;24776:58;24868:8;24863:2;24855:6;24851:15;24844:33;24659:225;:::o;24890:366::-;25032:3;25053:67;25117:2;25112:3;25053:67;:::i;:::-;25046:74;;25129:93;25218:3;25129:93;:::i;:::-;25247:2;25242:3;25238:12;25231:19;;24890:366;;;:::o;25262:419::-;25428:4;25466:2;25455:9;25451:18;25443:26;;25515:9;25509:4;25505:20;25501:1;25490:9;25486:17;25479:47;25543:131;25669:4;25543:131;:::i;:::-;25535:139;;25262:419;;;:::o;25687:98::-;25738:6;25772:5;25766:12;25756:22;;25687:98;;;:::o;25791:168::-;25874:11;25908:6;25903:3;25896:19;25948:4;25943:3;25939:14;25924:29;;25791:168;;;;:::o;25965:360::-;26051:3;26079:38;26111:5;26079:38;:::i;:::-;26133:70;26196:6;26191:3;26133:70;:::i;:::-;26126:77;;26212:52;26257:6;26252:3;26245:4;26238:5;26234:16;26212:52;:::i;:::-;26289:29;26311:6;26289:29;:::i;:::-;26284:3;26280:39;26273:46;;26055:270;25965:360;;;;:::o;26331:640::-;26526:4;26564:3;26553:9;26549:19;26541:27;;26578:71;26646:1;26635:9;26631:17;26622:6;26578:71;:::i;:::-;26659:72;26727:2;26716:9;26712:18;26703:6;26659:72;:::i;:::-;26741;26809:2;26798:9;26794:18;26785:6;26741:72;:::i;:::-;26860:9;26854:4;26850:20;26845:2;26834:9;26830:18;26823:48;26888:76;26959:4;26950:6;26888:76;:::i;:::-;26880:84;;26331:640;;;;;;;:::o;26977:141::-;27033:5;27064:6;27058:13;27049:22;;27080:32;27106:5;27080:32;:::i;:::-;26977:141;;;;:::o;27124:349::-;27193:6;27242:2;27230:9;27221:7;27217:23;27213:32;27210:119;;;27248:79;;:::i;:::-;27210:119;27368:1;27393:63;27448:7;27439:6;27428:9;27424:22;27393:63;:::i;:::-;27383:73;;27339:127;27124:349;;;;:::o

Swarm Source

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