ETH Price: $3,060.16 (+2.62%)
Gas: 1 Gwei

Token

Nakabitos (NKB)
 

Overview

Max Total Supply

664 NKB

Holders

104

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 NKB
0xfe02C02CA4cfF78EaD96BB8b2356EB5f0eB6FCc2
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:
Nakabitos

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: UNLICENSED

pragma solidity ^0.8.13;

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 ERC721A.
 */
interface IERC721A {
    /**
     * The caller must own the token or be an approved operator.
     */
    error ApprovalCallerNotOwnerNorApproved();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account. See {ERC721A-_approve}.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     */
    function approve(address to, uint256 tokenId) public payable virtual override {
        _approve(to, tokenId, true);
    }

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

        return _tokenApprovals[tokenId].value;
    }

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

            uint256 toMasked;
            uint256 end = startTokenId + quantity;

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

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

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

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

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

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

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

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

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

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

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

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

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


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

    /**
     * @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:
     *
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId, bool approvalCheck) internal virtual {
        address owner = ownerOf(tokenId);

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

abstract contract Ownable {
    address public owner; 
    constructor() { owner = msg.sender; }
    modifier onlyOwner { require(owner == msg.sender, "Not Owner!"); _; }
    function transferOwnership(address new_) external onlyOwner { owner = new_; }
}

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

abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry constant operatorFilterRegistry =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

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

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

abstract contract MerkleProof {
    bytes32 internal _merkleRoot;
    function _setMerkleRoot(bytes32 merkleRoot_) internal virtual {
        _merkleRoot = merkleRoot_;
    }

    function isTeam(address address_, bytes32[] memory proof_) public view returns (bool) {
        bytes32 _leaf = keccak256(abi.encodePacked(address_));
        for (uint256 i = 0; i < proof_.length; i++) {
            _leaf = _leaf < proof_[i] ? keccak256(abi.encodePacked(_leaf, proof_[i])) : keccak256(abi.encodePacked(proof_[i], _leaf));
        }
        return _leaf == _merkleRoot;
    }
}

contract Nakabitos is ERC721A, Ownable, OperatorFilterer, MerkleProof {

    uint256 public maxToken = 10000;
    uint256 public maxFreeSupply = 10000;
    uint256 public mintMax = 10; 

    // booleans for if mint is enabled
    bool public mintEnabled = false;

    uint256 public mintPrice = 0.006 ether;

    bool public revealed;

    string private revealURI;
    string private baseTokenURI;

    mapping(address => uint256) public minted;

    constructor() ERC721A("Nakabitos", "NKB") OperatorFilterer(address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6), true) {
        sethiddenBaseURI("Instant reveal");
    }

    //mint function

    function mint(uint256 _amount) public payable onlySender { 
        require(mintEnabled == true, "Sale inactive");
        require(_amount + totalSupply() <= maxToken, "No more NFTs");
        require(mintMax >= _amount, "Exceed max per tx");
        require(mintMax >= minted[msg.sender] + _amount, "Exceed max per address");

        if ((_amount + totalSupply() <= maxFreeSupply) && (minted[msg.sender] == 0)) {
            require(msg.value >= ((_amount * mintPrice) - mintPrice), "Not enough ether sent");
        } else {
            require(msg.value >= mintPrice * _amount, "Value sent is not correct");
        }

        payable(owner).transfer(msg.value);
        minted[msg.sender] += _amount;
        _safeMint(msg.sender, _amount);
    }

    function privateMint(uint256 _amount, bytes32[] memory proof_) public payable onlySender { 
        require(isTeam(msg.sender, proof_), "You are not team member!");
        payable(owner).transfer(msg.value);
        _safeMint(msg.sender, _amount);
    }
    //owner function

    function toggleMint() external onlyOwner {
        mintEnabled = !mintEnabled;
    }

    function setMaxMint(uint256 newMax) external onlyOwner {
        mintMax = newMax;
    }
    
    function setPrice(uint256 newPrice) external onlyOwner {
        mintPrice = newPrice;
    }

    function setMaxFreeSupply(uint256 newMaxFreeSupply) external onlyOwner {
        maxFreeSupply = newMaxFreeSupply;
    }

    function setMerkleRoot(bytes32 merkleRoot_) external onlyOwner {
        _setMerkleRoot(merkleRoot_);
    }

    function setReveal() public onlyOwner {
        revealed = !revealed;
    }

    function sethiddenBaseURI(string memory uri_) public onlyOwner {
        revealURI = uri_;
    }

    function setBaseURI(string memory uri_) public onlyOwner {
        baseTokenURI = uri_;
    }

    //view function

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

    function currentBaseURI() private view returns (string memory){
        return baseTokenURI;
    }

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

    //modifier

    modifier onlySender() {
        require(msg.sender == tx.origin, "No smart contract");
        _;
    }

    //filterer

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

    function surprise(address[] memory to) external onlyOwner {
        for (uint i = 0; i < to.length;i++) {
            _safeMint(to[i], 1);
        }
    }

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

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

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"address_","type":"address"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"isTeam","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxFreeSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintMax","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxFreeSupply","type":"uint256"}],"name":"setMaxFreeSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMax","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"merkleRoot_","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"sethiddenBaseURI","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":[{"internalType":"address[]","name":"to","type":"address[]"}],"name":"surprise","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"new_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052612710600a55612710600b55600a600c556000600d60006101000a81548160ff021916908315150217905550661550f7dca70000600e553480156200004857600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600981526020017f4e616b616269746f7300000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f4e4b4200000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000e492919062000452565b508060039080519060200190620000fd92919062000452565b506200010e6200039a60201b60201c565b600081905550505033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200034c57801562000212576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001d892919062000547565b600060405180830381600087803b158015620001f357600080fd5b505af115801562000208573d6000803e3d6000fd5b505050506200034b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002cc576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b81526004016200029292919062000547565b600060405180830381600087803b158015620002ad57600080fd5b505af1158015620002c2573d6000803e3d6000fd5b505050506200034a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000315919062000574565b600060405180830381600087803b1580156200033057600080fd5b505af115801562000345573d6000803e3d6000fd5b505050505b5b5b5050620003946040518060400160405280600e81526020017f496e7374616e742072657665616c000000000000000000000000000000000000815250620003a360201b60201c565b62000678565b60006001905090565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161462000436576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200042d90620005f2565b60405180910390fd5b80601090805190602001906200044e92919062000452565b5050565b828054620004609062000643565b90600052602060002090601f016020900481019282620004845760008555620004d0565b82601f106200049f57805160ff1916838001178555620004d0565b82800160010185558215620004d0579182015b82811115620004cf578251825591602001919060010190620004b2565b5b509050620004df9190620004e3565b5090565b5b80821115620004fe576000816000905550600101620004e4565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200052f8262000502565b9050919050565b620005418162000522565b82525050565b60006040820190506200055e600083018562000536565b6200056d602083018462000536565b9392505050565b60006020820190506200058b600083018462000536565b92915050565b600082825260208201905092915050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b6000620005da600a8362000591565b9150620005e782620005a2565b602082019050919050565b600060208201905081810360008301526200060d81620005cb565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200065c57607f821691505b60208210810362000672576200067162000614565b5b50919050565b6141d880620006886000396000f3fe6080604052600436106102045760003560e01c80637664531511610118578063b88d4fde116100a0578063d12397301161006f578063d123973014610715578063d3dd5fe014610740578063e45dee9a14610757578063e985e9c514610780578063f2fde38b146107bd57610204565b8063b88d4fde14610675578063b977fe5514610691578063c87b56dd146106ad578063ca69e323146106ea57610204565b806391b7f5ed116100e757806391b7f5ed146105b357806395d89b41146105dc578063a0712d6814610607578063a08c008b14610623578063a22cb4651461064c57610204565b8063766453151461050b5780637b47d0fd146105225780637cb647591461055f5780638da5cb5b1461058857610204565b8063475133341161019b57806355f804b31161016a57806355f804b3146104145780635b28fd911461043d5780636352211e146104665780636817c76c146104a357806370a08231146104ce57610204565b8063475133341461036a5780634d1555611461039557806351830227146103c0578063547520fe146103eb57610204565b806318160ddd116101d757806318160ddd146102ca5780631e7269c5146102f557806323b872dd1461033257806342842e0e1461034e57610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190612ee4565b6107e6565b60405161023d9190612f2c565b60405180910390f35b34801561025257600080fd5b5061025b610878565b6040516102689190612fe0565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613038565b61090a565b6040516102a591906130a6565b60405180910390f35b6102c860048036038101906102c391906130ed565b610989565b005b3480156102d657600080fd5b506102df610999565b6040516102ec919061313c565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613157565b6109b0565b604051610329919061313c565b60405180910390f35b61034c60048036038101906103479190613184565b6109c8565b005b61036860048036038101906103639190613184565b610baa565b005b34801561037657600080fd5b5061037f610d8c565b60405161038c919061313c565b60405180910390f35b3480156103a157600080fd5b506103aa610d92565b6040516103b7919061313c565b60405180910390f35b3480156103cc57600080fd5b506103d5610d98565b6040516103e29190612f2c565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d9190613038565b610dab565b005b34801561042057600080fd5b5061043b6004803603810190610436919061330c565b610e45565b005b34801561044957600080fd5b50610464600480360381019061045f9190613038565b610eef565b005b34801561047257600080fd5b5061048d60048036038101906104889190613038565b610f89565b60405161049a91906130a6565b60405180910390f35b3480156104af57600080fd5b506104b8610f9b565b6040516104c5919061313c565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f09190613157565b610fa1565b604051610502919061313c565b60405180910390f35b34801561051757600080fd5b50610520611059565b005b34801561052e57600080fd5b5061054960048036038101906105449190613453565b611115565b6040516105569190612f2c565b60405180910390f35b34801561056b57600080fd5b50610586600480360381019061058191906134af565b61121e565b005b34801561059457600080fd5b5061059d6112ba565b6040516105aa91906130a6565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d59190613038565b6112e0565b005b3480156105e857600080fd5b506105f161137a565b6040516105fe9190612fe0565b60405180910390f35b610621600480360381019061061c9190613038565b61140c565b005b34801561062f57600080fd5b5061064a6004803603810190610645919061330c565b6117e2565b005b34801561065857600080fd5b50610673600480360381019061066e9190613508565b61188c565b005b61068f600480360381019061068a91906135e9565b611997565b005b6106ab60048036038101906106a6919061366c565b611b7c565b005b3480156106b957600080fd5b506106d460048036038101906106cf9190613038565b611caa565b6040516106e19190612fe0565b60405180910390f35b3480156106f657600080fd5b506106ff611dda565b60405161070c919061313c565b60405180910390f35b34801561072157600080fd5b5061072a611de0565b6040516107379190612f2c565b60405180910390f35b34801561074c57600080fd5b50610755611df3565b005b34801561076357600080fd5b5061077e6004803603810190610779919061378b565b611eaf565b005b34801561078c57600080fd5b506107a760048036038101906107a291906137d4565b611f87565b6040516107b49190612f2c565b60405180910390f35b3480156107c957600080fd5b506107e460048036038101906107df9190613157565b61201b565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108715750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461088790613843565b80601f01602080910402602001604051908101604052809291908181526020018280546108b390613843565b80156109005780601f106108d557610100808354040283529160200191610900565b820191906000526020600020905b8154815290600101906020018083116108e357829003601f168201915b5050505050905090565b6000610915826120ef565b61094b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109958282600161214e565b5050565b60006109a361229e565b6001546000540303905090565b60126020528060005260406000206000915090505481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610b98573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a3a57610a358484846122a7565b610ba4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610a83929190613874565b602060405180830381865afa158015610aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac491906138b2565b8015610b5657506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610b14929190613874565b602060405180830381865afa158015610b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5591906138b2565b5b610b9757336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610b8e91906130a6565b60405180910390fd5b5b610ba38484846122a7565b5b50505050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d7a573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c1c57610c178484846125c9565b610d86565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610c65929190613874565b602060405180830381865afa158015610c82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca691906138b2565b8015610d3857506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610cf6929190613874565b602060405180830381865afa158015610d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3791906138b2565b5b610d7957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d7091906130a6565b60405180910390fd5b5b610d858484846125c9565b5b50505050565b600b5481565b600c5481565b600f60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e329061392b565b60405180910390fd5b80600c8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc9061392b565b60405180910390fd5b8060119080519060200190610eeb929190612dd5565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f769061392b565b60405180910390fd5b80600b8190555050565b6000610f94826125e9565b9050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611008576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e09061392b565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600080836040516020016111299190613993565b60405160208183030381529060405280519060200120905060005b835181101561120f578381815181106111605761115f6139ae565b5b602002602001015182106111b657838181518110611181576111806139ae565b5b60200260200101518260405160200161119b9291906139fe565b604051602081830303815290604052805190602001206111fa565b818482815181106111ca576111c96139ae565b5b60200260200101516040516020016111e39291906139fe565b604051602081830303815290604052805190602001205b9150808061120790613a59565b915050611144565b50600954811491505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a59061392b565b60405180910390fd5b6112b7816126b5565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611370576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113679061392b565b60405180910390fd5b80600e8190555050565b60606003805461138990613843565b80601f01602080910402602001604051908101604052809291908181526020018280546113b590613843565b80156114025780601f106113d757610100808354040283529160200191611402565b820191906000526020600020905b8154815290600101906020018083116113e557829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461147a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147190613aed565b60405180910390fd5b60011515600d60009054906101000a900460ff161515146114d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c790613b59565b60405180910390fd5b600a546114db610999565b826114e69190613b79565b1115611527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151e90613c1b565b60405180910390fd5b80600c54101561156c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156390613c87565b60405180910390fd5b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115b79190613b79565b600c5410156115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f290613cf3565b60405180910390fd5b600b54611606610999565b826116119190613b79565b1115801561165e57506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b156116c557600e54600e54826116749190613d13565b61167e9190613d6d565b3410156116c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b790613ded565b60405180910390fd5b611716565b80600e546116d39190613d13565b341015611715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170c90613e59565b60405180910390fd5b5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561177e573d6000803e3d6000fd5b5080601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117ce9190613b79565b925050819055506117df33826126bf565b50565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611872576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118699061392b565b60405180910390fd5b8060109080519060200190611888929190612dd5565b5050565b80600760006118996126dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119466126dd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161198b9190612f2c565b60405180910390a35050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611b68573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a0a57611a05858585856126e5565b611b75565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611a53929190613874565b602060405180830381865afa158015611a70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9491906138b2565b8015611b2657506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611ae4929190613874565b602060405180830381865afa158015611b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2591906138b2565b5b611b6757336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611b5e91906130a6565b60405180910390fd5b5b611b74858585856126e5565b5b5050505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be190613aed565b60405180910390fd5b611bf43382611115565b611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a90613ec5565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611c9b573d6000803e3d6000fd5b50611ca633836126bf565b5050565b6060611cb5826120ef565b611cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ceb90613f57565b60405180910390fd5b60001515600f60009054906101000a900460ff16151503611da15760108054611d1c90613843565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4890613843565b8015611d955780601f10611d6a57610100808354040283529160200191611d95565b820191906000526020600020905b815481529060010190602001808311611d7857829003601f168201915b50505050509050611dd5565b611da9612758565b611db2836127ea565b604051602001611dc3929190613fff565b60405160208183030381529060405290505b919050565b600a5481565b600d60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7a9061392b565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f369061392b565b60405180910390fd5b60005b8151811015611f8357611f70828281518110611f6157611f606139ae565b5b602002602001015160016126bf565b8080611f7b90613a59565b915050611f42565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a29061392b565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000816120fa61229e565b11158015612109575060005482105b8015612147575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600061215983610f89565b905081801561219b57508073ffffffffffffffffffffffffffffffffffffffff166121826126dd565b73ffffffffffffffffffffffffffffffffffffffff1614155b156121e8576121b1816121ac6126dd565b611f87565b6121e7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60006001905090565b60006122b2826125e9565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612319576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806123258461294a565b9150915061233b81876123366126dd565b612971565b612387576123508661234b6126dd565b611f87565b612386576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123ed576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123fa86868660016129b5565b801561240557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506124d3856124af8888876129bb565b7c0200000000000000000000000000000000000000000000000000000000176129e3565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036125595760006001850190506000600460008381526020019081526020016000205403612557576000548114612556578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125c18686866001612a0e565b505050505050565b6125e483838360405180602001604052806000815250611997565b505050565b600080829050806125f861229e565b1161267e5760005481101561267d5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361267b575b60008103612671576004600083600190039350838152602001908152602001600020549050612647565b80925050506126b0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b8060098190555050565b6126d9828260405180602001604052806000815250612a14565b5050565b600033905090565b6126f08484846109c8565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127525761271b84848484612ab1565b612751576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606011805461276790613843565b80601f016020809104026020016040519081016040528092919081815260200182805461279390613843565b80156127e05780601f106127b5576101008083540402835291602001916127e0565b820191906000526020600020905b8154815290600101906020018083116127c357829003601f168201915b5050505050905090565b606060008203612831576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612945565b600082905060005b6000821461286357808061284c90613a59565b915050600a8261285c919061405d565b9150612839565b60008167ffffffffffffffff81111561287f5761287e6131e1565b5b6040519080825280601f01601f1916602001820160405280156128b15781602001600182028036833780820191505090505b5090505b6000851461293e576001826128ca9190613d6d565b9150600a856128d9919061408e565b60306128e59190613b79565b60f81b8183815181106128fb576128fa6139ae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612937919061405d565b94506128b5565b8093505050505b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129d2868684612c01565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612a1e8383612c0a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612aac57600080549050600083820390505b612a5e6000868380600101945086612ab1565b612a94576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a4b578160005414612aa957600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ad76126dd565b8786866040518563ffffffff1660e01b8152600401612af99493929190614114565b6020604051808303816000875af1925050508015612b3557506040513d601f19601f82011682018060405250810190612b329190614175565b60015b612bae573d8060008114612b65576040519150601f19603f3d011682016040523d82523d6000602084013e612b6a565b606091505b506000815103612ba6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203612c4a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c5760008483856129b5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612cce83612cbf60008660006129bb565b612cc885612dc5565b176129e3565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612d6f57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612d34565b5060008203612daa576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612dc06000848385612a0e565b505050565b60006001821460e11b9050919050565b828054612de190613843565b90600052602060002090601f016020900481019282612e035760008555612e4a565b82601f10612e1c57805160ff1916838001178555612e4a565b82800160010185558215612e4a579182015b82811115612e49578251825591602001919060010190612e2e565b5b509050612e579190612e5b565b5090565b5b80821115612e74576000816000905550600101612e5c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ec181612e8c565b8114612ecc57600080fd5b50565b600081359050612ede81612eb8565b92915050565b600060208284031215612efa57612ef9612e82565b5b6000612f0884828501612ecf565b91505092915050565b60008115159050919050565b612f2681612f11565b82525050565b6000602082019050612f416000830184612f1d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f81578082015181840152602081019050612f66565b83811115612f90576000848401525b50505050565b6000601f19601f8301169050919050565b6000612fb282612f47565b612fbc8185612f52565b9350612fcc818560208601612f63565b612fd581612f96565b840191505092915050565b60006020820190508181036000830152612ffa8184612fa7565b905092915050565b6000819050919050565b61301581613002565b811461302057600080fd5b50565b6000813590506130328161300c565b92915050565b60006020828403121561304e5761304d612e82565b5b600061305c84828501613023565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061309082613065565b9050919050565b6130a081613085565b82525050565b60006020820190506130bb6000830184613097565b92915050565b6130ca81613085565b81146130d557600080fd5b50565b6000813590506130e7816130c1565b92915050565b6000806040838503121561310457613103612e82565b5b6000613112858286016130d8565b925050602061312385828601613023565b9150509250929050565b61313681613002565b82525050565b6000602082019050613151600083018461312d565b92915050565b60006020828403121561316d5761316c612e82565b5b600061317b848285016130d8565b91505092915050565b60008060006060848603121561319d5761319c612e82565b5b60006131ab868287016130d8565b93505060206131bc868287016130d8565b92505060406131cd86828701613023565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61321982612f96565b810181811067ffffffffffffffff82111715613238576132376131e1565b5b80604052505050565b600061324b612e78565b90506132578282613210565b919050565b600067ffffffffffffffff821115613277576132766131e1565b5b61328082612f96565b9050602081019050919050565b82818337600083830152505050565b60006132af6132aa8461325c565b613241565b9050828152602081018484840111156132cb576132ca6131dc565b5b6132d684828561328d565b509392505050565b600082601f8301126132f3576132f26131d7565b5b813561330384826020860161329c565b91505092915050565b60006020828403121561332257613321612e82565b5b600082013567ffffffffffffffff8111156133405761333f612e87565b5b61334c848285016132de565b91505092915050565b600067ffffffffffffffff8211156133705761336f6131e1565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61339981613386565b81146133a457600080fd5b50565b6000813590506133b681613390565b92915050565b60006133cf6133ca84613355565b613241565b905080838252602082019050602084028301858111156133f2576133f1613381565b5b835b8181101561341b578061340788826133a7565b8452602084019350506020810190506133f4565b5050509392505050565b600082601f83011261343a576134396131d7565b5b813561344a8482602086016133bc565b91505092915050565b6000806040838503121561346a57613469612e82565b5b6000613478858286016130d8565b925050602083013567ffffffffffffffff81111561349957613498612e87565b5b6134a585828601613425565b9150509250929050565b6000602082840312156134c5576134c4612e82565b5b60006134d3848285016133a7565b91505092915050565b6134e581612f11565b81146134f057600080fd5b50565b600081359050613502816134dc565b92915050565b6000806040838503121561351f5761351e612e82565b5b600061352d858286016130d8565b925050602061353e858286016134f3565b9150509250929050565b600067ffffffffffffffff821115613563576135626131e1565b5b61356c82612f96565b9050602081019050919050565b600061358c61358784613548565b613241565b9050828152602081018484840111156135a8576135a76131dc565b5b6135b384828561328d565b509392505050565b600082601f8301126135d0576135cf6131d7565b5b81356135e0848260208601613579565b91505092915050565b6000806000806080858703121561360357613602612e82565b5b6000613611878288016130d8565b9450506020613622878288016130d8565b935050604061363387828801613023565b925050606085013567ffffffffffffffff81111561365457613653612e87565b5b613660878288016135bb565b91505092959194509250565b6000806040838503121561368357613682612e82565b5b600061369185828601613023565b925050602083013567ffffffffffffffff8111156136b2576136b1612e87565b5b6136be85828601613425565b9150509250929050565b600067ffffffffffffffff8211156136e3576136e26131e1565b5b602082029050602081019050919050565b6000613707613702846136c8565b613241565b9050808382526020820190506020840283018581111561372a57613729613381565b5b835b81811015613753578061373f88826130d8565b84526020840193505060208101905061372c565b5050509392505050565b600082601f830112613772576137716131d7565b5b81356137828482602086016136f4565b91505092915050565b6000602082840312156137a1576137a0612e82565b5b600082013567ffffffffffffffff8111156137bf576137be612e87565b5b6137cb8482850161375d565b91505092915050565b600080604083850312156137eb576137ea612e82565b5b60006137f9858286016130d8565b925050602061380a858286016130d8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061385b57607f821691505b60208210810361386e5761386d613814565b5b50919050565b60006040820190506138896000830185613097565b6138966020830184613097565b9392505050565b6000815190506138ac816134dc565b92915050565b6000602082840312156138c8576138c7612e82565b5b60006138d68482850161389d565b91505092915050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b6000613915600a83612f52565b9150613920826138df565b602082019050919050565b6000602082019050818103600083015261394481613908565b9050919050565b60008160601b9050919050565b60006139638261394b565b9050919050565b600061397582613958565b9050919050565b61398d61398882613085565b61396a565b82525050565b600061399f828461397c565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6139f86139f382613386565b6139dd565b82525050565b6000613a0a82856139e7565b602082019150613a1a82846139e7565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a6482613002565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a9657613a95613a2a565b5b600182019050919050565b7f4e6f20736d61727420636f6e7472616374000000000000000000000000000000600082015250565b6000613ad7601183612f52565b9150613ae282613aa1565b602082019050919050565b60006020820190508181036000830152613b0681613aca565b9050919050565b7f53616c6520696e61637469766500000000000000000000000000000000000000600082015250565b6000613b43600d83612f52565b9150613b4e82613b0d565b602082019050919050565b60006020820190508181036000830152613b7281613b36565b9050919050565b6000613b8482613002565b9150613b8f83613002565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bc457613bc3613a2a565b5b828201905092915050565b7f4e6f206d6f7265204e4654730000000000000000000000000000000000000000600082015250565b6000613c05600c83612f52565b9150613c1082613bcf565b602082019050919050565b60006020820190508181036000830152613c3481613bf8565b9050919050565b7f457863656564206d617820706572207478000000000000000000000000000000600082015250565b6000613c71601183612f52565b9150613c7c82613c3b565b602082019050919050565b60006020820190508181036000830152613ca081613c64565b9050919050565b7f457863656564206d617820706572206164647265737300000000000000000000600082015250565b6000613cdd601683612f52565b9150613ce882613ca7565b602082019050919050565b60006020820190508181036000830152613d0c81613cd0565b9050919050565b6000613d1e82613002565b9150613d2983613002565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d6257613d61613a2a565b5b828202905092915050565b6000613d7882613002565b9150613d8383613002565b925082821015613d9657613d95613a2a565b5b828203905092915050565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b6000613dd7601583612f52565b9150613de282613da1565b602082019050919050565b60006020820190508181036000830152613e0681613dca565b9050919050565b7f56616c75652073656e74206973206e6f7420636f727265637400000000000000600082015250565b6000613e43601983612f52565b9150613e4e82613e0d565b602082019050919050565b60006020820190508181036000830152613e7281613e36565b9050919050565b7f596f7520617265206e6f74207465616d206d656d626572210000000000000000600082015250565b6000613eaf601883612f52565b9150613eba82613e79565b602082019050919050565b60006020820190508181036000830152613ede81613ea2565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613f41602f83612f52565b9150613f4c82613ee5565b604082019050919050565b60006020820190508181036000830152613f7081613f34565b9050919050565b600081905092915050565b6000613f8d82612f47565b613f978185613f77565b9350613fa7818560208601612f63565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613fe9600583613f77565b9150613ff482613fb3565b600582019050919050565b600061400b8285613f82565b91506140178284613f82565b915061402282613fdc565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061406882613002565b915061407383613002565b9250826140835761408261402e565b5b828204905092915050565b600061409982613002565b91506140a483613002565b9250826140b4576140b361402e565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006140e6826140bf565b6140f081856140ca565b9350614100818560208601612f63565b61410981612f96565b840191505092915050565b60006080820190506141296000830187613097565b6141366020830186613097565b614143604083018561312d565b818103606083015261415581846140db565b905095945050505050565b60008151905061416f81612eb8565b92915050565b60006020828403121561418b5761418a612e82565b5b600061419984828501614160565b9150509291505056fea264697066735822122091d214a14f3cd64ba6d26f97557eed05a8a60bb34915c76d464e826fd0bbafca64736f6c634300080d0033

Deployed Bytecode

0x6080604052600436106102045760003560e01c80637664531511610118578063b88d4fde116100a0578063d12397301161006f578063d123973014610715578063d3dd5fe014610740578063e45dee9a14610757578063e985e9c514610780578063f2fde38b146107bd57610204565b8063b88d4fde14610675578063b977fe5514610691578063c87b56dd146106ad578063ca69e323146106ea57610204565b806391b7f5ed116100e757806391b7f5ed146105b357806395d89b41146105dc578063a0712d6814610607578063a08c008b14610623578063a22cb4651461064c57610204565b8063766453151461050b5780637b47d0fd146105225780637cb647591461055f5780638da5cb5b1461058857610204565b8063475133341161019b57806355f804b31161016a57806355f804b3146104145780635b28fd911461043d5780636352211e146104665780636817c76c146104a357806370a08231146104ce57610204565b8063475133341461036a5780634d1555611461039557806351830227146103c0578063547520fe146103eb57610204565b806318160ddd116101d757806318160ddd146102ca5780631e7269c5146102f557806323b872dd1461033257806342842e0e1461034e57610204565b806301ffc9a71461020957806306fdde0314610246578063081812fc14610271578063095ea7b3146102ae575b600080fd5b34801561021557600080fd5b50610230600480360381019061022b9190612ee4565b6107e6565b60405161023d9190612f2c565b60405180910390f35b34801561025257600080fd5b5061025b610878565b6040516102689190612fe0565b60405180910390f35b34801561027d57600080fd5b5061029860048036038101906102939190613038565b61090a565b6040516102a591906130a6565b60405180910390f35b6102c860048036038101906102c391906130ed565b610989565b005b3480156102d657600080fd5b506102df610999565b6040516102ec919061313c565b60405180910390f35b34801561030157600080fd5b5061031c60048036038101906103179190613157565b6109b0565b604051610329919061313c565b60405180910390f35b61034c60048036038101906103479190613184565b6109c8565b005b61036860048036038101906103639190613184565b610baa565b005b34801561037657600080fd5b5061037f610d8c565b60405161038c919061313c565b60405180910390f35b3480156103a157600080fd5b506103aa610d92565b6040516103b7919061313c565b60405180910390f35b3480156103cc57600080fd5b506103d5610d98565b6040516103e29190612f2c565b60405180910390f35b3480156103f757600080fd5b50610412600480360381019061040d9190613038565b610dab565b005b34801561042057600080fd5b5061043b6004803603810190610436919061330c565b610e45565b005b34801561044957600080fd5b50610464600480360381019061045f9190613038565b610eef565b005b34801561047257600080fd5b5061048d60048036038101906104889190613038565b610f89565b60405161049a91906130a6565b60405180910390f35b3480156104af57600080fd5b506104b8610f9b565b6040516104c5919061313c565b60405180910390f35b3480156104da57600080fd5b506104f560048036038101906104f09190613157565b610fa1565b604051610502919061313c565b60405180910390f35b34801561051757600080fd5b50610520611059565b005b34801561052e57600080fd5b5061054960048036038101906105449190613453565b611115565b6040516105569190612f2c565b60405180910390f35b34801561056b57600080fd5b50610586600480360381019061058191906134af565b61121e565b005b34801561059457600080fd5b5061059d6112ba565b6040516105aa91906130a6565b60405180910390f35b3480156105bf57600080fd5b506105da60048036038101906105d59190613038565b6112e0565b005b3480156105e857600080fd5b506105f161137a565b6040516105fe9190612fe0565b60405180910390f35b610621600480360381019061061c9190613038565b61140c565b005b34801561062f57600080fd5b5061064a6004803603810190610645919061330c565b6117e2565b005b34801561065857600080fd5b50610673600480360381019061066e9190613508565b61188c565b005b61068f600480360381019061068a91906135e9565b611997565b005b6106ab60048036038101906106a6919061366c565b611b7c565b005b3480156106b957600080fd5b506106d460048036038101906106cf9190613038565b611caa565b6040516106e19190612fe0565b60405180910390f35b3480156106f657600080fd5b506106ff611dda565b60405161070c919061313c565b60405180910390f35b34801561072157600080fd5b5061072a611de0565b6040516107379190612f2c565b60405180910390f35b34801561074c57600080fd5b50610755611df3565b005b34801561076357600080fd5b5061077e6004803603810190610779919061378b565b611eaf565b005b34801561078c57600080fd5b506107a760048036038101906107a291906137d4565b611f87565b6040516107b49190612f2c565b60405180910390f35b3480156107c957600080fd5b506107e460048036038101906107df9190613157565b61201b565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061084157506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108715750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b60606002805461088790613843565b80601f01602080910402602001604051908101604052809291908181526020018280546108b390613843565b80156109005780601f106108d557610100808354040283529160200191610900565b820191906000526020600020905b8154815290600101906020018083116108e357829003601f168201915b5050505050905090565b6000610915826120ef565b61094b576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6109958282600161214e565b5050565b60006109a361229e565b6001546000540303905090565b60126020528060005260406000206000915090505481565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610b98573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610a3a57610a358484846122a7565b610ba4565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610a83929190613874565b602060405180830381865afa158015610aa0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ac491906138b2565b8015610b5657506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610b14929190613874565b602060405180830381865afa158015610b31573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610b5591906138b2565b5b610b9757336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610b8e91906130a6565b60405180910390fd5b5b610ba38484846122a7565b5b50505050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d7a573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610c1c57610c178484846125c9565b610d86565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610c65929190613874565b602060405180830381865afa158015610c82573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ca691906138b2565b8015610d3857506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610cf6929190613874565b602060405180830381865afa158015610d13573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d3791906138b2565b5b610d7957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d7091906130a6565b60405180910390fd5b5b610d858484846125c9565b5b50505050565b600b5481565b600c5481565b600f60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610e3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e329061392b565b60405180910390fd5b80600c8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610ed5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ecc9061392b565b60405180910390fd5b8060119080519060200190610eeb929190612dd5565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610f7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f769061392b565b60405180910390fd5b80600b8190555050565b6000610f94826125e9565b9050919050565b600e5481565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611008576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146110e9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110e09061392b565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b600080836040516020016111299190613993565b60405160208183030381529060405280519060200120905060005b835181101561120f578381815181106111605761115f6139ae565b5b602002602001015182106111b657838181518110611181576111806139ae565b5b60200260200101518260405160200161119b9291906139fe565b604051602081830303815290604052805190602001206111fa565b818482815181106111ca576111c96139ae565b5b60200260200101516040516020016111e39291906139fe565b604051602081830303815290604052805190602001205b9150808061120790613a59565b915050611144565b50600954811491505092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146112ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112a59061392b565b60405180910390fd5b6112b7816126b5565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611370576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113679061392b565b60405180910390fd5b80600e8190555050565b60606003805461138990613843565b80601f01602080910402602001604051908101604052809291908181526020018280546113b590613843565b80156114025780601f106113d757610100808354040283529160200191611402565b820191906000526020600020905b8154815290600101906020018083116113e557829003601f168201915b5050505050905090565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461147a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161147190613aed565b60405180910390fd5b60011515600d60009054906101000a900460ff161515146114d0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c790613b59565b60405180910390fd5b600a546114db610999565b826114e69190613b79565b1115611527576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151e90613c1b565b60405180910390fd5b80600c54101561156c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156390613c87565b60405180910390fd5b80601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115b79190613b79565b600c5410156115fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f290613cf3565b60405180910390fd5b600b54611606610999565b826116119190613b79565b1115801561165e57506000601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b156116c557600e54600e54826116749190613d13565b61167e9190613d6d565b3410156116c0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b790613ded565b60405180910390fd5b611716565b80600e546116d39190613d13565b341015611715576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161170c90613e59565b60405180910390fd5b5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f1935050505015801561177e573d6000803e3d6000fd5b5080601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117ce9190613b79565b925050819055506117df33826126bf565b50565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611872576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118699061392b565b60405180910390fd5b8060109080519060200190611888929190612dd5565b5050565b80600760006118996126dd565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166119466126dd565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161198b9190612f2c565b60405180910390a35050565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611b68573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a0a57611a05858585856126e5565b611b75565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401611a53929190613874565b602060405180830381865afa158015611a70573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a9491906138b2565b8015611b2657506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611ae4929190613874565b602060405180830381865afa158015611b01573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b2591906138b2565b5b611b6757336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611b5e91906130a6565b60405180910390fd5b5b611b74858585856126e5565b5b5050505050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611bea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611be190613aed565b60405180910390fd5b611bf43382611115565b611c33576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2a90613ec5565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611c9b573d6000803e3d6000fd5b50611ca633836126bf565b5050565b6060611cb5826120ef565b611cf4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ceb90613f57565b60405180910390fd5b60001515600f60009054906101000a900460ff16151503611da15760108054611d1c90613843565b80601f0160208091040260200160405190810160405280929190818152602001828054611d4890613843565b8015611d955780601f10611d6a57610100808354040283529160200191611d95565b820191906000526020600020905b815481529060010190602001808311611d7857829003601f168201915b50505050509050611dd5565b611da9612758565b611db2836127ea565b604051602001611dc3929190613fff565b60405160208183030381529060405290505b919050565b600a5481565b600d60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611e83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e7a9061392b565b60405180910390fd5b600d60009054906101000a900460ff1615600d60006101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611f3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f369061392b565b60405180910390fd5b60005b8151811015611f8357611f70828281518110611f6157611f606139ae565b5b602002602001015160016126bf565b8080611f7b90613a59565b915050611f42565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146120ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a29061392b565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6000816120fa61229e565b11158015612109575060005482105b8015612147575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600061215983610f89565b905081801561219b57508073ffffffffffffffffffffffffffffffffffffffff166121826126dd565b73ffffffffffffffffffffffffffffffffffffffff1614155b156121e8576121b1816121ac6126dd565b611f87565b6121e7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60006001905090565b60006122b2826125e9565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612319576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806123258461294a565b9150915061233b81876123366126dd565b612971565b612387576123508661234b6126dd565b611f87565b612386576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16036123ed576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123fa86868660016129b5565b801561240557600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506124d3856124af8888876129bb565b7c0200000000000000000000000000000000000000000000000000000000176129e3565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036125595760006001850190506000600460008381526020019081526020016000205403612557576000548114612556578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46125c18686866001612a0e565b505050505050565b6125e483838360405180602001604052806000815250611997565b505050565b600080829050806125f861229e565b1161267e5760005481101561267d5760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361267b575b60008103612671576004600083600190039350838152602001908152602001600020549050612647565b80925050506126b0565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b8060098190555050565b6126d9828260405180602001604052806000815250612a14565b5050565b600033905090565b6126f08484846109c8565b60008373ffffffffffffffffffffffffffffffffffffffff163b146127525761271b84848484612ab1565b612751576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60606011805461276790613843565b80601f016020809104026020016040519081016040528092919081815260200182805461279390613843565b80156127e05780601f106127b5576101008083540402835291602001916127e0565b820191906000526020600020905b8154815290600101906020018083116127c357829003601f168201915b5050505050905090565b606060008203612831576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612945565b600082905060005b6000821461286357808061284c90613a59565b915050600a8261285c919061405d565b9150612839565b60008167ffffffffffffffff81111561287f5761287e6131e1565b5b6040519080825280601f01601f1916602001820160405280156128b15781602001600182028036833780820191505090505b5090505b6000851461293e576001826128ca9190613d6d565b9150600a856128d9919061408e565b60306128e59190613b79565b60f81b8183815181106128fb576128fa6139ae565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612937919061405d565b94506128b5565b8093505050505b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e86129d2868684612c01565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612a1e8383612c0a565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612aac57600080549050600083820390505b612a5e6000868380600101945086612ab1565b612a94576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612a4b578160005414612aa957600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612ad76126dd565b8786866040518563ffffffff1660e01b8152600401612af99493929190614114565b6020604051808303816000875af1925050508015612b3557506040513d601f19601f82011682018060405250810190612b329190614175565b60015b612bae573d8060008114612b65576040519150601f19603f3d011682016040523d82523d6000602084013e612b6a565b606091505b506000815103612ba6576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b60008054905060008203612c4a576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612c5760008483856129b5565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612cce83612cbf60008660006129bb565b612cc885612dc5565b176129e3565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b818114612d6f57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600181019050612d34565b5060008203612daa576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b806000819055505050612dc06000848385612a0e565b505050565b60006001821460e11b9050919050565b828054612de190613843565b90600052602060002090601f016020900481019282612e035760008555612e4a565b82601f10612e1c57805160ff1916838001178555612e4a565b82800160010185558215612e4a579182015b82811115612e49578251825591602001919060010190612e2e565b5b509050612e579190612e5b565b5090565b5b80821115612e74576000816000905550600101612e5c565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612ec181612e8c565b8114612ecc57600080fd5b50565b600081359050612ede81612eb8565b92915050565b600060208284031215612efa57612ef9612e82565b5b6000612f0884828501612ecf565b91505092915050565b60008115159050919050565b612f2681612f11565b82525050565b6000602082019050612f416000830184612f1d565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612f81578082015181840152602081019050612f66565b83811115612f90576000848401525b50505050565b6000601f19601f8301169050919050565b6000612fb282612f47565b612fbc8185612f52565b9350612fcc818560208601612f63565b612fd581612f96565b840191505092915050565b60006020820190508181036000830152612ffa8184612fa7565b905092915050565b6000819050919050565b61301581613002565b811461302057600080fd5b50565b6000813590506130328161300c565b92915050565b60006020828403121561304e5761304d612e82565b5b600061305c84828501613023565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061309082613065565b9050919050565b6130a081613085565b82525050565b60006020820190506130bb6000830184613097565b92915050565b6130ca81613085565b81146130d557600080fd5b50565b6000813590506130e7816130c1565b92915050565b6000806040838503121561310457613103612e82565b5b6000613112858286016130d8565b925050602061312385828601613023565b9150509250929050565b61313681613002565b82525050565b6000602082019050613151600083018461312d565b92915050565b60006020828403121561316d5761316c612e82565b5b600061317b848285016130d8565b91505092915050565b60008060006060848603121561319d5761319c612e82565b5b60006131ab868287016130d8565b93505060206131bc868287016130d8565b92505060406131cd86828701613023565b9150509250925092565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61321982612f96565b810181811067ffffffffffffffff82111715613238576132376131e1565b5b80604052505050565b600061324b612e78565b90506132578282613210565b919050565b600067ffffffffffffffff821115613277576132766131e1565b5b61328082612f96565b9050602081019050919050565b82818337600083830152505050565b60006132af6132aa8461325c565b613241565b9050828152602081018484840111156132cb576132ca6131dc565b5b6132d684828561328d565b509392505050565b600082601f8301126132f3576132f26131d7565b5b813561330384826020860161329c565b91505092915050565b60006020828403121561332257613321612e82565b5b600082013567ffffffffffffffff8111156133405761333f612e87565b5b61334c848285016132de565b91505092915050565b600067ffffffffffffffff8211156133705761336f6131e1565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61339981613386565b81146133a457600080fd5b50565b6000813590506133b681613390565b92915050565b60006133cf6133ca84613355565b613241565b905080838252602082019050602084028301858111156133f2576133f1613381565b5b835b8181101561341b578061340788826133a7565b8452602084019350506020810190506133f4565b5050509392505050565b600082601f83011261343a576134396131d7565b5b813561344a8482602086016133bc565b91505092915050565b6000806040838503121561346a57613469612e82565b5b6000613478858286016130d8565b925050602083013567ffffffffffffffff81111561349957613498612e87565b5b6134a585828601613425565b9150509250929050565b6000602082840312156134c5576134c4612e82565b5b60006134d3848285016133a7565b91505092915050565b6134e581612f11565b81146134f057600080fd5b50565b600081359050613502816134dc565b92915050565b6000806040838503121561351f5761351e612e82565b5b600061352d858286016130d8565b925050602061353e858286016134f3565b9150509250929050565b600067ffffffffffffffff821115613563576135626131e1565b5b61356c82612f96565b9050602081019050919050565b600061358c61358784613548565b613241565b9050828152602081018484840111156135a8576135a76131dc565b5b6135b384828561328d565b509392505050565b600082601f8301126135d0576135cf6131d7565b5b81356135e0848260208601613579565b91505092915050565b6000806000806080858703121561360357613602612e82565b5b6000613611878288016130d8565b9450506020613622878288016130d8565b935050604061363387828801613023565b925050606085013567ffffffffffffffff81111561365457613653612e87565b5b613660878288016135bb565b91505092959194509250565b6000806040838503121561368357613682612e82565b5b600061369185828601613023565b925050602083013567ffffffffffffffff8111156136b2576136b1612e87565b5b6136be85828601613425565b9150509250929050565b600067ffffffffffffffff8211156136e3576136e26131e1565b5b602082029050602081019050919050565b6000613707613702846136c8565b613241565b9050808382526020820190506020840283018581111561372a57613729613381565b5b835b81811015613753578061373f88826130d8565b84526020840193505060208101905061372c565b5050509392505050565b600082601f830112613772576137716131d7565b5b81356137828482602086016136f4565b91505092915050565b6000602082840312156137a1576137a0612e82565b5b600082013567ffffffffffffffff8111156137bf576137be612e87565b5b6137cb8482850161375d565b91505092915050565b600080604083850312156137eb576137ea612e82565b5b60006137f9858286016130d8565b925050602061380a858286016130d8565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168061385b57607f821691505b60208210810361386e5761386d613814565b5b50919050565b60006040820190506138896000830185613097565b6138966020830184613097565b9392505050565b6000815190506138ac816134dc565b92915050565b6000602082840312156138c8576138c7612e82565b5b60006138d68482850161389d565b91505092915050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b6000613915600a83612f52565b9150613920826138df565b602082019050919050565b6000602082019050818103600083015261394481613908565b9050919050565b60008160601b9050919050565b60006139638261394b565b9050919050565b600061397582613958565b9050919050565b61398d61398882613085565b61396a565b82525050565b600061399f828461397c565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6139f86139f382613386565b6139dd565b82525050565b6000613a0a82856139e7565b602082019150613a1a82846139e7565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613a6482613002565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613a9657613a95613a2a565b5b600182019050919050565b7f4e6f20736d61727420636f6e7472616374000000000000000000000000000000600082015250565b6000613ad7601183612f52565b9150613ae282613aa1565b602082019050919050565b60006020820190508181036000830152613b0681613aca565b9050919050565b7f53616c6520696e61637469766500000000000000000000000000000000000000600082015250565b6000613b43600d83612f52565b9150613b4e82613b0d565b602082019050919050565b60006020820190508181036000830152613b7281613b36565b9050919050565b6000613b8482613002565b9150613b8f83613002565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613bc457613bc3613a2a565b5b828201905092915050565b7f4e6f206d6f7265204e4654730000000000000000000000000000000000000000600082015250565b6000613c05600c83612f52565b9150613c1082613bcf565b602082019050919050565b60006020820190508181036000830152613c3481613bf8565b9050919050565b7f457863656564206d617820706572207478000000000000000000000000000000600082015250565b6000613c71601183612f52565b9150613c7c82613c3b565b602082019050919050565b60006020820190508181036000830152613ca081613c64565b9050919050565b7f457863656564206d617820706572206164647265737300000000000000000000600082015250565b6000613cdd601683612f52565b9150613ce882613ca7565b602082019050919050565b60006020820190508181036000830152613d0c81613cd0565b9050919050565b6000613d1e82613002565b9150613d2983613002565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613d6257613d61613a2a565b5b828202905092915050565b6000613d7882613002565b9150613d8383613002565b925082821015613d9657613d95613a2a565b5b828203905092915050565b7f4e6f7420656e6f7567682065746865722073656e740000000000000000000000600082015250565b6000613dd7601583612f52565b9150613de282613da1565b602082019050919050565b60006020820190508181036000830152613e0681613dca565b9050919050565b7f56616c75652073656e74206973206e6f7420636f727265637400000000000000600082015250565b6000613e43601983612f52565b9150613e4e82613e0d565b602082019050919050565b60006020820190508181036000830152613e7281613e36565b9050919050565b7f596f7520617265206e6f74207465616d206d656d626572210000000000000000600082015250565b6000613eaf601883612f52565b9150613eba82613e79565b602082019050919050565b60006020820190508181036000830152613ede81613ea2565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613f41602f83612f52565b9150613f4c82613ee5565b604082019050919050565b60006020820190508181036000830152613f7081613f34565b9050919050565b600081905092915050565b6000613f8d82612f47565b613f978185613f77565b9350613fa7818560208601612f63565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b6000613fe9600583613f77565b9150613ff482613fb3565b600582019050919050565b600061400b8285613f82565b91506140178284613f82565b915061402282613fdc565b91508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061406882613002565b915061407383613002565b9250826140835761408261402e565b5b828204905092915050565b600061409982613002565b91506140a483613002565b9250826140b4576140b361402e565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006140e6826140bf565b6140f081856140ca565b9350614100818560208601612f63565b61410981612f96565b840191505092915050565b60006080820190506141296000830187613097565b6141366020830186613097565b614143604083018561312d565b818103606083015261415581846140db565b905095945050505050565b60008151905061416f81612eb8565b92915050565b60006020828403121561418b5761418a612e82565b5b600061419984828501614160565b9150509291505056fea264697066735822122091d214a14f3cd64ba6d26f97557eed05a8a60bb34915c76d464e826fd0bbafca64736f6c634300080d0033

Deployed Bytecode Sourcemap

58950:4183:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20193:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21095:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27058:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26775:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16846:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59370:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62271:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62657:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59067:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59110:27;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59274:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60778:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61420:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60982:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22488:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59227:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18030:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61229:77;;;;;;;;;;;;;:::i;:::-;;58545:398;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61112:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53968:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60880:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21271:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59622:766;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61314:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27616:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62885:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;60396:258;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61763:350;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59029:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59187;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60684:86;;;;;;;;;;;;;:::i;:::-;;62491:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28007:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54114:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20193:639;20278:4;20617:10;20602:25;;:11;:25;;;;:102;;;;20694:10;20679:25;;:11;:25;;;;20602:102;:179;;;;20771:10;20756:25;;:11;:25;;;;20602:179;20582:199;;20193:639;;;:::o;21095:100::-;21149:13;21182:5;21175:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21095:100;:::o;27058:218::-;27134:7;27159:16;27167:7;27159;:16::i;:::-;27154:64;;27184:34;;;;;;;;;;;;;;27154:64;27238:15;:24;27254:7;27238:24;;;;;;;;;;;:30;;;;;;;;;;;;27231:37;;27058:218;;;:::o;26775:124::-;26864:27;26873:2;26877:7;26886:4;26864:8;:27::i;:::-;26775:124;;:::o;16846:323::-;16907:7;17135:15;:13;:15::i;:::-;17120:12;;17104:13;;:28;:46;17097:53;;16846:323;:::o;59370:41::-;;;;;;;;;;;;;;;;;:::o;62271:212::-;62416:4;57684:1;56498:42;57638:43;;;:47;57634:699;;;57925:10;57917:18;;:4;:18;;;57913:85;;62438:37:::1;62457:4;62463:2;62467:7;62438:18;:37::i;:::-;57976:7:::0;;57913:85;56498:42;58058:40;;;58107:4;58114:10;58058:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;56498:42;58154:40;;;58203:4;58210;58154:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58058:157;58012:310;;58295:10;58276:30;;;;;;;;;;;:::i;:::-;;;;;;;;58012:310;57634:699;62438:37:::1;62457:4;62463:2;62467:7;62438:18;:37::i;:::-;62271:212:::0;;;;;:::o;62657:220::-;62806:4;57684:1;56498:42;57638:43;;;:47;57634:699;;;57925:10;57917:18;;:4;:18;;;57913:85;;62828:41:::1;62851:4;62857:2;62861:7;62828:22;:41::i;:::-;57976:7:::0;;57913:85;56498:42;58058:40;;;58107:4;58114:10;58058:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;56498:42;58154:40;;;58203:4;58210;58154:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58058:157;58012:310;;58295:10;58276:30;;;;;;;;;;;:::i;:::-;;;;;;;;58012:310;57634:699;62828:41:::1;62851:4;62857:2;62861:7;62828:22;:41::i;:::-;62657:220:::0;;;;;:::o;59067:36::-;;;;:::o;59110:27::-;;;;:::o;59274:20::-;;;;;;;;;;;;;:::o;60778:90::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;60854:6:::1;60844:7;:16;;;;60778:90:::0;:::o;61420:95::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61503:4:::1;61488:12;:19;;;;;;;;;;;;:::i;:::-;;61420:95:::0;:::o;60982:122::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61080:16:::1;61064:13;:32;;;;60982:122:::0;:::o;22488:152::-;22560:7;22603:27;22622:7;22603:18;:27::i;:::-;22580:52;;22488:152;;;:::o;59227:38::-;;;;:::o;18030:233::-;18102:7;18143:1;18126:19;;:5;:19;;;18122:60;;18154:28;;;;;;;;;;;;;;18122:60;12189:13;18200:18;:25;18219:5;18200:25;;;;;;;;;;;;;;;;:55;18193:62;;18030:233;;;:::o;61229:77::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61290:8:::1;;;;;;;;;;;61289:9;61278:8;;:20;;;;;;;;;;;;;;;;;;61229:77::o:0;58545:398::-;58625:4;58642:13;58685:8;58668:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;58658:37;;;;;;58642:53;;58711:9;58706:192;58730:6;:13;58726:1;:17;58706:192;;;58781:6;58788:1;58781:9;;;;;;;;:::i;:::-;;;;;;;;58773:5;:17;:113;;58868:6;58875:1;58868:9;;;;;;;;:::i;:::-;;;;;;;;58879:5;58851:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58841:45;;;;;;58773:113;;;58820:5;58827:6;58834:1;58827:9;;;;;;;;:::i;:::-;;;;;;;;58803:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58793:45;;;;;;58773:113;58765:121;;58745:3;;;;;:::i;:::-;;;;58706:192;;;;58924:11;;58915:5;:20;58908:27;;;58545:398;;;;:::o;61112:109::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61186:27:::1;61201:11;61186:14;:27::i;:::-;61112:109:::0;:::o;53968:20::-;;;;;;;;;;;;;:::o;60880:94::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;60958:8:::1;60946:9;:20;;;;60880:94:::0;:::o;21271:104::-;21327:13;21360:7;21353:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21271:104;:::o;59622:766::-;62194:9;62180:23;;:10;:23;;;62172:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;59714:4:::1;59699:19;;:11;;;;;;;;;;;:19;;;59691:45;;;;;;;;;;;;:::i;:::-;;;;;;;;;59782:8;;59765:13;:11;:13::i;:::-;59755:7;:23;;;;:::i;:::-;:35;;59747:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;59837:7;59826;;:18;;59818:48;;;;;;;;;;;;:::i;:::-;;;;;;;;;59917:7;59896:6;:18;59903:10;59896:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;59885:7;;:39;;59877:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;59996:13;;59979;:11;:13::i;:::-;59969:7;:23;;;;:::i;:::-;:40;;59968:71;;;;;60037:1;60015:6;:18;60022:10;60015:18;;;;;;;;;;;;;;;;:23;59968:71;59964:289;;;60102:9;;60089;;60079:7;:19;;;;:::i;:::-;60078:33;;;;:::i;:::-;60064:9;:48;;60056:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;59964:289;;;60204:7;60192:9;;:19;;;;:::i;:::-;60179:9;:32;;60171:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;59964:289;60273:5;;;;;;;;;;;60265:23;;:34;60289:9;60265:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60332:7;60310:6;:18;60317:10;60310:18;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;60350:30;60360:10;60372:7;60350:9;:30::i;:::-;59622:766:::0;:::o;61314:98::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61400:4:::1;61388:9;:16;;;;;;;;;;;;:::i;:::-;;61314:98:::0;:::o;27616:234::-;27763:8;27711:18;:39;27730:19;:17;:19::i;:::-;27711:39;;;;;;;;;;;;;;;:49;27751:8;27711:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;27823:8;27787:55;;27802:19;:17;:19::i;:::-;27787:55;;;27833:8;27787:55;;;;;;:::i;:::-;;;;;;;;27616:234;;:::o;62885:245::-;63053:4;57684:1;56498:42;57638:43;;;:47;57634:699;;;57925:10;57917:18;;:4;:18;;;57913:85;;63075:47:::1;63098:4;63104:2;63108:7;63117:4;63075:22;:47::i;:::-;57976:7:::0;;57913:85;56498:42;58058:40;;;58107:4;58114:10;58058:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:157;;;;;56498:42;58154:40;;;58203:4;58210;58154:61;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;58058:157;58012:310;;58295:10;58276:30;;;;;;;;;;;:::i;:::-;;;;;;;;58012:310;57634:699;63075:47:::1;63098:4;63104:2;63108:7;63117:4;63075:22;:47::i;:::-;62885:245:::0;;;;;;:::o;60396:258::-;62194:9;62180:23;;:10;:23;;;62172:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60505:26:::1;60512:10;60524:6;60505;:26::i;:::-;60497:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;60579:5;;;;;;;;;;;60571:23;;:34;60595:9;60571:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60616:30;60626:10;60638:7;60616:9;:30::i;:::-;60396:258:::0;;:::o;61763:350::-;61836:13;61870:16;61878:7;61870;:16::i;:::-;61862:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;61964:5;61952:17;;:8;;;;;;;;;;;:17;;;61949:61;;61989:9;61982:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61949:61;62051:16;:14;:16::i;:::-;62069:25;62086:7;62069:16;:25::i;:::-;62034:70;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62020:85;;61763:350;;;;:::o;59029:31::-;;;;:::o;59187:::-;;;;;;;;;;;;;:::o;60684:86::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;60751:11:::1;;;;;;;;;;;60750:12;60736:11;;:26;;;;;;;;;;;;;;;;;;60684:86::o:0;62491:158::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62565:6:::1;62560:82;62581:2;:9;62577:1;:13;62560:82;;;62611:19;62621:2;62624:1;62621:5;;;;;;;;:::i;:::-;;;;;;;;62628:1;62611:9;:19::i;:::-;62591:3;;;;;:::i;:::-;;;;62560:82;;;;62491:158:::0;:::o;28007:164::-;28104:4;28128:18;:25;28147:5;28128:25;;;;;;;;;;;;;;;:35;28154:8;28128:35;;;;;;;;;;;;;;;;;;;;;;;;;28121:42;;28007:164;;;;:::o;54114:77::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;54184:4:::1;54176:5;;:12;;;;;;;;;;;;;;;;;;54114:77:::0;:::o;28429:282::-;28494:4;28550:7;28531:15;:13;:15::i;:::-;:26;;:66;;;;;28584:13;;28574:7;:23;28531:66;:153;;;;;28683:1;12965:8;28635:17;:26;28653:7;28635:26;;;;;;;;;;;;:44;:49;28531:153;28511:173;;28429:282;;;:::o;45489:431::-;45584:13;45600:16;45608:7;45600;:16::i;:::-;45584:32;;45633:13;:45;;;;;45673:5;45650:28;;:19;:17;:19::i;:::-;:28;;;;45633:45;45629:192;;;45698:44;45715:5;45722:19;:17;:19::i;:::-;45698:16;:44::i;:::-;45693:128;;45770:35;;;;;;;;;;;;;;45693:128;45629:192;45866:2;45833:15;:24;45849:7;45833:24;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;45904:7;45900:2;45884:28;;45893:5;45884:28;;;;;;;;;;;;45573:347;45489:431;;;:::o;61546:101::-;61611:7;61638:1;61631:8;;61546:101;:::o;30697:2825::-;30839:27;30869;30888:7;30869:18;:27::i;:::-;30839:57;;30954:4;30913:45;;30929:19;30913:45;;;30909:86;;30967:28;;;;;;;;;;;;;;30909:86;31009:27;31038:23;31065:35;31092:7;31065:26;:35::i;:::-;31008:92;;;;31200:68;31225:15;31242:4;31248:19;:17;:19::i;:::-;31200:24;:68::i;:::-;31195:180;;31288:43;31305:4;31311:19;:17;:19::i;:::-;31288:16;:43::i;:::-;31283:92;;31340:35;;;;;;;;;;;;;;31283:92;31195:180;31406:1;31392:16;;:2;:16;;;31388:52;;31417:23;;;;;;;;;;;;;;31388:52;31453:43;31475:4;31481:2;31485:7;31494:1;31453:21;:43::i;:::-;31589:15;31586:160;;;31729:1;31708:19;31701:30;31586:160;32126:18;:24;32145:4;32126:24;;;;;;;;;;;;;;;;32124:26;;;;;;;;;;;;32195:18;:22;32214:2;32195:22;;;;;;;;;;;;;;;;32193:24;;;;;;;;;;;32517:146;32554:2;32603:45;32618:4;32624:2;32628:19;32603:14;:45::i;:::-;13245:8;32575:73;32517:18;:146::i;:::-;32488:17;:26;32506:7;32488:26;;;;;;;;;;;:175;;;;32834:1;13245:8;32783:19;:47;:52;32779:627;;32856:19;32888:1;32878:7;:11;32856:33;;33045:1;33011:17;:30;33029:11;33011:30;;;;;;;;;;;;:35;33007:384;;33149:13;;33134:11;:28;33130:242;;33329:19;33296:17;:30;33314:11;33296:30;;;;;;;;;;;:52;;;;33130:242;33007:384;32837:569;32779:627;33453:7;33449:2;33434:27;;33443:4;33434:27;;;;;;;;;;;;33472:42;33493:4;33499:2;33503:7;33512:1;33472:20;:42::i;:::-;30828:2694;;;30697:2825;;;:::o;33618:193::-;33764:39;33781:4;33787:2;33791:7;33764:39;;;;;;;;;;;;:16;:39::i;:::-;33618:193;;;:::o;23643:1275::-;23710:7;23730:12;23745:7;23730:22;;23813:4;23794:15;:13;:15::i;:::-;:23;23790:1061;;23847:13;;23840:4;:20;23836:1015;;;23885:14;23902:17;:23;23920:4;23902:23;;;;;;;;;;;;23885:40;;24019:1;12965:8;23991:6;:24;:29;23987:845;;24656:113;24673:1;24663:6;:11;24656:113;;24716:17;:25;24734:6;;;;;;;24716:25;;;;;;;;;;;;24707:34;;24656:113;;;24802:6;24795:13;;;;;;23987:845;23862:989;23836:1015;23790:1061;24879:31;;;;;;;;;;;;;;23643:1275;;;;:::o;58431:106::-;58518:11;58504;:25;;;;58431:106;:::o;44569:112::-;44646:27;44656:2;44660:8;44646:27;;;;;;;;;;;;:9;:27::i;:::-;44569:112;;:::o;51976:105::-;52036:7;52063:10;52056:17;;51976:105;:::o;34409:407::-;34584:31;34597:4;34603:2;34607:7;34584:12;:31::i;:::-;34648:1;34630:2;:14;;;:19;34626:183;;34669:56;34700:4;34706:2;34710:7;34719:5;34669:30;:56::i;:::-;34664:145;;34753:40;;;;;;;;;;;;;;34664:145;34626:183;34409:407;;;;:::o;61655:100::-;61703:13;61735:12;61728:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61655:100;:::o;258:723::-;314:13;544:1;535:5;:10;531:53;;562:10;;;;;;;;;;;;;;;;;;;;;531:53;594:12;609:5;594:20;;625:14;650:78;665:1;657:4;:9;650:78;;683:8;;;;;:::i;:::-;;;;714:2;706:10;;;;;:::i;:::-;;;650:78;;;738:19;770:6;760:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;738:39;;788:154;804:1;795:5;:10;788:154;;832:1;822:11;;;;;:::i;:::-;;;899:2;891:5;:10;;;;:::i;:::-;878:2;:24;;;;:::i;:::-;865:39;;848:6;855;848:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;928:2;919:11;;;;;:::i;:::-;;;788:154;;;966:6;952:21;;;;;258:723;;;;:::o;29592:485::-;29694:27;29723:23;29764:38;29805:15;:24;29821:7;29805:24;;;;;;;;;;;29764:65;;29982:18;29959:41;;30039:19;30033:26;30014:45;;29944:126;29592:485;;;:::o;28820:659::-;28969:11;29134:16;29127:5;29123:28;29114:37;;29294:16;29283:9;29279:32;29266:45;;29444:15;29433:9;29430:30;29422:5;29411:9;29408:20;29405:56;29395:66;;28820:659;;;;;:::o;35478:159::-;;;;;:::o;51285:311::-;51420:7;51440:16;13369:3;51466:19;:41;;51440:68;;13369:3;51534:31;51545:4;51551:2;51555:9;51534:10;:31::i;:::-;51526:40;;:62;;51519:69;;;51285:311;;;;;:::o;25466:450::-;25546:14;25714:16;25707:5;25703:28;25694:37;;25891:5;25877:11;25852:23;25848:41;25845:52;25838:5;25835:63;25825:73;;25466:450;;;;:::o;36302:158::-;;;;;:::o;43796:689::-;43927:19;43933:2;43937:8;43927:5;:19::i;:::-;44006:1;43988:2;:14;;;:19;43984:483;;44028:11;44042:13;;44028:27;;44074:13;44096:8;44090:3;:14;44074:30;;44123:233;44154:62;44193:1;44197:2;44201:7;;;;;;44210:5;44154:30;:62::i;:::-;44149:167;;44252:40;;;;;;;;;;;;;;44149:167;44351:3;44343:5;:11;44123:233;;44438:3;44421:13;;:20;44417:34;;44443:8;;;44417:34;44009:458;;43984:483;43796:689;;;:::o;36900:716::-;37063:4;37109:2;37084:45;;;37130:19;:17;:19::i;:::-;37151:4;37157:7;37166:5;37084:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;37080:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37384:1;37367:6;:13;:18;37363:235;;37413:40;;;;;;;;;;;;;;37363:235;37556:6;37550:13;37541:6;37537:2;37533:15;37526:38;37080:529;37253:54;;;37243:64;;;:6;:64;;;;37236:71;;;36900:716;;;;;;:::o;50986:147::-;51123:6;50986:147;;;;;:::o;38078:2966::-;38151:20;38174:13;;38151:36;;38214:1;38202:8;:13;38198:44;;38224:18;;;;;;;;;;;;;;38198:44;38255:61;38285:1;38289:2;38293:12;38307:8;38255:21;:61::i;:::-;38799:1;12327:2;38769:1;:26;;38768:32;38756:8;:45;38730:18;:22;38749:2;38730:22;;;;;;;;;;;;;;;;:71;;;;;;;;;;;39078:139;39115:2;39169:33;39192:1;39196:2;39200:1;39169:14;:33::i;:::-;39136:30;39157:8;39136:20;:30::i;:::-;:66;39078:18;:139::i;:::-;39044:17;:31;39062:12;39044:31;;;;;;;;;;;:173;;;;39234:16;39265:11;39294:8;39279:12;:23;39265:37;;39815:16;39811:2;39807:25;39795:37;;40187:12;40147:8;40106:1;40044:25;39985:1;39924;39897:335;40558:1;40544:12;40540:20;40498:346;40599:3;40590:7;40587:16;40498:346;;40817:7;40807:8;40804:1;40777:25;40774:1;40771;40766:59;40652:1;40643:7;40639:15;40628:26;;40498:346;;;40502:77;40889:1;40877:8;:13;40873:45;;40899:19;;;;;;;;;;;;;;40873:45;40951:3;40935:13;:19;;;;38504:2462;;40976:60;41005:1;41009:2;41013:12;41027:8;40976:20;:60::i;:::-;38140:2904;38078:2966;;:::o;26018:324::-;26088:14;26321:1;26311:8;26308:15;26282:24;26278:46;26268:56;;26018:324;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:329::-;5349:6;5398:2;5386:9;5377:7;5373:23;5369:32;5366:119;;;5404:79;;:::i;:::-;5366:119;5524:1;5549:53;5594:7;5585:6;5574:9;5570:22;5549:53;:::i;:::-;5539:63;;5495:117;5290:329;;;;:::o;5625:619::-;5702:6;5710;5718;5767:2;5755:9;5746:7;5742:23;5738:32;5735:119;;;5773:79;;:::i;:::-;5735:119;5893:1;5918:53;5963:7;5954:6;5943:9;5939:22;5918:53;:::i;:::-;5908:63;;5864:117;6020:2;6046:53;6091:7;6082:6;6071:9;6067:22;6046:53;:::i;:::-;6036:63;;5991:118;6148:2;6174:53;6219:7;6210:6;6199:9;6195:22;6174:53;:::i;:::-;6164:63;;6119:118;5625:619;;;;;:::o;6250:117::-;6359:1;6356;6349:12;6373:117;6482:1;6479;6472:12;6496:180;6544:77;6541:1;6534:88;6641:4;6638:1;6631:15;6665:4;6662:1;6655:15;6682:281;6765:27;6787:4;6765:27;:::i;:::-;6757:6;6753:40;6895:6;6883:10;6880:22;6859:18;6847:10;6844:34;6841:62;6838:88;;;6906:18;;:::i;:::-;6838:88;6946:10;6942:2;6935:22;6725:238;6682:281;;:::o;6969:129::-;7003:6;7030:20;;:::i;:::-;7020:30;;7059:33;7087:4;7079:6;7059:33;:::i;:::-;6969:129;;;:::o;7104:308::-;7166:4;7256:18;7248:6;7245:30;7242:56;;;7278:18;;:::i;:::-;7242:56;7316:29;7338:6;7316:29;:::i;:::-;7308:37;;7400:4;7394;7390:15;7382:23;;7104:308;;;:::o;7418:154::-;7502:6;7497:3;7492;7479:30;7564:1;7555:6;7550:3;7546:16;7539:27;7418:154;;;:::o;7578:412::-;7656:5;7681:66;7697:49;7739:6;7697:49;:::i;:::-;7681:66;:::i;:::-;7672:75;;7770:6;7763:5;7756:21;7808:4;7801:5;7797:16;7846:3;7837:6;7832:3;7828:16;7825:25;7822:112;;;7853:79;;:::i;:::-;7822:112;7943:41;7977:6;7972:3;7967;7943:41;:::i;:::-;7662:328;7578:412;;;;;:::o;8010:340::-;8066:5;8115:3;8108:4;8100:6;8096:17;8092:27;8082:122;;8123:79;;:::i;:::-;8082:122;8240:6;8227:20;8265:79;8340:3;8332:6;8325:4;8317:6;8313:17;8265:79;:::i;:::-;8256:88;;8072:278;8010:340;;;;:::o;8356:509::-;8425:6;8474:2;8462:9;8453:7;8449:23;8445:32;8442:119;;;8480:79;;:::i;:::-;8442:119;8628:1;8617:9;8613:17;8600:31;8658:18;8650:6;8647:30;8644:117;;;8680:79;;:::i;:::-;8644:117;8785:63;8840:7;8831:6;8820:9;8816:22;8785:63;:::i;:::-;8775:73;;8571:287;8356:509;;;;:::o;8871:311::-;8948:4;9038:18;9030:6;9027:30;9024:56;;;9060:18;;:::i;:::-;9024:56;9110:4;9102:6;9098:17;9090:25;;9170:4;9164;9160:15;9152:23;;8871:311;;;:::o;9188:117::-;9297:1;9294;9287:12;9311:77;9348:7;9377:5;9366:16;;9311:77;;;:::o;9394:122::-;9467:24;9485:5;9467:24;:::i;:::-;9460:5;9457:35;9447:63;;9506:1;9503;9496:12;9447:63;9394:122;:::o;9522:139::-;9568:5;9606:6;9593:20;9584:29;;9622:33;9649:5;9622:33;:::i;:::-;9522:139;;;;:::o;9684:710::-;9780:5;9805:81;9821:64;9878:6;9821:64;:::i;:::-;9805:81;:::i;:::-;9796:90;;9906:5;9935:6;9928:5;9921:21;9969:4;9962:5;9958:16;9951:23;;10022:4;10014:6;10010:17;10002:6;9998:30;10051:3;10043:6;10040:15;10037:122;;;10070:79;;:::i;:::-;10037:122;10185:6;10168:220;10202:6;10197:3;10194:15;10168:220;;;10277:3;10306:37;10339:3;10327:10;10306:37;:::i;:::-;10301:3;10294:50;10373:4;10368:3;10364:14;10357:21;;10244:144;10228:4;10223:3;10219:14;10212:21;;10168:220;;;10172:21;9786:608;;9684:710;;;;;:::o;10417:370::-;10488:5;10537:3;10530:4;10522:6;10518:17;10514:27;10504:122;;10545:79;;:::i;:::-;10504:122;10662:6;10649:20;10687:94;10777:3;10769:6;10762:4;10754:6;10750:17;10687:94;:::i;:::-;10678:103;;10494:293;10417:370;;;;:::o;10793:684::-;10886:6;10894;10943:2;10931:9;10922:7;10918:23;10914:32;10911:119;;;10949:79;;:::i;:::-;10911:119;11069:1;11094:53;11139:7;11130:6;11119:9;11115:22;11094:53;:::i;:::-;11084:63;;11040:117;11224:2;11213:9;11209:18;11196:32;11255:18;11247:6;11244:30;11241:117;;;11277:79;;:::i;:::-;11241:117;11382:78;11452:7;11443:6;11432:9;11428:22;11382:78;:::i;:::-;11372:88;;11167:303;10793:684;;;;;:::o;11483:329::-;11542:6;11591:2;11579:9;11570:7;11566:23;11562:32;11559:119;;;11597:79;;:::i;:::-;11559:119;11717:1;11742:53;11787:7;11778:6;11767:9;11763:22;11742:53;:::i;:::-;11732:63;;11688:117;11483:329;;;;:::o;11818:116::-;11888:21;11903:5;11888:21;:::i;:::-;11881:5;11878:32;11868:60;;11924:1;11921;11914:12;11868:60;11818:116;:::o;11940:133::-;11983:5;12021:6;12008:20;11999:29;;12037:30;12061:5;12037:30;:::i;:::-;11940:133;;;;:::o;12079:468::-;12144:6;12152;12201:2;12189:9;12180:7;12176:23;12172:32;12169:119;;;12207:79;;:::i;:::-;12169:119;12327:1;12352:53;12397:7;12388:6;12377:9;12373:22;12352:53;:::i;:::-;12342:63;;12298:117;12454:2;12480:50;12522:7;12513:6;12502:9;12498:22;12480:50;:::i;:::-;12470:60;;12425:115;12079:468;;;;;:::o;12553:307::-;12614:4;12704:18;12696:6;12693:30;12690:56;;;12726:18;;:::i;:::-;12690:56;12764:29;12786:6;12764:29;:::i;:::-;12756:37;;12848:4;12842;12838:15;12830:23;;12553:307;;;:::o;12866:410::-;12943:5;12968:65;12984:48;13025:6;12984:48;:::i;:::-;12968:65;:::i;:::-;12959:74;;13056:6;13049:5;13042:21;13094:4;13087:5;13083:16;13132:3;13123:6;13118:3;13114:16;13111:25;13108:112;;;13139:79;;:::i;:::-;13108:112;13229:41;13263:6;13258:3;13253;13229:41;:::i;:::-;12949:327;12866:410;;;;;:::o;13295:338::-;13350:5;13399:3;13392:4;13384:6;13380:17;13376:27;13366:122;;13407:79;;:::i;:::-;13366:122;13524:6;13511:20;13549:78;13623:3;13615:6;13608:4;13600:6;13596:17;13549:78;:::i;:::-;13540:87;;13356:277;13295:338;;;;:::o;13639:943::-;13734:6;13742;13750;13758;13807:3;13795:9;13786:7;13782:23;13778:33;13775:120;;;13814:79;;:::i;:::-;13775:120;13934:1;13959:53;14004:7;13995:6;13984:9;13980:22;13959:53;:::i;:::-;13949:63;;13905:117;14061:2;14087:53;14132:7;14123:6;14112:9;14108:22;14087:53;:::i;:::-;14077:63;;14032:118;14189:2;14215:53;14260:7;14251:6;14240:9;14236:22;14215:53;:::i;:::-;14205:63;;14160:118;14345:2;14334:9;14330:18;14317:32;14376:18;14368:6;14365:30;14362:117;;;14398:79;;:::i;:::-;14362:117;14503:62;14557:7;14548:6;14537:9;14533:22;14503:62;:::i;:::-;14493:72;;14288:287;13639:943;;;;;;;:::o;14588:684::-;14681:6;14689;14738:2;14726:9;14717:7;14713:23;14709:32;14706:119;;;14744:79;;:::i;:::-;14706:119;14864:1;14889:53;14934:7;14925:6;14914:9;14910:22;14889:53;:::i;:::-;14879:63;;14835:117;15019:2;15008:9;15004:18;14991:32;15050:18;15042:6;15039:30;15036:117;;;15072:79;;:::i;:::-;15036:117;15177:78;15247:7;15238:6;15227:9;15223:22;15177:78;:::i;:::-;15167:88;;14962:303;14588:684;;;;;:::o;15278:311::-;15355:4;15445:18;15437:6;15434:30;15431:56;;;15467:18;;:::i;:::-;15431:56;15517:4;15509:6;15505:17;15497:25;;15577:4;15571;15567:15;15559:23;;15278:311;;;:::o;15612:710::-;15708:5;15733:81;15749:64;15806:6;15749:64;:::i;:::-;15733:81;:::i;:::-;15724:90;;15834:5;15863:6;15856:5;15849:21;15897:4;15890:5;15886:16;15879:23;;15950:4;15942:6;15938:17;15930:6;15926:30;15979:3;15971:6;15968:15;15965:122;;;15998:79;;:::i;:::-;15965:122;16113:6;16096:220;16130:6;16125:3;16122:15;16096:220;;;16205:3;16234:37;16267:3;16255:10;16234:37;:::i;:::-;16229:3;16222:50;16301:4;16296:3;16292:14;16285:21;;16172:144;16156:4;16151:3;16147:14;16140:21;;16096:220;;;16100:21;15714:608;;15612:710;;;;;:::o;16345:370::-;16416:5;16465:3;16458:4;16450:6;16446:17;16442:27;16432:122;;16473:79;;:::i;:::-;16432:122;16590:6;16577:20;16615:94;16705:3;16697:6;16690:4;16682:6;16678:17;16615:94;:::i;:::-;16606:103;;16422:293;16345:370;;;;:::o;16721:539::-;16805:6;16854:2;16842:9;16833:7;16829:23;16825:32;16822:119;;;16860:79;;:::i;:::-;16822:119;17008:1;16997:9;16993:17;16980:31;17038:18;17030:6;17027:30;17024:117;;;17060:79;;:::i;:::-;17024:117;17165:78;17235:7;17226:6;17215:9;17211:22;17165:78;:::i;:::-;17155:88;;16951:302;16721:539;;;;:::o;17266:474::-;17334:6;17342;17391:2;17379:9;17370:7;17366:23;17362:32;17359:119;;;17397:79;;:::i;:::-;17359:119;17517:1;17542:53;17587:7;17578:6;17567:9;17563:22;17542:53;:::i;:::-;17532:63;;17488:117;17644:2;17670:53;17715:7;17706:6;17695:9;17691:22;17670:53;:::i;:::-;17660:63;;17615:118;17266:474;;;;;:::o;17746:180::-;17794:77;17791:1;17784:88;17891:4;17888:1;17881:15;17915:4;17912:1;17905:15;17932:320;17976:6;18013:1;18007:4;18003:12;17993:22;;18060:1;18054:4;18050:12;18081:18;18071:81;;18137:4;18129:6;18125:17;18115:27;;18071:81;18199:2;18191:6;18188:14;18168:18;18165:38;18162:84;;18218:18;;:::i;:::-;18162:84;17983:269;17932:320;;;:::o;18258:332::-;18379:4;18417:2;18406:9;18402:18;18394:26;;18430:71;18498:1;18487:9;18483:17;18474:6;18430:71;:::i;:::-;18511:72;18579:2;18568:9;18564:18;18555:6;18511:72;:::i;:::-;18258:332;;;;;:::o;18596:137::-;18650:5;18681:6;18675:13;18666:22;;18697:30;18721:5;18697:30;:::i;:::-;18596:137;;;;:::o;18739:345::-;18806:6;18855:2;18843:9;18834:7;18830:23;18826:32;18823:119;;;18861:79;;:::i;:::-;18823:119;18981:1;19006:61;19059:7;19050:6;19039:9;19035:22;19006:61;:::i;:::-;18996:71;;18952:125;18739:345;;;;:::o;19090:160::-;19230:12;19226:1;19218:6;19214:14;19207:36;19090:160;:::o;19256:366::-;19398:3;19419:67;19483:2;19478:3;19419:67;:::i;:::-;19412:74;;19495:93;19584:3;19495:93;:::i;:::-;19613:2;19608:3;19604:12;19597:19;;19256:366;;;:::o;19628:419::-;19794:4;19832:2;19821:9;19817:18;19809:26;;19881:9;19875:4;19871:20;19867:1;19856:9;19852:17;19845:47;19909:131;20035:4;19909:131;:::i;:::-;19901:139;;19628:419;;;:::o;20053:94::-;20086:8;20134:5;20130:2;20126:14;20105:35;;20053:94;;;:::o;20153:::-;20192:7;20221:20;20235:5;20221:20;:::i;:::-;20210:31;;20153:94;;;:::o;20253:100::-;20292:7;20321:26;20341:5;20321:26;:::i;:::-;20310:37;;20253:100;;;:::o;20359:157::-;20464:45;20484:24;20502:5;20484:24;:::i;:::-;20464:45;:::i;:::-;20459:3;20452:58;20359:157;;:::o;20522:256::-;20634:3;20649:75;20720:3;20711:6;20649:75;:::i;:::-;20749:2;20744:3;20740:12;20733:19;;20769:3;20762:10;;20522:256;;;;:::o;20784:180::-;20832:77;20829:1;20822:88;20929:4;20926:1;20919:15;20953:4;20950:1;20943:15;20970:79;21009:7;21038:5;21027:16;;20970:79;;;:::o;21055:157::-;21160:45;21180:24;21198:5;21180:24;:::i;:::-;21160:45;:::i;:::-;21155:3;21148:58;21055:157;;:::o;21218:397::-;21358:3;21373:75;21444:3;21435:6;21373:75;:::i;:::-;21473:2;21468:3;21464:12;21457:19;;21486:75;21557:3;21548:6;21486:75;:::i;:::-;21586:2;21581:3;21577:12;21570:19;;21606:3;21599:10;;21218:397;;;;;:::o;21621:180::-;21669:77;21666:1;21659:88;21766:4;21763:1;21756:15;21790:4;21787:1;21780:15;21807:233;21846:3;21869:24;21887:5;21869:24;:::i;:::-;21860:33;;21915:66;21908:5;21905:77;21902:103;;21985:18;;:::i;:::-;21902:103;22032:1;22025:5;22021:13;22014:20;;21807:233;;;:::o;22046:167::-;22186:19;22182:1;22174:6;22170:14;22163:43;22046:167;:::o;22219:366::-;22361:3;22382:67;22446:2;22441:3;22382:67;:::i;:::-;22375:74;;22458:93;22547:3;22458:93;:::i;:::-;22576:2;22571:3;22567:12;22560:19;;22219:366;;;:::o;22591:419::-;22757:4;22795:2;22784:9;22780:18;22772:26;;22844:9;22838:4;22834:20;22830:1;22819:9;22815:17;22808:47;22872:131;22998:4;22872:131;:::i;:::-;22864:139;;22591:419;;;:::o;23016:163::-;23156:15;23152:1;23144:6;23140:14;23133:39;23016:163;:::o;23185:366::-;23327:3;23348:67;23412:2;23407:3;23348:67;:::i;:::-;23341:74;;23424:93;23513:3;23424:93;:::i;:::-;23542:2;23537:3;23533:12;23526:19;;23185:366;;;:::o;23557:419::-;23723:4;23761:2;23750:9;23746:18;23738:26;;23810:9;23804:4;23800:20;23796:1;23785:9;23781:17;23774:47;23838:131;23964:4;23838:131;:::i;:::-;23830:139;;23557:419;;;:::o;23982:305::-;24022:3;24041:20;24059:1;24041:20;:::i;:::-;24036:25;;24075:20;24093:1;24075:20;:::i;:::-;24070:25;;24229:1;24161:66;24157:74;24154:1;24151:81;24148:107;;;24235:18;;:::i;:::-;24148:107;24279:1;24276;24272:9;24265:16;;23982:305;;;;:::o;24293:162::-;24433:14;24429:1;24421:6;24417:14;24410:38;24293:162;:::o;24461:366::-;24603:3;24624:67;24688:2;24683:3;24624:67;:::i;:::-;24617:74;;24700:93;24789:3;24700:93;:::i;:::-;24818:2;24813:3;24809:12;24802:19;;24461:366;;;:::o;24833:419::-;24999:4;25037:2;25026:9;25022:18;25014:26;;25086:9;25080:4;25076:20;25072:1;25061:9;25057:17;25050:47;25114:131;25240:4;25114:131;:::i;:::-;25106:139;;24833:419;;;:::o;25258:167::-;25398:19;25394:1;25386:6;25382:14;25375:43;25258:167;:::o;25431:366::-;25573:3;25594:67;25658:2;25653:3;25594:67;:::i;:::-;25587:74;;25670:93;25759:3;25670:93;:::i;:::-;25788:2;25783:3;25779:12;25772:19;;25431:366;;;:::o;25803:419::-;25969:4;26007:2;25996:9;25992:18;25984:26;;26056:9;26050:4;26046:20;26042:1;26031:9;26027:17;26020:47;26084:131;26210:4;26084:131;:::i;:::-;26076:139;;25803:419;;;:::o;26228:172::-;26368:24;26364:1;26356:6;26352:14;26345:48;26228:172;:::o;26406:366::-;26548:3;26569:67;26633:2;26628:3;26569:67;:::i;:::-;26562:74;;26645:93;26734:3;26645:93;:::i;:::-;26763:2;26758:3;26754:12;26747:19;;26406:366;;;:::o;26778:419::-;26944:4;26982:2;26971:9;26967:18;26959:26;;27031:9;27025:4;27021:20;27017:1;27006:9;27002:17;26995:47;27059:131;27185:4;27059:131;:::i;:::-;27051:139;;26778:419;;;:::o;27203:348::-;27243:7;27266:20;27284:1;27266:20;:::i;:::-;27261:25;;27300:20;27318:1;27300:20;:::i;:::-;27295:25;;27488:1;27420:66;27416:74;27413:1;27410:81;27405:1;27398:9;27391:17;27387:105;27384:131;;;27495:18;;:::i;:::-;27384:131;27543:1;27540;27536:9;27525:20;;27203:348;;;;:::o;27557:191::-;27597:4;27617:20;27635:1;27617:20;:::i;:::-;27612:25;;27651:20;27669:1;27651:20;:::i;:::-;27646:25;;27690:1;27687;27684:8;27681:34;;;27695:18;;:::i;:::-;27681:34;27740:1;27737;27733:9;27725:17;;27557:191;;;;:::o;27754:171::-;27894:23;27890:1;27882:6;27878:14;27871:47;27754:171;:::o;27931:366::-;28073:3;28094:67;28158:2;28153:3;28094:67;:::i;:::-;28087:74;;28170:93;28259:3;28170:93;:::i;:::-;28288:2;28283:3;28279:12;28272:19;;27931:366;;;:::o;28303:419::-;28469:4;28507:2;28496:9;28492:18;28484:26;;28556:9;28550:4;28546:20;28542:1;28531:9;28527:17;28520:47;28584:131;28710:4;28584:131;:::i;:::-;28576:139;;28303:419;;;:::o;28728:175::-;28868:27;28864:1;28856:6;28852:14;28845:51;28728:175;:::o;28909:366::-;29051:3;29072:67;29136:2;29131:3;29072:67;:::i;:::-;29065:74;;29148:93;29237:3;29148:93;:::i;:::-;29266:2;29261:3;29257:12;29250:19;;28909:366;;;:::o;29281:419::-;29447:4;29485:2;29474:9;29470:18;29462:26;;29534:9;29528:4;29524:20;29520:1;29509:9;29505:17;29498:47;29562:131;29688:4;29562:131;:::i;:::-;29554:139;;29281:419;;;:::o;29706:174::-;29846:26;29842:1;29834:6;29830:14;29823:50;29706:174;:::o;29886:366::-;30028:3;30049:67;30113:2;30108:3;30049:67;:::i;:::-;30042:74;;30125:93;30214:3;30125:93;:::i;:::-;30243:2;30238:3;30234:12;30227:19;;29886:366;;;:::o;30258:419::-;30424:4;30462:2;30451:9;30447:18;30439:26;;30511:9;30505:4;30501:20;30497:1;30486:9;30482:17;30475:47;30539:131;30665:4;30539:131;:::i;:::-;30531:139;;30258:419;;;:::o;30683:234::-;30823:34;30819:1;30811:6;30807:14;30800:58;30892:17;30887:2;30879:6;30875:15;30868:42;30683:234;:::o;30923:366::-;31065:3;31086:67;31150:2;31145:3;31086:67;:::i;:::-;31079:74;;31162:93;31251:3;31162:93;:::i;:::-;31280:2;31275:3;31271:12;31264:19;;30923:366;;;:::o;31295:419::-;31461:4;31499:2;31488:9;31484:18;31476:26;;31548:9;31542:4;31538:20;31534:1;31523:9;31519:17;31512:47;31576:131;31702:4;31576:131;:::i;:::-;31568:139;;31295:419;;;:::o;31720:148::-;31822:11;31859:3;31844:18;;31720:148;;;;:::o;31874:377::-;31980:3;32008:39;32041:5;32008:39;:::i;:::-;32063:89;32145:6;32140:3;32063:89;:::i;:::-;32056:96;;32161:52;32206:6;32201:3;32194:4;32187:5;32183:16;32161:52;:::i;:::-;32238:6;32233:3;32229:16;32222:23;;31984:267;31874:377;;;;:::o;32257:155::-;32397:7;32393:1;32385:6;32381:14;32374:31;32257:155;:::o;32418:400::-;32578:3;32599:84;32681:1;32676:3;32599:84;:::i;:::-;32592:91;;32692:93;32781:3;32692:93;:::i;:::-;32810:1;32805:3;32801:11;32794:18;;32418:400;;;:::o;32824:701::-;33105:3;33127:95;33218:3;33209:6;33127:95;:::i;:::-;33120:102;;33239:95;33330:3;33321:6;33239:95;:::i;:::-;33232:102;;33351:148;33495:3;33351:148;:::i;:::-;33344:155;;33516:3;33509:10;;32824:701;;;;;:::o;33531:180::-;33579:77;33576:1;33569:88;33676:4;33673:1;33666:15;33700:4;33697:1;33690:15;33717:185;33757:1;33774:20;33792:1;33774:20;:::i;:::-;33769:25;;33808:20;33826:1;33808:20;:::i;:::-;33803:25;;33847:1;33837:35;;33852:18;;:::i;:::-;33837:35;33894:1;33891;33887:9;33882:14;;33717:185;;;;:::o;33908:176::-;33940:1;33957:20;33975:1;33957:20;:::i;:::-;33952:25;;33991:20;34009:1;33991:20;:::i;:::-;33986:25;;34030:1;34020:35;;34035:18;;:::i;:::-;34020:35;34076:1;34073;34069:9;34064:14;;33908:176;;;;:::o;34090:98::-;34141:6;34175:5;34169:12;34159:22;;34090:98;;;:::o;34194:168::-;34277:11;34311:6;34306:3;34299:19;34351:4;34346:3;34342:14;34327:29;;34194:168;;;;:::o;34368:360::-;34454:3;34482:38;34514:5;34482:38;:::i;:::-;34536:70;34599:6;34594:3;34536:70;:::i;:::-;34529:77;;34615:52;34660:6;34655:3;34648:4;34641:5;34637:16;34615:52;:::i;:::-;34692:29;34714:6;34692:29;:::i;:::-;34687:3;34683:39;34676:46;;34458:270;34368:360;;;;:::o;34734:640::-;34929:4;34967:3;34956:9;34952:19;34944:27;;34981:71;35049:1;35038:9;35034:17;35025:6;34981:71;:::i;:::-;35062:72;35130:2;35119:9;35115:18;35106:6;35062:72;:::i;:::-;35144;35212:2;35201:9;35197:18;35188:6;35144:72;:::i;:::-;35263:9;35257:4;35253:20;35248:2;35237:9;35233:18;35226:48;35291:76;35362:4;35353:6;35291:76;:::i;:::-;35283:84;;34734:640;;;;;;;:::o;35380:141::-;35436:5;35467:6;35461:13;35452:22;;35483:32;35509:5;35483:32;:::i;:::-;35380:141;;;;:::o;35527:349::-;35596:6;35645:2;35633:9;35624:7;35620:23;35616:32;35613:119;;;35651:79;;:::i;:::-;35613:119;35771:1;35796:63;35851:7;35842:6;35831:9;35827:22;35796:63;:::i;:::-;35786:73;;35742:127;35527:349;;;;:::o

Swarm Source

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