ETH Price: $2,632.11 (-0.92%)

Token

Yes But (YB)
 

Overview

Max Total Supply

666 YB

Holders

329

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 YB
0xa91eee49d2fea98f0c8f364e416ba66345579f0f
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:
YesBut

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

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

// 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 isWhitelisted(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;
    }
}

/*
yes, i'm a crypto-expert, but where is my money?
*/

contract YesBut is ERC721A, Ownable, OperatorFilterer, MerkleProof {

    uint256 public constant maxToken = 5000;
    uint256 public mintMax = 4; //1 higher than the actual 

    uint8 public saleState = 0; //1-wl1 2-wl2 3-pub 4-close

    uint256 public wl1mintPrice = 0.01 ether;
    uint256 public pbmintPrice = 0.02 ether;

    bool public revealed;

    string private revealURI;
    string private baseTokenURI;
    string private baseTokenURI_EXT;

    mapping(address => uint256) private wl1Minted;
    mapping(address => uint256) private pbMinted;

    constructor() ERC721A("Yes But", "YB") OperatorFilterer(address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6), true) {
        sethiddenBaseURI("ipfs://bafybeieqedcao4ukh53jrncgy22ic7awthixz47a3xauh6k5avqlfihkfe/0.json");
    }

    //mint function

    function ownerMint(uint256 _amount, address _address) public onlyOwner { 
        require(_amount + totalSupply() <= maxToken, "No more NFTs");

        _safeMint(_address, _amount);
    }

    function wl1Mint(uint256 _amount, bytes32[] memory proof_) public payable onlySender { 
        require(saleState == 1, "Sale inactive");
        require(_amount + totalSupply() <= maxToken, "No more NFTs");
        require(mintMax > _amount, "You've reached max per tx");
        require(mintMax > wl1Minted[msg.sender] + _amount, "You've reached max per address");
        require(isWhitelisted(msg.sender, proof_), "You are not whitelisted!");
        require(msg.value == wl1mintPrice * _amount, "Value sent is not correct");
        payable(owner).transfer(msg.value);

        wl1Minted[msg.sender] += _amount;
        _safeMint(msg.sender, _amount);
    }


    function pbMint(uint256 _amount) public payable onlySender { 
        require(saleState == 2, "Sale inactive");
        require(_amount + totalSupply() <= maxToken, "No more NFTs");
        require(mintMax > _amount, "Exceed max per tx");
        require(mintMax > pbMinted[msg.sender] + _amount, "Exceed max per address");
        require(msg.value == pbmintPrice * _amount, "Value sent is not correct");
        payable(owner).transfer(msg.value);

        pbMinted[msg.sender] += _amount;
        _safeMint(msg.sender, _amount);
    }

    //owner function

    function flipSaleState(uint8 _state) external onlyOwner {
        saleState = _state;
    }

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

    function setPbPrice(uint256 newPrice) external onlyOwner {
        pbmintPrice = newPrice;
    }

    function setWlPrice(uint256 newWlPrice) external onlyOwner {
        wl1mintPrice = newWlPrice;
    }

    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_;
    }

    function setBaseTokenURI_EXT(string memory ext_) public onlyOwner {
        baseTokenURI_EXT = ext_;
    }

    function withdraw() public onlyOwner {
        uint256 sendAmount = address(this).balance;

        address aa = payable(0xC36ee0F2BfA61542659749B635ecc8F17Da2Daa3);

        bool success;

        (success, ) = aa.call{value: (sendAmount * 1000/1000)}("");
        require(success, "Failed to withdraw Ether");
    }

    //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), baseTokenURI_EXT));
    }

    //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 reserveBulk(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":"uint8","name":"_state","type":"uint8"}],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","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":"isWhitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxToken","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintMax","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":"_amount","type":"uint256"},{"internalType":"address","name":"_address","type":"address"}],"name":"ownerMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"pbMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"pbmintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"to","type":"address[]"}],"name":"reserveBulk","outputs":[],"stateMutability":"nonpayable","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":[],"name":"saleState","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","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":"ext_","type":"string"}],"name":"setBaseTokenURI_EXT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri_","type":"string"}],"name":"setBaseURI","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":"setPbPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setReveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newWlPrice","type":"uint256"}],"name":"setWlPrice","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":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"new_","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes32[]","name":"proof_","type":"bytes32[]"}],"name":"wl1Mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"wl1mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"}]

