ETH Price: $2,636.08 (-0.83%)

Token

Fud Panda (FudPanda)
 

Overview

Max Total Supply

8,964 FudPanda

Holders

355

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
20 FudPanda
0xad256cf689ff3320c2718a7d253f4baa0b255d96
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:
FudPanda

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

/**
 * @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 String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

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

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

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

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

/**
 * @dev 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 FudPanda is ERC721A, Ownable {

    using Strings for uint256;
    string baseURI;
    uint256 maxSupply = 8964;
    uint8 public maxMintAmount = 20;
    bool public paused = true;

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _initBaseURI
    ) ERC721A(_name, _symbol) {
        setBaseURI(_initBaseURI);
        _safeMint(msg.sender, 100);
    }

    function mint(uint256 _amount) external {
        require(!paused, "the contract is paused");
        require(_amount > 0, "need to mint at least 1 NFT");
        require(_amount <= maxMintAmount, "max mint amount per session exceeded");
        require(totalSupply() + _amount <= maxSupply, "max NFT limit exceeded");
        _safeMint(msg.sender, _amount);
    }

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

    function tokenURI(uint256 tokenId) public view virtual override
    returns (string memory){
        require(_exists(tokenId),
            "ERC721Metadata: URI query for nonexistent token"
        );

        string memory currentBaseURI = _baseURI();
        return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), ".json")) : "";
    }

    function pause() public onlyOwner {
        paused = !paused;
    }

    function setBaseURI(string memory _newBaseURI) public onlyOwner {
        baseURI = _newBaseURI;
    }
    
    function setmaxMintAmount(uint8 _newmaxMintAmount) public onlyOwner() {
        maxMintAmount = _newmaxMintAmount;
    }

    function withdraw() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
    
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_initBaseURI","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":"maxMintAmount","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_newmaxMintAmount","type":"uint8"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052612304600a556014600b60006101000a81548160ff021916908360ff1602179055506001600b60016101000a81548160ff0219169083151502179055503480156200004e57600080fd5b5060405162003b5338038062003b538339818101604052810190620000749190620008d1565b828281600290805190602001906200008e9291906200075a565b508060039080519060200190620000a79291906200075a565b50620000b86200010d60201b60201c565b6000819055505050620000e0620000d46200011260201b60201c565b6200011a60201b60201c565b620000f181620001e060201b60201c565b620001043360646200028b60201b60201c565b50505062000ce8565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620001f06200011260201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000216620002b160201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16146200026f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002669062000a68565b60405180910390fd5b8060099080519060200190620002879291906200075a565b5050565b620002ad828260405180602001604052806000815250620002db60201b60201c565b5050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141562000349576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600083141562000385576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6200039a6000858386620005c060201b60201c565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16200040760018514620005c660201b60201c565b901b60a042901b6200041f86620005d060201b60201c565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b1462000530575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4620004dc6000878480600101955087620005da60201b60201c565b62000513576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210620004655782600054146200052a57600080fd5b6200059c565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821062000531575b816000819055505050620005ba60008583866200074c60201b60201c565b50505050565b50505050565b6000819050919050565b6000819050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006086200075260201b60201c565b8786866040518563ffffffff1660e01b81526004016200062c949392919062000a14565b602060405180830381600087803b1580156200064757600080fd5b505af19250505080156200067b57506040513d601f19601f820116820180604052508101906200067891906200089f565b60015b620006f9573d8060008114620006ae576040519150601f19603f3d011682016040523d82523d6000602084013e620006b3565b606091505b50600081511415620006f1576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b50505050565b600033905090565b828054620007689062000bb6565b90600052602060002090601f0160209004810192826200078c5760008555620007d8565b82601f10620007a757805160ff1916838001178555620007d8565b82800160010185558215620007d8579182015b82811115620007d7578251825591602001919060010190620007ba565b5b509050620007e79190620007eb565b5090565b5b8082111562000806576000816000905550600101620007ec565b5090565b6000620008216200081b8462000ab3565b62000a8a565b90508281526020810184848401111562000840576200083f62000c85565b5b6200084d84828562000b80565b509392505050565b600081519050620008668162000cce565b92915050565b600082601f83011262000884576200088362000c80565b5b8151620008968482602086016200080a565b91505092915050565b600060208284031215620008b857620008b762000c8f565b5b6000620008c88482850162000855565b91505092915050565b600080600060608486031215620008ed57620008ec62000c8f565b5b600084015167ffffffffffffffff8111156200090e576200090d62000c8a565b5b6200091c868287016200086c565b935050602084015167ffffffffffffffff81111562000940576200093f62000c8a565b5b6200094e868287016200086c565b925050604084015167ffffffffffffffff81111562000972576200097162000c8a565b5b62000980868287016200086c565b9150509250925092565b620009958162000b16565b82525050565b6000620009a88262000ae9565b620009b4818562000af4565b9350620009c681856020860162000b80565b620009d18162000c94565b840191505092915050565b6000620009eb60208362000b05565b9150620009f88262000ca5565b602082019050919050565b62000a0e8162000b76565b82525050565b600060808201905062000a2b60008301876200098a565b62000a3a60208301866200098a565b62000a49604083018562000a03565b818103606083015262000a5d81846200099b565b905095945050505050565b6000602082019050818103600083015262000a8381620009dc565b9050919050565b600062000a9662000aa9565b905062000aa4828262000bec565b919050565b6000604051905090565b600067ffffffffffffffff82111562000ad15762000ad062000c51565b5b62000adc8262000c94565b9050602081019050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600062000b238262000b56565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b8381101562000ba057808201518184015260208101905062000b83565b8381111562000bb0576000848401525b50505050565b6000600282049050600182168062000bcf57607f821691505b6020821081141562000be65762000be562000c22565b5b50919050565b62000bf78262000c94565b810181811067ffffffffffffffff8211171562000c195762000c1862000c51565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b62000cd98162000b2a565b811462000ce557600080fd5b50565b612e5b8062000cf86000396000f3fe60806040526004361061014b5760003560e01c806370a08231116100b6578063a22cb4651161006f578063a22cb4651461044b578063b88d4fde14610474578063c87b56dd1461049d578063e985e9c5146104da578063f2fde38b14610517578063f8f53e6f146105405761014b565b806370a0823114610361578063715018a61461039e5780638456cb59146103b55780638da5cb5b146103cc57806395d89b41146103f7578063a0712d68146104225761014b565b806323b872dd1161010857806323b872dd146102745780633ccfd60b1461029d57806342842e0e146102a757806355f804b3146102d05780635c975abb146102f95780636352211e146103245761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021e578063239c70ae14610249575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906122e6565b610569565b6040516101849190612670565b60405180910390f35b34801561019957600080fd5b506101a26105fb565b6040516101af919061268b565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da9190612389565b61068d565b6040516101ec9190612609565b60405180910390f35b34801561020157600080fd5b5061021c600480360381019061021791906122a6565b610709565b005b34801561022a57600080fd5b506102336108b0565b604051610240919061278d565b60405180910390f35b34801561025557600080fd5b5061025e6108c7565b60405161026b91906127a8565b60405180910390f35b34801561028057600080fd5b5061029b60048036038101906102969190612190565b6108da565b005b6102a56108ea565b005b3480156102b357600080fd5b506102ce60048036038101906102c99190612190565b6109a6565b005b3480156102dc57600080fd5b506102f760048036038101906102f29190612340565b6109c6565b005b34801561030557600080fd5b5061030e610a5c565b60405161031b9190612670565b60405180910390f35b34801561033057600080fd5b5061034b60048036038101906103469190612389565b610a6f565b6040516103589190612609565b60405180910390f35b34801561036d57600080fd5b5061038860048036038101906103839190612123565b610a81565b604051610395919061278d565b60405180910390f35b3480156103aa57600080fd5b506103b3610b3a565b005b3480156103c157600080fd5b506103ca610bc2565b005b3480156103d857600080fd5b506103e1610c6a565b6040516103ee9190612609565b60405180910390f35b34801561040357600080fd5b5061040c610c94565b604051610419919061268b565b60405180910390f35b34801561042e57600080fd5b5061044960048036038101906104449190612389565b610d26565b005b34801561045757600080fd5b50610472600480360381019061046d9190612266565b610e72565b005b34801561048057600080fd5b5061049b600480360381019061049691906121e3565b610fea565b005b3480156104a957600080fd5b506104c460048036038101906104bf9190612389565b61105d565b6040516104d1919061268b565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc9190612150565b611104565b60405161050e9190612670565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190612123565b611198565b005b34801561054c57600080fd5b50610567600480360381019061056291906123b6565b611290565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105c457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105f45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461060a90612a0b565b80601f016020809104026020016040519081016040528092919081815260200182805461063690612a0b565b80156106835780601f1061065857610100808354040283529160200191610683565b820191906000526020600020905b81548152906001019060200180831161066657829003601f168201915b5050505050905090565b60006106988261132a565b6106ce576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061071482611389565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561077c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079b611457565b73ffffffffffffffffffffffffffffffffffffffff16146107fe576107c7816107c2611457565b611104565b6107fd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006108ba61145f565b6001546000540303905090565b600b60009054906101000a900460ff1681565b6108e5838383611464565b505050565b6108f261180e565b73ffffffffffffffffffffffffffffffffffffffff16610910610c6a565b73ffffffffffffffffffffffffffffffffffffffff1614610966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095d9061270d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506109a457600080fd5b565b6109c183838360405180602001604052806000815250610fea565b505050565b6109ce61180e565b73ffffffffffffffffffffffffffffffffffffffff166109ec610c6a565b73ffffffffffffffffffffffffffffffffffffffff1614610a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a399061270d565b60405180910390fd5b8060099080519060200190610a58929190611f22565b5050565b600b60019054906101000a900460ff1681565b6000610a7a82611389565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ae9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610b4261180e565b73ffffffffffffffffffffffffffffffffffffffff16610b60610c6a565b73ffffffffffffffffffffffffffffffffffffffff1614610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad9061270d565b60405180910390fd5b610bc06000611816565b565b610bca61180e565b73ffffffffffffffffffffffffffffffffffffffff16610be8610c6a565b73ffffffffffffffffffffffffffffffffffffffff1614610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c359061270d565b60405180910390fd5b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ca390612a0b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccf90612a0b565b8015610d1c5780601f10610cf157610100808354040283529160200191610d1c565b820191906000526020600020905b815481529060010190602001808311610cff57829003601f168201915b5050505050905090565b600b60019054906101000a900460ff1615610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d9061272d565b60405180910390fd5b60008111610db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db09061276d565b60405180910390fd5b600b60009054906101000a900460ff1660ff16811115610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e05906126ed565b60405180910390fd5b600a5481610e1a6108b0565b610e24919061288d565b1115610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c906126cd565b60405180910390fd5b610e6f33826118dc565b50565b610e7a611457565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610edf576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610eec611457565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f99611457565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fde9190612670565b60405180910390a35050565b610ff5848484611464565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461105757611020848484846118fa565b611056576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606110688261132a565b6110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e9061274d565b60405180910390fd5b60006110b1611a5a565b905060008151116110d157604051806020016040528060008152506110fc565b806110db84611aec565b6040516020016110ec9291906125da565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111a061180e565b73ffffffffffffffffffffffffffffffffffffffff166111be610c6a565b73ffffffffffffffffffffffffffffffffffffffff1614611214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120b9061270d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b906126ad565b60405180910390fd5b61128d81611816565b50565b61129861180e565b73ffffffffffffffffffffffffffffffffffffffff166112b6610c6a565b73ffffffffffffffffffffffffffffffffffffffff161461130c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113039061270d565b60405180910390fd5b80600b60006101000a81548160ff021916908360ff16021790555050565b60008161133561145f565b11158015611344575060005482105b8015611382575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061139861145f565b116114205760005481101561141f5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561141d575b60008114156114135760046000836001900393508381526020019081526020016000205490506113e8565b8092505050611452565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b600061146f82611389565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114d6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166114f7611457565b73ffffffffffffffffffffffffffffffffffffffff161480611526575061152585611520611457565b611104565b5b8061156b5750611534611457565b73ffffffffffffffffffffffffffffffffffffffff166115538461068d565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806115a4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561160b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116188585856001611c4d565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61171586611c53565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561179f57600060018401905060006004600083815260200190815260200160002054141561179d57600054811461179c578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118078585856001611c5d565b5050505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6118f6828260405180602001604052806000815250611c63565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611920611457565b8786866040518563ffffffff1660e01b81526004016119429493929190612624565b602060405180830381600087803b15801561195c57600080fd5b505af192505050801561198d57506040513d601f19601f8201168201806040525081019061198a9190612313565b60015b611a07573d80600081146119bd576040519150601f19603f3d011682016040523d82523d6000602084013e6119c2565b606091505b506000815114156119ff576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611a6990612a0b565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9590612a0b565b8015611ae25780601f10611ab757610100808354040283529160200191611ae2565b820191906000526020600020905b815481529060010190602001808311611ac557829003601f168201915b5050505050905090565b60606000821415611b34576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c48565b600082905060005b60008214611b66578080611b4f90612a6e565b915050600a82611b5f91906128e3565b9150611b3c565b60008167ffffffffffffffff811115611b8257611b81612ba4565b5b6040519080825280601f01601f191660200182016040528015611bb45781602001600182028036833780820191505090505b5090505b60008514611c4157600182611bcd9190612914565b9150600a85611bdc9190612ab7565b6030611be8919061288d565b60f81b818381518110611bfe57611bfd612b75565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611c3a91906128e3565b9450611bb8565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611cd0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415611d0b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d186000858386611c4d565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1611d7d60018514611f18565b901b60a042901b611d8d86611c53565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14611e91575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e4160008784806001019550876118fa565b611e77576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210611dd2578260005414611e8c57600080fd5b611efc565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611e92575b816000819055505050611f126000858386611c5d565b50505050565b6000819050919050565b828054611f2e90612a0b565b90600052602060002090601f016020900481019282611f505760008555611f97565b82601f10611f6957805160ff1916838001178555611f97565b82800160010185558215611f97579182015b82811115611f96578251825591602001919060010190611f7b565b5b509050611fa49190611fa8565b5090565b5b80821115611fc1576000816000905550600101611fa9565b5090565b6000611fd8611fd3846127e8565b6127c3565b905082815260208101848484011115611ff457611ff3612bd8565b5b611fff8482856129c9565b509392505050565b600061201a61201584612819565b6127c3565b90508281526020810184848401111561203657612035612bd8565b5b6120418482856129c9565b509392505050565b60008135905061205881612db2565b92915050565b60008135905061206d81612dc9565b92915050565b60008135905061208281612de0565b92915050565b60008151905061209781612de0565b92915050565b600082601f8301126120b2576120b1612bd3565b5b81356120c2848260208601611fc5565b91505092915050565b600082601f8301126120e0576120df612bd3565b5b81356120f0848260208601612007565b91505092915050565b60008135905061210881612df7565b92915050565b60008135905061211d81612e0e565b92915050565b60006020828403121561213957612138612be2565b5b600061214784828501612049565b91505092915050565b6000806040838503121561216757612166612be2565b5b600061217585828601612049565b925050602061218685828601612049565b9150509250929050565b6000806000606084860312156121a9576121a8612be2565b5b60006121b786828701612049565b93505060206121c886828701612049565b92505060406121d9868287016120f9565b9150509250925092565b600080600080608085870312156121fd576121fc612be2565b5b600061220b87828801612049565b945050602061221c87828801612049565b935050604061222d878288016120f9565b925050606085013567ffffffffffffffff81111561224e5761224d612bdd565b5b61225a8782880161209d565b91505092959194509250565b6000806040838503121561227d5761227c612be2565b5b600061228b85828601612049565b925050602061229c8582860161205e565b9150509250929050565b600080604083850312156122bd576122bc612be2565b5b60006122cb85828601612049565b92505060206122dc858286016120f9565b9150509250929050565b6000602082840312156122fc576122fb612be2565b5b600061230a84828501612073565b91505092915050565b60006020828403121561232957612328612be2565b5b600061233784828501612088565b91505092915050565b60006020828403121561235657612355612be2565b5b600082013567ffffffffffffffff81111561237457612373612bdd565b5b612380848285016120cb565b91505092915050565b60006020828403121561239f5761239e612be2565b5b60006123ad848285016120f9565b91505092915050565b6000602082840312156123cc576123cb612be2565b5b60006123da8482850161210e565b91505092915050565b6123ec81612948565b82525050565b6123fb8161295a565b82525050565b600061240c8261284a565b6124168185612860565b93506124268185602086016129d8565b61242f81612be7565b840191505092915050565b600061244582612855565b61244f8185612871565b935061245f8185602086016129d8565b61246881612be7565b840191505092915050565b600061247e82612855565b6124888185612882565b93506124988185602086016129d8565b80840191505092915050565b60006124b1602683612871565b91506124bc82612bf8565b604082019050919050565b60006124d4601683612871565b91506124df82612c47565b602082019050919050565b60006124f7602483612871565b915061250282612c70565b604082019050919050565b600061251a600583612882565b915061252582612cbf565b600582019050919050565b600061253d602083612871565b915061254882612ce8565b602082019050919050565b6000612560601683612871565b915061256b82612d11565b602082019050919050565b6000612583602f83612871565b915061258e82612d3a565b604082019050919050565b60006125a6601b83612871565b91506125b182612d89565b602082019050919050565b6125c5816129b2565b82525050565b6125d4816129bc565b82525050565b60006125e68285612473565b91506125f28284612473565b91506125fd8261250d565b91508190509392505050565b600060208201905061261e60008301846123e3565b92915050565b600060808201905061263960008301876123e3565b61264660208301866123e3565b61265360408301856125bc565b81810360608301526126658184612401565b905095945050505050565b600060208201905061268560008301846123f2565b92915050565b600060208201905081810360008301526126a5818461243a565b905092915050565b600060208201905081810360008301526126c6816124a4565b9050919050565b600060208201905081810360008301526126e6816124c7565b9050919050565b60006020820190508181036000830152612706816124ea565b9050919050565b6000602082019050818103600083015261272681612530565b9050919050565b6000602082019050818103600083015261274681612553565b9050919050565b6000602082019050818103600083015261276681612576565b9050919050565b6000602082019050818103600083015261278681612599565b9050919050565b60006020820190506127a260008301846125bc565b92915050565b60006020820190506127bd60008301846125cb565b92915050565b60006127cd6127de565b90506127d98282612a3d565b919050565b6000604051905090565b600067ffffffffffffffff82111561280357612802612ba4565b5b61280c82612be7565b9050602081019050919050565b600067ffffffffffffffff82111561283457612833612ba4565b5b61283d82612be7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612898826129b2565b91506128a3836129b2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156128d8576128d7612ae8565b5b828201905092915050565b60006128ee826129b2565b91506128f9836129b2565b92508261290957612908612b17565b5b828204905092915050565b600061291f826129b2565b915061292a836129b2565b92508282101561293d5761293c612ae8565b5b828203905092915050565b600061295382612992565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156129f65780820151818401526020810190506129db565b83811115612a05576000848401525b50505050565b60006002820490506001821680612a2357607f821691505b60208210811415612a3757612a36612b46565b5b50919050565b612a4682612be7565b810181811067ffffffffffffffff82111715612a6557612a64612ba4565b5b80604052505050565b6000612a79826129b2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612aac57612aab612ae8565b5b600182019050919050565b6000612ac2826129b2565b9150612acd836129b2565b925082612add57612adc612b17565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b612dbb81612948565b8114612dc657600080fd5b50565b612dd28161295a565b8114612ddd57600080fd5b50565b612de981612966565b8114612df457600080fd5b50565b612e00816129b2565b8114612e0b57600080fd5b50565b612e17816129bc565b8114612e2257600080fd5b5056fea264697066735822122094d584de2c21ab71c3b62001314c020c9736768281d3e92883bf2789368ac99264736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000094675642050616e64610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000846756450616e64610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656962376d786d3572667635703474626e6672717171347471677869336a6d6a71337269663263376b3573376465776476346f7478792f0000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061014b5760003560e01c806370a08231116100b6578063a22cb4651161006f578063a22cb4651461044b578063b88d4fde14610474578063c87b56dd1461049d578063e985e9c5146104da578063f2fde38b14610517578063f8f53e6f146105405761014b565b806370a0823114610361578063715018a61461039e5780638456cb59146103b55780638da5cb5b146103cc57806395d89b41146103f7578063a0712d68146104225761014b565b806323b872dd1161010857806323b872dd146102745780633ccfd60b1461029d57806342842e0e146102a757806355f804b3146102d05780635c975abb146102f95780636352211e146103245761014b565b806301ffc9a71461015057806306fdde031461018d578063081812fc146101b8578063095ea7b3146101f557806318160ddd1461021e578063239c70ae14610249575b600080fd5b34801561015c57600080fd5b50610177600480360381019061017291906122e6565b610569565b6040516101849190612670565b60405180910390f35b34801561019957600080fd5b506101a26105fb565b6040516101af919061268b565b60405180910390f35b3480156101c457600080fd5b506101df60048036038101906101da9190612389565b61068d565b6040516101ec9190612609565b60405180910390f35b34801561020157600080fd5b5061021c600480360381019061021791906122a6565b610709565b005b34801561022a57600080fd5b506102336108b0565b604051610240919061278d565b60405180910390f35b34801561025557600080fd5b5061025e6108c7565b60405161026b91906127a8565b60405180910390f35b34801561028057600080fd5b5061029b60048036038101906102969190612190565b6108da565b005b6102a56108ea565b005b3480156102b357600080fd5b506102ce60048036038101906102c99190612190565b6109a6565b005b3480156102dc57600080fd5b506102f760048036038101906102f29190612340565b6109c6565b005b34801561030557600080fd5b5061030e610a5c565b60405161031b9190612670565b60405180910390f35b34801561033057600080fd5b5061034b60048036038101906103469190612389565b610a6f565b6040516103589190612609565b60405180910390f35b34801561036d57600080fd5b5061038860048036038101906103839190612123565b610a81565b604051610395919061278d565b60405180910390f35b3480156103aa57600080fd5b506103b3610b3a565b005b3480156103c157600080fd5b506103ca610bc2565b005b3480156103d857600080fd5b506103e1610c6a565b6040516103ee9190612609565b60405180910390f35b34801561040357600080fd5b5061040c610c94565b604051610419919061268b565b60405180910390f35b34801561042e57600080fd5b5061044960048036038101906104449190612389565b610d26565b005b34801561045757600080fd5b50610472600480360381019061046d9190612266565b610e72565b005b34801561048057600080fd5b5061049b600480360381019061049691906121e3565b610fea565b005b3480156104a957600080fd5b506104c460048036038101906104bf9190612389565b61105d565b6040516104d1919061268b565b60405180910390f35b3480156104e657600080fd5b5061050160048036038101906104fc9190612150565b611104565b60405161050e9190612670565b60405180910390f35b34801561052357600080fd5b5061053e60048036038101906105399190612123565b611198565b005b34801561054c57600080fd5b50610567600480360381019061056291906123b6565b611290565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806105c457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806105f45750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461060a90612a0b565b80601f016020809104026020016040519081016040528092919081815260200182805461063690612a0b565b80156106835780601f1061065857610100808354040283529160200191610683565b820191906000526020600020905b81548152906001019060200180831161066657829003601f168201915b5050505050905090565b60006106988261132a565b6106ce576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061071482611389565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561077c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661079b611457565b73ffffffffffffffffffffffffffffffffffffffff16146107fe576107c7816107c2611457565b611104565b6107fd576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006108ba61145f565b6001546000540303905090565b600b60009054906101000a900460ff1681565b6108e5838383611464565b505050565b6108f261180e565b73ffffffffffffffffffffffffffffffffffffffff16610910610c6a565b73ffffffffffffffffffffffffffffffffffffffff1614610966576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095d9061270d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f193505050506109a457600080fd5b565b6109c183838360405180602001604052806000815250610fea565b505050565b6109ce61180e565b73ffffffffffffffffffffffffffffffffffffffff166109ec610c6a565b73ffffffffffffffffffffffffffffffffffffffff1614610a42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a399061270d565b60405180910390fd5b8060099080519060200190610a58929190611f22565b5050565b600b60019054906101000a900460ff1681565b6000610a7a82611389565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ae9576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b610b4261180e565b73ffffffffffffffffffffffffffffffffffffffff16610b60610c6a565b73ffffffffffffffffffffffffffffffffffffffff1614610bb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bad9061270d565b60405180910390fd5b610bc06000611816565b565b610bca61180e565b73ffffffffffffffffffffffffffffffffffffffff16610be8610c6a565b73ffffffffffffffffffffffffffffffffffffffff1614610c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c359061270d565b60405180910390fd5b600b60019054906101000a900460ff1615600b60016101000a81548160ff021916908315150217905550565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060038054610ca390612a0b565b80601f0160208091040260200160405190810160405280929190818152602001828054610ccf90612a0b565b8015610d1c5780601f10610cf157610100808354040283529160200191610d1c565b820191906000526020600020905b815481529060010190602001808311610cff57829003601f168201915b5050505050905090565b600b60019054906101000a900460ff1615610d76576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6d9061272d565b60405180910390fd5b60008111610db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db09061276d565b60405180910390fd5b600b60009054906101000a900460ff1660ff16811115610e0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e05906126ed565b60405180910390fd5b600a5481610e1a6108b0565b610e24919061288d565b1115610e65576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5c906126cd565b60405180910390fd5b610e6f33826118dc565b50565b610e7a611457565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610edf576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000610eec611457565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16610f99611457565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051610fde9190612670565b60405180910390a35050565b610ff5848484611464565b60008373ffffffffffffffffffffffffffffffffffffffff163b1461105757611020848484846118fa565b611056576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606110688261132a565b6110a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161109e9061274d565b60405180910390fd5b60006110b1611a5a565b905060008151116110d157604051806020016040528060008152506110fc565b806110db84611aec565b6040516020016110ec9291906125da565b6040516020818303038152906040525b915050919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6111a061180e565b73ffffffffffffffffffffffffffffffffffffffff166111be610c6a565b73ffffffffffffffffffffffffffffffffffffffff1614611214576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161120b9061270d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611284576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127b906126ad565b60405180910390fd5b61128d81611816565b50565b61129861180e565b73ffffffffffffffffffffffffffffffffffffffff166112b6610c6a565b73ffffffffffffffffffffffffffffffffffffffff161461130c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113039061270d565b60405180910390fd5b80600b60006101000a81548160ff021916908360ff16021790555050565b60008161133561145f565b11158015611344575060005482105b8015611382575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061139861145f565b116114205760005481101561141f5760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561141d575b60008114156114135760046000836001900393508381526020019081526020016000205490506113e8565b8092505050611452565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b600061146f82611389565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146114d6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166114f7611457565b73ffffffffffffffffffffffffffffffffffffffff161480611526575061152585611520611457565b611104565b5b8061156b5750611534611457565b73ffffffffffffffffffffffffffffffffffffffff166115538461068d565b73ffffffffffffffffffffffffffffffffffffffff16145b9050806115a4576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561160b576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6116188585856001611c4d565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61171586611c53565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561179f57600060018401905060006004600083815260200190815260200160002054141561179d57600054811461179c578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46118078585856001611c5d565b5050505050565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6118f6828260405180602001604052806000815250611c63565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02611920611457565b8786866040518563ffffffff1660e01b81526004016119429493929190612624565b602060405180830381600087803b15801561195c57600080fd5b505af192505050801561198d57506040513d601f19601f8201168201806040525081019061198a9190612313565b60015b611a07573d80600081146119bd576040519150601f19603f3d011682016040523d82523d6000602084013e6119c2565b606091505b506000815114156119ff576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b606060098054611a6990612a0b565b80601f0160208091040260200160405190810160405280929190818152602001828054611a9590612a0b565b8015611ae25780601f10611ab757610100808354040283529160200191611ae2565b820191906000526020600020905b815481529060010190602001808311611ac557829003601f168201915b5050505050905090565b60606000821415611b34576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050611c48565b600082905060005b60008214611b66578080611b4f90612a6e565b915050600a82611b5f91906128e3565b9150611b3c565b60008167ffffffffffffffff811115611b8257611b81612ba4565b5b6040519080825280601f01601f191660200182016040528015611bb45781602001600182028036833780820191505090505b5090505b60008514611c4157600182611bcd9190612914565b9150600a85611bdc9190612ab7565b6030611be8919061288d565b60f81b818381518110611bfe57611bfd612b75565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611c3a91906128e3565b9450611bb8565b8093505050505b919050565b50505050565b6000819050919050565b50505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611cd0576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000831415611d0b576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d186000858386611c4d565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1611d7d60018514611f18565b901b60a042901b611d8d86611c53565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14611e91575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611e4160008784806001019550876118fa565b611e77576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210611dd2578260005414611e8c57600080fd5b611efc565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210611e92575b816000819055505050611f126000858386611c5d565b50505050565b6000819050919050565b828054611f2e90612a0b565b90600052602060002090601f016020900481019282611f505760008555611f97565b82601f10611f6957805160ff1916838001178555611f97565b82800160010185558215611f97579182015b82811115611f96578251825591602001919060010190611f7b565b5b509050611fa49190611fa8565b5090565b5b80821115611fc1576000816000905550600101611fa9565b5090565b6000611fd8611fd3846127e8565b6127c3565b905082815260208101848484011115611ff457611ff3612bd8565b5b611fff8482856129c9565b509392505050565b600061201a61201584612819565b6127c3565b90508281526020810184848401111561203657612035612bd8565b5b6120418482856129c9565b509392505050565b60008135905061205881612db2565b92915050565b60008135905061206d81612dc9565b92915050565b60008135905061208281612de0565b92915050565b60008151905061209781612de0565b92915050565b600082601f8301126120b2576120b1612bd3565b5b81356120c2848260208601611fc5565b91505092915050565b600082601f8301126120e0576120df612bd3565b5b81356120f0848260208601612007565b91505092915050565b60008135905061210881612df7565b92915050565b60008135905061211d81612e0e565b92915050565b60006020828403121561213957612138612be2565b5b600061214784828501612049565b91505092915050565b6000806040838503121561216757612166612be2565b5b600061217585828601612049565b925050602061218685828601612049565b9150509250929050565b6000806000606084860312156121a9576121a8612be2565b5b60006121b786828701612049565b93505060206121c886828701612049565b92505060406121d9868287016120f9565b9150509250925092565b600080600080608085870312156121fd576121fc612be2565b5b600061220b87828801612049565b945050602061221c87828801612049565b935050604061222d878288016120f9565b925050606085013567ffffffffffffffff81111561224e5761224d612bdd565b5b61225a8782880161209d565b91505092959194509250565b6000806040838503121561227d5761227c612be2565b5b600061228b85828601612049565b925050602061229c8582860161205e565b9150509250929050565b600080604083850312156122bd576122bc612be2565b5b60006122cb85828601612049565b92505060206122dc858286016120f9565b9150509250929050565b6000602082840312156122fc576122fb612be2565b5b600061230a84828501612073565b91505092915050565b60006020828403121561232957612328612be2565b5b600061233784828501612088565b91505092915050565b60006020828403121561235657612355612be2565b5b600082013567ffffffffffffffff81111561237457612373612bdd565b5b612380848285016120cb565b91505092915050565b60006020828403121561239f5761239e612be2565b5b60006123ad848285016120f9565b91505092915050565b6000602082840312156123cc576123cb612be2565b5b60006123da8482850161210e565b91505092915050565b6123ec81612948565b82525050565b6123fb8161295a565b82525050565b600061240c8261284a565b6124168185612860565b93506124268185602086016129d8565b61242f81612be7565b840191505092915050565b600061244582612855565b61244f8185612871565b935061245f8185602086016129d8565b61246881612be7565b840191505092915050565b600061247e82612855565b6124888185612882565b93506124988185602086016129d8565b80840191505092915050565b60006124b1602683612871565b91506124bc82612bf8565b604082019050919050565b60006124d4601683612871565b91506124df82612c47565b602082019050919050565b60006124f7602483612871565b915061250282612c70565b604082019050919050565b600061251a600583612882565b915061252582612cbf565b600582019050919050565b600061253d602083612871565b915061254882612ce8565b602082019050919050565b6000612560601683612871565b915061256b82612d11565b602082019050919050565b6000612583602f83612871565b915061258e82612d3a565b604082019050919050565b60006125a6601b83612871565b91506125b182612d89565b602082019050919050565b6125c5816129b2565b82525050565b6125d4816129bc565b82525050565b60006125e68285612473565b91506125f28284612473565b91506125fd8261250d565b91508190509392505050565b600060208201905061261e60008301846123e3565b92915050565b600060808201905061263960008301876123e3565b61264660208301866123e3565b61265360408301856125bc565b81810360608301526126658184612401565b905095945050505050565b600060208201905061268560008301846123f2565b92915050565b600060208201905081810360008301526126a5818461243a565b905092915050565b600060208201905081810360008301526126c6816124a4565b9050919050565b600060208201905081810360008301526126e6816124c7565b9050919050565b60006020820190508181036000830152612706816124ea565b9050919050565b6000602082019050818103600083015261272681612530565b9050919050565b6000602082019050818103600083015261274681612553565b9050919050565b6000602082019050818103600083015261276681612576565b9050919050565b6000602082019050818103600083015261278681612599565b9050919050565b60006020820190506127a260008301846125bc565b92915050565b60006020820190506127bd60008301846125cb565b92915050565b60006127cd6127de565b90506127d98282612a3d565b919050565b6000604051905090565b600067ffffffffffffffff82111561280357612802612ba4565b5b61280c82612be7565b9050602081019050919050565b600067ffffffffffffffff82111561283457612833612ba4565b5b61283d82612be7565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000612898826129b2565b91506128a3836129b2565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156128d8576128d7612ae8565b5b828201905092915050565b60006128ee826129b2565b91506128f9836129b2565b92508261290957612908612b17565b5b828204905092915050565b600061291f826129b2565b915061292a836129b2565b92508282101561293d5761293c612ae8565b5b828203905092915050565b600061295382612992565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156129f65780820151818401526020810190506129db565b83811115612a05576000848401525b50505050565b60006002820490506001821680612a2357607f821691505b60208210811415612a3757612a36612b46565b5b50919050565b612a4682612be7565b810181811067ffffffffffffffff82111715612a6557612a64612ba4565b5b80604052505050565b6000612a79826129b2565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415612aac57612aab612ae8565b5b600182019050919050565b6000612ac2826129b2565b9150612acd836129b2565b925082612add57612adc612b17565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f6d6178204e4654206c696d697420657863656564656400000000000000000000600082015250565b7f6d6178206d696e7420616d6f756e74207065722073657373696f6e206578636560008201527f6564656400000000000000000000000000000000000000000000000000000000602082015250565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f74686520636f6e74726163742069732070617573656400000000000000000000600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f6e65656420746f206d696e74206174206c656173742031204e46540000000000600082015250565b612dbb81612948565b8114612dc657600080fd5b50565b612dd28161295a565b8114612ddd57600080fd5b50565b612de981612966565b8114612df457600080fd5b50565b612e00816129b2565b8114612e0b57600080fd5b50565b612e17816129bc565b8114612e2257600080fd5b5056fea264697066735822122094d584de2c21ab71c3b62001314c020c9736768281d3e92883bf2789368ac99264736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e000000000000000000000000000000000000000000000000000000000000000094675642050616e64610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000846756450616e64610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000043697066733a2f2f6261667962656962376d786d3572667635703474626e6672717171347471677869336a6d6a71337269663263376b3573376465776476346f7478792f0000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): Fud Panda
Arg [1] : _symbol (string): FudPanda
Arg [2] : _initBaseURI (string): ipfs://bafybeib7mxm5rfv5p4tbnfrqqq4tqgxi3jmjq3rif2c7k5s7dewdv4otxy/

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [4] : 4675642050616e64610000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [6] : 46756450616e6461000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000043
Arg [8] : 697066733a2f2f6261667962656962376d786d3572667635703474626e667271
Arg [9] : 7171347471677869336a6d6a71337269663263376b3573376465776476346f74
Arg [10] : 78792f0000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

43280:1778:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18006:615;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23019:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25087:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24547:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17060:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43411:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25973:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44929:120;;;:::i;:::-;;26214:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44683:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43449:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22808:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18685:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2386:103;;;;;;;;;;;;;:::i;:::-;;44606:69;;;;;;;;;;;;;:::i;:::-;;1735:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23188:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43713:370;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25363:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26470:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44207:391;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25742:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2644:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44799:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18006:615;18091:4;18406:10;18391:25;;:11;:25;;;;:102;;;;18483:10;18468:25;;:11;:25;;;;18391:102;:179;;;;18560:10;18545:25;;:11;:25;;;;18391:179;18371:199;;18006:615;;;:::o;23019:100::-;23073:13;23106:5;23099:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23019:100;:::o;25087:204::-;25155:7;25180:16;25188:7;25180;:16::i;:::-;25175:64;;25205:34;;;;;;;;;;;;;;25175:64;25259:15;:24;25275:7;25259:24;;;;;;;;;;;;;;;;;;;;;25252:31;;25087:204;;;:::o;24547:474::-;24620:13;24652:27;24671:7;24652:18;:27::i;:::-;24620:61;;24702:5;24696:11;;:2;:11;;;24692:48;;;24716:24;;;;;;;;;;;;;;24692:48;24780:5;24757:28;;:19;:17;:19::i;:::-;:28;;;24753:175;;24805:44;24822:5;24829:19;:17;:19::i;:::-;24805:16;:44::i;:::-;24800:128;;24877:35;;;;;;;;;;;;;;24800:128;24753:175;24967:2;24940:15;:24;24956:7;24940:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25005:7;25001:2;24985:28;;24994:5;24985:28;;;;;;;;;;;;24609:412;24547:474;;:::o;17060:315::-;17113:7;17341:15;:13;:15::i;:::-;17326:12;;17310:13;;:28;:46;17303:53;;17060:315;:::o;43411:31::-;;;;;;;;;;;;;:::o;25973:170::-;26107:28;26117:4;26123:2;26127:7;26107:9;:28::i;:::-;25973:170;;;:::o;44929:120::-;1966:12;:10;:12::i;:::-;1955:23;;:7;:5;:7::i;:::-;:23;;;1947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45001:10:::1;44993:24;;:47;45018:21;44993:47;;;;;;;;;;;;;;;;;;;;;;;44985:56;;;::::0;::::1;;44929:120::o:0;26214:185::-;26352:39;26369:4;26375:2;26379:7;26352:39;;;;;;;;;;;;:16;:39::i;:::-;26214:185;;;:::o;44683:104::-;1966:12;:10;:12::i;:::-;1955:23;;:7;:5;:7::i;:::-;:23;;;1947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44768:11:::1;44758:7;:21;;;;;;;;;;;;:::i;:::-;;44683:104:::0;:::o;43449:25::-;;;;;;;;;;;;;:::o;22808:144::-;22872:7;22915:27;22934:7;22915:18;:27::i;:::-;22892:52;;22808:144;;;:::o;18685:224::-;18749:7;18790:1;18773:19;;:5;:19;;;18769:60;;;18801:28;;;;;;;;;;;;;;18769:60;14024:13;18847:18;:25;18866:5;18847:25;;;;;;;;;;;;;;;;:54;18840:61;;18685:224;;;:::o;2386:103::-;1966:12;:10;:12::i;:::-;1955:23;;:7;:5;:7::i;:::-;:23;;;1947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2451:30:::1;2478:1;2451:18;:30::i;:::-;2386:103::o:0;44606:69::-;1966:12;:10;:12::i;:::-;1955:23;;:7;:5;:7::i;:::-;:23;;;1947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44661:6:::1;;;;;;;;;;;44660:7;44651:6;;:16;;;;;;;;;;;;;;;;;;44606:69::o:0;1735:87::-;1781:7;1808:6;;;;;;;;;;;1801:13;;1735:87;:::o;23188:104::-;23244:13;23277:7;23270:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23188:104;:::o;43713:370::-;43773:6;;;;;;;;;;;43772:7;43764:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;43835:1;43825:7;:11;43817:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;43898:13;;;;;;;;;;;43887:24;;:7;:24;;43879:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;43998:9;;43987:7;43971:13;:11;:13::i;:::-;:23;;;;:::i;:::-;:36;;43963:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;44045:30;44055:10;44067:7;44045:9;:30::i;:::-;43713:370;:::o;25363:308::-;25474:19;:17;:19::i;:::-;25462:31;;:8;:31;;;25458:61;;;25502:17;;;;;;;;;;;;;;25458:61;25584:8;25532:18;:39;25551:19;:17;:19::i;:::-;25532:39;;;;;;;;;;;;;;;:49;25572:8;25532:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;25644:8;25608:55;;25623:19;:17;:19::i;:::-;25608:55;;;25654:8;25608:55;;;;;;:::i;:::-;;;;;;;;25363:308;;:::o;26470:396::-;26637:28;26647:4;26653:2;26657:7;26637:9;:28::i;:::-;26698:1;26680:2;:14;;;:19;26676:183;;26719:56;26750:4;26756:2;26760:7;26769:5;26719:30;:56::i;:::-;26714:145;;26803:40;;;;;;;;;;;;;;26714:145;26676:183;26470:396;;;;:::o;44207:391::-;44285:13;44318:16;44326:7;44318;:16::i;:::-;44310:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;44422:28;44453:10;:8;:10::i;:::-;44422:41;;44512:1;44487:14;44481:28;:32;:109;;;;;;;;;;;;;;;;;44540:14;44556:18;:7;:16;:18::i;:::-;44523:61;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44481:109;44474:116;;;44207:391;;;:::o;25742:164::-;25839:4;25863:18;:25;25882:5;25863:25;;;;;;;;;;;;;;;:35;25889:8;25863:35;;;;;;;;;;;;;;;;;;;;;;;;;25856:42;;25742:164;;;;:::o;2644:201::-;1966:12;:10;:12::i;:::-;1955:23;;:7;:5;:7::i;:::-;:23;;;1947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;2753:1:::1;2733:22;;:8;:22;;;;2725:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2809:28;2828:8;2809:18;:28::i;:::-;2644:201:::0;:::o;44799:122::-;1966:12;:10;:12::i;:::-;1955:23;;:7;:5;:7::i;:::-;:23;;;1947:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44896:17:::1;44880:13;;:33;;;;;;;;;;;;;;;;;;44799:122:::0;:::o;27121:273::-;27178:4;27234:7;27215:15;:13;:15::i;:::-;:26;;:66;;;;;27268:13;;27258:7;:23;27215:66;:152;;;;;27366:1;14794:8;27319:17;:26;27337:7;27319:26;;;;;;;;;;;;:43;:48;27215:152;27195:172;;27121:273;;;:::o;20323:1129::-;20390:7;20410:12;20425:7;20410:22;;20493:4;20474:15;:13;:15::i;:::-;:23;20470:915;;20527:13;;20520:4;:20;20516:869;;;20565:14;20582:17;:23;20600:4;20582:23;;;;;;;;;;;;20565:40;;20698:1;14794:8;20671:6;:23;:28;20667:699;;;21190:113;21207:1;21197:6;:11;21190:113;;;21250:17;:25;21268:6;;;;;;;21250:25;;;;;;;;;;;;21241:34;;21190:113;;;21336:6;21329:13;;;;;;20667:699;20542:843;20516:869;20470:915;21413:31;;;;;;;;;;;;;;20323:1129;;;;:::o;41103:105::-;41163:7;41190:10;41183:17;;41103:105;:::o;16583:92::-;16639:7;16583:92;:::o;32360:2515::-;32475:27;32505;32524:7;32505:18;:27::i;:::-;32475:57;;32590:4;32549:45;;32565:19;32549:45;;;32545:86;;32603:28;;;;;;;;;;;;;;32545:86;32644:22;32693:4;32670:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;32714:43;32731:4;32737:19;:17;:19::i;:::-;32714:16;:43::i;:::-;32670:87;:147;;;;32798:19;:17;:19::i;:::-;32774:43;;:20;32786:7;32774:11;:20::i;:::-;:43;;;32670:147;32644:174;;32836:17;32831:66;;32862:35;;;;;;;;;;;;;;32831:66;32926:1;32912:16;;:2;:16;;;32908:52;;;32937:23;;;;;;;;;;;;;;32908:52;32973:43;32995:4;33001:2;33005:7;33014:1;32973:21;:43::i;:::-;33089:15;:24;33105:7;33089:24;;;;;;;;;;;;33082:31;;;;;;;;;;;33481:18;:24;33500:4;33481:24;;;;;;;;;;;;;;;;33479:26;;;;;;;;;;;;33550:18;:22;33569:2;33550:22;;;;;;;;;;;;;;;;33548:24;;;;;;;;;;;15076:8;14678:3;33931:15;:41;;33889:21;33907:2;33889:17;:21::i;:::-;:84;:128;33843:17;:26;33861:7;33843:26;;;;;;;;;;;:174;;;;34187:1;15076:8;34137:19;:46;:51;34133:626;;;34209:19;34241:1;34231:7;:11;34209:33;;34398:1;34364:17;:30;34382:11;34364:30;;;;;;;;;;;;:35;34360:384;;;34502:13;;34487:11;:28;34483:242;;34682:19;34649:17;:30;34667:11;34649:30;;;;;;;;;;;:52;;;;34483:242;34360:384;34190:569;34133:626;34806:7;34802:2;34787:27;;34796:4;34787:27;;;;;;;;;;;;34825:42;34846:4;34852:2;34856:7;34865:1;34825:20;:42::i;:::-;32464:2411;;32360:2515;;;:::o;602:98::-;655:7;682:10;675:17;;602:98;:::o;3005:191::-;3079:16;3098:6;;;;;;;;;;;3079:25;;3124:8;3115:6;;:17;;;;;;;;;;;;;;;;;;3179:8;3148:40;;3169:8;3148:40;;;;;;;;;;;;3068:128;3005:191;:::o;27478:104::-;27547:27;27557:2;27561:8;27547:27;;;;;;;;;;;;:9;:27::i;:::-;27478:104;;:::o;38572:716::-;38735:4;38781:2;38756:45;;;38802:19;:17;:19::i;:::-;38823:4;38829:7;38838:5;38756:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38752:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39056:1;39039:6;:13;:18;39035:235;;;39085:40;;;;;;;;;;;;;;39035:235;39228:6;39222:13;39213:6;39209:2;39205:15;39198:38;38752:529;38925:54;;;38915:64;;;:6;:64;;;;38908:71;;;38572:716;;;;;;:::o;44091:108::-;44151:13;44184:7;44177:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44091:108;:::o;3429:723::-;3485:13;3715:1;3706:5;:10;3702:53;;;3733:10;;;;;;;;;;;;;;;;;;;;;3702:53;3765:12;3780:5;3765:20;;3796:14;3821:78;3836:1;3828:4;:9;3821:78;;3854:8;;;;;:::i;:::-;;;;3885:2;3877:10;;;;;:::i;:::-;;;3821:78;;;3909:19;3941:6;3931:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3909:39;;3959:154;3975:1;3966:5;:10;3959:154;;4003:1;3993:11;;;;;:::i;:::-;;;4070:2;4062:5;:10;;;;:::i;:::-;4049:2;:24;;;;:::i;:::-;4036:39;;4019:6;4026;4019:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;4099:2;4090:11;;;;;:::i;:::-;;;3959:154;;;4137:6;4123:21;;;;;3429:723;;;;:::o;39936:159::-;;;;;:::o;24108:148::-;24172:14;24233:5;24223:15;;24108:148;;;:::o;40754:158::-;;;;;:::o;27955:2236::-;28078:20;28101:13;;28078:36;;28143:1;28129:16;;:2;:16;;;28125:48;;;28154:19;;;;;;;;;;;;;;28125:48;28200:1;28188:8;:13;28184:44;;;28210:18;;;;;;;;;;;;;;28184:44;28241:61;28271:1;28275:2;28279:12;28293:8;28241:21;:61::i;:::-;28845:1;14161:2;28816:1;:25;;28815:31;28803:8;:44;28777:18;:22;28796:2;28777:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;14941:3;29246:29;29273:1;29261:8;:13;29246:14;:29::i;:::-;:56;;14678:3;29183:15;:41;;29141:21;29159:2;29141:17;:21::i;:::-;:84;:162;29090:17;:31;29108:12;29090:31;;;;;;;;;;;:213;;;;29320:20;29343:12;29320:35;;29370:11;29399:8;29384:12;:23;29370:37;;29446:1;29428:2;:14;;;:19;29424:635;;29468:313;29524:12;29520:2;29499:38;;29516:1;29499:38;;;;;;;;;;;;29565:69;29604:1;29608:2;29612:14;;;;;;29628:5;29565:30;:69::i;:::-;29560:174;;29670:40;;;;;;;;;;;;;;29560:174;29776:3;29761:12;:18;29468:313;;29862:12;29845:13;;:29;29841:43;;29876:8;;;29841:43;29424:635;;;29925:119;29981:14;;;;;;29977:2;29956:40;;29973:1;29956:40;;;;;;;;;;;;30039:3;30024:12;:18;29925:119;;29424:635;30089:12;30073:13;:28;;;;28554:1559;;30123:60;30152:1;30156:2;30160:12;30174:8;30123:20;:60::i;:::-;28067:2124;27955:2236;;;:::o;24343:142::-;24401:14;24462:5;24452:15;;24343:142;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:135::-;2321:5;2359:6;2346:20;2337:29;;2375:31;2400:5;2375:31;:::i;:::-;2277:135;;;;:::o;2418:329::-;2477:6;2526:2;2514:9;2505:7;2501:23;2497:32;2494:119;;;2532:79;;:::i;:::-;2494:119;2652:1;2677:53;2722:7;2713:6;2702:9;2698:22;2677:53;:::i;:::-;2667:63;;2623:117;2418:329;;;;:::o;2753:474::-;2821:6;2829;2878:2;2866:9;2857:7;2853:23;2849:32;2846:119;;;2884:79;;:::i;:::-;2846:119;3004:1;3029:53;3074:7;3065:6;3054:9;3050:22;3029:53;:::i;:::-;3019:63;;2975:117;3131:2;3157:53;3202:7;3193:6;3182:9;3178:22;3157:53;:::i;:::-;3147:63;;3102:118;2753:474;;;;;:::o;3233:619::-;3310:6;3318;3326;3375:2;3363:9;3354:7;3350:23;3346:32;3343:119;;;3381:79;;:::i;:::-;3343:119;3501:1;3526:53;3571:7;3562:6;3551:9;3547:22;3526:53;:::i;:::-;3516:63;;3472:117;3628:2;3654:53;3699:7;3690:6;3679:9;3675:22;3654:53;:::i;:::-;3644:63;;3599:118;3756:2;3782:53;3827:7;3818:6;3807:9;3803:22;3782:53;:::i;:::-;3772:63;;3727:118;3233:619;;;;;:::o;3858:943::-;3953:6;3961;3969;3977;4026:3;4014:9;4005:7;4001:23;3997:33;3994:120;;;4033:79;;:::i;:::-;3994:120;4153:1;4178:53;4223:7;4214:6;4203:9;4199:22;4178:53;:::i;:::-;4168:63;;4124:117;4280:2;4306:53;4351:7;4342:6;4331:9;4327:22;4306:53;:::i;:::-;4296:63;;4251:118;4408:2;4434:53;4479:7;4470:6;4459:9;4455:22;4434:53;:::i;:::-;4424:63;;4379:118;4564:2;4553:9;4549:18;4536:32;4595:18;4587:6;4584:30;4581:117;;;4617:79;;:::i;:::-;4581:117;4722:62;4776:7;4767:6;4756:9;4752:22;4722:62;:::i;:::-;4712:72;;4507:287;3858:943;;;;;;;:::o;4807:468::-;4872:6;4880;4929:2;4917:9;4908:7;4904:23;4900:32;4897:119;;;4935:79;;:::i;:::-;4897:119;5055:1;5080:53;5125:7;5116:6;5105:9;5101:22;5080:53;:::i;:::-;5070:63;;5026:117;5182:2;5208:50;5250:7;5241:6;5230:9;5226:22;5208:50;:::i;:::-;5198:60;;5153:115;4807:468;;;;;:::o;5281:474::-;5349:6;5357;5406:2;5394:9;5385:7;5381:23;5377:32;5374:119;;;5412:79;;:::i;:::-;5374:119;5532:1;5557:53;5602:7;5593:6;5582:9;5578:22;5557:53;:::i;:::-;5547:63;;5503:117;5659:2;5685:53;5730:7;5721:6;5710:9;5706:22;5685:53;:::i;:::-;5675:63;;5630:118;5281:474;;;;;:::o;5761:327::-;5819:6;5868:2;5856:9;5847:7;5843:23;5839:32;5836:119;;;5874:79;;:::i;:::-;5836:119;5994:1;6019:52;6063:7;6054:6;6043:9;6039:22;6019:52;:::i;:::-;6009:62;;5965:116;5761:327;;;;:::o;6094:349::-;6163:6;6212:2;6200:9;6191:7;6187:23;6183:32;6180:119;;;6218:79;;:::i;:::-;6180:119;6338:1;6363:63;6418:7;6409:6;6398:9;6394:22;6363:63;:::i;:::-;6353:73;;6309:127;6094:349;;;;:::o;6449:509::-;6518:6;6567:2;6555:9;6546:7;6542:23;6538:32;6535:119;;;6573:79;;:::i;:::-;6535:119;6721:1;6710:9;6706:17;6693:31;6751:18;6743:6;6740:30;6737:117;;;6773:79;;:::i;:::-;6737:117;6878:63;6933:7;6924:6;6913:9;6909:22;6878:63;:::i;:::-;6868:73;;6664:287;6449:509;;;;:::o;6964:329::-;7023:6;7072:2;7060:9;7051:7;7047:23;7043:32;7040:119;;;7078:79;;:::i;:::-;7040:119;7198:1;7223:53;7268:7;7259:6;7248:9;7244:22;7223:53;:::i;:::-;7213:63;;7169:117;6964:329;;;;:::o;7299:325::-;7356:6;7405:2;7393:9;7384:7;7380:23;7376:32;7373:119;;;7411:79;;:::i;:::-;7373:119;7531:1;7556:51;7599:7;7590:6;7579:9;7575:22;7556:51;:::i;:::-;7546:61;;7502:115;7299:325;;;;:::o;7630:118::-;7717:24;7735:5;7717:24;:::i;:::-;7712:3;7705:37;7630:118;;:::o;7754:109::-;7835:21;7850:5;7835:21;:::i;:::-;7830:3;7823:34;7754:109;;:::o;7869:360::-;7955:3;7983:38;8015:5;7983:38;:::i;:::-;8037:70;8100:6;8095:3;8037:70;:::i;:::-;8030:77;;8116:52;8161:6;8156:3;8149:4;8142:5;8138:16;8116:52;:::i;:::-;8193:29;8215:6;8193:29;:::i;:::-;8188:3;8184:39;8177:46;;7959:270;7869:360;;;;:::o;8235:364::-;8323:3;8351:39;8384:5;8351:39;:::i;:::-;8406:71;8470:6;8465:3;8406:71;:::i;:::-;8399:78;;8486:52;8531:6;8526:3;8519:4;8512:5;8508:16;8486:52;:::i;:::-;8563:29;8585:6;8563:29;:::i;:::-;8558:3;8554:39;8547:46;;8327:272;8235:364;;;;:::o;8605:377::-;8711:3;8739:39;8772:5;8739:39;:::i;:::-;8794:89;8876:6;8871:3;8794:89;:::i;:::-;8787:96;;8892:52;8937:6;8932:3;8925:4;8918:5;8914:16;8892:52;:::i;:::-;8969:6;8964:3;8960:16;8953:23;;8715:267;8605:377;;;;:::o;8988:366::-;9130:3;9151:67;9215:2;9210:3;9151:67;:::i;:::-;9144:74;;9227:93;9316:3;9227:93;:::i;:::-;9345:2;9340:3;9336:12;9329:19;;8988:366;;;:::o;9360:::-;9502:3;9523:67;9587:2;9582:3;9523:67;:::i;:::-;9516:74;;9599:93;9688:3;9599:93;:::i;:::-;9717:2;9712:3;9708:12;9701:19;;9360:366;;;:::o;9732:::-;9874:3;9895:67;9959:2;9954:3;9895:67;:::i;:::-;9888:74;;9971:93;10060:3;9971:93;:::i;:::-;10089:2;10084:3;10080:12;10073:19;;9732:366;;;:::o;10104:400::-;10264:3;10285:84;10367:1;10362:3;10285:84;:::i;:::-;10278:91;;10378:93;10467:3;10378:93;:::i;:::-;10496:1;10491:3;10487:11;10480:18;;10104:400;;;:::o;10510:366::-;10652:3;10673:67;10737:2;10732:3;10673:67;:::i;:::-;10666:74;;10749:93;10838:3;10749:93;:::i;:::-;10867:2;10862:3;10858:12;10851:19;;10510:366;;;:::o;10882:::-;11024:3;11045:67;11109:2;11104:3;11045:67;:::i;:::-;11038:74;;11121:93;11210:3;11121:93;:::i;:::-;11239:2;11234:3;11230:12;11223:19;;10882:366;;;:::o;11254:::-;11396:3;11417:67;11481:2;11476:3;11417:67;:::i;:::-;11410:74;;11493:93;11582:3;11493:93;:::i;:::-;11611:2;11606:3;11602:12;11595:19;;11254:366;;;:::o;11626:::-;11768:3;11789:67;11853:2;11848:3;11789:67;:::i;:::-;11782:74;;11865:93;11954:3;11865:93;:::i;:::-;11983:2;11978:3;11974:12;11967:19;;11626:366;;;:::o;11998:118::-;12085:24;12103:5;12085:24;:::i;:::-;12080:3;12073:37;11998:118;;:::o;12122:112::-;12205:22;12221:5;12205:22;:::i;:::-;12200:3;12193:35;12122:112;;:::o;12240:701::-;12521:3;12543:95;12634:3;12625:6;12543:95;:::i;:::-;12536:102;;12655:95;12746:3;12737:6;12655:95;:::i;:::-;12648:102;;12767:148;12911:3;12767:148;:::i;:::-;12760:155;;12932:3;12925:10;;12240:701;;;;;:::o;12947:222::-;13040:4;13078:2;13067:9;13063:18;13055:26;;13091:71;13159:1;13148:9;13144:17;13135:6;13091:71;:::i;:::-;12947:222;;;;:::o;13175:640::-;13370:4;13408:3;13397:9;13393:19;13385:27;;13422:71;13490:1;13479:9;13475:17;13466:6;13422:71;:::i;:::-;13503:72;13571:2;13560:9;13556:18;13547:6;13503:72;:::i;:::-;13585;13653:2;13642:9;13638:18;13629:6;13585:72;:::i;:::-;13704:9;13698:4;13694:20;13689:2;13678:9;13674:18;13667:48;13732:76;13803:4;13794:6;13732:76;:::i;:::-;13724:84;;13175:640;;;;;;;:::o;13821:210::-;13908:4;13946:2;13935:9;13931:18;13923:26;;13959:65;14021:1;14010:9;14006:17;13997:6;13959:65;:::i;:::-;13821:210;;;;:::o;14037:313::-;14150:4;14188:2;14177:9;14173:18;14165:26;;14237:9;14231:4;14227:20;14223:1;14212:9;14208:17;14201:47;14265:78;14338:4;14329:6;14265:78;:::i;:::-;14257:86;;14037:313;;;;:::o;14356:419::-;14522:4;14560:2;14549:9;14545:18;14537:26;;14609:9;14603:4;14599:20;14595:1;14584:9;14580:17;14573:47;14637:131;14763:4;14637:131;:::i;:::-;14629:139;;14356:419;;;:::o;14781:::-;14947:4;14985:2;14974:9;14970:18;14962:26;;15034:9;15028:4;15024:20;15020:1;15009:9;15005:17;14998:47;15062:131;15188:4;15062:131;:::i;:::-;15054:139;;14781:419;;;:::o;15206:::-;15372:4;15410:2;15399:9;15395:18;15387:26;;15459:9;15453:4;15449:20;15445:1;15434:9;15430:17;15423:47;15487:131;15613:4;15487:131;:::i;:::-;15479:139;;15206:419;;;:::o;15631:::-;15797:4;15835:2;15824:9;15820:18;15812:26;;15884:9;15878:4;15874:20;15870:1;15859:9;15855:17;15848:47;15912:131;16038:4;15912:131;:::i;:::-;15904:139;;15631:419;;;:::o;16056:::-;16222:4;16260:2;16249:9;16245:18;16237:26;;16309:9;16303:4;16299:20;16295:1;16284:9;16280:17;16273:47;16337:131;16463:4;16337:131;:::i;:::-;16329:139;;16056:419;;;:::o;16481:::-;16647:4;16685:2;16674:9;16670:18;16662:26;;16734:9;16728:4;16724:20;16720:1;16709:9;16705:17;16698:47;16762:131;16888:4;16762:131;:::i;:::-;16754:139;;16481:419;;;:::o;16906:::-;17072:4;17110:2;17099:9;17095:18;17087:26;;17159:9;17153:4;17149:20;17145:1;17134:9;17130:17;17123:47;17187:131;17313:4;17187:131;:::i;:::-;17179:139;;16906:419;;;:::o;17331:222::-;17424:4;17462:2;17451:9;17447:18;17439:26;;17475:71;17543:1;17532:9;17528:17;17519:6;17475:71;:::i;:::-;17331:222;;;;:::o;17559:214::-;17648:4;17686:2;17675:9;17671:18;17663:26;;17699:67;17763:1;17752:9;17748:17;17739:6;17699:67;:::i;:::-;17559:214;;;;:::o;17779:129::-;17813:6;17840:20;;:::i;:::-;17830:30;;17869:33;17897:4;17889:6;17869:33;:::i;:::-;17779:129;;;:::o;17914:75::-;17947:6;17980:2;17974:9;17964:19;;17914:75;:::o;17995:307::-;18056:4;18146:18;18138:6;18135:30;18132:56;;;18168:18;;:::i;:::-;18132:56;18206:29;18228:6;18206:29;:::i;:::-;18198:37;;18290:4;18284;18280:15;18272:23;;17995:307;;;:::o;18308:308::-;18370:4;18460:18;18452:6;18449:30;18446:56;;;18482:18;;:::i;:::-;18446:56;18520:29;18542:6;18520:29;:::i;:::-;18512:37;;18604:4;18598;18594:15;18586:23;;18308:308;;;:::o;18622:98::-;18673:6;18707:5;18701:12;18691:22;;18622:98;;;:::o;18726:99::-;18778:6;18812:5;18806:12;18796:22;;18726:99;;;:::o;18831:168::-;18914:11;18948:6;18943:3;18936:19;18988:4;18983:3;18979:14;18964:29;;18831:168;;;;:::o;19005:169::-;19089:11;19123:6;19118:3;19111:19;19163:4;19158:3;19154:14;19139:29;;19005:169;;;;:::o;19180:148::-;19282:11;19319:3;19304:18;;19180:148;;;;:::o;19334:305::-;19374:3;19393:20;19411:1;19393:20;:::i;:::-;19388:25;;19427:20;19445:1;19427:20;:::i;:::-;19422:25;;19581:1;19513:66;19509:74;19506:1;19503:81;19500:107;;;19587:18;;:::i;:::-;19500:107;19631:1;19628;19624:9;19617:16;;19334:305;;;;:::o;19645:185::-;19685:1;19702:20;19720:1;19702:20;:::i;:::-;19697:25;;19736:20;19754:1;19736:20;:::i;:::-;19731:25;;19775:1;19765:35;;19780:18;;:::i;:::-;19765:35;19822:1;19819;19815:9;19810:14;;19645:185;;;;:::o;19836:191::-;19876:4;19896:20;19914:1;19896:20;:::i;:::-;19891:25;;19930:20;19948:1;19930:20;:::i;:::-;19925:25;;19969:1;19966;19963:8;19960:34;;;19974:18;;:::i;:::-;19960:34;20019:1;20016;20012:9;20004:17;;19836:191;;;;:::o;20033:96::-;20070:7;20099:24;20117:5;20099:24;:::i;:::-;20088:35;;20033:96;;;:::o;20135:90::-;20169:7;20212:5;20205:13;20198:21;20187:32;;20135:90;;;:::o;20231:149::-;20267:7;20307:66;20300:5;20296:78;20285:89;;20231:149;;;:::o;20386:126::-;20423:7;20463:42;20456:5;20452:54;20441:65;;20386:126;;;:::o;20518:77::-;20555:7;20584:5;20573:16;;20518:77;;;:::o;20601:86::-;20636:7;20676:4;20669:5;20665:16;20654:27;;20601:86;;;:::o;20693:154::-;20777:6;20772:3;20767;20754:30;20839:1;20830:6;20825:3;20821:16;20814:27;20693:154;;;:::o;20853:307::-;20921:1;20931:113;20945:6;20942:1;20939:13;20931:113;;;21030:1;21025:3;21021:11;21015:18;21011:1;21006:3;21002:11;20995:39;20967:2;20964:1;20960:10;20955:15;;20931:113;;;21062:6;21059:1;21056:13;21053:101;;;21142:1;21133:6;21128:3;21124:16;21117:27;21053:101;20902:258;20853:307;;;:::o;21166:320::-;21210:6;21247:1;21241:4;21237:12;21227:22;;21294:1;21288:4;21284:12;21315:18;21305:81;;21371:4;21363:6;21359:17;21349:27;;21305:81;21433:2;21425:6;21422:14;21402:18;21399:38;21396:84;;;21452:18;;:::i;:::-;21396:84;21217:269;21166:320;;;:::o;21492:281::-;21575:27;21597:4;21575:27;:::i;:::-;21567:6;21563:40;21705:6;21693:10;21690:22;21669:18;21657:10;21654:34;21651:62;21648:88;;;21716:18;;:::i;:::-;21648:88;21756:10;21752:2;21745:22;21535:238;21492:281;;:::o;21779:233::-;21818:3;21841:24;21859:5;21841:24;:::i;:::-;21832:33;;21887:66;21880:5;21877:77;21874:103;;;21957:18;;:::i;:::-;21874:103;22004:1;21997:5;21993:13;21986:20;;21779:233;;;:::o;22018:176::-;22050:1;22067:20;22085:1;22067:20;:::i;:::-;22062:25;;22101:20;22119:1;22101:20;:::i;:::-;22096:25;;22140:1;22130:35;;22145:18;;:::i;:::-;22130:35;22186:1;22183;22179:9;22174:14;;22018:176;;;;:::o;22200:180::-;22248:77;22245:1;22238:88;22345:4;22342:1;22335:15;22369:4;22366:1;22359:15;22386:180;22434:77;22431:1;22424:88;22531:4;22528:1;22521:15;22555:4;22552:1;22545:15;22572:180;22620:77;22617:1;22610:88;22717:4;22714:1;22707:15;22741:4;22738:1;22731:15;22758:180;22806:77;22803:1;22796:88;22903:4;22900:1;22893:15;22927:4;22924:1;22917:15;22944:180;22992:77;22989:1;22982:88;23089:4;23086:1;23079:15;23113:4;23110:1;23103:15;23130:117;23239:1;23236;23229:12;23253:117;23362:1;23359;23352:12;23376:117;23485:1;23482;23475:12;23499:117;23608:1;23605;23598:12;23622:102;23663:6;23714:2;23710:7;23705:2;23698:5;23694:14;23690:28;23680:38;;23622:102;;;:::o;23730:225::-;23870:34;23866:1;23858:6;23854:14;23847:58;23939:8;23934:2;23926:6;23922:15;23915:33;23730:225;:::o;23961:172::-;24101:24;24097:1;24089:6;24085:14;24078:48;23961:172;:::o;24139:223::-;24279:34;24275:1;24267:6;24263:14;24256:58;24348:6;24343:2;24335:6;24331:15;24324:31;24139:223;:::o;24368:155::-;24508:7;24504:1;24496:6;24492:14;24485:31;24368:155;:::o;24529:182::-;24669:34;24665:1;24657:6;24653:14;24646:58;24529:182;:::o;24717:172::-;24857:24;24853:1;24845:6;24841:14;24834:48;24717:172;:::o;24895:234::-;25035:34;25031:1;25023:6;25019:14;25012:58;25104:17;25099:2;25091:6;25087:15;25080:42;24895:234;:::o;25135:177::-;25275:29;25271:1;25263:6;25259:14;25252:53;25135:177;:::o;25318:122::-;25391:24;25409:5;25391:24;:::i;:::-;25384:5;25381:35;25371:63;;25430:1;25427;25420:12;25371:63;25318:122;:::o;25446:116::-;25516:21;25531:5;25516:21;:::i;:::-;25509:5;25506:32;25496:60;;25552:1;25549;25542:12;25496:60;25446:116;:::o;25568:120::-;25640:23;25657:5;25640:23;:::i;:::-;25633:5;25630:34;25620:62;;25678:1;25675;25668:12;25620:62;25568:120;:::o;25694:122::-;25767:24;25785:5;25767:24;:::i;:::-;25760:5;25757:35;25747:63;;25806:1;25803;25796:12;25747:63;25694:122;:::o;25822:118::-;25893:22;25909:5;25893:22;:::i;:::-;25886:5;25883:33;25873:61;;25930:1;25927;25920:12;25873:61;25822:118;:::o

Swarm Source

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