60806040526004600a556000600b60006101000a81548160ff021916908360ff160217905550662386f26fc10000600c5566470de4df820000600d553480156200004857600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb660016040518060400160405280600781526020017f59657320427574000000000000000000000000000000000000000000000000008152506040518060400160405280600281526020017f59420000000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000e492919062000436565b508060039080519060200190620000fd92919062000436565b506200010e6200037e60201b60201c565b600081905550505033600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200034c57801562000212576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620001d89291906200052b565b600060405180830381600087803b158015620001f357600080fd5b505af115801562000208573d6000803e3d6000fd5b505050506200034b565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620002cc576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620002929291906200052b565b600060405180830381600087803b158015620002ad57600080fd5b505af1158015620002c2573d6000803e3d6000fd5b505050506200034a565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b815260040162000315919062000558565b600060405180830381600087803b1580156200033057600080fd5b505af115801562000345573d6000803e3d6000fd5b505050505b5b5b50506200037860405180608001604052806049815260200162004f19604991396200038760201b60201c565b6200065c565b60006001905090565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146200041a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200041190620005d6565b60405180910390fd5b80600f90805190602001906200043292919062000436565b5050565b828054620004449062000627565b90600052602060002090601f016020900481019282620004685760008555620004b4565b82601f106200048357805160ff1916838001178555620004b4565b82800160010185558215620004b4579182015b82811115620004b357825182559160200191906001019062000496565b5b509050620004c39190620004c7565b5090565b5b80821115620004e2576000816000905550600101620004c8565b5090565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006200051382620004e6565b9050919050565b620005258162000506565b82525050565b60006040820190506200054260008301856200051a565b6200055160208301846200051a565b9392505050565b60006020820190506200056f60008301846200051a565b92915050565b600082825260208201905092915050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b6000620005be600a8362000575565b9150620005cb8262000586565b602082019050919050565b60006020820190508181036000830152620005f181620005af565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200064057607f821691505b602082108103620006565762000655620005f8565b5b50919050565b6148ad806200066c6000396000f3fe60806040526004361061021a5760003560e01c80637664531511610123578063b88d4fde116100ab578063d22b78d61161006f578063d22b78d614610773578063d52c57e01461078f578063e985e9c5146107b8578063f0e4ab7a146107f5578063f2fde38b146108115761021a565b8063b88d4fde1461069b578063bc9817f4146106b7578063be0469a9146106e0578063c87b56dd1461070b578063ca69e323146107485761021a565b80638dd07d0f116100f25780638dd07d0f146105ca57806395d89b41146105f3578063a08c008b1461061e578063a22cb46514610647578063a9e0d039146106705761021a565b806376645315146105365780637ba5b5fb1461054d5780637cb64759146105765780638da5cb5b1461059f5761021a565b806342842e0e116101a657806355f804b31161017557806355f804b31461042b5780635a23dd9914610454578063603f4d52146104915780636352211e146104bc57806370a08231146104f95761021a565b806342842e0e146103905780634d155561146103ac57806351830227146103d7578063547520fe146104025761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806312e7a1bf1461030957806318160ddd1461033257806323b872dd1461035d5780633ccfd60b146103795761021a565b806301ffc9a71461021f57806302ffaed11461025c57806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613381565b61083a565b60405161025391906133c9565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e919061352a565b6108cc565b005b34801561029157600080fd5b5061029a610976565b6040516102a791906135fb565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d29190613653565b610a08565b6040516102e491906136c1565b60405180910390f35b61030760048036038101906103029190613708565b610a87565b005b34801561031557600080fd5b50610330600480360381019061032b9190613781565b610a97565b005b34801561033e57600080fd5b50610347610b45565b60405161035491906137bd565b60405180910390f35b610377600480360381019061037291906137d8565b610b5c565b005b34801561038557600080fd5b5061038e610d3e565b005b6103aa60048036038101906103a591906137d8565b610eb7565b005b3480156103b857600080fd5b506103c1611099565b6040516103ce91906137bd565b60405180910390f35b3480156103e357600080fd5b506103ec61109f565b6040516103f991906133c9565b60405180910390f35b34801561040e57600080fd5b5061042960048036038101906104249190613653565b6110b2565b005b34801561043757600080fd5b50610452600480360381019061044d919061352a565b61114c565b005b34801561046057600080fd5b5061047b60048036038101906104769190613929565b6111f6565b60405161048891906133c9565b60405180910390f35b34801561049d57600080fd5b506104a66112ff565b6040516104b39190613994565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190613653565b611312565b6040516104f091906136c1565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b91906139af565b611324565b60405161052d91906137bd565b60405180910390f35b34801561054257600080fd5b5061054b6113dc565b005b34801561055957600080fd5b50610574600480360381019061056f9190613a9f565b611498565b005b34801561058257600080fd5b5061059d60048036038101906105989190613ae8565b611570565b005b3480156105ab57600080fd5b506105b461160c565b6040516105c191906136c1565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec9190613653565b611632565b005b3480156105ff57600080fd5b506106086116cc565b60405161061591906135fb565b60405180910390f35b34801561062a57600080fd5b506106456004803603810190610640919061352a565b61175e565b005b34801561065357600080fd5b5061066e60048036038101906106699190613b41565b611808565b005b34801561067c57600080fd5b50610685611913565b60405161069291906137bd565b60405180910390f35b6106b560048036038101906106b09190613c22565b611919565b005b3480156106c357600080fd5b506106de60048036038101906106d99190613653565b611afe565b005b3480156106ec57600080fd5b506106f5611b98565b60405161070291906137bd565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d9190613653565b611b9e565b60405161073f91906135fb565b60405180910390f35b34801561075457600080fd5b5061075d611cd1565b60405161076a91906137bd565b60405180910390f35b61078d60048036038101906107889190613653565b611cd7565b005b34801561079b57600080fd5b506107b660048036038101906107b19190613ca5565b611fde565b005b3480156107c457600080fd5b506107df60048036038101906107da9190613ce5565b6120d3565b6040516107ec91906133c9565b60405180910390f35b61080f600480360381019061080a9190613d25565b612167565b005b34801561081d57600080fd5b50610838600480360381019061083391906139af565b6124b8565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461095c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095390613dcd565b60405180910390fd5b8060119080519060200190610972929190613272565b5050565b60606002805461098590613e1c565b80601f01602080910402602001604051908101604052809291908181526020018280546109b190613e1c565b80156109fe5780601f106109d3576101008083540402835291602001916109fe565b820191906000526020600020905b8154815290600101906020018083116109e157829003601f168201915b5050505050905090565b6000610a138261258c565b610a49576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a93828260016125eb565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90613dcd565b60405180910390fd5b80600b60006101000a81548160ff021916908360ff16021790555050565b6000610b4f61273b565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d2c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bce57610bc9848484612744565b610d38565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610c17929190613e4d565b602060405180830381865afa158015610c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c589190613e8b565b8015610cea57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610ca8929190613e4d565b602060405180830381865afa158015610cc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce99190613e8b565b5b610d2b57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d2291906136c1565b60405180910390fd5b5b610d37848484612744565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc590613dcd565b60405180910390fd5b6000479050600073c36ee0f2bfa61542659749b635ecc8f17da2daa3905060008173ffffffffffffffffffffffffffffffffffffffff166103e88085610e149190613ee7565b610e1e9190613f70565b604051610e2a90613fd2565b60006040518083038185875af1925050503d8060008114610e67576040519150601f19603f3d011682016040523d82523d6000602084013e610e6c565b606091505b50508091505080610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea990614033565b60405180910390fd5b505050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611087573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f2957610f24848484612a66565b611093565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f72929190613e4d565b602060405180830381865afa158015610f8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb39190613e8b565b801561104557506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611003929190613e4d565b602060405180830381865afa158015611020573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110449190613e8b565b5b61108657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161107d91906136c1565b60405180910390fd5b5b611092848484612a66565b5b50505050565b600a5481565b600e60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113990613dcd565b60405180910390fd5b80600a8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390613dcd565b60405180910390fd5b80601090805190602001906111f2929190613272565b5050565b6000808360405160200161120a919061409b565b60405160208183030381529060405280519060200120905060005b83518110156112f057838181518110611241576112406140b6565b5b6020026020010151821061129757838181518110611262576112616140b6565b5b60200260200101518260405160200161127c929190614106565b604051602081830303815290604052805190602001206112db565b818482815181106112ab576112aa6140b6565b5b60200260200101516040516020016112c4929190614106565b604051602081830303815290604052805190602001205b915080806112e890614132565b915050611225565b50600954811491505092915050565b600b60009054906101000a900460ff1681565b600061131d82612a86565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361138b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461146c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146390613dcd565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f90613dcd565b60405180910390fd5b60005b815181101561156c5761155982828151811061154a576115496140b6565b5b60200260200101516001612b52565b808061156490614132565b91505061152b565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f790613dcd565b60405180910390fd5b61160981612b70565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b990613dcd565b60405180910390fd5b80600c8190555050565b6060600380546116db90613e1c565b80601f016020809104026020016040519081016040528092919081815260200182805461170790613e1c565b80156117545780601f1061172957610100808354040283529160200191611754565b820191906000526020600020905b81548152906001019060200180831161173757829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e590613dcd565b60405180910390fd5b80600f9080519060200190611804929190613272565b5050565b8060076000611815612b7a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118c2612b7a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161190791906133c9565b60405180910390a35050565b600d5481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611aea573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361198c5761198785858585612b82565b611af7565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016119d5929190613e4d565b602060405180830381865afa1580156119f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a169190613e8b565b8015611aa857506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611a66929190613e4d565b602060405180830381865afa158015611a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa79190613e8b565b5b611ae957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ae091906136c1565b60405180910390fd5b5b611af685858585612b82565b5b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8590613dcd565b60405180910390fd5b80600d8190555050565b600c5481565b6060611ba98261258c565b611be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdf906141ec565b60405180910390fd5b60001515600e60009054906101000a900460ff16151503611c9557600f8054611c1090613e1c565b80601f0160208091040260200160405190810160405280929190818152602001828054611c3c90613e1c565b8015611c895780601f10611c5e57610100808354040283529160200191611c89565b820191906000526020600020905b815481529060010190602001808311611c6c57829003601f168201915b50505050509050611ccc565b611c9d612bf5565b611ca683612c87565b6011604051602001611cba939291906142dc565b60405160208183030381529060405290505b919050565b61138881565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3c90614359565b60405180910390fd5b6002600b60009054906101000a900460ff1660ff1614611d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d91906143c5565b60405180910390fd5b611388611da5610b45565b82611db091906143e5565b1115611df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de890614487565b60405180910390fd5b80600a5411611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c906144f3565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e8091906143e5565b600a5411611ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eba9061455f565b60405180910390fd5b80600d54611ed19190613ee7565b3414611f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f09906145cb565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611f7a573d6000803e3d6000fd5b5080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fca91906143e5565b92505081905550611fdb3382612b52565b50565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461206e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206590613dcd565b60405180910390fd5b611388612079610b45565b8361208491906143e5565b11156120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90614487565b60405180910390fd5b6120cf8183612b52565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cc90614359565b60405180910390fd5b6001600b60009054906101000a900460ff1660ff161461222a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612221906143c5565b60405180910390fd5b611388612235610b45565b8361224091906143e5565b1115612281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227890614487565b60405180910390fd5b81600a54116122c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bc90614637565b60405180910390fd5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461231091906143e5565b600a5411612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234a906146a3565b60405180910390fd5b61235d33826111f6565b61239c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123939061470f565b60405180910390fd5b81600c546123aa9190613ee7565b34146123eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e2906145cb565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015612453573d6000803e3d6000fd5b5081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a391906143e5565b925050819055506124b43383612b52565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253f90613dcd565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008161259761273b565b111580156125a6575060005482105b80156125e4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006125f683611312565b905081801561263857508073ffffffffffffffffffffffffffffffffffffffff1661261f612b7a565b73ffffffffffffffffffffffffffffffffffffffff1614155b156126855761264e81612649612b7a565b6120d3565b612684576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60006001905090565b600061274f82612a86565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127b6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806127c284612de7565b915091506127d881876127d3612b7a565b612e0e565b612824576127ed866127e8612b7a565b6120d3565b612823576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361288a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128978686866001612e52565b80156128a257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506129708561294c888887612e58565b7c020000000000000000000000000000000000000000000000000000000017612e80565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036129f657600060018501905060006004600083815260200190815260200160002054036129f45760005481146129f3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a5e8686866001612eab565b505050505050565b612a8183838360405180602001604052806000815250611919565b505050565b60008082905080612a9561273b565b11612b1b57600054811015612b1a5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612b18575b60008103612b0e576004600083600190039350838152602001908152602001600020549050612ae4565b8092505050612b4d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b612b6c828260405180602001604052806000815250612eb1565b5050565b8060098190555050565b600033905090565b612b8d848484610b5c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612bef57612bb884848484612f4e565b612bee576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060108054612c0490613e1c565b80601f0160208091040260200160405190810160405280929190818152602001828054612c3090613e1c565b8015612c7d5780601f10612c5257610100808354040283529160200191612c7d565b820191906000526020600020905b815481529060010190602001808311612c6057829003601f168201915b5050505050905090565b606060008203612cce576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612de2565b600082905060005b60008214612d00578080612ce990614132565b915050600a82612cf99190613f70565b9150612cd6565b60008167ffffffffffffffff811115612d1c57612d1b6133ff565b5b6040519080825280601f01601f191660200182016040528015612d4e5781602001600182028036833780820191505090505b5090505b60008514612ddb57600182612d67919061472f565b9150600a85612d769190614763565b6030612d8291906143e5565b60f81b818381518110612d9857612d976140b6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612dd49190613f70565b9450612d52565b8093505050505b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612e6f86868461309e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612ebb83836130a7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f4957600080549050600083820390505b612efb6000868380600101945086612f4e565b612f31576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612ee8578160005414612f4657600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f74612b7a565b8786866040518563ffffffff1660e01b8152600401612f9694939291906147e9565b6020604051808303816000875af1925050508015612fd257506040513d601f19601f82011682018060405250810190612fcf919061484a565b60015b61304b573d8060008114613002576040519150601f19603f3d011682016040523d82523d6000602084013e613007565b606091505b506000815103613043576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b600080549050600082036130e7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130f46000848385612e52565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061316b8361315c6000866000612e58565b61316585613262565b17612e80565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461320c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506131d1565b5060008203613247576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061325d6000848385612eab565b505050565b60006001821460e11b9050919050565b82805461327e90613e1c565b90600052602060002090601f0160209004810192826132a057600085556132e7565b82601f106132b957805160ff19168380011785556132e7565b828001600101855582156132e7579182015b828111156132e65782518255916020019190600101906132cb565b5b5090506132f491906132f8565b5090565b5b808211156133115760008160009055506001016132f9565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61335e81613329565b811461336957600080fd5b50565b60008135905061337b81613355565b92915050565b6000602082840312156133975761339661331f565b5b60006133a58482850161336c565b91505092915050565b60008115159050919050565b6133c3816133ae565b82525050565b60006020820190506133de60008301846133ba565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613437826133ee565b810181811067ffffffffffffffff82111715613456576134556133ff565b5b80604052505050565b6000613469613315565b9050613475828261342e565b919050565b600067ffffffffffffffff821115613495576134946133ff565b5b61349e826133ee565b9050602081019050919050565b82818337600083830152505050565b60006134cd6134c88461347a565b61345f565b9050828152602081018484840111156134e9576134e86133e9565b5b6134f48482856134ab565b509392505050565b600082601f830112613511576135106133e4565b5b81356135218482602086016134ba565b91505092915050565b6000602082840312156135405761353f61331f565b5b600082013567ffffffffffffffff81111561355e5761355d613324565b5b61356a848285016134fc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135ad578082015181840152602081019050613592565b838111156135bc576000848401525b50505050565b60006135cd82613573565b6135d7818561357e565b93506135e781856020860161358f565b6135f0816133ee565b840191505092915050565b6000602082019050818103600083015261361581846135c2565b905092915050565b6000819050919050565b6136308161361d565b811461363b57600080fd5b50565b60008135905061364d81613627565b92915050565b6000602082840312156136695761366861331f565b5b60006136778482850161363e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136ab82613680565b9050919050565b6136bb816136a0565b82525050565b60006020820190506136d660008301846136b2565b92915050565b6136e5816136a0565b81146136f057600080fd5b50565b600081359050613702816136dc565b92915050565b6000806040838503121561371f5761371e61331f565b5b600061372d858286016136f3565b925050602061373e8582860161363e565b9150509250929050565b600060ff82169050919050565b61375e81613748565b811461376957600080fd5b50565b60008135905061377b81613755565b92915050565b6000602082840312156137975761379661331f565b5b60006137a58482850161376c565b91505092915050565b6137b78161361d565b82525050565b60006020820190506137d260008301846137ae565b92915050565b6000806000606084860312156137f1576137f061331f565b5b60006137ff868287016136f3565b9350506020613810868287016136f3565b92505060406138218682870161363e565b9150509250925092565b600067ffffffffffffffff821115613846576138456133ff565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61386f8161385c565b811461387a57600080fd5b50565b60008135905061388c81613866565b92915050565b60006138a56138a08461382b565b61345f565b905080838252602082019050602084028301858111156138c8576138c7613857565b5b835b818110156138f157806138dd888261387d565b8452602084019350506020810190506138ca565b5050509392505050565b600082601f8301126139105761390f6133e4565b5b8135613920848260208601613892565b91505092915050565b600080604083850312156139405761393f61331f565b5b600061394e858286016136f3565b925050602083013567ffffffffffffffff81111561396f5761396e613324565b5b61397b858286016138fb565b9150509250929050565b61398e81613748565b82525050565b60006020820190506139a96000830184613985565b92915050565b6000602082840312156139c5576139c461331f565b5b60006139d3848285016136f3565b91505092915050565b600067ffffffffffffffff8211156139f7576139f66133ff565b5b602082029050602081019050919050565b6000613a1b613a16846139dc565b61345f565b90508083825260208201905060208402830185811115613a3e57613a3d613857565b5b835b81811015613a675780613a5388826136f3565b845260208401935050602081019050613a40565b5050509392505050565b600082601f830112613a8657613a856133e4565b5b8135613a96848260208601613a08565b91505092915050565b600060208284031215613ab557613ab461331f565b5b600082013567ffffffffffffffff811115613ad357613ad2613324565b5b613adf84828501613a71565b91505092915050565b600060208284031215613afe57613afd61331f565b5b6000613b0c8482850161387d565b91505092915050565b613b1e816133ae565b8114613b2957600080fd5b50565b600081359050613b3b81613b15565b92915050565b60008060408385031215613b5857613b5761331f565b5b6000613b66858286016136f3565b9250506020613b7785828601613b2c565b9150509250929050565b600067ffffffffffffffff821115613b9c57613b9b6133ff565b5b613ba5826133ee565b9050602081019050919050565b6000613bc5613bc084613b81565b61345f565b905082815260208101848484011115613be157613be06133e9565b5b613bec8482856134ab565b509392505050565b600082601f830112613c0957613c086133e4565b5b8135613c19848260208601613bb2565b91505092915050565b60008060008060808587031215613c3c57613c3b61331f565b5b6000613c4a878288016136f3565b9450506020613c5b878288016136f3565b9350506040613c6c8782880161363e565b925050606085013567ffffffffffffffff811115613c8d57613c8c613324565b5b613c9987828801613bf4565b91505092959194509250565b60008060408385031215613cbc57613cbb61331f565b5b6000613cca8582860161363e565b9250506020613cdb858286016136f3565b9150509250929050565b60008060408385031215613cfc57613cfb61331f565b5b6000613d0a858286016136f3565b9250506020613d1b858286016136f3565b9150509250929050565b60008060408385031215613d3c57613d3b61331f565b5b6000613d4a8582860161363e565b925050602083013567ffffffffffffffff811115613d6b57613d6a613324565b5b613d77858286016138fb565b9150509250929050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b6000613db7600a8361357e565b9150613dc282613d81565b602082019050919050565b60006020820190508181036000830152613de681613daa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e3457607f821691505b602082108103613e4757613e46613ded565b5b50919050565b6000604082019050613e6260008301856136b2565b613e6f60208301846136b2565b9392505050565b600081519050613e8581613b15565b92915050565b600060208284031215613ea157613ea061331f565b5b6000613eaf84828501613e76565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ef28261361d565b9150613efd8361361d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f3657613f35613eb8565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f7b8261361d565b9150613f868361361d565b925082613f9657613f95613f41565b5b828204905092915050565b600081905092915050565b50565b6000613fbc600083613fa1565b9150613fc782613fac565b600082019050919050565b6000613fdd82613faf565b9150819050919050565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b600061401d60188361357e565b915061402882613fe7565b602082019050919050565b6000602082019050818103600083015261404c81614010565b9050919050565b60008160601b9050919050565b600061406b82614053565b9050919050565b600061407d82614060565b9050919050565b614095614090826136a0565b614072565b82525050565b60006140a78284614084565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6141006140fb8261385c565b6140e5565b82525050565b600061411282856140ef565b60208201915061412282846140ef565b6020820191508190509392505050565b600061413d8261361d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361416f5761416e613eb8565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006141d6602f8361357e565b91506141e18261417a565b604082019050919050565b60006020820190508181036000830152614205816141c9565b9050919050565b600081905092915050565b600061422282613573565b61422c818561420c565b935061423c81856020860161358f565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461426a81613e1c565b614274818661420c565b9450600182166000811461428f57600181146142a0576142d3565b60ff198316865281860193506142d3565b6142a985614248565b60005b838110156142cb578154818901526001820191506020810190506142ac565b838801955050505b50505092915050565b60006142e88286614217565b91506142f48285614217565b9150614300828461425d565b9150819050949350505050565b7f4e6f20736d61727420636f6e7472616374000000000000000000000000000000600082015250565b600061434360118361357e565b915061434e8261430d565b602082019050919050565b6000602082019050818103600083015261437281614336565b9050919050565b7f53616c6520696e61637469766500000000000000000000000000000000000000600082015250565b60006143af600d8361357e565b91506143ba82614379565b602082019050919050565b600060208201905081810360008301526143de816143a2565b9050919050565b60006143f08261361d565b91506143fb8361361d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144305761442f613eb8565b5b828201905092915050565b7f4e6f206d6f7265204e4654730000000000000000000000000000000000000000600082015250565b6000614471600c8361357e565b915061447c8261443b565b602082019050919050565b600060208201905081810360008301526144a081614464565b9050919050565b7f457863656564206d617820706572207478000000000000000000000000000000600082015250565b60006144dd60118361357e565b91506144e8826144a7565b602082019050919050565b6000602082019050818103600083015261450c816144d0565b9050919050565b7f457863656564206d617820706572206164647265737300000000000000000000600082015250565b600061454960168361357e565b915061455482614513565b602082019050919050565b600060208201905081810360008301526145788161453c565b9050919050565b7f56616c75652073656e74206973206e6f7420636f727265637400000000000000600082015250565b60006145b560198361357e565b91506145c08261457f565b602082019050919050565b600060208201905081810360008301526145e4816145a8565b9050919050565b7f596f752776652072656163686564206d61782070657220747800000000000000600082015250565b600061462160198361357e565b915061462c826145eb565b602082019050919050565b6000602082019050818103600083015261465081614614565b9050919050565b7f596f752776652072656163686564206d61782070657220616464726573730000600082015250565b600061468d601e8361357e565b915061469882614657565b602082019050919050565b600060208201905081810360008301526146bc81614680565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564210000000000000000600082015250565b60006146f960188361357e565b9150614704826146c3565b602082019050919050565b60006020820190508181036000830152614728816146ec565b9050919050565b600061473a8261361d565b91506147458361361d565b92508282101561475857614757613eb8565b5b828203905092915050565b600061476e8261361d565b91506147798361361d565b92508261478957614788613f41565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006147bb82614794565b6147c5818561479f565b93506147d581856020860161358f565b6147de816133ee565b840191505092915050565b60006080820190506147fe60008301876136b2565b61480b60208301866136b2565b61481860408301856137ae565b818103606083015261482a81846147b0565b905095945050505050565b60008151905061484481613355565b92915050565b6000602082840312156148605761485f61331f565b5b600061486e84828501614835565b9150509291505056fea2646970667358221220264d767596f1f638db7fdbf610dd3a962f1cd80d207200bffe577bf5fb1cdbbe64736f6c634300080d0033697066733a2f2f626166796265696571656463616f34756b6835336a726e63677932326963376177746869787a3437613378617568366b356176716c6669686b66652f302e6a736f6e

Deployed Bytecode

0x60806040526004361061021a5760003560e01c80637664531511610123578063b88d4fde116100ab578063d22b78d61161006f578063d22b78d614610773578063d52c57e01461078f578063e985e9c5146107b8578063f0e4ab7a146107f5578063f2fde38b146108115761021a565b8063b88d4fde1461069b578063bc9817f4146106b7578063be0469a9146106e0578063c87b56dd1461070b578063ca69e323146107485761021a565b80638dd07d0f116100f25780638dd07d0f146105ca57806395d89b41146105f3578063a08c008b1461061e578063a22cb46514610647578063a9e0d039146106705761021a565b806376645315146105365780637ba5b5fb1461054d5780637cb64759146105765780638da5cb5b1461059f5761021a565b806342842e0e116101a657806355f804b31161017557806355f804b31461042b5780635a23dd9914610454578063603f4d52146104915780636352211e146104bc57806370a08231146104f95761021a565b806342842e0e146103905780634d155561146103ac57806351830227146103d7578063547520fe146104025761021a565b8063095ea7b3116101ed578063095ea7b3146102ed57806312e7a1bf1461030957806318160ddd1461033257806323b872dd1461035d5780633ccfd60b146103795761021a565b806301ffc9a71461021f57806302ffaed11461025c57806306fdde0314610285578063081812fc146102b0575b600080fd5b34801561022b57600080fd5b5061024660048036038101906102419190613381565b61083a565b60405161025391906133c9565b60405180910390f35b34801561026857600080fd5b50610283600480360381019061027e919061352a565b6108cc565b005b34801561029157600080fd5b5061029a610976565b6040516102a791906135fb565b60405180910390f35b3480156102bc57600080fd5b506102d760048036038101906102d29190613653565b610a08565b6040516102e491906136c1565b60405180910390f35b61030760048036038101906103029190613708565b610a87565b005b34801561031557600080fd5b50610330600480360381019061032b9190613781565b610a97565b005b34801561033e57600080fd5b50610347610b45565b60405161035491906137bd565b60405180910390f35b610377600480360381019061037291906137d8565b610b5c565b005b34801561038557600080fd5b5061038e610d3e565b005b6103aa60048036038101906103a591906137d8565b610eb7565b005b3480156103b857600080fd5b506103c1611099565b6040516103ce91906137bd565b60405180910390f35b3480156103e357600080fd5b506103ec61109f565b6040516103f991906133c9565b60405180910390f35b34801561040e57600080fd5b5061042960048036038101906104249190613653565b6110b2565b005b34801561043757600080fd5b50610452600480360381019061044d919061352a565b61114c565b005b34801561046057600080fd5b5061047b60048036038101906104769190613929565b6111f6565b60405161048891906133c9565b60405180910390f35b34801561049d57600080fd5b506104a66112ff565b6040516104b39190613994565b60405180910390f35b3480156104c857600080fd5b506104e360048036038101906104de9190613653565b611312565b6040516104f091906136c1565b60405180910390f35b34801561050557600080fd5b50610520600480360381019061051b91906139af565b611324565b60405161052d91906137bd565b60405180910390f35b34801561054257600080fd5b5061054b6113dc565b005b34801561055957600080fd5b50610574600480360381019061056f9190613a9f565b611498565b005b34801561058257600080fd5b5061059d60048036038101906105989190613ae8565b611570565b005b3480156105ab57600080fd5b506105b461160c565b6040516105c191906136c1565b60405180910390f35b3480156105d657600080fd5b506105f160048036038101906105ec9190613653565b611632565b005b3480156105ff57600080fd5b506106086116cc565b60405161061591906135fb565b60405180910390f35b34801561062a57600080fd5b506106456004803603810190610640919061352a565b61175e565b005b34801561065357600080fd5b5061066e60048036038101906106699190613b41565b611808565b005b34801561067c57600080fd5b50610685611913565b60405161069291906137bd565b60405180910390f35b6106b560048036038101906106b09190613c22565b611919565b005b3480156106c357600080fd5b506106de60048036038101906106d99190613653565b611afe565b005b3480156106ec57600080fd5b506106f5611b98565b60405161070291906137bd565b60405180910390f35b34801561071757600080fd5b50610732600480360381019061072d9190613653565b611b9e565b60405161073f91906135fb565b60405180910390f35b34801561075457600080fd5b5061075d611cd1565b60405161076a91906137bd565b60405180910390f35b61078d60048036038101906107889190613653565b611cd7565b005b34801561079b57600080fd5b506107b660048036038101906107b19190613ca5565b611fde565b005b3480156107c457600080fd5b506107df60048036038101906107da9190613ce5565b6120d3565b6040516107ec91906133c9565b60405180910390f35b61080f600480360381019061080a9190613d25565b612167565b005b34801561081d57600080fd5b50610838600480360381019061083391906139af565b6124b8565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061089557506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806108c55750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461095c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095390613dcd565b60405180910390fd5b8060119080519060200190610972929190613272565b5050565b60606002805461098590613e1c565b80601f01602080910402602001604051908101604052809291908181526020018280546109b190613e1c565b80156109fe5780601f106109d3576101008083540402835291602001916109fe565b820191906000526020600020905b8154815290600101906020018083116109e157829003601f168201915b5050505050905090565b6000610a138261258c565b610a49576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b610a93828260016125eb565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610b27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1e90613dcd565b60405180910390fd5b80600b60006101000a81548160ff021916908360ff16021790555050565b6000610b4f61273b565b6001546000540303905090565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115610d2c573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bce57610bc9848484612744565b610d38565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610c17929190613e4d565b602060405180830381865afa158015610c34573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610c589190613e8b565b8015610cea57506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401610ca8929190613e4d565b602060405180830381865afa158015610cc5573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ce99190613e8b565b5b610d2b57336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401610d2291906136c1565b60405180910390fd5b5b610d37848484612744565b5b50505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614610dce576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc590613dcd565b60405180910390fd5b6000479050600073c36ee0f2bfa61542659749b635ecc8f17da2daa3905060008173ffffffffffffffffffffffffffffffffffffffff166103e88085610e149190613ee7565b610e1e9190613f70565b604051610e2a90613fd2565b60006040518083038185875af1925050503d8060008114610e67576040519150601f19603f3d011682016040523d82523d6000602084013e610e6c565b606091505b50508091505080610eb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea990614033565b60405180910390fd5b505050565b8260006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611087573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f2957610f24848484612a66565b611093565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b8152600401610f72929190613e4d565b602060405180830381865afa158015610f8f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610fb39190613e8b565b801561104557506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611003929190613e4d565b602060405180830381865afa158015611020573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906110449190613e8b565b5b61108657336040517fede71dcc00000000000000000000000000000000000000000000000000000000815260040161107d91906136c1565b60405180910390fd5b5b611092848484612a66565b5b50505050565b600a5481565b600e60009054906101000a900460ff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611142576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113990613dcd565b60405180910390fd5b80600a8190555050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146111dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d390613dcd565b60405180910390fd5b80601090805190602001906111f2929190613272565b5050565b6000808360405160200161120a919061409b565b60405160208183030381529060405280519060200120905060005b83518110156112f057838181518110611241576112406140b6565b5b6020026020010151821061129757838181518110611262576112616140b6565b5b60200260200101518260405160200161127c929190614106565b604051602081830303815290604052805190602001206112db565b818482815181106112ab576112aa6140b6565b5b60200260200101516040516020016112c4929190614106565b604051602081830303815290604052805190602001205b915080806112e890614132565b915050611225565b50600954811491505092915050565b600b60009054906101000a900460ff1681565b600061131d82612a86565b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361138b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461146c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146390613dcd565b60405180910390fd5b600e60009054906101000a900460ff1615600e60006101000a81548160ff021916908315150217905550565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611528576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161151f90613dcd565b60405180910390fd5b60005b815181101561156c5761155982828151811061154a576115496140b6565b5b60200260200101516001612b52565b808061156490614132565b91505061152b565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611600576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f790613dcd565b60405180910390fd5b61160981612b70565b50565b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146116c2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b990613dcd565b60405180910390fd5b80600c8190555050565b6060600380546116db90613e1c565b80601f016020809104026020016040519081016040528092919081815260200182805461170790613e1c565b80156117545780601f1061172957610100808354040283529160200191611754565b820191906000526020600020905b81548152906001019060200180831161173757829003601f168201915b5050505050905090565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16146117ee576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e590613dcd565b60405180910390fd5b80600f9080519060200190611804929190613272565b5050565b8060076000611815612b7a565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166118c2612b7a565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161190791906133c9565b60405180910390a35050565b600d5481565b8360006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b1115611aea573373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff160361198c5761198785858585612b82565b611af7565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430336040518363ffffffff1660e01b81526004016119d5929190613e4d565b602060405180830381865afa1580156119f2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611a169190613e8b565b8015611aa857506daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b8152600401611a66929190613e4d565b602060405180830381865afa158015611a83573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611aa79190613e8b565b5b611ae957336040517fede71dcc000000000000000000000000000000000000000000000000000000008152600401611ae091906136c1565b60405180910390fd5b5b611af685858585612b82565b5b5050505050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614611b8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8590613dcd565b60405180910390fd5b80600d8190555050565b600c5481565b6060611ba98261258c565b611be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdf906141ec565b60405180910390fd5b60001515600e60009054906101000a900460ff16151503611c9557600f8054611c1090613e1c565b80601f0160208091040260200160405190810160405280929190818152602001828054611c3c90613e1c565b8015611c895780601f10611c5e57610100808354040283529160200191611c89565b820191906000526020600020905b815481529060010190602001808311611c6c57829003601f168201915b50505050509050611ccc565b611c9d612bf5565b611ca683612c87565b6011604051602001611cba939291906142dc565b60405160208183030381529060405290505b919050565b61138881565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611d45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d3c90614359565b60405180910390fd5b6002600b60009054906101000a900460ff1660ff1614611d9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d91906143c5565b60405180910390fd5b611388611da5610b45565b82611db091906143e5565b1115611df1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de890614487565b60405180910390fd5b80600a5411611e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2c906144f3565b60405180910390fd5b80601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611e8091906143e5565b600a5411611ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611eba9061455f565b60405180910390fd5b80600d54611ed19190613ee7565b3414611f12576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f09906145cb565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015611f7a573d6000803e3d6000fd5b5080601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611fca91906143e5565b92505081905550611fdb3382612b52565b50565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161461206e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206590613dcd565b60405180910390fd5b611388612079610b45565b8361208491906143e5565b11156120c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120bc90614487565b60405180910390fd5b6120cf8183612b52565b5050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146121d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121cc90614359565b60405180910390fd5b6001600b60009054906101000a900460ff1660ff161461222a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612221906143c5565b60405180910390fd5b611388612235610b45565b8361224091906143e5565b1115612281576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161227890614487565b60405180910390fd5b81600a54116122c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122bc90614637565b60405180910390fd5b81601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461231091906143e5565b600a5411612353576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161234a906146a3565b60405180910390fd5b61235d33826111f6565b61239c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123939061470f565b60405180910390fd5b81600c546123aa9190613ee7565b34146123eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e2906145cb565b60405180910390fd5b600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc349081150290604051600060405180830381858888f19350505050158015612453573d6000803e3d6000fd5b5081601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546124a391906143e5565b925050819055506124b43383612b52565b5050565b3373ffffffffffffffffffffffffffffffffffffffff16600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614612548576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161253f90613dcd565b60405180910390fd5b80600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008161259761273b565b111580156125a6575060005482105b80156125e4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60006125f683611312565b905081801561263857508073ffffffffffffffffffffffffffffffffffffffff1661261f612b7a565b73ffffffffffffffffffffffffffffffffffffffff1614155b156126855761264e81612649612b7a565b6120d3565b612684576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b836006600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550828473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a450505050565b60006001905090565b600061274f82612a86565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16146127b6576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806127c284612de7565b915091506127d881876127d3612b7a565b612e0e565b612824576127ed866127e8612b7a565b6120d3565b612823576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361288a576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128978686866001612e52565b80156128a257600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055506129708561294c888887612e58565b7c020000000000000000000000000000000000000000000000000000000017612e80565b600460008681526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008416036129f657600060018501905060006004600083815260200190815260200160002054036129f45760005481146129f3578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a5e8686866001612eab565b505050505050565b612a8183838360405180602001604052806000815250611919565b505050565b60008082905080612a9561273b565b11612b1b57600054811015612b1a5760006004600083815260200190815260200160002054905060007c0100000000000000000000000000000000000000000000000000000000821603612b18575b60008103612b0e576004600083600190039350838152602001908152602001600020549050612ae4565b8092505050612b4d565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b612b6c828260405180602001604052806000815250612eb1565b5050565b8060098190555050565b600033905090565b612b8d848484610b5c565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612bef57612bb884848484612f4e565b612bee576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b606060108054612c0490613e1c565b80601f0160208091040260200160405190810160405280929190818152602001828054612c3090613e1c565b8015612c7d5780601f10612c5257610100808354040283529160200191612c7d565b820191906000526020600020905b815481529060010190602001808311612c6057829003601f168201915b5050505050905090565b606060008203612cce576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612de2565b600082905060005b60008214612d00578080612ce990614132565b915050600a82612cf99190613f70565b9150612cd6565b60008167ffffffffffffffff811115612d1c57612d1b6133ff565b5b6040519080825280601f01601f191660200182016040528015612d4e5781602001600182028036833780820191505090505b5090505b60008514612ddb57600182612d67919061472f565b9150600a85612d769190614763565b6030612d8291906143e5565b60f81b818381518110612d9857612d976140b6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612dd49190613f70565b9450612d52565b8093505050505b919050565b60008060006006600085815260200190815260200160002090508092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e8612e6f86868461309e565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b612ebb83836130a7565b60008373ffffffffffffffffffffffffffffffffffffffff163b14612f4957600080549050600083820390505b612efb6000868380600101945086612f4e565b612f31576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b818110612ee8578160005414612f4657600080fd5b50505b505050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612f74612b7a565b8786866040518563ffffffff1660e01b8152600401612f9694939291906147e9565b6020604051808303816000875af1925050508015612fd257506040513d601f19601f82011682018060405250810190612fcf919061484a565b60015b61304b573d8060008114613002576040519150601f19603f3d011682016040523d82523d6000602084013e613007565b606091505b506000815103613043576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60009392505050565b600080549050600082036130e7576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130f46000848385612e52565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555061316b8361315c6000866000612e58565b61316585613262565b17612e80565b6004600083815260200190815260200160002081905550600080838301905073ffffffffffffffffffffffffffffffffffffffff85169150828260007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a4600183015b81811461320c57808360007fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef600080a46001810190506131d1565b5060008203613247576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600081905550505061325d6000848385612eab565b505050565b60006001821460e11b9050919050565b82805461327e90613e1c565b90600052602060002090601f0160209004810192826132a057600085556132e7565b82601f106132b957805160ff19168380011785556132e7565b828001600101855582156132e7579182015b828111156132e65782518255916020019190600101906132cb565b5b5090506132f491906132f8565b5090565b5b808211156133115760008160009055506001016132f9565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b61335e81613329565b811461336957600080fd5b50565b60008135905061337b81613355565b92915050565b6000602082840312156133975761339661331f565b5b60006133a58482850161336c565b91505092915050565b60008115159050919050565b6133c3816133ae565b82525050565b60006020820190506133de60008301846133ba565b92915050565b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613437826133ee565b810181811067ffffffffffffffff82111715613456576134556133ff565b5b80604052505050565b6000613469613315565b9050613475828261342e565b919050565b600067ffffffffffffffff821115613495576134946133ff565b5b61349e826133ee565b9050602081019050919050565b82818337600083830152505050565b60006134cd6134c88461347a565b61345f565b9050828152602081018484840111156134e9576134e86133e9565b5b6134f48482856134ab565b509392505050565b600082601f830112613511576135106133e4565b5b81356135218482602086016134ba565b91505092915050565b6000602082840312156135405761353f61331f565b5b600082013567ffffffffffffffff81111561355e5761355d613324565b5b61356a848285016134fc565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156135ad578082015181840152602081019050613592565b838111156135bc576000848401525b50505050565b60006135cd82613573565b6135d7818561357e565b93506135e781856020860161358f565b6135f0816133ee565b840191505092915050565b6000602082019050818103600083015261361581846135c2565b905092915050565b6000819050919050565b6136308161361d565b811461363b57600080fd5b50565b60008135905061364d81613627565b92915050565b6000602082840312156136695761366861331f565b5b60006136778482850161363e565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006136ab82613680565b9050919050565b6136bb816136a0565b82525050565b60006020820190506136d660008301846136b2565b92915050565b6136e5816136a0565b81146136f057600080fd5b50565b600081359050613702816136dc565b92915050565b6000806040838503121561371f5761371e61331f565b5b600061372d858286016136f3565b925050602061373e8582860161363e565b9150509250929050565b600060ff82169050919050565b61375e81613748565b811461376957600080fd5b50565b60008135905061377b81613755565b92915050565b6000602082840312156137975761379661331f565b5b60006137a58482850161376c565b91505092915050565b6137b78161361d565b82525050565b60006020820190506137d260008301846137ae565b92915050565b6000806000606084860312156137f1576137f061331f565b5b60006137ff868287016136f3565b9350506020613810868287016136f3565b92505060406138218682870161363e565b9150509250925092565b600067ffffffffffffffff821115613846576138456133ff565b5b602082029050602081019050919050565b600080fd5b6000819050919050565b61386f8161385c565b811461387a57600080fd5b50565b60008135905061388c81613866565b92915050565b60006138a56138a08461382b565b61345f565b905080838252602082019050602084028301858111156138c8576138c7613857565b5b835b818110156138f157806138dd888261387d565b8452602084019350506020810190506138ca565b5050509392505050565b600082601f8301126139105761390f6133e4565b5b8135613920848260208601613892565b91505092915050565b600080604083850312156139405761393f61331f565b5b600061394e858286016136f3565b925050602083013567ffffffffffffffff81111561396f5761396e613324565b5b61397b858286016138fb565b9150509250929050565b61398e81613748565b82525050565b60006020820190506139a96000830184613985565b92915050565b6000602082840312156139c5576139c461331f565b5b60006139d3848285016136f3565b91505092915050565b600067ffffffffffffffff8211156139f7576139f66133ff565b5b602082029050602081019050919050565b6000613a1b613a16846139dc565b61345f565b90508083825260208201905060208402830185811115613a3e57613a3d613857565b5b835b81811015613a675780613a5388826136f3565b845260208401935050602081019050613a40565b5050509392505050565b600082601f830112613a8657613a856133e4565b5b8135613a96848260208601613a08565b91505092915050565b600060208284031215613ab557613ab461331f565b5b600082013567ffffffffffffffff811115613ad357613ad2613324565b5b613adf84828501613a71565b91505092915050565b600060208284031215613afe57613afd61331f565b5b6000613b0c8482850161387d565b91505092915050565b613b1e816133ae565b8114613b2957600080fd5b50565b600081359050613b3b81613b15565b92915050565b60008060408385031215613b5857613b5761331f565b5b6000613b66858286016136f3565b9250506020613b7785828601613b2c565b9150509250929050565b600067ffffffffffffffff821115613b9c57613b9b6133ff565b5b613ba5826133ee565b9050602081019050919050565b6000613bc5613bc084613b81565b61345f565b905082815260208101848484011115613be157613be06133e9565b5b613bec8482856134ab565b509392505050565b600082601f830112613c0957613c086133e4565b5b8135613c19848260208601613bb2565b91505092915050565b60008060008060808587031215613c3c57613c3b61331f565b5b6000613c4a878288016136f3565b9450506020613c5b878288016136f3565b9350506040613c6c8782880161363e565b925050606085013567ffffffffffffffff811115613c8d57613c8c613324565b5b613c9987828801613bf4565b91505092959194509250565b60008060408385031215613cbc57613cbb61331f565b5b6000613cca8582860161363e565b9250506020613cdb858286016136f3565b9150509250929050565b60008060408385031215613cfc57613cfb61331f565b5b6000613d0a858286016136f3565b9250506020613d1b858286016136f3565b9150509250929050565b60008060408385031215613d3c57613d3b61331f565b5b6000613d4a8582860161363e565b925050602083013567ffffffffffffffff811115613d6b57613d6a613324565b5b613d77858286016138fb565b9150509250929050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b6000613db7600a8361357e565b9150613dc282613d81565b602082019050919050565b60006020820190508181036000830152613de681613daa565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e3457607f821691505b602082108103613e4757613e46613ded565b5b50919050565b6000604082019050613e6260008301856136b2565b613e6f60208301846136b2565b9392505050565b600081519050613e8581613b15565b92915050565b600060208284031215613ea157613ea061331f565b5b6000613eaf84828501613e76565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613ef28261361d565b9150613efd8361361d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f3657613f35613eb8565b5b828202905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613f7b8261361d565b9150613f868361361d565b925082613f9657613f95613f41565b5b828204905092915050565b600081905092915050565b50565b6000613fbc600083613fa1565b9150613fc782613fac565b600082019050919050565b6000613fdd82613faf565b9150819050919050565b7f4661696c656420746f2077697468647261772045746865720000000000000000600082015250565b600061401d60188361357e565b915061402882613fe7565b602082019050919050565b6000602082019050818103600083015261404c81614010565b9050919050565b60008160601b9050919050565b600061406b82614053565b9050919050565b600061407d82614060565b9050919050565b614095614090826136a0565b614072565b82525050565b60006140a78284614084565b60148201915081905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000819050919050565b6141006140fb8261385c565b6140e5565b82525050565b600061411282856140ef565b60208201915061412282846140ef565b6020820191508190509392505050565b600061413d8261361d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820361416f5761416e613eb8565b5b600182019050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b60006141d6602f8361357e565b91506141e18261417a565b604082019050919050565b60006020820190508181036000830152614205816141c9565b9050919050565b600081905092915050565b600061422282613573565b61422c818561420c565b935061423c81856020860161358f565b80840191505092915050565b60008190508160005260206000209050919050565b6000815461426a81613e1c565b614274818661420c565b9450600182166000811461428f57600181146142a0576142d3565b60ff198316865281860193506142d3565b6142a985614248565b60005b838110156142cb578154818901526001820191506020810190506142ac565b838801955050505b50505092915050565b60006142e88286614217565b91506142f48285614217565b9150614300828461425d565b9150819050949350505050565b7f4e6f20736d61727420636f6e7472616374000000000000000000000000000000600082015250565b600061434360118361357e565b915061434e8261430d565b602082019050919050565b6000602082019050818103600083015261437281614336565b9050919050565b7f53616c6520696e61637469766500000000000000000000000000000000000000600082015250565b60006143af600d8361357e565b91506143ba82614379565b602082019050919050565b600060208201905081810360008301526143de816143a2565b9050919050565b60006143f08261361d565b91506143fb8361361d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144305761442f613eb8565b5b828201905092915050565b7f4e6f206d6f7265204e4654730000000000000000000000000000000000000000600082015250565b6000614471600c8361357e565b915061447c8261443b565b602082019050919050565b600060208201905081810360008301526144a081614464565b9050919050565b7f457863656564206d617820706572207478000000000000000000000000000000600082015250565b60006144dd60118361357e565b91506144e8826144a7565b602082019050919050565b6000602082019050818103600083015261450c816144d0565b9050919050565b7f457863656564206d617820706572206164647265737300000000000000000000600082015250565b600061454960168361357e565b915061455482614513565b602082019050919050565b600060208201905081810360008301526145788161453c565b9050919050565b7f56616c75652073656e74206973206e6f7420636f727265637400000000000000600082015250565b60006145b560198361357e565b91506145c08261457f565b602082019050919050565b600060208201905081810360008301526145e4816145a8565b9050919050565b7f596f752776652072656163686564206d61782070657220747800000000000000600082015250565b600061462160198361357e565b915061462c826145eb565b602082019050919050565b6000602082019050818103600083015261465081614614565b9050919050565b7f596f752776652072656163686564206d61782070657220616464726573730000600082015250565b600061468d601e8361357e565b915061469882614657565b602082019050919050565b600060208201905081810360008301526146bc81614680565b9050919050565b7f596f7520617265206e6f742077686974656c6973746564210000000000000000600082015250565b60006146f960188361357e565b9150614704826146c3565b602082019050919050565b60006020820190508181036000830152614728816146ec565b9050919050565b600061473a8261361d565b91506147458361361d565b92508282101561475857614757613eb8565b5b828203905092915050565b600061476e8261361d565b91506147798361361d565b92508261478957614788613f41565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b60006147bb82614794565b6147c5818561479f565b93506147d581856020860161358f565b6147de816133ee565b840191505092915050565b60006080820190506147fe60008301876136b2565b61480b60208301866136b2565b61481860408301856137ae565b818103606083015261482a81846147b0565b905095945050505050565b60008151905061484481613355565b92915050565b6000602082840312156148605761485f61331f565b5b600061486e84828501614835565b9150509291505056fea2646970667358221220264d767596f1f638db7fdbf610dd3a962f1cd80d207200bffe577bf5fb1cdbbe64736f6c634300080d0033

Deployed Bytecode Sourcemap

59015:5201:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20193:639;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62144:108;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21095:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27058:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26775:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61317:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16846:323;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63351:212;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62260:326;;;;;;;;;;;;;:::i;:::-;;63740:220;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59137:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59358:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61418:90;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62041:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58543:405;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59200:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22488:152;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18030:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61850:77;;;;;;;;;;;;;:::i;:::-;;63571:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61733:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53968:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61622:103;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21271:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;61935:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27616:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59310:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63968:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;61516:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59263:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62834:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59091:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60738:547;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;59855:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28007:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;60055:673;;;;;;;;;;;;;:::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;62144:108::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62240:4:::1;62221:16;:23;;;;;;;;;;;;:::i;:::-;;62144:108:::0;:::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;61317:93::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61396:6:::1;61384:9;;:18;;;;;;;;;;;;;;;;;;61317:93:::0;:::o;16846:323::-;16907:7;17135:15;:13;:15::i;:::-;17120:12;;17104:13;;:28;:46;17097:53;;16846:323;:::o;63351:212::-;63496:4;57684:1;56498:42;57638:43;;;:47;57634:699;;;57925:10;57917:18;;:4;:18;;;57913:85;;63518:37:::1;63537:4;63543:2;63547:7;63518: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;63518:37:::1;63537:4;63543:2;63547:7;63518:18;:37::i;:::-;63351:212:::0;;;;;:::o;62260:326::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62308:18:::1;62329:21;62308:42;;62363:10;62384:42;62363:64;;62440:12;62479:2;:7;;62513:4;62508::::0;62495:10:::1;:17;;;;:::i;:::-;:22;;;;:::i;:::-;62479:44;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62465:58;;;;;62542:7;62534:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;62297:289;;;62260:326::o:0;63740:220::-;63889:4;57684:1;56498:42;57638:43;;;:47;57634:699;;;57925:10;57917:18;;:4;:18;;;57913:85;;63911:41:::1;63934:4;63940:2;63944:7;63911: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;63911:41:::1;63934:4;63940:2;63944:7;63911:22;:41::i;:::-;63740:220:::0;;;;;:::o;59137:26::-;;;;:::o;59358:20::-;;;;;;;;;;;;;:::o;61418:90::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61494:6:::1;61484:7;:16;;;;61418:90:::0;:::o;62041:95::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62124:4:::1;62109:12;:19;;;;;;;;;;;;:::i;:::-;;62041:95:::0;:::o;58543:405::-;58630:4;58647:13;58690:8;58673:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;58663:37;;;;;;58647:53;;58716:9;58711:192;58735:6;:13;58731:1;:17;58711:192;;;58786:6;58793:1;58786:9;;;;;;;;:::i;:::-;;;;;;;;58778:5;:17;:113;;58873:6;58880:1;58873:9;;;;;;;;:::i;:::-;;;;;;;;58884:5;58856:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58846:45;;;;;;58778:113;;;58825:5;58832:6;58839:1;58832:9;;;;;;;;:::i;:::-;;;;;;;;58808:34;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58798:45;;;;;;58778:113;58770:121;;58750:3;;;;;:::i;:::-;;;;58711:192;;;;58929:11;;58920:5;:20;58913:27;;;58543:405;;;;:::o;59200:26::-;;;;;;;;;;;;;:::o;22488:152::-;22560:7;22603:27;22622:7;22603:18;:27::i;:::-;22580:52;;22488:152;;;:::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;61850:77::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61911:8:::1;;;;;;;;;;;61910:9;61899:8;;:20;;;;;;;;;;;;;;;;;;61850:77::o:0;63571:161::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;63648:6:::1;63643:82;63664:2;:9;63660:1;:13;63643:82;;;63694:19;63704:2;63707:1;63704:5;;;;;;;;:::i;:::-;;;;;;;;63711:1;63694:9;:19::i;:::-;63674:3;;;;;:::i;:::-;;;;63643:82;;;;63571:161:::0;:::o;61733:109::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61807:27:::1;61822:11;61807:14;:27::i;:::-;61733:109:::0;:::o;53968:20::-;;;;;;;;;;;;;:::o;61622:103::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61707:10:::1;61692:12;:25;;;;61622:103:::0;:::o;21271:104::-;21327:13;21360:7;21353:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21271:104;:::o;61935:98::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;62021:4:::1;62009:9;:16;;;;;;;;;;;;:::i;:::-;;61935: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;59310:39::-;;;;:::o;63968:245::-;64136:4;57684:1;56498:42;57638:43;;;:47;57634:699;;;57925:10;57917:18;;:4;:18;;;57913:85;;64158:47:::1;64181:4;64187:2;64191:7;64200:4;64158: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;64158:47:::1;64181:4;64187:2;64191:7;64200:4;64158:22;:47::i;:::-;63968:245:::0;;;;;;:::o;61516:98::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;61598:8:::1;61584:11;:22;;;;61516:98:::0;:::o;59263:40::-;;;;:::o;62834:359::-;62907:13;62941:16;62949:7;62941;:16::i;:::-;62933:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;63035:5;63023:17;;:8;;;;;;;;;;;:17;;;63020:61;;63060:9;63053:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63020:61;63122:16;:14;:16::i;:::-;63140:25;63157:7;63140:16;:25::i;:::-;63167:16;63105:79;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;63091:94;;62834:359;;;;:::o;59091:39::-;59126:4;59091:39;:::o;60738:547::-;63274:9;63260:23;;:10;:23;;;63252:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60830:1:::1;60817:9;;;;;;;;;;;:14;;;60809:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;59126:4;60878:13;:11;:13::i;:::-;60868:7;:23;;;;:::i;:::-;:35;;60860:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;60949:7;60939;;:17;60931:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;61030:7;61007:8;:20;61016:10;61007:20;;;;;;;;;;;;;;;;:30;;;;:::i;:::-;60997:7;;:40;60989:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;61110:7;61096:11;;:21;;;;:::i;:::-;61083:9;:34;61075:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;61166:5;;;;;;;;;;;61158:23;;:34;61182:9;61158:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;61229:7;61205:8;:20;61214:10;61205:20;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;61247:30;61257:10;61269:7;61247:9;:30::i;:::-;60738:547:::0;:::o;59855:192::-;54077:10;54068:19;;:5;;;;;;;;;;;:19;;;54060:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;59126:4:::1;59956:13;:11;:13::i;:::-;59946:7;:23;;;;:::i;:::-;:35;;59938:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;60011:28;60021:8;60031:7;60011:9;:28::i;:::-;59855:192:::0;;:::o;28007:164::-;28104:4;28128:18;:25;28147:5;28128:25;;;;;;;;;;;;;;;:35;28154:8;28128:35;;;;;;;;;;;;;;;;;;;;;;;;;28121:42;;28007:164;;;;:::o;60055:673::-;63274:9;63260:23;;:10;:23;;;63252:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;60173:1:::1;60160:9;;;;;;;;;;;:14;;;60152:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;59126:4;60221:13;:11;:13::i;:::-;60211:7;:23;;;;:::i;:::-;:35;;60203:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;60292:7;60282;;:17;60274:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;60382:7;60358:9;:21;60368:10;60358:21;;;;;;;;;;;;;;;;:31;;;;:::i;:::-;60348:7;;:41;60340:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;60443:33;60457:10;60469:6;60443:13;:33::i;:::-;60435:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;60552:7;60537:12;;:22;;;;:::i;:::-;60524:9;:35;60516:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;60608:5;;;;;;;;;;;60600:23;;:34;60624:9;60600:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;60672:7;60647:9;:21;60657:10;60647:21;;;;;;;;;;;;;;;;:32;;;;;;;:::i;:::-;;;;;;;;60690:30;60700:10;60712:7;60690:9;:30::i;:::-;60055:673:::0;;:::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;62617:101::-;62682:7;62709:1;62702:8;;62617: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;44569:112::-;44646:27;44656:2;44660:8;44646:27;;;;;;;;;;;;:9;:27::i;:::-;44569:112;;:::o;58431:106::-;58518:11;58504;:25;;;;58431:106;:::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;62726:100::-;62774:13;62806:12;62799:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62726: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:117::-;1627:1;1624;1617:12;1641:117;1750:1;1747;1740:12;1764:102;1805:6;1856:2;1852:7;1847:2;1840:5;1836:14;1832:28;1822:38;;1764:102;;;:::o;1872:180::-;1920:77;1917:1;1910:88;2017:4;2014:1;2007:15;2041:4;2038:1;2031:15;2058:281;2141:27;2163:4;2141:27;:::i;:::-;2133:6;2129:40;2271:6;2259:10;2256:22;2235:18;2223:10;2220:34;2217:62;2214:88;;;2282:18;;:::i;:::-;2214:88;2322:10;2318:2;2311:22;2101:238;2058:281;;:::o;2345:129::-;2379:6;2406:20;;:::i;:::-;2396:30;;2435:33;2463:4;2455:6;2435:33;:::i;:::-;2345:129;;;:::o;2480:308::-;2542:4;2632:18;2624:6;2621:30;2618:56;;;2654:18;;:::i;:::-;2618:56;2692:29;2714:6;2692:29;:::i;:::-;2684:37;;2776:4;2770;2766:15;2758:23;;2480:308;;;:::o;2794:154::-;2878:6;2873:3;2868;2855:30;2940:1;2931:6;2926:3;2922:16;2915:27;2794:154;;;:::o;2954:412::-;3032:5;3057:66;3073:49;3115:6;3073:49;:::i;:::-;3057:66;:::i;:::-;3048:75;;3146:6;3139:5;3132:21;3184:4;3177:5;3173:16;3222:3;3213:6;3208:3;3204:16;3201:25;3198:112;;;3229:79;;:::i;:::-;3198:112;3319:41;3353:6;3348:3;3343;3319:41;:::i;:::-;3038:328;2954:412;;;;;:::o;3386:340::-;3442:5;3491:3;3484:4;3476:6;3472:17;3468:27;3458:122;;3499:79;;:::i;:::-;3458:122;3616:6;3603:20;3641:79;3716:3;3708:6;3701:4;3693:6;3689:17;3641:79;:::i;:::-;3632:88;;3448:278;3386:340;;;;:::o;3732:509::-;3801:6;3850:2;3838:9;3829:7;3825:23;3821:32;3818:119;;;3856:79;;:::i;:::-;3818:119;4004:1;3993:9;3989:17;3976:31;4034:18;4026:6;4023:30;4020:117;;;4056:79;;:::i;:::-;4020:117;4161:63;4216:7;4207:6;4196:9;4192:22;4161:63;:::i;:::-;4151:73;;3947:287;3732:509;;;;:::o;4247:99::-;4299:6;4333:5;4327:12;4317:22;;4247:99;;;:::o;4352:169::-;4436:11;4470:6;4465:3;4458:19;4510:4;4505:3;4501:14;4486:29;;4352:169;;;;:::o;4527:307::-;4595:1;4605:113;4619:6;4616:1;4613:13;4605:113;;;4704:1;4699:3;4695:11;4689:18;4685:1;4680:3;4676:11;4669:39;4641:2;4638:1;4634:10;4629:15;;4605:113;;;4736:6;4733:1;4730:13;4727:101;;;4816:1;4807:6;4802:3;4798:16;4791:27;4727:101;4576:258;4527:307;;;:::o;4840:364::-;4928:3;4956:39;4989:5;4956:39;:::i;:::-;5011:71;5075:6;5070:3;5011:71;:::i;:::-;5004:78;;5091:52;5136:6;5131:3;5124:4;5117:5;5113:16;5091:52;:::i;:::-;5168:29;5190:6;5168:29;:::i;:::-;5163:3;5159:39;5152:46;;4932:272;4840:364;;;;:::o;5210:313::-;5323:4;5361:2;5350:9;5346:18;5338:26;;5410:9;5404:4;5400:20;5396:1;5385:9;5381:17;5374:47;5438:78;5511:4;5502:6;5438:78;:::i;:::-;5430:86;;5210:313;;;;:::o;5529:77::-;5566:7;5595:5;5584:16;;5529:77;;;:::o;5612:122::-;5685:24;5703:5;5685:24;:::i;:::-;5678:5;5675:35;5665:63;;5724:1;5721;5714:12;5665:63;5612:122;:::o;5740:139::-;5786:5;5824:6;5811:20;5802:29;;5840:33;5867:5;5840:33;:::i;:::-;5740:139;;;;:::o;5885:329::-;5944:6;5993:2;5981:9;5972:7;5968:23;5964:32;5961:119;;;5999:79;;:::i;:::-;5961:119;6119:1;6144:53;6189:7;6180:6;6169:9;6165:22;6144:53;:::i;:::-;6134:63;;6090:117;5885:329;;;;:::o;6220:126::-;6257:7;6297:42;6290:5;6286:54;6275:65;;6220:126;;;:::o;6352:96::-;6389:7;6418:24;6436:5;6418:24;:::i;:::-;6407:35;;6352:96;;;:::o;6454:118::-;6541:24;6559:5;6541:24;:::i;:::-;6536:3;6529:37;6454:118;;:::o;6578:222::-;6671:4;6709:2;6698:9;6694:18;6686:26;;6722:71;6790:1;6779:9;6775:17;6766:6;6722:71;:::i;:::-;6578:222;;;;:::o;6806:122::-;6879:24;6897:5;6879:24;:::i;:::-;6872:5;6869:35;6859:63;;6918:1;6915;6908:12;6859:63;6806:122;:::o;6934:139::-;6980:5;7018:6;7005:20;6996:29;;7034:33;7061:5;7034:33;:::i;:::-;6934:139;;;;:::o;7079:474::-;7147:6;7155;7204:2;7192:9;7183:7;7179:23;7175:32;7172:119;;;7210:79;;:::i;:::-;7172:119;7330:1;7355:53;7400:7;7391:6;7380:9;7376:22;7355:53;:::i;:::-;7345:63;;7301:117;7457:2;7483:53;7528:7;7519:6;7508:9;7504:22;7483:53;:::i;:::-;7473:63;;7428:118;7079:474;;;;;:::o;7559:86::-;7594:7;7634:4;7627:5;7623:16;7612:27;;7559:86;;;:::o;7651:118::-;7722:22;7738:5;7722:22;:::i;:::-;7715:5;7712:33;7702:61;;7759:1;7756;7749:12;7702:61;7651:118;:::o;7775:135::-;7819:5;7857:6;7844:20;7835:29;;7873:31;7898:5;7873:31;:::i;:::-;7775:135;;;;:::o;7916:325::-;7973:6;8022:2;8010:9;8001:7;7997:23;7993:32;7990:119;;;8028:79;;:::i;:::-;7990:119;8148:1;8173:51;8216:7;8207:6;8196:9;8192:22;8173:51;:::i;:::-;8163:61;;8119:115;7916:325;;;;:::o;8247:118::-;8334:24;8352:5;8334:24;:::i;:::-;8329:3;8322:37;8247:118;;:::o;8371:222::-;8464:4;8502:2;8491:9;8487:18;8479:26;;8515:71;8583:1;8572:9;8568:17;8559:6;8515:71;:::i;:::-;8371:222;;;;:::o;8599:619::-;8676:6;8684;8692;8741:2;8729:9;8720:7;8716:23;8712:32;8709:119;;;8747:79;;:::i;:::-;8709:119;8867:1;8892:53;8937:7;8928:6;8917:9;8913:22;8892:53;:::i;:::-;8882:63;;8838:117;8994:2;9020:53;9065:7;9056:6;9045:9;9041:22;9020:53;:::i;:::-;9010:63;;8965:118;9122:2;9148:53;9193:7;9184:6;9173:9;9169:22;9148:53;:::i;:::-;9138:63;;9093:118;8599:619;;;;;:::o;9224:311::-;9301:4;9391:18;9383:6;9380:30;9377:56;;;9413:18;;:::i;:::-;9377:56;9463:4;9455:6;9451:17;9443:25;;9523:4;9517;9513:15;9505:23;;9224:311;;;:::o;9541:117::-;9650:1;9647;9640:12;9664:77;9701:7;9730:5;9719:16;;9664:77;;;:::o;9747:122::-;9820:24;9838:5;9820:24;:::i;:::-;9813:5;9810:35;9800:63;;9859:1;9856;9849:12;9800:63;9747:122;:::o;9875:139::-;9921:5;9959:6;9946:20;9937:29;;9975:33;10002:5;9975:33;:::i;:::-;9875:139;;;;:::o;10037:710::-;10133:5;10158:81;10174:64;10231:6;10174:64;:::i;:::-;10158:81;:::i;:::-;10149:90;;10259:5;10288:6;10281:5;10274:21;10322:4;10315:5;10311:16;10304:23;;10375:4;10367:6;10363:17;10355:6;10351:30;10404:3;10396:6;10393:15;10390:122;;;10423:79;;:::i;:::-;10390:122;10538:6;10521:220;10555:6;10550:3;10547:15;10521:220;;;10630:3;10659:37;10692:3;10680:10;10659:37;:::i;:::-;10654:3;10647:50;10726:4;10721:3;10717:14;10710:21;;10597:144;10581:4;10576:3;10572:14;10565:21;;10521:220;;;10525:21;10139:608;;10037:710;;;;;:::o;10770:370::-;10841:5;10890:3;10883:4;10875:6;10871:17;10867:27;10857:122;;10898:79;;:::i;:::-;10857:122;11015:6;11002:20;11040:94;11130:3;11122:6;11115:4;11107:6;11103:17;11040:94;:::i;:::-;11031:103;;10847:293;10770:370;;;;:::o;11146:684::-;11239:6;11247;11296:2;11284:9;11275:7;11271:23;11267:32;11264:119;;;11302:79;;:::i;:::-;11264:119;11422:1;11447:53;11492:7;11483:6;11472:9;11468:22;11447:53;:::i;:::-;11437:63;;11393:117;11577:2;11566:9;11562:18;11549:32;11608:18;11600:6;11597:30;11594:117;;;11630:79;;:::i;:::-;11594:117;11735:78;11805:7;11796:6;11785:9;11781:22;11735:78;:::i;:::-;11725:88;;11520:303;11146:684;;;;;:::o;11836:112::-;11919:22;11935:5;11919:22;:::i;:::-;11914:3;11907:35;11836:112;;:::o;11954:214::-;12043:4;12081:2;12070:9;12066:18;12058:26;;12094:67;12158:1;12147:9;12143:17;12134:6;12094:67;:::i;:::-;11954:214;;;;:::o;12174:329::-;12233:6;12282:2;12270:9;12261:7;12257:23;12253:32;12250:119;;;12288:79;;:::i;:::-;12250:119;12408:1;12433:53;12478:7;12469:6;12458:9;12454:22;12433:53;:::i;:::-;12423:63;;12379:117;12174:329;;;;:::o;12509:311::-;12586:4;12676:18;12668:6;12665:30;12662:56;;;12698:18;;:::i;:::-;12662:56;12748:4;12740:6;12736:17;12728:25;;12808:4;12802;12798:15;12790:23;;12509:311;;;:::o;12843:710::-;12939:5;12964:81;12980:64;13037:6;12980:64;:::i;:::-;12964:81;:::i;:::-;12955:90;;13065:5;13094:6;13087:5;13080:21;13128:4;13121:5;13117:16;13110:23;;13181:4;13173:6;13169:17;13161:6;13157:30;13210:3;13202:6;13199:15;13196:122;;;13229:79;;:::i;:::-;13196:122;13344:6;13327:220;13361:6;13356:3;13353:15;13327:220;;;13436:3;13465:37;13498:3;13486:10;13465:37;:::i;:::-;13460:3;13453:50;13532:4;13527:3;13523:14;13516:21;;13403:144;13387:4;13382:3;13378:14;13371:21;;13327:220;;;13331:21;12945:608;;12843:710;;;;;:::o;13576:370::-;13647:5;13696:3;13689:4;13681:6;13677:17;13673:27;13663:122;;13704:79;;:::i;:::-;13663:122;13821:6;13808:20;13846:94;13936:3;13928:6;13921:4;13913:6;13909:17;13846:94;:::i;:::-;13837:103;;13653:293;13576:370;;;;:::o;13952:539::-;14036:6;14085:2;14073:9;14064:7;14060:23;14056:32;14053:119;;;14091:79;;:::i;:::-;14053:119;14239:1;14228:9;14224:17;14211:31;14269:18;14261:6;14258:30;14255:117;;;14291:79;;:::i;:::-;14255:117;14396:78;14466:7;14457:6;14446:9;14442:22;14396:78;:::i;:::-;14386:88;;14182:302;13952:539;;;;:::o;14497:329::-;14556:6;14605:2;14593:9;14584:7;14580:23;14576:32;14573:119;;;14611:79;;:::i;:::-;14573:119;14731:1;14756:53;14801:7;14792:6;14781:9;14777:22;14756:53;:::i;:::-;14746:63;;14702:117;14497:329;;;;:::o;14832:116::-;14902:21;14917:5;14902:21;:::i;:::-;14895:5;14892:32;14882:60;;14938:1;14935;14928:12;14882:60;14832:116;:::o;14954:133::-;14997:5;15035:6;15022:20;15013:29;;15051:30;15075:5;15051:30;:::i;:::-;14954:133;;;;:::o;15093:468::-;15158:6;15166;15215:2;15203:9;15194:7;15190:23;15186:32;15183:119;;;15221:79;;:::i;:::-;15183:119;15341:1;15366:53;15411:7;15402:6;15391:9;15387:22;15366:53;:::i;:::-;15356:63;;15312:117;15468:2;15494:50;15536:7;15527:6;15516:9;15512:22;15494:50;:::i;:::-;15484:60;;15439:115;15093:468;;;;;:::o;15567:307::-;15628:4;15718:18;15710:6;15707:30;15704:56;;;15740:18;;:::i;:::-;15704:56;15778:29;15800:6;15778:29;:::i;:::-;15770:37;;15862:4;15856;15852:15;15844:23;;15567:307;;;:::o;15880:410::-;15957:5;15982:65;15998:48;16039:6;15998:48;:::i;:::-;15982:65;:::i;:::-;15973:74;;16070:6;16063:5;16056:21;16108:4;16101:5;16097:16;16146:3;16137:6;16132:3;16128:16;16125:25;16122:112;;;16153:79;;:::i;:::-;16122:112;16243:41;16277:6;16272:3;16267;16243:41;:::i;:::-;15963:327;15880:410;;;;;:::o;16309:338::-;16364:5;16413:3;16406:4;16398:6;16394:17;16390:27;16380:122;;16421:79;;:::i;:::-;16380:122;16538:6;16525:20;16563:78;16637:3;16629:6;16622:4;16614:6;16610:17;16563:78;:::i;:::-;16554:87;;16370:277;16309:338;;;;:::o;16653:943::-;16748:6;16756;16764;16772;16821:3;16809:9;16800:7;16796:23;16792:33;16789:120;;;16828:79;;:::i;:::-;16789:120;16948:1;16973:53;17018:7;17009:6;16998:9;16994:22;16973:53;:::i;:::-;16963:63;;16919:117;17075:2;17101:53;17146:7;17137:6;17126:9;17122:22;17101:53;:::i;:::-;17091:63;;17046:118;17203:2;17229:53;17274:7;17265:6;17254:9;17250:22;17229:53;:::i;:::-;17219:63;;17174:118;17359:2;17348:9;17344:18;17331:32;17390:18;17382:6;17379:30;17376:117;;;17412:79;;:::i;:::-;17376:117;17517:62;17571:7;17562:6;17551:9;17547:22;17517:62;:::i;:::-;17507:72;;17302:287;16653:943;;;;;;;:::o;17602:474::-;17670:6;17678;17727:2;17715:9;17706:7;17702:23;17698:32;17695:119;;;17733:79;;:::i;:::-;17695:119;17853:1;17878:53;17923:7;17914:6;17903:9;17899:22;17878:53;:::i;:::-;17868:63;;17824:117;17980:2;18006:53;18051:7;18042:6;18031:9;18027:22;18006:53;:::i;:::-;17996:63;;17951:118;17602:474;;;;;:::o;18082:::-;18150:6;18158;18207:2;18195:9;18186:7;18182:23;18178:32;18175:119;;;18213:79;;:::i;:::-;18175:119;18333:1;18358:53;18403:7;18394:6;18383:9;18379:22;18358:53;:::i;:::-;18348:63;;18304:117;18460:2;18486:53;18531:7;18522:6;18511:9;18507:22;18486:53;:::i;:::-;18476:63;;18431:118;18082:474;;;;;:::o;18562:684::-;18655:6;18663;18712:2;18700:9;18691:7;18687:23;18683:32;18680:119;;;18718:79;;:::i;:::-;18680:119;18838:1;18863:53;18908:7;18899:6;18888:9;18884:22;18863:53;:::i;:::-;18853:63;;18809:117;18993:2;18982:9;18978:18;18965:32;19024:18;19016:6;19013:30;19010:117;;;19046:79;;:::i;:::-;19010:117;19151:78;19221:7;19212:6;19201:9;19197:22;19151:78;:::i;:::-;19141:88;;18936:303;18562:684;;;;;:::o;19252:160::-;19392:12;19388:1;19380:6;19376:14;19369:36;19252:160;:::o;19418:366::-;19560:3;19581:67;19645:2;19640:3;19581:67;:::i;:::-;19574:74;;19657:93;19746:3;19657:93;:::i;:::-;19775:2;19770:3;19766:12;19759:19;;19418:366;;;:::o;19790:419::-;19956:4;19994:2;19983:9;19979:18;19971:26;;20043:9;20037:4;20033:20;20029:1;20018:9;20014:17;20007:47;20071:131;20197:4;20071:131;:::i;:::-;20063:139;;19790:419;;;:::o;20215:180::-;20263:77;20260:1;20253:88;20360:4;20357:1;20350:15;20384:4;20381:1;20374:15;20401:320;20445:6;20482:1;20476:4;20472:12;20462:22;;20529:1;20523:4;20519:12;20550:18;20540:81;;20606:4;20598:6;20594:17;20584:27;;20540:81;20668:2;20660:6;20657:14;20637:18;20634:38;20631:84;;20687:18;;:::i;:::-;20631:84;20452:269;20401:320;;;:::o;20727:332::-;20848:4;20886:2;20875:9;20871:18;20863:26;;20899:71;20967:1;20956:9;20952:17;20943:6;20899:71;:::i;:::-;20980:72;21048:2;21037:9;21033:18;21024:6;20980:72;:::i;:::-;20727:332;;;;;:::o;21065:137::-;21119:5;21150:6;21144:13;21135:22;;21166:30;21190:5;21166:30;:::i;:::-;21065:137;;;;:::o;21208:345::-;21275:6;21324:2;21312:9;21303:7;21299:23;21295:32;21292:119;;;21330:79;;:::i;:::-;21292:119;21450:1;21475:61;21528:7;21519:6;21508:9;21504:22;21475:61;:::i;:::-;21465:71;;21421:125;21208:345;;;;:::o;21559:180::-;21607:77;21604:1;21597:88;21704:4;21701:1;21694:15;21728:4;21725:1;21718:15;21745:348;21785:7;21808:20;21826:1;21808:20;:::i;:::-;21803:25;;21842:20;21860:1;21842:20;:::i;:::-;21837:25;;22030:1;21962:66;21958:74;21955:1;21952:81;21947:1;21940:9;21933:17;21929:105;21926:131;;;22037:18;;:::i;:::-;21926:131;22085:1;22082;22078:9;22067:20;;21745:348;;;;:::o;22099:180::-;22147:77;22144:1;22137:88;22244:4;22241:1;22234:15;22268:4;22265:1;22258:15;22285:185;22325:1;22342:20;22360:1;22342:20;:::i;:::-;22337:25;;22376:20;22394:1;22376:20;:::i;:::-;22371:25;;22415:1;22405:35;;22420:18;;:::i;:::-;22405:35;22462:1;22459;22455:9;22450:14;;22285:185;;;;:::o;22476:147::-;22577:11;22614:3;22599:18;;22476:147;;;;:::o;22629:114::-;;:::o;22749:398::-;22908:3;22929:83;23010:1;23005:3;22929:83;:::i;:::-;22922:90;;23021:93;23110:3;23021:93;:::i;:::-;23139:1;23134:3;23130:11;23123:18;;22749:398;;;:::o;23153:379::-;23337:3;23359:147;23502:3;23359:147;:::i;:::-;23352:154;;23523:3;23516:10;;23153:379;;;:::o;23538:174::-;23678:26;23674:1;23666:6;23662:14;23655:50;23538:174;:::o;23718:366::-;23860:3;23881:67;23945:2;23940:3;23881:67;:::i;:::-;23874:74;;23957:93;24046:3;23957:93;:::i;:::-;24075:2;24070:3;24066:12;24059:19;;23718:366;;;:::o;24090:419::-;24256:4;24294:2;24283:9;24279:18;24271:26;;24343:9;24337:4;24333:20;24329:1;24318:9;24314:17;24307:47;24371:131;24497:4;24371:131;:::i;:::-;24363:139;;24090:419;;;:::o;24515:94::-;24548:8;24596:5;24592:2;24588:14;24567:35;;24515:94;;;:::o;24615:::-;24654:7;24683:20;24697:5;24683:20;:::i;:::-;24672:31;;24615:94;;;:::o;24715:100::-;24754:7;24783:26;24803:5;24783:26;:::i;:::-;24772:37;;24715:100;;;:::o;24821:157::-;24926:45;24946:24;24964:5;24946:24;:::i;:::-;24926:45;:::i;:::-;24921:3;24914:58;24821:157;;:::o;24984:256::-;25096:3;25111:75;25182:3;25173:6;25111:75;:::i;:::-;25211:2;25206:3;25202:12;25195:19;;25231:3;25224:10;;24984:256;;;;:::o;25246:180::-;25294:77;25291:1;25284:88;25391:4;25388:1;25381:15;25415:4;25412:1;25405:15;25432:79;25471:7;25500:5;25489:16;;25432:79;;;:::o;25517:157::-;25622:45;25642:24;25660:5;25642:24;:::i;:::-;25622:45;:::i;:::-;25617:3;25610:58;25517:157;;:::o;25680:397::-;25820:3;25835:75;25906:3;25897:6;25835:75;:::i;:::-;25935:2;25930:3;25926:12;25919:19;;25948:75;26019:3;26010:6;25948:75;:::i;:::-;26048:2;26043:3;26039:12;26032:19;;26068:3;26061:10;;25680:397;;;;;:::o;26083:233::-;26122:3;26145:24;26163:5;26145:24;:::i;:::-;26136:33;;26191:66;26184:5;26181:77;26178:103;;26261:18;;:::i;:::-;26178:103;26308:1;26301:5;26297:13;26290:20;;26083:233;;;:::o;26322:234::-;26462:34;26458:1;26450:6;26446:14;26439:58;26531:17;26526:2;26518:6;26514:15;26507:42;26322:234;:::o;26562:366::-;26704:3;26725:67;26789:2;26784:3;26725:67;:::i;:::-;26718:74;;26801:93;26890:3;26801:93;:::i;:::-;26919:2;26914:3;26910:12;26903:19;;26562:366;;;:::o;26934:419::-;27100:4;27138:2;27127:9;27123:18;27115:26;;27187:9;27181:4;27177:20;27173:1;27162:9;27158:17;27151:47;27215:131;27341:4;27215:131;:::i;:::-;27207:139;;26934:419;;;:::o;27359:148::-;27461:11;27498:3;27483:18;;27359:148;;;;:::o;27513:377::-;27619:3;27647:39;27680:5;27647:39;:::i;:::-;27702:89;27784:6;27779:3;27702:89;:::i;:::-;27695:96;;27800:52;27845:6;27840:3;27833:4;27826:5;27822:16;27800:52;:::i;:::-;27877:6;27872:3;27868:16;27861:23;;27623:267;27513:377;;;;:::o;27896:141::-;27945:4;27968:3;27960:11;;27991:3;27988:1;27981:14;28025:4;28022:1;28012:18;28004:26;;27896:141;;;:::o;28067:845::-;28170:3;28207:5;28201:12;28236:36;28262:9;28236:36;:::i;:::-;28288:89;28370:6;28365:3;28288:89;:::i;:::-;28281:96;;28408:1;28397:9;28393:17;28424:1;28419:137;;;;28570:1;28565:341;;;;28386:520;;28419:137;28503:4;28499:9;28488;28484:25;28479:3;28472:38;28539:6;28534:3;28530:16;28523:23;;28419:137;;28565:341;28632:38;28664:5;28632:38;:::i;:::-;28692:1;28706:154;28720:6;28717:1;28714:13;28706:154;;;28794:7;28788:14;28784:1;28779:3;28775:11;28768:35;28844:1;28835:7;28831:15;28820:26;;28742:4;28739:1;28735:12;28730:17;;28706:154;;;28889:6;28884:3;28880:16;28873:23;;28572:334;;28386:520;;28174:738;;28067:845;;;;:::o;28918:589::-;29143:3;29165:95;29256:3;29247:6;29165:95;:::i;:::-;29158:102;;29277:95;29368:3;29359:6;29277:95;:::i;:::-;29270:102;;29389:92;29477:3;29468:6;29389:92;:::i;:::-;29382:99;;29498:3;29491:10;;28918:589;;;;;;:::o;29513:167::-;29653:19;29649:1;29641:6;29637:14;29630:43;29513:167;:::o;29686:366::-;29828:3;29849:67;29913:2;29908:3;29849:67;:::i;:::-;29842:74;;29925:93;30014:3;29925:93;:::i;:::-;30043:2;30038:3;30034:12;30027:19;;29686:366;;;:::o;30058:419::-;30224:4;30262:2;30251:9;30247:18;30239:26;;30311:9;30305:4;30301:20;30297:1;30286:9;30282:17;30275:47;30339:131;30465:4;30339:131;:::i;:::-;30331:139;;30058:419;;;:::o;30483:163::-;30623:15;30619:1;30611:6;30607:14;30600:39;30483:163;:::o;30652:366::-;30794:3;30815:67;30879:2;30874:3;30815:67;:::i;:::-;30808:74;;30891:93;30980:3;30891:93;:::i;:::-;31009:2;31004:3;31000:12;30993:19;;30652:366;;;:::o;31024:419::-;31190:4;31228:2;31217:9;31213:18;31205:26;;31277:9;31271:4;31267:20;31263:1;31252:9;31248:17;31241:47;31305:131;31431:4;31305:131;:::i;:::-;31297:139;;31024:419;;;:::o;31449:305::-;31489:3;31508:20;31526:1;31508:20;:::i;:::-;31503:25;;31542:20;31560:1;31542:20;:::i;:::-;31537:25;;31696:1;31628:66;31624:74;31621:1;31618:81;31615:107;;;31702:18;;:::i;:::-;31615:107;31746:1;31743;31739:9;31732:16;;31449:305;;;;:::o;31760:162::-;31900:14;31896:1;31888:6;31884:14;31877:38;31760:162;:::o;31928:366::-;32070:3;32091:67;32155:2;32150:3;32091:67;:::i;:::-;32084:74;;32167:93;32256:3;32167:93;:::i;:::-;32285:2;32280:3;32276:12;32269:19;;31928:366;;;:::o;32300:419::-;32466:4;32504:2;32493:9;32489:18;32481:26;;32553:9;32547:4;32543:20;32539:1;32528:9;32524:17;32517:47;32581:131;32707:4;32581:131;:::i;:::-;32573:139;;32300:419;;;:::o;32725:167::-;32865:19;32861:1;32853:6;32849:14;32842:43;32725:167;:::o;32898:366::-;33040:3;33061:67;33125:2;33120:3;33061:67;:::i;:::-;33054:74;;33137:93;33226:3;33137:93;:::i;:::-;33255:2;33250:3;33246:12;33239:19;;32898:366;;;:::o;33270:419::-;33436:4;33474:2;33463:9;33459:18;33451:26;;33523:9;33517:4;33513:20;33509:1;33498:9;33494:17;33487:47;33551:131;33677:4;33551:131;:::i;:::-;33543:139;;33270:419;;;:::o;33695:172::-;33835:24;33831:1;33823:6;33819:14;33812:48;33695:172;:::o;33873:366::-;34015:3;34036:67;34100:2;34095:3;34036:67;:::i;:::-;34029:74;;34112:93;34201:3;34112:93;:::i;:::-;34230:2;34225:3;34221:12;34214:19;;33873:366;;;:::o;34245:419::-;34411:4;34449:2;34438:9;34434:18;34426:26;;34498:9;34492:4;34488:20;34484:1;34473:9;34469:17;34462:47;34526:131;34652:4;34526:131;:::i;:::-;34518:139;;34245:419;;;:::o;34670:175::-;34810:27;34806:1;34798:6;34794:14;34787:51;34670:175;:::o;34851:366::-;34993:3;35014:67;35078:2;35073:3;35014:67;:::i;:::-;35007:74;;35090:93;35179:3;35090:93;:::i;:::-;35208:2;35203:3;35199:12;35192:19;;34851:366;;;:::o;35223:419::-;35389:4;35427:2;35416:9;35412:18;35404:26;;35476:9;35470:4;35466:20;35462:1;35451:9;35447:17;35440:47;35504:131;35630:4;35504:131;:::i;:::-;35496:139;;35223:419;;;:::o;35648:175::-;35788:27;35784:1;35776:6;35772:14;35765:51;35648:175;:::o;35829:366::-;35971:3;35992:67;36056:2;36051:3;35992:67;:::i;:::-;35985:74;;36068:93;36157:3;36068:93;:::i;:::-;36186:2;36181:3;36177:12;36170:19;;35829:366;;;:::o;36201:419::-;36367:4;36405:2;36394:9;36390:18;36382:26;;36454:9;36448:4;36444:20;36440:1;36429:9;36425:17;36418:47;36482:131;36608:4;36482:131;:::i;:::-;36474:139;;36201:419;;;:::o;36626:180::-;36766:32;36762:1;36754:6;36750:14;36743:56;36626:180;:::o;36812:366::-;36954:3;36975:67;37039:2;37034:3;36975:67;:::i;:::-;36968:74;;37051:93;37140:3;37051:93;:::i;:::-;37169:2;37164:3;37160:12;37153:19;;36812:366;;;:::o;37184:419::-;37350:4;37388:2;37377:9;37373:18;37365:26;;37437:9;37431:4;37427:20;37423:1;37412:9;37408:17;37401:47;37465:131;37591:4;37465:131;:::i;:::-;37457:139;;37184:419;;;:::o;37609:174::-;37749:26;37745:1;37737:6;37733:14;37726:50;37609:174;:::o;37789:366::-;37931:3;37952:67;38016:2;38011:3;37952:67;:::i;:::-;37945:74;;38028:93;38117:3;38028:93;:::i;:::-;38146:2;38141:3;38137:12;38130:19;;37789:366;;;:::o;38161:419::-;38327:4;38365:2;38354:9;38350:18;38342:26;;38414:9;38408:4;38404:20;38400:1;38389:9;38385:17;38378:47;38442:131;38568:4;38442:131;:::i;:::-;38434:139;;38161:419;;;:::o;38586:191::-;38626:4;38646:20;38664:1;38646:20;:::i;:::-;38641:25;;38680:20;38698:1;38680:20;:::i;:::-;38675:25;;38719:1;38716;38713:8;38710:34;;;38724:18;;:::i;:::-;38710:34;38769:1;38766;38762:9;38754:17;;38586:191;;;;:::o;38783:176::-;38815:1;38832:20;38850:1;38832:20;:::i;:::-;38827:25;;38866:20;38884:1;38866:20;:::i;:::-;38861:25;;38905:1;38895:35;;38910:18;;:::i;:::-;38895:35;38951:1;38948;38944:9;38939:14;;38783:176;;;;:::o;38965:98::-;39016:6;39050:5;39044:12;39034:22;;38965:98;;;:::o;39069:168::-;39152:11;39186:6;39181:3;39174:19;39226:4;39221:3;39217:14;39202:29;;39069:168;;;;:::o;39243:360::-;39329:3;39357:38;39389:5;39357:38;:::i;:::-;39411:70;39474:6;39469:3;39411:70;:::i;:::-;39404:77;;39490:52;39535:6;39530:3;39523:4;39516:5;39512:16;39490:52;:::i;:::-;39567:29;39589:6;39567:29;:::i;:::-;39562:3;39558:39;39551:46;;39333:270;39243:360;;;;:::o;39609:640::-;39804:4;39842:3;39831:9;39827:19;39819:27;;39856:71;39924:1;39913:9;39909:17;39900:6;39856:71;:::i;:::-;39937:72;40005:2;39994:9;39990:18;39981:6;39937:72;:::i;:::-;40019;40087:2;40076:9;40072:18;40063:6;40019:72;:::i;:::-;40138:9;40132:4;40128:20;40123:2;40112:9;40108:18;40101:48;40166:76;40237:4;40228:6;40166:76;:::i;:::-;40158:84;;39609:640;;;;;;;:::o;40255:141::-;40311:5;40342:6;40336:13;40327:22;;40358:32;40384:5;40358:32;:::i;:::-;40255:141;;;;:::o;40402:349::-;40471:6;40520:2;40508:9;40499:7;40495:23;40491:32;40488:119;;;40526:79;;:::i;:::-;40488:119;40646:1;40671:63;40726:7;40717:6;40706:9;40702:22;40671:63;:::i;:::-;40661:73;;40617:127;40402:349;;;;:::o

Swarm Source

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