ETH Price: $2,481.77 (+3.01%)
 

Overview

Max Total Supply

113 ERC20 ***

Holders

66

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
0xhazy.eth
Balance
2 ERC20 ***
0x24726bb1C7996dBE80dae1e87799034125577144
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:
BDigiDaigaku

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721AQueryable compliant contract.
 */
interface IERC721AQueryable is IERC721A {
    /**
     * Invalid query range (`start` >= `stop`).
     */
    error InvalidQueryRange();

    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory);

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view returns (uint256[] memory);

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view returns (uint256[] memory);
}

pragma solidity ^0.8.4;

/**
 * @dev Interface of an ERC721ABurnable compliant contract.
 */
interface IERC721ABurnable is IERC721A {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) external;
}

pragma solidity ^0.8.4;

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

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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

pragma solidity ^0.8.4;

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

pragma solidity ^0.8.4;

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

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

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

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

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

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

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

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

        address from = address(uint160(prevOwnershipPacked));

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.4;

/**
 * @title ERC721A Burnable Token
 * @dev ERC721A Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721ABurnable is ERC721A, IERC721ABurnable {
    /**
     * @dev Burns `tokenId`. See {ERC721A-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual override {
        _burn(tokenId, true);
    }
}

pragma solidity ^0.8.4;

/**
 * @title ERC721A Queryable
 * @dev ERC721A subclass with convenience query functions.
 */
abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable {
    /**
     * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting.
     *
     * If the `tokenId` is out of bounds:
     *   - `addr` = `address(0)`
     *   - `startTimestamp` = `0`
     *   - `burned` = `false`
     *
     * If the `tokenId` is burned:
     *   - `addr` = `<Address of owner before token was burned>`
     *   - `startTimestamp` = `<Timestamp when token was burned>`
     *   - `burned = `true`
     *
     * Otherwise:
     *   - `addr` = `<Address of owner>`
     *   - `startTimestamp` = `<Timestamp of start of ownership>`
     *   - `burned = `false`
     */
    function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) {
        TokenOwnership memory ownership;
        if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) {
            return ownership;
        }
        ownership = _ownershipAt(tokenId);
        if (ownership.burned) {
            return ownership;
        }
        return _ownershipOf(tokenId);
    }

    /**
     * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order.
     * See {ERC721AQueryable-explicitOwnershipOf}
     */
    function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) {
    unchecked {
        uint256 tokenIdsLength = tokenIds.length;
        TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength);
        for (uint256 i; i != tokenIdsLength; ++i) {
            ownerships[i] = explicitOwnershipOf(tokenIds[i]);
        }
        return ownerships;
    }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`,
     * in the range [`start`, `stop`)
     * (i.e. `start <= tokenId < stop`).
     *
     * This function allows for tokens to be queried if the collection
     * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}.
     *
     * Requirements:
     *
     * - `start` < `stop`
     */
    function tokensOfOwnerIn(
        address owner,
        uint256 start,
        uint256 stop
    ) external view override returns (uint256[] memory) {
    unchecked {
        if (start >= stop) revert InvalidQueryRange();
        uint256 tokenIdsIdx;
        uint256 stopLimit = _nextTokenId();
        // Set `start = max(start, _startTokenId())`.
        if (start < _startTokenId()) {
            start = _startTokenId();
        }
        // Set `stop = min(stop, stopLimit)`.
        if (stop > stopLimit) {
            stop = stopLimit;
        }
        uint256 tokenIdsMaxLength = balanceOf(owner);
        // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`,
        // to cater for cases where `balanceOf(owner)` is too big.
        if (start < stop) {
            uint256 rangeLength = stop - start;
            if (rangeLength < tokenIdsMaxLength) {
                tokenIdsMaxLength = rangeLength;
            }
        } else {
            tokenIdsMaxLength = 0;
        }
        uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength);
        if (tokenIdsMaxLength == 0) {
            return tokenIds;
        }
        // We need to call `explicitOwnershipOf(start)`,
        // because the slot at `start` may not be initialized.
        TokenOwnership memory ownership = explicitOwnershipOf(start);
        address currOwnershipAddr;
        // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`.
        // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range.
        if (!ownership.burned) {
            currOwnershipAddr = ownership.addr;
        }
        for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) {
            ownership = _ownershipAt(i);
            if (ownership.burned) {
                continue;
            }
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                tokenIds[tokenIdsIdx++] = i;
            }
        }
        // Downsize the array to fit.
        assembly {
            mstore(tokenIds, tokenIdsIdx)
        }
        return tokenIds;
    }
    }

    /**
     * @dev Returns an array of token IDs owned by `owner`.
     *
     * This function scans the ownership mapping and is O(totalSupply) in complexity.
     * It is meant to be called off-chain.
     *
     * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into
     * multiple smaller scans if the collection is large enough to cause
     * an out-of-gas error (10K pfp collections should be fine).
     */
    function tokensOfOwner(address owner) external view override returns (uint256[] memory) {
    unchecked {
        uint256 tokenIdsIdx;
        address currOwnershipAddr;
        uint256 tokenIdsLength = balanceOf(owner);
        uint256[] memory tokenIds = new uint256[](tokenIdsLength);
        TokenOwnership memory ownership;
        for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) {
            ownership = _ownershipAt(i);
            if (ownership.burned) {
                continue;
            }
            if (ownership.addr != address(0)) {
                currOwnershipAddr = ownership.addr;
            }
            if (currOwnershipAddr == owner) {
                tokenIds[tokenIdsIdx++] = i;
            }
        }
        return tokenIds;
    }
    }
}


pragma solidity ^0.8.4;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex;
                // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        return _values(set._inner);
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        assembly {
            result := store
        }

        return result;
    }
}

pragma solidity ^0.8.4;

contract BDigiDaigaku is ERC721AQueryable, ERC721ABurnable, Ownable {
    using EnumerableSet for EnumerableSet.UintSet;

    uint256 public constant MAX_SUPPLY = 777;

    uint256 public maxByWallet = 2;
    mapping(address => uint256) public mintedByWallet;
    mapping(address => uint256) public walletWhitelist;

    // 0:close | 1:whitelist | 2:open
    uint8 public saleState = 0;

    bool public collectMarketing = true;

    //baseURI
    string public baseURI;

    //uriSuffix
    string public uriSuffix;

    constructor(
        string memory name,
        string memory symbol,
        string memory baseURI_,
        string memory uriSuffix_
    ) ERC721A(name, symbol) {
        baseURI = baseURI_;
        uriSuffix = uriSuffix_;
    }

    uint256 public MINT_PRICE = .005 ether;
    uint256 public FREE_MINT_UNTIL = 333;

    /******************** PUBLIC ********************/

    function mint(uint256 amount) external payable {
        require(saleState != 0, "Cant mint yet");
        require(msg.sender == tx.origin, "not allowed");
        require(amount + _totalMinted()  <= MAX_SUPPLY, "Exceed MAX_SUPPLY");
        require(amount > 0, "Amount can't be 0");

        if(saleState == 1) {
            require(amount + mintedByWallet[msg.sender] <= walletWhitelist[msg.sender], "Exceed whitelist mint for this wallet");
            mintedByWallet[msg.sender] += amount;
            _safeMint(msg.sender, amount);
        } else if(saleState == 2) {
            require(amount + mintedByWallet[msg.sender] <= (maxByWallet + walletWhitelist[msg.sender]), "Exceed maxByWallet");
            if (collectMarketing) {
                if(FREE_MINT_UNTIL < _totalMinted()) {
                    require(amount * MINT_PRICE <= msg.value, "Invalid payment amount");
                }
            }



            mintedByWallet[msg.sender] += amount;
            _safeMint(msg.sender, amount);            
        }
    }

    /******************** OVERRIDES ********************/

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

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

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

        if (bytes(baseURI).length == 0) {
            return _toString(tokenId);
        }

        return string(abi.encodePacked(baseURI, _toString(tokenId), uriSuffix));
    }

    /******************** OWNER ********************/

    /// @notice Set baseURI.
    /// @param newBaseURI New baseURI.
    /// @param newUriSuffix New uriSuffix.
    function setBaseURI(string memory newBaseURI, string memory newUriSuffix) external onlyOwner {
        baseURI = newBaseURI;
        uriSuffix = newUriSuffix;
    }

    /// @notice Set saleState.
    /// @param newSaleState New sale state.
    function setSaleState(uint8 newSaleState) external onlyOwner {
        saleState = newSaleState;
    }

    /// @notice Set collectMarketing.
    /// @param newCollectMarketing New collect marketing flag.
    function setCollectMarketing(bool newCollectMarketing) external onlyOwner {
        collectMarketing = newCollectMarketing;
    }

    /// @notice Set maxByWallet.
    /// @param newMaxByWallet New max by wallet
    function setMaxByWallet(uint256 newMaxByWallet) external onlyOwner {
        maxByWallet = newMaxByWallet;
    }

    /******************** ALPHA MINT ********************/

    function alphaMint(address[] calldata addresses, uint256[] calldata count) external onlyOwner {
        require(saleState == 0, "sale is open!");
        require(addresses.length == count.length, "mismatching lengths!");

        for (uint256 i; i < addresses.length; i++) {
            _safeMint(addresses[i], count[i]);
        }

        require(_totalMinted() <= MAX_SUPPLY, "Exceed MAX_SUPPLY");
    }

    function setWhitelist(address[] calldata addresses, uint256[] calldata count) external onlyOwner {
        require(saleState == 0, "sale is open!");

        require(addresses.length == count.length, "mismatching lengths!");

        for (uint256 i; i < addresses.length; i++) {
            walletWhitelist[addresses[i]]=count[i];
        }
    }


    function withdraw() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseURI_","type":"string"},{"internalType":"string","name":"uriSuffix_","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"FREE_MINT_UNTIL","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"count","type":"uint256[]"}],"name":"alphaMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"collectMarketing","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxByWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedByWallet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"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":"newBaseURI","type":"string"},{"internalType":"string","name":"newUriSuffix","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"newCollectMarketing","type":"bool"}],"name":"setCollectMarketing","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMaxByWallet","type":"uint256"}],"name":"setMaxByWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"newSaleState","type":"uint8"}],"name":"setSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"},{"internalType":"uint256[]","name":"count","type":"uint256[]"}],"name":"setWhitelist","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":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"walletWhitelist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260026009556000600c60006101000a81548160ff021916908360ff1602179055506001600c60016101000a81548160ff0219169083151502179055506611c37937e08000600f5561014d6010553480156200005e57600080fd5b5060405162004efc38038062004efc833981810160405281019062000084919062000331565b838381600290805190602001906200009e92919062000203565b508060039080519060200190620000b792919062000203565b50620000c86200012c60201b60201c565b6000819055505050620000f0620000e46200013560201b60201c565b6200013d60201b60201c565b81600d90805190602001906200010892919062000203565b5080600e90805190602001906200012192919062000203565b5050505050620005a3565b60006001905090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021190620004b4565b90600052602060002090601f01602090048101928262000235576000855562000281565b82601f106200025057805160ff191683800117855562000281565b8280016001018555821562000281579182015b828111156200028057825182559160200191906001019062000263565b5b50905062000290919062000294565b5090565b5b80821115620002af57600081600090555060010162000295565b5090565b6000620002ca620002c48462000448565b6200041f565b905082815260208101848484011115620002e957620002e862000583565b5b620002f68482856200047e565b509392505050565b600082601f8301126200031657620003156200057e565b5b815162000328848260208601620002b3565b91505092915050565b600080600080608085870312156200034e576200034d6200058d565b5b600085015167ffffffffffffffff8111156200036f576200036e62000588565b5b6200037d87828801620002fe565b945050602085015167ffffffffffffffff811115620003a157620003a062000588565b5b620003af87828801620002fe565b935050604085015167ffffffffffffffff811115620003d357620003d262000588565b5b620003e187828801620002fe565b925050606085015167ffffffffffffffff81111562000405576200040462000588565b5b6200041387828801620002fe565b91505092959194509250565b60006200042b6200043e565b9050620004398282620004ea565b919050565b6000604051905090565b600067ffffffffffffffff8211156200046657620004656200054f565b5b620004718262000592565b9050602081019050919050565b60005b838110156200049e57808201518184015260208101905062000481565b83811115620004ae576000848401525b50505050565b60006002820490506001821680620004cd57607f821691505b60208210811415620004e457620004e362000520565b5b50919050565b620004f58262000592565b810181811067ffffffffffffffff821117156200051757620005166200054f565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b61494980620005b36000396000f3fe60806040526004361061023b5760003560e01c80636790a9de1161012e578063a22cb465116100ab578063c87b56dd1161006f578063c87b56dd1461088a578063e985e9c5146108c7578063f013e0e114610904578063f09a03c01461092d578063f2fde38b146109565761023b565b8063a22cb465146107a5578063b88d4fde146107ce578063b974f633146107f7578063c002d23d14610822578063c23dc68f1461084d5761023b565b80638da5cb5b116100f25780638da5cb5b146106cb5780639434b805146106f657806395d89b411461072157806399a2557a1461074c578063a0712d68146107895761023b565b80636790a9de146105e65780636c0360eb1461060f57806370a082311461063a578063715018a6146106775780638462151c1461068e5761023b565b806334ecc70a116101bc5780635503a0e8116101805780635503a0e8146104ed5780635a67de07146105185780635bbb217714610541578063603f4d521461057e5780636352211e146105a95761023b565b806334ecc70a1461041c5780633ccfd60b1461044757806342842e0e1461045e57806342966c68146104875780634a81d9dd146104b05761023b565b806317d985141161020357806317d985141461034b57806318160ddd1461037457806323b872dd1461039f5780632e067421146103c857806332cb6b0c146103f15761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780630d7581111461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613975565b61097f565b6040516102749190614008565b60405180910390f35b34801561028957600080fd5b50610292610a11565b60405161029f9190614023565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613a47565b610aa3565b6040516102dc9190613f5d565b60405180910390f35b3480156102f157600080fd5b5061030c600480360381019061030791906137eb565b610b1f565b005b34801561031a57600080fd5b5061033560048036038101906103309190613668565b610cc6565b60405161034291906141c0565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d9190613948565b610cde565b005b34801561038057600080fd5b50610389610d77565b60405161039691906141c0565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c191906136d5565b610d8e565b005b3480156103d457600080fd5b506103ef60048036038101906103ea9190613a47565b610d9e565b005b3480156103fd57600080fd5b50610406610e24565b60405161041391906141c0565b60405180910390f35b34801561042857600080fd5b50610431610e2a565b60405161043e91906141c0565b60405180910390f35b34801561045357600080fd5b5061045c610e30565b005b34801561046a57600080fd5b50610485600480360381019061048091906136d5565b610efc565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613a47565b610f1c565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190613668565b610f2a565b6040516104e491906141c0565b60405180910390f35b3480156104f957600080fd5b50610502610f42565b60405161050f9190614023565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190613a74565b610fd0565b005b34801561054d57600080fd5b50610568600480360381019061056391906138ff565b61106a565b6040516105759190613fc4565b60405180910390f35b34801561058a57600080fd5b5061059361112b565b6040516105a091906141db565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190613a47565b61113e565b6040516105dd9190613f5d565b60405180910390f35b3480156105f257600080fd5b5061060d600480360381019061060891906139cf565b611150565b005b34801561061b57600080fd5b506106246111fe565b6040516106319190614023565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c9190613668565b61128c565b60405161066e91906141c0565b60405180910390f35b34801561068357600080fd5b5061068c611345565b005b34801561069a57600080fd5b506106b560048036038101906106b09190613668565b6113cd565b6040516106c29190613fe6565b60405180910390f35b3480156106d757600080fd5b506106e0611517565b6040516106ed9190613f5d565b60405180910390f35b34801561070257600080fd5b5061070b611541565b6040516107189190614008565b60405180910390f35b34801561072d57600080fd5b50610736611554565b6040516107439190614023565b60405180910390f35b34801561075857600080fd5b50610773600480360381019061076e919061382b565b6115e6565b6040516107809190613fe6565b60405180910390f35b6107a3600480360381019061079e9190613a47565b6117fa565b005b3480156107b157600080fd5b506107cc60048036038101906107c791906137ab565b611c75565b005b3480156107da57600080fd5b506107f560048036038101906107f09190613728565b611ded565b005b34801561080357600080fd5b5061080c611e60565b60405161081991906141c0565b60405180910390f35b34801561082e57600080fd5b50610837611e66565b60405161084491906141c0565b60405180910390f35b34801561085957600080fd5b50610874600480360381019061086f9190613a47565b611e6c565b60405161088191906141a5565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac9190613a47565b611ed6565b6040516108be9190614023565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190613695565b611f74565b6040516108fb9190614008565b60405180910390f35b34801561091057600080fd5b5061092b6004803603810190610926919061387e565b612008565b005b34801561093957600080fd5b50610954600480360381019061094f919061387e565b6121cd565b005b34801561096257600080fd5b5061097d60048036038101906109789190613668565b6123a4565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109da57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a0a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610a20906144fa565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4c906144fa565b8015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b5050505050905090565b6000610aae8261249c565b610ae4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b2a826124fb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b92576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bb16125c9565b73ffffffffffffffffffffffffffffffffffffffff1614610c1457610bdd81610bd86125c9565b611f74565b610c13576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600a6020528060005260406000206000915090505481565b610ce66125d1565b73ffffffffffffffffffffffffffffffffffffffff16610d04611517565b73ffffffffffffffffffffffffffffffffffffffff1614610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5190614165565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b6000610d816125d9565b6001546000540303905090565b610d998383836125e2565b505050565b610da66125d1565b73ffffffffffffffffffffffffffffffffffffffff16610dc4611517565b73ffffffffffffffffffffffffffffffffffffffff1614610e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1190614165565b60405180910390fd5b8060098190555050565b61030981565b60095481565b610e386125d1565b73ffffffffffffffffffffffffffffffffffffffff16610e56611517565b73ffffffffffffffffffffffffffffffffffffffff1614610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea390614165565b60405180910390fd5b610eb4611517565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ef9573d6000803e3d6000fd5b50565b610f1783838360405180602001604052806000815250611ded565b505050565b610f2781600161298c565b50565b600b6020528060005260406000206000915090505481565b600e8054610f4f906144fa565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7b906144fa565b8015610fc85780601f10610f9d57610100808354040283529160200191610fc8565b820191906000526020600020905b815481529060010190602001808311610fab57829003601f168201915b505050505081565b610fd86125d1565b73ffffffffffffffffffffffffffffffffffffffff16610ff6611517565b73ffffffffffffffffffffffffffffffffffffffff161461104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104390614165565b60405180910390fd5b80600c60006101000a81548160ff021916908360ff16021790555050565b606060008251905060008167ffffffffffffffff81111561108e5761108d614633565b5b6040519080825280602002602001820160405280156110c757816020015b6110b46132da565b8152602001906001900390816110ac5790505b50905060005b828114611120576110f78582815181106110ea576110e9614604565b5b6020026020010151611e6c565b82828151811061110a57611109614604565b5b60200260200101819052508060010190506110cd565b508092505050919050565b600c60009054906101000a900460ff1681565b6000611149826124fb565b9050919050565b6111586125d1565b73ffffffffffffffffffffffffffffffffffffffff16611176611517565b73ffffffffffffffffffffffffffffffffffffffff16146111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c390614165565b60405180910390fd5b81600d90805190602001906111e292919061331d565b5080600e90805190602001906111f992919061331d565b505050565b600d805461120b906144fa565b80601f0160208091040260200160405190810160405280929190818152602001828054611237906144fa565b80156112845780601f1061125957610100808354040283529160200191611284565b820191906000526020600020905b81548152906001019060200180831161126757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112f4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61134d6125d1565b73ffffffffffffffffffffffffffffffffffffffff1661136b611517565b73ffffffffffffffffffffffffffffffffffffffff16146113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890614165565b60405180910390fd5b6113cb6000612c64565b565b606060008060006113dd8561128c565b905060008167ffffffffffffffff8111156113fb576113fa614633565b5b6040519080825280602002602001820160405280156114295781602001602082028036833780820191505090505b5090506114346132da565b600061143e6125d9565b90505b8386146115095761145181612d2a565b9150816040015115611462576114fe565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146114a257816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156114fd57808387806001019850815181106114f0576114ef614604565b5b6020026020010181815250505b5b806001019050611441565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60019054906101000a900460ff1681565b606060038054611563906144fa565b80601f016020809104026020016040519081016040528092919081815260200182805461158f906144fa565b80156115dc5780601f106115b1576101008083540402835291602001916115dc565b820191906000526020600020905b8154815290600101906020018083116115bf57829003601f168201915b5050505050905090565b6060818310611621576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061162c612d55565b90506116366125d9565b851015611648576116456125d9565b94505b80841115611654578093505b600061165f8761128c565b90508486101561168257600086860390508181101561167c578091505b50611687565b600090505b60008167ffffffffffffffff8111156116a3576116a2614633565b5b6040519080825280602002602001820160405280156116d15781602001602082028036833780820191505090505b50905060008214156116e957809450505050506117f3565b60006116f488611e6c565b90506000816040015161170957816000015190505b60008990505b88811415801561171f5750848714155b156117e55761172d81612d2a565b925082604001511561173e576117da565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461177e57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117d957808488806001019950815181106117cc576117cb614604565b5b6020026020010181815250505b5b80600101905061170f565b508583528296505050505050505b9392505050565b6000600c60009054906101000a900460ff1660ff161415611850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184790614105565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b5906140e5565b60405180910390fd5b6103096118c9612d5e565b826118d49190614373565b1115611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614185565b60405180910390fd5b60008111611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90614125565b60405180910390fd5b6001600c60009054906101000a900460ff1660ff161415611aa457600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826119fe9190614373565b1115611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3690614145565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a8e9190614373565b92505081905550611a9f3382612d71565b611c72565b6002600c60009054906101000a900460ff1660ff161415611c7157600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600954611b0c9190614373565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611b579190614373565b1115611b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8f90614065565b60405180910390fd5b600c60019054906101000a900460ff1615611c1057611bb5612d5e565b6010541015611c0f5734600f5482611bcd91906143c9565b1115611c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c05906140a5565b60405180910390fd5b5b5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c5f9190614373565b92505081905550611c703382612d71565b5b5b50565b611c7d6125c9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ce2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611cef6125c9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d9c6125c9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611de19190614008565b60405180910390a35050565b611df88484846125e2565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e5a57611e2384848484612d8f565b611e59576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60105481565b600f5481565b611e746132da565b611e7c6132da565b611e846125d9565b831080611e985750611e94612d55565b8310155b15611ea65780915050611ed1565b611eaf83612d2a565b9050806040015115611ec45780915050611ed1565b611ecd83612eef565b9150505b919050565b6060611ee18261249c565b611f17576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600d8054611f26906144fa565b90501415611f3e57611f3782612f0f565b9050611f6f565b600d611f4983612f0f565b600e604051602001611f5d93929190613f2c565b60405160208183030381529060405290505b919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120106125d1565b73ffffffffffffffffffffffffffffffffffffffff1661202e611517565b73ffffffffffffffffffffffffffffffffffffffff1614612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207b90614165565b60405180910390fd5b6000600c60009054906101000a900460ff1660ff16146120d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d090614045565b60405180910390fd5b818190508484905014612121576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612118906140c5565b60405180910390fd5b60005b848490508110156121c65782828281811061214257612141614604565b5b90506020020135600b60008787858181106121605761215f614604565b5b90506020020160208101906121759190613668565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806121be9061455d565b915050612124565b5050505050565b6121d56125d1565b73ffffffffffffffffffffffffffffffffffffffff166121f3611517565b73ffffffffffffffffffffffffffffffffffffffff1614612249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224090614165565b60405180910390fd5b6000600c60009054906101000a900460ff1660ff161461229e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229590614045565b60405180910390fd5b8181905084849050146122e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dd906140c5565b60405180910390fd5b60005b848490508110156123515761233e85858381811061230a57612309614604565b5b905060200201602081019061231f9190613668565b84848481811061233257612331614604565b5b90506020020135612d71565b80806123499061455d565b9150506122e9565b5061030961235d612d5e565b111561239e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239590614185565b60405180910390fd5b50505050565b6123ac6125d1565b73ffffffffffffffffffffffffffffffffffffffff166123ca611517565b73ffffffffffffffffffffffffffffffffffffffff1614612420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241790614165565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248790614085565b60405180910390fd5b61249981612c64565b50565b6000816124a76125d9565b111580156124b6575060005482105b80156124f4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061250a6125d9565b11612592576000548110156125915760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561258f575b600081141561258557600460008360019003935083815260200190815260200160002054905061255a565b80925050506125c4565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b60006125ed826124fb565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612654576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166126756125c9565b73ffffffffffffffffffffffffffffffffffffffff1614806126a457506126a38561269e6125c9565b611f74565b5b806126e957506126b26125c9565b73ffffffffffffffffffffffffffffffffffffffff166126d184610aa3565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612722576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612789576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127968585856001612f69565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61289386612f6f565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561291d57600060018401905060006004600083815260200190815260200160002054141561291b57600054811461291a578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129858585856001612f79565b5050505050565b6000612997836124fb565b905060008190508215612a745760008173ffffffffffffffffffffffffffffffffffffffff166129c56125c9565b73ffffffffffffffffffffffffffffffffffffffff1614806129f457506129f3826129ee6125c9565b611f74565b5b80612a395750612a026125c9565b73ffffffffffffffffffffffffffffffffffffffff16612a2186610aa3565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612a72576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b612a82816000866001612f69565b6006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160806001901b03600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b612b5784612f6f565b171717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612be2576000600185019050600060046000838152602001908152602001600020541415612be0576000548114612bdf578260046000838152602001908152602001600020819055505b5b505b83600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c4c816000866001612f79565b60016000815480929190600101919050555050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d326132da565b612d4e6004600084815260200190815260200160002054612f7f565b9050919050565b60008054905090565b6000612d686125d9565b60005403905090565b612d8b82826040518060200160405280600081525061301b565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612db56125c9565b8786866040518563ffffffff1660e01b8152600401612dd79493929190613f78565b602060405180830381600087803b158015612df157600080fd5b505af1925050508015612e2257506040513d601f19601f82011682018060405250810190612e1f91906139a2565b60015b612e9c573d8060008114612e52576040519150601f19603f3d011682016040523d82523d6000602084013e612e57565b606091505b50600081511415612e94576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612ef76132da565b612f08612f03836124fb565b612f7f565b9050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015612f5557600183039250600a81066030018353600a81049050612f35565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b612f876132da565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613088576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156130c3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130d06000858386612f69565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1613135600185146132d0565b901b60a042901b61314586612f6f565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14613249575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131f96000878480600101955087612d8f565b61322f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061318a57826000541461324457600080fd5b6132b4565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061324a575b8160008190555050506132ca6000858386612f79565b50505050565b6000819050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b828054613329906144fa565b90600052602060002090601f01602090048101928261334b5760008555613392565b82601f1061336457805160ff1916838001178555613392565b82800160010185558215613392579182015b82811115613391578251825591602001919060010190613376565b5b50905061339f91906133a3565b5090565b5b808211156133bc5760008160009055506001016133a4565b5090565b60006133d36133ce8461421b565b6141f6565b905080838252602082019050828560208602820111156133f6576133f561466c565b5b60005b85811015613426578161340c888261363e565b8452602084019350602083019250506001810190506133f9565b5050509392505050565b600061344361343e84614247565b6141f6565b90508281526020810184848401111561345f5761345e614671565b5b61346a8482856144b8565b509392505050565b600061348561348084614278565b6141f6565b9050828152602081018484840111156134a1576134a0614671565b5b6134ac8482856144b8565b509392505050565b6000813590506134c3816148a0565b92915050565b60008083601f8401126134df576134de614667565b5b8235905067ffffffffffffffff8111156134fc576134fb614662565b5b6020830191508360208202830111156135185761351761466c565b5b9250929050565b60008083601f84011261353557613534614667565b5b8235905067ffffffffffffffff81111561355257613551614662565b5b60208301915083602082028301111561356e5761356d61466c565b5b9250929050565b600082601f83011261358a57613589614667565b5b813561359a8482602086016133c0565b91505092915050565b6000813590506135b2816148b7565b92915050565b6000813590506135c7816148ce565b92915050565b6000815190506135dc816148ce565b92915050565b600082601f8301126135f7576135f6614667565b5b8135613607848260208601613430565b91505092915050565b600082601f83011261362557613624614667565b5b8135613635848260208601613472565b91505092915050565b60008135905061364d816148e5565b92915050565b600081359050613662816148fc565b92915050565b60006020828403121561367e5761367d61467b565b5b600061368c848285016134b4565b91505092915050565b600080604083850312156136ac576136ab61467b565b5b60006136ba858286016134b4565b92505060206136cb858286016134b4565b9150509250929050565b6000806000606084860312156136ee576136ed61467b565b5b60006136fc868287016134b4565b935050602061370d868287016134b4565b925050604061371e8682870161363e565b9150509250925092565b600080600080608085870312156137425761374161467b565b5b6000613750878288016134b4565b9450506020613761878288016134b4565b93505060406137728782880161363e565b925050606085013567ffffffffffffffff81111561379357613792614676565b5b61379f878288016135e2565b91505092959194509250565b600080604083850312156137c2576137c161467b565b5b60006137d0858286016134b4565b92505060206137e1858286016135a3565b9150509250929050565b600080604083850312156138025761380161467b565b5b6000613810858286016134b4565b92505060206138218582860161363e565b9150509250929050565b6000806000606084860312156138445761384361467b565b5b6000613852868287016134b4565b93505060206138638682870161363e565b92505060406138748682870161363e565b9150509250925092565b600080600080604085870312156138985761389761467b565b5b600085013567ffffffffffffffff8111156138b6576138b5614676565b5b6138c2878288016134c9565b9450945050602085013567ffffffffffffffff8111156138e5576138e4614676565b5b6138f18782880161351f565b925092505092959194509250565b6000602082840312156139155761391461467b565b5b600082013567ffffffffffffffff81111561393357613932614676565b5b61393f84828501613575565b91505092915050565b60006020828403121561395e5761395d61467b565b5b600061396c848285016135a3565b91505092915050565b60006020828403121561398b5761398a61467b565b5b6000613999848285016135b8565b91505092915050565b6000602082840312156139b8576139b761467b565b5b60006139c6848285016135cd565b91505092915050565b600080604083850312156139e6576139e561467b565b5b600083013567ffffffffffffffff811115613a0457613a03614676565b5b613a1085828601613610565b925050602083013567ffffffffffffffff811115613a3157613a30614676565b5b613a3d85828601613610565b9150509250929050565b600060208284031215613a5d57613a5c61467b565b5b6000613a6b8482850161363e565b91505092915050565b600060208284031215613a8a57613a8961467b565b5b6000613a9884828501613653565b91505092915050565b6000613aad8383613e6c565b60608301905092915050565b6000613ac58383613ef0565b60208301905092915050565b613ada81614423565b82525050565b613ae981614423565b82525050565b6000613afa826142de565b613b048185614324565b9350613b0f836142a9565b8060005b83811015613b40578151613b278882613aa1565b9750613b328361430a565b925050600181019050613b13565b5085935050505092915050565b6000613b58826142e9565b613b628185614335565b9350613b6d836142b9565b8060005b83811015613b9e578151613b858882613ab9565b9750613b9083614317565b925050600181019050613b71565b5085935050505092915050565b613bb481614435565b82525050565b613bc381614435565b82525050565b6000613bd4826142f4565b613bde8185614346565b9350613bee8185602086016144c7565b613bf781614680565b840191505092915050565b6000613c0d826142ff565b613c178185614357565b9350613c278185602086016144c7565b613c3081614680565b840191505092915050565b6000613c46826142ff565b613c508185614368565b9350613c608185602086016144c7565b80840191505092915050565b60008154613c79816144fa565b613c838186614368565b94506001821660008114613c9e5760018114613caf57613ce2565b60ff19831686528186019350613ce2565b613cb8856142c9565b60005b83811015613cda57815481890152600182019150602081019050613cbb565b838801955050505b50505092915050565b6000613cf8600d83614357565b9150613d0382614691565b602082019050919050565b6000613d1b601283614357565b9150613d26826146ba565b602082019050919050565b6000613d3e602683614357565b9150613d49826146e3565b604082019050919050565b6000613d61601683614357565b9150613d6c82614732565b602082019050919050565b6000613d84601483614357565b9150613d8f8261475b565b602082019050919050565b6000613da7600b83614357565b9150613db282614784565b602082019050919050565b6000613dca600d83614357565b9150613dd5826147ad565b602082019050919050565b6000613ded601183614357565b9150613df8826147d6565b602082019050919050565b6000613e10602583614357565b9150613e1b826147ff565b604082019050919050565b6000613e33602083614357565b9150613e3e8261484e565b602082019050919050565b6000613e56601183614357565b9150613e6182614877565b602082019050919050565b606082016000820151613e826000850182613ad1565b506020820151613e956020850182613f0e565b506040820151613ea86040850182613bab565b50505050565b606082016000820151613ec46000850182613ad1565b506020820151613ed76020850182613f0e565b506040820151613eea6040850182613bab565b50505050565b613ef98161448d565b82525050565b613f088161448d565b82525050565b613f1781614497565b82525050565b613f26816144ab565b82525050565b6000613f388286613c6c565b9150613f448285613c3b565b9150613f508284613c6c565b9150819050949350505050565b6000602082019050613f726000830184613ae0565b92915050565b6000608082019050613f8d6000830187613ae0565b613f9a6020830186613ae0565b613fa76040830185613eff565b8181036060830152613fb98184613bc9565b905095945050505050565b60006020820190508181036000830152613fde8184613aef565b905092915050565b600060208201905081810360008301526140008184613b4d565b905092915050565b600060208201905061401d6000830184613bba565b92915050565b6000602082019050818103600083015261403d8184613c02565b905092915050565b6000602082019050818103600083015261405e81613ceb565b9050919050565b6000602082019050818103600083015261407e81613d0e565b9050919050565b6000602082019050818103600083015261409e81613d31565b9050919050565b600060208201905081810360008301526140be81613d54565b9050919050565b600060208201905081810360008301526140de81613d77565b9050919050565b600060208201905081810360008301526140fe81613d9a565b9050919050565b6000602082019050818103600083015261411e81613dbd565b9050919050565b6000602082019050818103600083015261413e81613de0565b9050919050565b6000602082019050818103600083015261415e81613e03565b9050919050565b6000602082019050818103600083015261417e81613e26565b9050919050565b6000602082019050818103600083015261419e81613e49565b9050919050565b60006060820190506141ba6000830184613eae565b92915050565b60006020820190506141d56000830184613eff565b92915050565b60006020820190506141f06000830184613f1d565b92915050565b6000614200614211565b905061420c828261452c565b919050565b6000604051905090565b600067ffffffffffffffff82111561423657614235614633565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561426257614261614633565b5b61426b82614680565b9050602081019050919050565b600067ffffffffffffffff82111561429357614292614633565b5b61429c82614680565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061437e8261448d565b91506143898361448d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143be576143bd6145a6565b5b828201905092915050565b60006143d48261448d565b91506143df8361448d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614418576144176145a6565b5b828202905092915050565b600061442e8261446d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156144e55780820151818401526020810190506144ca565b838111156144f4576000848401525b50505050565b6000600282049050600182168061451257607f821691505b60208210811415614526576145256145d5565b5b50919050565b61453582614680565b810181811067ffffffffffffffff8211171561455457614553614633565b5b80604052505050565b60006145688261448d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561459b5761459a6145a6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f73616c65206973206f70656e2100000000000000000000000000000000000000600082015250565b7f457863656564206d6178427957616c6c65740000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207061796d656e7420616d6f756e7400000000000000000000600082015250565b7f6d69736d61746368696e67206c656e6774687321000000000000000000000000600082015250565b7f6e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f43616e74206d696e742079657400000000000000000000000000000000000000600082015250565b7f416d6f756e742063616e27742062652030000000000000000000000000000000600082015250565b7f4578636565642077686974656c697374206d696e7420666f722074686973207760008201527f616c6c6574000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f457863656564204d41585f535550504c59000000000000000000000000000000600082015250565b6148a981614423565b81146148b457600080fd5b50565b6148c081614435565b81146148cb57600080fd5b50565b6148d781614441565b81146148e257600080fd5b50565b6148ee8161448d565b81146148f957600080fd5b50565b614905816144ab565b811461491057600080fd5b5056fea2646970667358221220921306a632746db7b45b12d600de670eb72d3862cc0451faf1dc63d4772d498864736f6c63430008070033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000012426c75727279204469676944616967616b750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c424469676944616967616b7500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d52364b5343487a4338336a3159745966515442537031475657516d52724351337670596f674b4d52706f42762f0000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061023b5760003560e01c80636790a9de1161012e578063a22cb465116100ab578063c87b56dd1161006f578063c87b56dd1461088a578063e985e9c5146108c7578063f013e0e114610904578063f09a03c01461092d578063f2fde38b146109565761023b565b8063a22cb465146107a5578063b88d4fde146107ce578063b974f633146107f7578063c002d23d14610822578063c23dc68f1461084d5761023b565b80638da5cb5b116100f25780638da5cb5b146106cb5780639434b805146106f657806395d89b411461072157806399a2557a1461074c578063a0712d68146107895761023b565b80636790a9de146105e65780636c0360eb1461060f57806370a082311461063a578063715018a6146106775780638462151c1461068e5761023b565b806334ecc70a116101bc5780635503a0e8116101805780635503a0e8146104ed5780635a67de07146105185780635bbb217714610541578063603f4d521461057e5780636352211e146105a95761023b565b806334ecc70a1461041c5780633ccfd60b1461044757806342842e0e1461045e57806342966c68146104875780634a81d9dd146104b05761023b565b806317d985141161020357806317d985141461034b57806318160ddd1461037457806323b872dd1461039f5780632e067421146103c857806332cb6b0c146103f15761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e55780630d7581111461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190613975565b61097f565b6040516102749190614008565b60405180910390f35b34801561028957600080fd5b50610292610a11565b60405161029f9190614023565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca9190613a47565b610aa3565b6040516102dc9190613f5d565b60405180910390f35b3480156102f157600080fd5b5061030c600480360381019061030791906137eb565b610b1f565b005b34801561031a57600080fd5b5061033560048036038101906103309190613668565b610cc6565b60405161034291906141c0565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d9190613948565b610cde565b005b34801561038057600080fd5b50610389610d77565b60405161039691906141c0565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c191906136d5565b610d8e565b005b3480156103d457600080fd5b506103ef60048036038101906103ea9190613a47565b610d9e565b005b3480156103fd57600080fd5b50610406610e24565b60405161041391906141c0565b60405180910390f35b34801561042857600080fd5b50610431610e2a565b60405161043e91906141c0565b60405180910390f35b34801561045357600080fd5b5061045c610e30565b005b34801561046a57600080fd5b50610485600480360381019061048091906136d5565b610efc565b005b34801561049357600080fd5b506104ae60048036038101906104a99190613a47565b610f1c565b005b3480156104bc57600080fd5b506104d760048036038101906104d29190613668565b610f2a565b6040516104e491906141c0565b60405180910390f35b3480156104f957600080fd5b50610502610f42565b60405161050f9190614023565b60405180910390f35b34801561052457600080fd5b5061053f600480360381019061053a9190613a74565b610fd0565b005b34801561054d57600080fd5b50610568600480360381019061056391906138ff565b61106a565b6040516105759190613fc4565b60405180910390f35b34801561058a57600080fd5b5061059361112b565b6040516105a091906141db565b60405180910390f35b3480156105b557600080fd5b506105d060048036038101906105cb9190613a47565b61113e565b6040516105dd9190613f5d565b60405180910390f35b3480156105f257600080fd5b5061060d600480360381019061060891906139cf565b611150565b005b34801561061b57600080fd5b506106246111fe565b6040516106319190614023565b60405180910390f35b34801561064657600080fd5b50610661600480360381019061065c9190613668565b61128c565b60405161066e91906141c0565b60405180910390f35b34801561068357600080fd5b5061068c611345565b005b34801561069a57600080fd5b506106b560048036038101906106b09190613668565b6113cd565b6040516106c29190613fe6565b60405180910390f35b3480156106d757600080fd5b506106e0611517565b6040516106ed9190613f5d565b60405180910390f35b34801561070257600080fd5b5061070b611541565b6040516107189190614008565b60405180910390f35b34801561072d57600080fd5b50610736611554565b6040516107439190614023565b60405180910390f35b34801561075857600080fd5b50610773600480360381019061076e919061382b565b6115e6565b6040516107809190613fe6565b60405180910390f35b6107a3600480360381019061079e9190613a47565b6117fa565b005b3480156107b157600080fd5b506107cc60048036038101906107c791906137ab565b611c75565b005b3480156107da57600080fd5b506107f560048036038101906107f09190613728565b611ded565b005b34801561080357600080fd5b5061080c611e60565b60405161081991906141c0565b60405180910390f35b34801561082e57600080fd5b50610837611e66565b60405161084491906141c0565b60405180910390f35b34801561085957600080fd5b50610874600480360381019061086f9190613a47565b611e6c565b60405161088191906141a5565b60405180910390f35b34801561089657600080fd5b506108b160048036038101906108ac9190613a47565b611ed6565b6040516108be9190614023565b60405180910390f35b3480156108d357600080fd5b506108ee60048036038101906108e99190613695565b611f74565b6040516108fb9190614008565b60405180910390f35b34801561091057600080fd5b5061092b6004803603810190610926919061387e565b612008565b005b34801561093957600080fd5b50610954600480360381019061094f919061387e565b6121cd565b005b34801561096257600080fd5b5061097d60048036038101906109789190613668565b6123a4565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109da57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a0a5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610a20906144fa565b80601f0160208091040260200160405190810160405280929190818152602001828054610a4c906144fa565b8015610a995780601f10610a6e57610100808354040283529160200191610a99565b820191906000526020600020905b815481529060010190602001808311610a7c57829003601f168201915b5050505050905090565b6000610aae8261249c565b610ae4576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b2a826124fb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610b92576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610bb16125c9565b73ffffffffffffffffffffffffffffffffffffffff1614610c1457610bdd81610bd86125c9565b611f74565b610c13576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600a6020528060005260406000206000915090505481565b610ce66125d1565b73ffffffffffffffffffffffffffffffffffffffff16610d04611517565b73ffffffffffffffffffffffffffffffffffffffff1614610d5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d5190614165565b60405180910390fd5b80600c60016101000a81548160ff02191690831515021790555050565b6000610d816125d9565b6001546000540303905090565b610d998383836125e2565b505050565b610da66125d1565b73ffffffffffffffffffffffffffffffffffffffff16610dc4611517565b73ffffffffffffffffffffffffffffffffffffffff1614610e1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1190614165565b60405180910390fd5b8060098190555050565b61030981565b60095481565b610e386125d1565b73ffffffffffffffffffffffffffffffffffffffff16610e56611517565b73ffffffffffffffffffffffffffffffffffffffff1614610eac576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ea390614165565b60405180910390fd5b610eb4611517565b73ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610ef9573d6000803e3d6000fd5b50565b610f1783838360405180602001604052806000815250611ded565b505050565b610f2781600161298c565b50565b600b6020528060005260406000206000915090505481565b600e8054610f4f906144fa565b80601f0160208091040260200160405190810160405280929190818152602001828054610f7b906144fa565b8015610fc85780601f10610f9d57610100808354040283529160200191610fc8565b820191906000526020600020905b815481529060010190602001808311610fab57829003601f168201915b505050505081565b610fd86125d1565b73ffffffffffffffffffffffffffffffffffffffff16610ff6611517565b73ffffffffffffffffffffffffffffffffffffffff161461104c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161104390614165565b60405180910390fd5b80600c60006101000a81548160ff021916908360ff16021790555050565b606060008251905060008167ffffffffffffffff81111561108e5761108d614633565b5b6040519080825280602002602001820160405280156110c757816020015b6110b46132da565b8152602001906001900390816110ac5790505b50905060005b828114611120576110f78582815181106110ea576110e9614604565b5b6020026020010151611e6c565b82828151811061110a57611109614604565b5b60200260200101819052508060010190506110cd565b508092505050919050565b600c60009054906101000a900460ff1681565b6000611149826124fb565b9050919050565b6111586125d1565b73ffffffffffffffffffffffffffffffffffffffff16611176611517565b73ffffffffffffffffffffffffffffffffffffffff16146111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c390614165565b60405180910390fd5b81600d90805190602001906111e292919061331d565b5080600e90805190602001906111f992919061331d565b505050565b600d805461120b906144fa565b80601f0160208091040260200160405190810160405280929190818152602001828054611237906144fa565b80156112845780601f1061125957610100808354040283529160200191611284565b820191906000526020600020905b81548152906001019060200180831161126757829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156112f4576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b61134d6125d1565b73ffffffffffffffffffffffffffffffffffffffff1661136b611517565b73ffffffffffffffffffffffffffffffffffffffff16146113c1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b890614165565b60405180910390fd5b6113cb6000612c64565b565b606060008060006113dd8561128c565b905060008167ffffffffffffffff8111156113fb576113fa614633565b5b6040519080825280602002602001820160405280156114295781602001602082028036833780820191505090505b5090506114346132da565b600061143e6125d9565b90505b8386146115095761145181612d2a565b9150816040015115611462576114fe565b600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146114a257816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156114fd57808387806001019850815181106114f0576114ef614604565b5b6020026020010181815250505b5b806001019050611441565b508195505050505050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60019054906101000a900460ff1681565b606060038054611563906144fa565b80601f016020809104026020016040519081016040528092919081815260200182805461158f906144fa565b80156115dc5780601f106115b1576101008083540402835291602001916115dc565b820191906000526020600020905b8154815290600101906020018083116115bf57829003601f168201915b5050505050905090565b6060818310611621576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008061162c612d55565b90506116366125d9565b851015611648576116456125d9565b94505b80841115611654578093505b600061165f8761128c565b90508486101561168257600086860390508181101561167c578091505b50611687565b600090505b60008167ffffffffffffffff8111156116a3576116a2614633565b5b6040519080825280602002602001820160405280156116d15781602001602082028036833780820191505090505b50905060008214156116e957809450505050506117f3565b60006116f488611e6c565b90506000816040015161170957816000015190505b60008990505b88811415801561171f5750848714155b156117e55761172d81612d2a565b925082604001511561173e576117da565b600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff161461177e57826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156117d957808488806001019950815181106117cc576117cb614604565b5b6020026020010181815250505b5b80600101905061170f565b508583528296505050505050505b9392505050565b6000600c60009054906101000a900460ff1660ff161415611850576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184790614105565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146118be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118b5906140e5565b60405180910390fd5b6103096118c9612d5e565b826118d49190614373565b1115611915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190c90614185565b60405180910390fd5b60008111611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f90614125565b60405180910390fd5b6001600c60009054906101000a900460ff1660ff161415611aa457600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054826119fe9190614373565b1115611a3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a3690614145565b60405180910390fd5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a8e9190614373565b92505081905550611a9f3382612d71565b611c72565b6002600c60009054906101000a900460ff1660ff161415611c7157600b60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600954611b0c9190614373565b600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205482611b579190614373565b1115611b98576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b8f90614065565b60405180910390fd5b600c60019054906101000a900460ff1615611c1057611bb5612d5e565b6010541015611c0f5734600f5482611bcd91906143c9565b1115611c0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c05906140a5565b60405180910390fd5b5b5b80600a60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c5f9190614373565b92505081905550611c703382612d71565b5b5b50565b611c7d6125c9565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611ce2576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611cef6125c9565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d9c6125c9565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611de19190614008565b60405180910390a35050565b611df88484846125e2565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611e5a57611e2384848484612d8f565b611e59576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b60105481565b600f5481565b611e746132da565b611e7c6132da565b611e846125d9565b831080611e985750611e94612d55565b8310155b15611ea65780915050611ed1565b611eaf83612d2a565b9050806040015115611ec45780915050611ed1565b611ecd83612eef565b9150505b919050565b6060611ee18261249c565b611f17576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000600d8054611f26906144fa565b90501415611f3e57611f3782612f0f565b9050611f6f565b600d611f4983612f0f565b600e604051602001611f5d93929190613f2c565b60405160208183030381529060405290505b919050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6120106125d1565b73ffffffffffffffffffffffffffffffffffffffff1661202e611517565b73ffffffffffffffffffffffffffffffffffffffff1614612084576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207b90614165565b60405180910390fd5b6000600c60009054906101000a900460ff1660ff16146120d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d090614045565b60405180910390fd5b818190508484905014612121576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612118906140c5565b60405180910390fd5b60005b848490508110156121c65782828281811061214257612141614604565b5b90506020020135600b60008787858181106121605761215f614604565b5b90506020020160208101906121759190613668565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080806121be9061455d565b915050612124565b5050505050565b6121d56125d1565b73ffffffffffffffffffffffffffffffffffffffff166121f3611517565b73ffffffffffffffffffffffffffffffffffffffff1614612249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161224090614165565b60405180910390fd5b6000600c60009054906101000a900460ff1660ff161461229e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229590614045565b60405180910390fd5b8181905084849050146122e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122dd906140c5565b60405180910390fd5b60005b848490508110156123515761233e85858381811061230a57612309614604565b5b905060200201602081019061231f9190613668565b84848481811061233257612331614604565b5b90506020020135612d71565b80806123499061455d565b9150506122e9565b5061030961235d612d5e565b111561239e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161239590614185565b60405180910390fd5b50505050565b6123ac6125d1565b73ffffffffffffffffffffffffffffffffffffffff166123ca611517565b73ffffffffffffffffffffffffffffffffffffffff1614612420576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241790614165565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612490576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161248790614085565b60405180910390fd5b61249981612c64565b50565b6000816124a76125d9565b111580156124b6575060005482105b80156124f4575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b6000808290508061250a6125d9565b11612592576000548110156125915760006004600083815260200190815260200160002054905060007c01000000000000000000000000000000000000000000000000000000008216141561258f575b600081141561258557600460008360019003935083815260200190815260200160002054905061255a565b80925050506125c4565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600033905090565b60006001905090565b60006125ed826124fb565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614612654576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff166126756125c9565b73ffffffffffffffffffffffffffffffffffffffff1614806126a457506126a38561269e6125c9565b611f74565b5b806126e957506126b26125c9565b73ffffffffffffffffffffffffffffffffffffffff166126d184610aa3565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612722576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612789576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6127968585856001612f69565b6006600084815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b61289386612f6f565b1717600460008581526020019081526020016000208190555060007c02000000000000000000000000000000000000000000000000000000008316141561291d57600060018401905060006004600083815260200190815260200160002054141561291b57600054811461291a578260046000838152602001908152602001600020819055505b5b505b828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129858585856001612f79565b5050505050565b6000612997836124fb565b905060008190508215612a745760008173ffffffffffffffffffffffffffffffffffffffff166129c56125c9565b73ffffffffffffffffffffffffffffffffffffffff1614806129f457506129f3826129ee6125c9565b611f74565b5b80612a395750612a026125c9565b73ffffffffffffffffffffffffffffffffffffffff16612a2186610aa3565b73ffffffffffffffffffffffffffffffffffffffff16145b905080612a72576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b505b612a82816000866001612f69565b6006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff0219169055600160806001901b03600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825401925050819055507c02000000000000000000000000000000000000000000000000000000007c010000000000000000000000000000000000000000000000000000000060a042901b612b5784612f6f565b171717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000083161415612be2576000600185019050600060046000838152602001908152602001600020541415612be0576000548114612bdf578260046000838152602001908152602001600020819055505b5b505b83600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612c4c816000866001612f79565b60016000815480929190600101919050555050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612d326132da565b612d4e6004600084815260200190815260200160002054612f7f565b9050919050565b60008054905090565b6000612d686125d9565b60005403905090565b612d8b82826040518060200160405280600081525061301b565b5050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612db56125c9565b8786866040518563ffffffff1660e01b8152600401612dd79493929190613f78565b602060405180830381600087803b158015612df157600080fd5b505af1925050508015612e2257506040513d601f19601f82011682018060405250810190612e1f91906139a2565b60015b612e9c573d8060008114612e52576040519150601f19603f3d011682016040523d82523d6000602084013e612e57565b606091505b50600081511415612e94576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b612ef76132da565b612f08612f03836124fb565b612f7f565b9050919050565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015612f5557600183039250600a81066030018353600a81049050612f35565b508181036020830392508083525050919050565b50505050565b6000819050919050565b50505050565b612f876132da565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c010000000000000000000000000000000000000000000000000000000083161415816040019015159081151581525050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415613088576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156130c3576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6130d06000858386612f69565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e1613135600185146132d0565b901b60a042901b61314586612f6f565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14613249575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46131f96000878480600101955087612d8f565b61322f576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821061318a57826000541461324457600080fd5b6132b4565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061324a575b8160008190555050506132ca6000858386612f79565b50505050565b6000819050919050565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b828054613329906144fa565b90600052602060002090601f01602090048101928261334b5760008555613392565b82601f1061336457805160ff1916838001178555613392565b82800160010185558215613392579182015b82811115613391578251825591602001919060010190613376565b5b50905061339f91906133a3565b5090565b5b808211156133bc5760008160009055506001016133a4565b5090565b60006133d36133ce8461421b565b6141f6565b905080838252602082019050828560208602820111156133f6576133f561466c565b5b60005b85811015613426578161340c888261363e565b8452602084019350602083019250506001810190506133f9565b5050509392505050565b600061344361343e84614247565b6141f6565b90508281526020810184848401111561345f5761345e614671565b5b61346a8482856144b8565b509392505050565b600061348561348084614278565b6141f6565b9050828152602081018484840111156134a1576134a0614671565b5b6134ac8482856144b8565b509392505050565b6000813590506134c3816148a0565b92915050565b60008083601f8401126134df576134de614667565b5b8235905067ffffffffffffffff8111156134fc576134fb614662565b5b6020830191508360208202830111156135185761351761466c565b5b9250929050565b60008083601f84011261353557613534614667565b5b8235905067ffffffffffffffff81111561355257613551614662565b5b60208301915083602082028301111561356e5761356d61466c565b5b9250929050565b600082601f83011261358a57613589614667565b5b813561359a8482602086016133c0565b91505092915050565b6000813590506135b2816148b7565b92915050565b6000813590506135c7816148ce565b92915050565b6000815190506135dc816148ce565b92915050565b600082601f8301126135f7576135f6614667565b5b8135613607848260208601613430565b91505092915050565b600082601f83011261362557613624614667565b5b8135613635848260208601613472565b91505092915050565b60008135905061364d816148e5565b92915050565b600081359050613662816148fc565b92915050565b60006020828403121561367e5761367d61467b565b5b600061368c848285016134b4565b91505092915050565b600080604083850312156136ac576136ab61467b565b5b60006136ba858286016134b4565b92505060206136cb858286016134b4565b9150509250929050565b6000806000606084860312156136ee576136ed61467b565b5b60006136fc868287016134b4565b935050602061370d868287016134b4565b925050604061371e8682870161363e565b9150509250925092565b600080600080608085870312156137425761374161467b565b5b6000613750878288016134b4565b9450506020613761878288016134b4565b93505060406137728782880161363e565b925050606085013567ffffffffffffffff81111561379357613792614676565b5b61379f878288016135e2565b91505092959194509250565b600080604083850312156137c2576137c161467b565b5b60006137d0858286016134b4565b92505060206137e1858286016135a3565b9150509250929050565b600080604083850312156138025761380161467b565b5b6000613810858286016134b4565b92505060206138218582860161363e565b9150509250929050565b6000806000606084860312156138445761384361467b565b5b6000613852868287016134b4565b93505060206138638682870161363e565b92505060406138748682870161363e565b9150509250925092565b600080600080604085870312156138985761389761467b565b5b600085013567ffffffffffffffff8111156138b6576138b5614676565b5b6138c2878288016134c9565b9450945050602085013567ffffffffffffffff8111156138e5576138e4614676565b5b6138f18782880161351f565b925092505092959194509250565b6000602082840312156139155761391461467b565b5b600082013567ffffffffffffffff81111561393357613932614676565b5b61393f84828501613575565b91505092915050565b60006020828403121561395e5761395d61467b565b5b600061396c848285016135a3565b91505092915050565b60006020828403121561398b5761398a61467b565b5b6000613999848285016135b8565b91505092915050565b6000602082840312156139b8576139b761467b565b5b60006139c6848285016135cd565b91505092915050565b600080604083850312156139e6576139e561467b565b5b600083013567ffffffffffffffff811115613a0457613a03614676565b5b613a1085828601613610565b925050602083013567ffffffffffffffff811115613a3157613a30614676565b5b613a3d85828601613610565b9150509250929050565b600060208284031215613a5d57613a5c61467b565b5b6000613a6b8482850161363e565b91505092915050565b600060208284031215613a8a57613a8961467b565b5b6000613a9884828501613653565b91505092915050565b6000613aad8383613e6c565b60608301905092915050565b6000613ac58383613ef0565b60208301905092915050565b613ada81614423565b82525050565b613ae981614423565b82525050565b6000613afa826142de565b613b048185614324565b9350613b0f836142a9565b8060005b83811015613b40578151613b278882613aa1565b9750613b328361430a565b925050600181019050613b13565b5085935050505092915050565b6000613b58826142e9565b613b628185614335565b9350613b6d836142b9565b8060005b83811015613b9e578151613b858882613ab9565b9750613b9083614317565b925050600181019050613b71565b5085935050505092915050565b613bb481614435565b82525050565b613bc381614435565b82525050565b6000613bd4826142f4565b613bde8185614346565b9350613bee8185602086016144c7565b613bf781614680565b840191505092915050565b6000613c0d826142ff565b613c178185614357565b9350613c278185602086016144c7565b613c3081614680565b840191505092915050565b6000613c46826142ff565b613c508185614368565b9350613c608185602086016144c7565b80840191505092915050565b60008154613c79816144fa565b613c838186614368565b94506001821660008114613c9e5760018114613caf57613ce2565b60ff19831686528186019350613ce2565b613cb8856142c9565b60005b83811015613cda57815481890152600182019150602081019050613cbb565b838801955050505b50505092915050565b6000613cf8600d83614357565b9150613d0382614691565b602082019050919050565b6000613d1b601283614357565b9150613d26826146ba565b602082019050919050565b6000613d3e602683614357565b9150613d49826146e3565b604082019050919050565b6000613d61601683614357565b9150613d6c82614732565b602082019050919050565b6000613d84601483614357565b9150613d8f8261475b565b602082019050919050565b6000613da7600b83614357565b9150613db282614784565b602082019050919050565b6000613dca600d83614357565b9150613dd5826147ad565b602082019050919050565b6000613ded601183614357565b9150613df8826147d6565b602082019050919050565b6000613e10602583614357565b9150613e1b826147ff565b604082019050919050565b6000613e33602083614357565b9150613e3e8261484e565b602082019050919050565b6000613e56601183614357565b9150613e6182614877565b602082019050919050565b606082016000820151613e826000850182613ad1565b506020820151613e956020850182613f0e565b506040820151613ea86040850182613bab565b50505050565b606082016000820151613ec46000850182613ad1565b506020820151613ed76020850182613f0e565b506040820151613eea6040850182613bab565b50505050565b613ef98161448d565b82525050565b613f088161448d565b82525050565b613f1781614497565b82525050565b613f26816144ab565b82525050565b6000613f388286613c6c565b9150613f448285613c3b565b9150613f508284613c6c565b9150819050949350505050565b6000602082019050613f726000830184613ae0565b92915050565b6000608082019050613f8d6000830187613ae0565b613f9a6020830186613ae0565b613fa76040830185613eff565b8181036060830152613fb98184613bc9565b905095945050505050565b60006020820190508181036000830152613fde8184613aef565b905092915050565b600060208201905081810360008301526140008184613b4d565b905092915050565b600060208201905061401d6000830184613bba565b92915050565b6000602082019050818103600083015261403d8184613c02565b905092915050565b6000602082019050818103600083015261405e81613ceb565b9050919050565b6000602082019050818103600083015261407e81613d0e565b9050919050565b6000602082019050818103600083015261409e81613d31565b9050919050565b600060208201905081810360008301526140be81613d54565b9050919050565b600060208201905081810360008301526140de81613d77565b9050919050565b600060208201905081810360008301526140fe81613d9a565b9050919050565b6000602082019050818103600083015261411e81613dbd565b9050919050565b6000602082019050818103600083015261413e81613de0565b9050919050565b6000602082019050818103600083015261415e81613e03565b9050919050565b6000602082019050818103600083015261417e81613e26565b9050919050565b6000602082019050818103600083015261419e81613e49565b9050919050565b60006060820190506141ba6000830184613eae565b92915050565b60006020820190506141d56000830184613eff565b92915050565b60006020820190506141f06000830184613f1d565b92915050565b6000614200614211565b905061420c828261452c565b919050565b6000604051905090565b600067ffffffffffffffff82111561423657614235614633565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561426257614261614633565b5b61426b82614680565b9050602081019050919050565b600067ffffffffffffffff82111561429357614292614633565b5b61429c82614680565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061437e8261448d565b91506143898361448d565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156143be576143bd6145a6565b5b828201905092915050565b60006143d48261448d565b91506143df8361448d565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615614418576144176145a6565b5b828202905092915050565b600061442e8261446d565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600067ffffffffffffffff82169050919050565b600060ff82169050919050565b82818337600083830152505050565b60005b838110156144e55780820151818401526020810190506144ca565b838111156144f4576000848401525b50505050565b6000600282049050600182168061451257607f821691505b60208210811415614526576145256145d5565b5b50919050565b61453582614680565b810181811067ffffffffffffffff8211171561455457614553614633565b5b80604052505050565b60006145688261448d565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561459b5761459a6145a6565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f73616c65206973206f70656e2100000000000000000000000000000000000000600082015250565b7f457863656564206d6178427957616c6c65740000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f496e76616c6964207061796d656e7420616d6f756e7400000000000000000000600082015250565b7f6d69736d61746368696e67206c656e6774687321000000000000000000000000600082015250565b7f6e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b7f43616e74206d696e742079657400000000000000000000000000000000000000600082015250565b7f416d6f756e742063616e27742062652030000000000000000000000000000000600082015250565b7f4578636565642077686974656c697374206d696e7420666f722074686973207760008201527f616c6c6574000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f457863656564204d41585f535550504c59000000000000000000000000000000600082015250565b6148a981614423565b81146148b457600080fd5b50565b6148c081614435565b81146148cb57600080fd5b50565b6148d781614441565b81146148e257600080fd5b50565b6148ee8161448d565b81146148f957600080fd5b50565b614905816144ab565b811461491057600080fd5b5056fea2646970667358221220921306a632746db7b45b12d600de670eb72d3862cc0451faf1dc63d4772d498864736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001600000000000000000000000000000000000000000000000000000000000000012426c75727279204469676944616967616b750000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000c424469676944616967616b7500000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d52364b5343487a4338336a3159745966515442537031475657516d52724351337670596f674b4d52706f42762f0000000000000000000000000000000000000000000000000000000000000000000000000000000000052e6a736f6e000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Blurry DigiDaigaku
Arg [1] : symbol (string): BDigiDaigaku
Arg [2] : baseURI_ (string): ipfs://QmR6KSCHzC83j1YtYfQTBSp1GVWQmRrCQ3vpYogKMRpoBv/
Arg [3] : uriSuffix_ (string): .json

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [5] : 426c75727279204469676944616967616b750000000000000000000000000000
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000c
Arg [7] : 424469676944616967616b750000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [9] : 697066733a2f2f516d52364b5343487a4338336a315974596651544253703147
Arg [10] : 5657516d52724351337670596f674b4d52706f42762f00000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000005
Arg [12] : 2e6a736f6e000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

62156:4583:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18757:612;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23713:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25781:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25241:474;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62371:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65437:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17835:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26667:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65659:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62285:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62334:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66630:106;;;;;;;;;;;;;:::i;:::-;;26908:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43790:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62427:50;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62666:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;65222:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45290:436;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62525:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23502:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64970:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62619:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19433:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13028:103;;;;;;;;;;;;;:::i;:::-;;48854:812;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12377:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62560:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23882:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46116:2289;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;63093:1058;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;26057:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27164:396;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62990:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62945:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44711:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;64445:346;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26436:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66266:354;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;65843:415;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13286:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18757:612;18842:4;19153:10;19138:25;;:11;:25;;;;:98;;;;19226:10;19211:25;;:11;:25;;;;19138:98;:171;;;;19299:10;19284:25;;:11;:25;;;;19138:171;19122:187;;18757:612;;;:::o;23713:100::-;23767:13;23800:5;23793:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23713:100;:::o;25781:204::-;25849:7;25874:16;25882:7;25874;:16::i;:::-;25869:64;;25899:34;;;;;;;;;;;;;;25869:64;25953:15;:24;25969:7;25953:24;;;;;;;;;;;;;;;;;;;;;25946:31;;25781:204;;;:::o;25241:474::-;25314:13;25346:27;25365:7;25346:18;:27::i;:::-;25314:61;;25396:5;25390:11;;:2;:11;;;25386:48;;;25410:24;;;;;;;;;;;;;;25386:48;25474:5;25451:28;;:19;:17;:19::i;:::-;:28;;;25447:175;;25499:44;25516:5;25523:19;:17;:19::i;:::-;25499:16;:44::i;:::-;25494:128;;25571:35;;;;;;;;;;;;;;25494:128;25447:175;25661:2;25634:15;:24;25650:7;25634:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;25699:7;25695:2;25679:28;;25688:5;25679:28;;;;;;;;;;;;25303:412;25241:474;;:::o;62371:49::-;;;;;;;;;;;;;;;;;:::o;65437:131::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65541:19:::1;65522:16;;:38;;;;;;;;;;;;;;;;;;65437:131:::0;:::o;17835:303::-;17888:7;18108:15;:13;:15::i;:::-;18093:12;;18077:13;;:28;:46;18070:53;;17835:303;:::o;26667:170::-;26801:28;26811:4;26817:2;26821:7;26801:9;:28::i;:::-;26667:170;;;:::o;65659:114::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65751:14:::1;65737:11;:28;;;;65659:114:::0;:::o;62285:40::-;62322:3;62285:40;:::o;62334:30::-;;;;:::o;66630:106::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66688:7:::1;:5;:7::i;:::-;66680:25;;:48;66706:21;66680:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;66630:106::o:0;26908:185::-;27046:39;27063:4;27069:2;27073:7;27046:39;;;;;;;;;;;;:16;:39::i;:::-;26908:185;;;:::o;43790:94::-;43856:20;43862:7;43871:4;43856:5;:20::i;:::-;43790:94;:::o;62427:50::-;;;;;;;;;;;;;;;;;:::o;62666:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;65222:104::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65306:12:::1;65294:9;;:24;;;;;;;;;;;;;;;;;;65222:104:::0;:::o;45290:436::-;45379:23;45432:22;45457:8;:15;45432:40;;45483:34;45541:14;45520:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;45483:73;;45572:9;45567:117;45588:14;45583:1;:19;45567:117;;45640:32;45660:8;45669:1;45660:11;;;;;;;;:::i;:::-;;;;;;;;45640:19;:32::i;:::-;45624:10;45635:1;45624:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;45604:3;;;;;45567:117;;;;45701:10;45694:17;;;;45290:436;;;:::o;62525:26::-;;;;;;;;;;;;;:::o;23502:144::-;23566:7;23609:27;23628:7;23609:18;:27::i;:::-;23586:52;;23502:144;;;:::o;64970:167::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65084:10:::1;65074:7;:20;;;;;;;;;;;;:::i;:::-;;65117:12;65105:9;:24;;;;;;;;;;;;:::i;:::-;;64970:167:::0;;:::o;62619:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;19433:224::-;19497:7;19538:1;19521:19;;:5;:19;;;19517:60;;;19549:28;;;;;;;;;;;;;;19517:60;14805:13;19595:18;:25;19614:5;19595:25;;;;;;;;;;;;;;;;:54;19588:61;;19433:224;;;:::o;13028:103::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13093:30:::1;13120:1;13093:18;:30::i;:::-;13028:103::o:0;48854:812::-;48924:16;48970:19;49000:25;49036:22;49061:16;49071:5;49061:9;:16::i;:::-;49036:41;;49088:25;49130:14;49116:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49088:57;;49156:31;;:::i;:::-;49203:9;49215:15;:13;:15::i;:::-;49203:27;;49198:428;49247:14;49232:11;:29;49198:428;;49295:15;49308:1;49295:12;:15::i;:::-;49283:27;;49329:9;:16;;;49325:65;;;49366:8;;49325:65;49434:1;49408:28;;:9;:14;;;:28;;;49404:103;;49477:9;:14;;;49457:34;;49404:103;49546:5;49525:26;;:17;:26;;;49521:94;;;49598:1;49572:8;49581:13;;;;;;49572:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;49521:94;49198:428;49263:3;;;;;49198:428;;;;49643:8;49636:15;;;;;;;48854:812;;;:::o;12377:87::-;12423:7;12450:6;;;;;;;;;;;12443:13;;12377:87;:::o;62560:35::-;;;;;;;;;;;;;:::o;23882:104::-;23938:13;23971:7;23964:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23882:104;:::o;46116:2289::-;46251:16;46310:4;46301:5;:13;46297:45;;46323:19;;;;;;;;;;;;;;46297:45;46353:19;46383:17;46403:14;:12;:14::i;:::-;46383:34;;46495:15;:13;:15::i;:::-;46487:5;:23;46483:79;;;46535:15;:13;:15::i;:::-;46527:23;;46483:79;46630:9;46623:4;:16;46619:65;;;46663:9;46656:16;;46619:65;46694:25;46722:16;46732:5;46722:9;:16::i;:::-;46694:44;;46904:4;46896:5;:12;46892:250;;;46925:19;46954:5;46947:4;:12;46925:34;;46992:17;46978:11;:31;46974:103;;;47050:11;47030:31;;46974:103;46910:178;46892:250;;;47129:1;47109:21;;46892:250;47152:25;47194:17;47180:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47152:60;;47248:1;47227:17;:22;47223:70;;;47273:8;47266:15;;;;;;;;47223:70;47425:31;47459:26;47479:5;47459:19;:26::i;:::-;47425:60;;47496:25;47729:9;:16;;;47724:84;;47782:9;:14;;;47762:34;;47724:84;47823:9;47835:5;47823:17;;47818:434;47847:4;47842:1;:9;;:45;;;;;47870:17;47855:11;:32;;47842:45;47818:434;;;47921:15;47934:1;47921:12;:15::i;:::-;47909:27;;47955:9;:16;;;47951:65;;;47992:8;;47951:65;48060:1;48034:28;;:9;:14;;;:28;;;48030:103;;48103:9;:14;;;48083:34;;48030:103;48172:5;48151:26;;:17;:26;;;48147:94;;;48224:1;48198:8;48207:13;;;;;;48198:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;48147:94;47818:434;47889:3;;;;;47818:434;;;;48342:11;48332:8;48325:29;48382:8;48375:15;;;;;;;;46116:2289;;;;;;:::o;63093:1058::-;63172:1;63159:9;;;;;;;;;;;:14;;;;63151:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;63224:9;63210:23;;:10;:23;;;63202:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;62322:3;63277:14;:12;:14::i;:::-;63268:6;:23;;;;:::i;:::-;:38;;63260:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;63356:1;63347:6;:10;63339:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;63408:1;63395:9;;;;;;;;;;;:14;;;63392:752;;;63473:15;:27;63489:10;63473:27;;;;;;;;;;;;;;;;63443:14;:26;63458:10;63443:26;;;;;;;;;;;;;;;;63434:6;:35;;;;:::i;:::-;:66;;63426:116;;;;;;;;;;;;:::i;:::-;;;;;;;;;63587:6;63557:14;:26;63572:10;63557:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;63608:29;63618:10;63630:6;63608:9;:29::i;:::-;63392:752;;;63671:1;63658:9;;;;;;;;;;;:14;;;63655:489;;;63751:15;:27;63767:10;63751:27;;;;;;;;;;;;;;;;63737:11;;:41;;;;:::i;:::-;63706:14;:26;63721:10;63706:26;;;;;;;;;;;;;;;;63697:6;:35;;;;:::i;:::-;:82;;63689:113;;;;;;;;;;;;:::i;:::-;;;;;;;;;63821:16;;;;;;;;;;;63817:203;;;63879:14;:12;:14::i;:::-;63861:15;;:32;63858:147;;;63949:9;63935:10;;63926:6;:19;;;;:::i;:::-;:32;;63918:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;63858:147;63817:203;64070:6;64040:14;:26;64055:10;64040:26;;;;;;;;;;;;;;;;:36;;;;;;;:::i;:::-;;;;;;;;64091:29;64101:10;64113:6;64091:9;:29::i;:::-;63655:489;63392:752;63093:1058;:::o;26057:308::-;26168:19;:17;:19::i;:::-;26156:31;;:8;:31;;;26152:61;;;26196:17;;;;;;;;;;;;;;26152:61;26278:8;26226:18;:39;26245:19;:17;:19::i;:::-;26226:39;;;;;;;;;;;;;;;:49;26266:8;26226:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;26338:8;26302:55;;26317:19;:17;:19::i;:::-;26302:55;;;26348:8;26302:55;;;;;;:::i;:::-;;;;;;;;26057:308;;:::o;27164:396::-;27331:28;27341:4;27347:2;27351:7;27331:9;:28::i;:::-;27392:1;27374:2;:14;;;:19;27370:183;;27413:56;27444:4;27450:2;27454:7;27463:5;27413:30;:56::i;:::-;27408:145;;27497:40;;;;;;;;;;;;;;27408:145;27370:183;27164:396;;;;:::o;62990:36::-;;;;:::o;62945:38::-;;;;:::o;44711:420::-;44787:21;;:::i;:::-;44821:31;;:::i;:::-;44877:15;:13;:15::i;:::-;44867:7;:25;:54;;;;44907:14;:12;:14::i;:::-;44896:7;:25;;44867:54;44863:103;;;44945:9;44938:16;;;;;44863:103;44988:21;45001:7;44988:12;:21::i;:::-;44976:33;;45024:9;:16;;;45020:65;;;45064:9;45057:16;;;;;45020:65;45102:21;45115:7;45102:12;:21::i;:::-;45095:28;;;44711:420;;;;:::o;64445:346::-;64518:13;64549:16;64557:7;64549;:16::i;:::-;64544:59;;64574:29;;;;;;;;;;;;;;64544:59;64645:1;64626:7;64620:21;;;;;:::i;:::-;;;:26;64616:84;;;64670:18;64680:7;64670:9;:18::i;:::-;64663:25;;;;64616:84;64743:7;64752:18;64762:7;64752:9;:18::i;:::-;64772:9;64726:56;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;64712:71;;64445:346;;;;:::o;26436:164::-;26533:4;26557:18;:25;26576:5;26557:25;;;;;;;;;;;;;;;:35;26583:8;26557:35;;;;;;;;;;;;;;;;;;;;;;;;;26550:42;;26436:164;;;;:::o;66266:354::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;66395:1:::1;66382:9;;;;;;;;;;;:14;;;66374:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;66455:5;;:12;;66435:9;;:16;;:32;66427:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;66510:9;66505:108;66525:9;;:16;;66521:1;:20;66505:108;;;66593:5;;66599:1;66593:8;;;;;;;:::i;:::-;;;;;;;;66563:15;:29;66579:9;;66589:1;66579:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;66563:29;;;;;;;;;;;;;;;:38;;;;66543:3;;;;;:::i;:::-;;;;66505:108;;;;66266:354:::0;;;;:::o;65843:415::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;65969:1:::1;65956:9;;;;;;;;;;;:14;;;65948:40;;;;;;;;;;;;:::i;:::-;;;;;;;;;66027:5;;:12;;66007:9;;:16;;:32;65999:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;66082:9;66077:103;66097:9;;:16;;66093:1;:20;66077:103;;;66135:33;66145:9;;66155:1;66145:12;;;;;;;:::i;:::-;;;;;;;;;;;;;;;:::i;:::-;66159:5;;66165:1;66159:8;;;;;;;:::i;:::-;;;;;;;;66135:9;:33::i;:::-;66115:3;;;;;:::i;:::-;;;;66077:103;;;;62322:3;66200:14;:12;:14::i;:::-;:28;;66192:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;65843:415:::0;;;;:::o;13286:201::-;12608:12;:10;:12::i;:::-;12597:23;;:7;:5;:7::i;:::-;:23;;;12589:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;13395:1:::1;13375:22;;:8;:22;;;;13367:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;13451:28;13470:8;13451:18;:28::i;:::-;13286:201:::0;:::o;27815:270::-;27872:4;27924:7;27905:15;:13;:15::i;:::-;:26;;:62;;;;;27954:13;;27944:7;:23;27905:62;:144;;;;;28048:1;15575:8;28001:17;:26;28019:7;28001:26;;;;;;;;;;;;:43;:48;27905:144;27889:160;;27815:270;;;:::o;21070:1049::-;21137:7;21157:12;21172:7;21157:22;;21232:4;21213:15;:13;:15::i;:::-;:23;21209:847;;21262:13;;21255:4;:20;21251:805;;;21296:14;21313:17;:23;21331:4;21313:23;;;;;;;;;;;;21296:40;;21421:1;15575:8;21394:6;:23;:28;21390:651;;;21881:105;21898:1;21888:6;:11;21881:105;;;21937:17;:25;21955:6;;;;;;;21937:25;;;;;;;;;;;;21928:34;;21881:105;;;22015:6;22008:13;;;;;;21390:651;21277:779;21251:805;21209:847;22080:31;;;;;;;;;;;;;;21070:1049;;;;:::o;41310:105::-;41370:7;41397:10;41390:17;;41310:105;:::o;11217:98::-;11270:7;11297:10;11290:17;;11217:98;:::o;64220:101::-;64285:7;64312:1;64305:8;;64220:101;:::o;32834:2409::-;32949:27;32979;32998:7;32979:18;:27::i;:::-;32949:57;;33064:4;33023:45;;33039:19;33023:45;;;33019:86;;33077:28;;;;;;;;;;;;;;33019:86;33118:22;33167:4;33144:27;;:19;:17;:19::i;:::-;:27;;;:83;;;;33184:43;33201:4;33207:19;:17;:19::i;:::-;33184:16;:43::i;:::-;33144:83;:139;;;;33264:19;:17;:19::i;:::-;33240:43;;:20;33252:7;33240:11;:20::i;:::-;:43;;;33144:139;33118:166;;33302:17;33297:66;;33328:35;;;;;;;;;;;;;;33297:66;33392:1;33378:16;;:2;:16;;;33374:52;;;33403:23;;;;;;;;;;;;;;33374:52;33439:43;33461:4;33467:2;33471:7;33480:1;33439:21;:43::i;:::-;33555:15;:24;33571:7;33555:24;;;;;;;;;;;;33548:31;;;;;;;;;;;33935:18;:24;33954:4;33935:24;;;;;;;;;;;;;;;;33933:26;;;;;;;;;;;;34009:18;:22;34028:2;34009:22;;;;;;;;;;;;;;;;34007:24;;;;;;;;;;;15853:8;15459:3;34359:15;:41;;34325:21;34343:2;34325:17;:21::i;:::-;:76;:112;34287:17;:26;34305:7;34287:26;;;;;;;;;;;:150;;;;34599:1;15853:8;34549:19;:46;:51;34545:586;;;34617:19;34649:1;34639:7;:11;34617:33;;34798:1;34764:17;:30;34782:11;34764:30;;;;;;;;;;;;:35;34760:360;;;34894:13;;34879:11;:28;34875:230;;35066:19;35033:17;:30;35051:11;35033:30;;;;;;;;;;;:52;;;;34875:230;34760:360;34602:529;34545:586;35174:7;35170:2;35155:27;;35164:4;35155:27;;;;;;;;;;;;35193:42;35214:4;35220:2;35224:7;35233:1;35193:20;:42::i;:::-;32938:2305;;32834:2409;;;:::o;35639:2648::-;35719:27;35749;35768:7;35749:18;:27::i;:::-;35719:57;;35789:12;35820:19;35789:52;;35858:13;35854:303;;;35888:22;35937:4;35914:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;35958:43;35975:4;35981:19;:17;:19::i;:::-;35958:16;:43::i;:::-;35914:87;:147;;;;36042:19;:17;:19::i;:::-;36018:43;;:20;36030:7;36018:11;:20::i;:::-;:43;;;35914:147;35888:174;;36084:17;36079:66;;36110:35;;;;;;;;;;;;;;36079:66;35873:284;35854:303;36169:51;36191:4;36205:1;36209:7;36218:1;36169:21;:51::i;:::-;36293:15;:24;36309:7;36293:24;;;;;;;;;;;;36286:31;;;;;;;;;;;36932:1;15068:3;36903:1;:25;;36902:31;36874:18;:24;36893:4;36874:24;;;;;;;;;;;;;;;;:59;;;;;;;;;;;15853:8;15575;15459:3;37221:15;:41;;37185:23;37203:4;37185:17;:23::i;:::-;:78;:104;:140;37147:17;:26;37165:7;37147:26;;;;;;;;;;;:178;;;;37487:1;15853:8;37437:19;:46;:51;37433:586;;;37505:19;37537:1;37527:7;:11;37505:33;;37686:1;37652:17;:30;37670:11;37652:30;;;;;;;;;;;;:35;37648:360;;;37782:13;;37767:11;:28;37763:230;;37954:19;37921:17;:30;37939:11;37921:30;;;;;;;;;;;:52;;;;37763:230;37648:360;37490:529;37433:586;38070:7;38066:1;38043:35;;38052:4;38043:35;;;;;;;;;;;;38089:50;38110:4;38124:1;38128:7;38137:1;38089:20;:50::i;:::-;38258:12;;:14;;;;;;;;;;;;;35708:2579;;35639:2648;;:::o;13647:191::-;13721:16;13740:6;;;;;;;;;;;13721:25;;13766:8;13757:6;;:17;;;;;;;;;;;;;;;;;;13821:8;13790:40;;13811:8;13790:40;;;;;;;;;;;;13710:128;13647:191;:::o;22626:153::-;22686:21;;:::i;:::-;22727:44;22746:17;:24;22764:5;22746:24;;;;;;;;;;;;22727:18;:44::i;:::-;22720:51;;22626:153;;;:::o;17530:95::-;17577:7;17604:13;;17597:20;;17530:95;:::o;18236:273::-;18283:7;18479:15;:13;:15::i;:::-;18463:13;;:31;18456:38;;18236:273;:::o;28169:104::-;28238:27;28248:2;28252:8;28238:27;;;;;;;;;;;;:9;:27::i;:::-;28169:104;;:::o;38779:716::-;38942:4;38988:2;38963:45;;;39009:19;:17;:19::i;:::-;39030:4;39036:7;39045:5;38963:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;38959:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39263:1;39246:6;:13;:18;39242:235;;;39292:40;;;;;;;;;;;;;;39242:235;39435:6;39429:13;39420:6;39416:2;39412:15;39405:38;38959:529;39132:54;;;39122:64;;;:6;:64;;;;39115:71;;;38779:716;;;;;;:::o;23282:158::-;23344:21;;:::i;:::-;23385:47;23404:27;23423:7;23404:18;:27::i;:::-;23385:18;:47::i;:::-;23378:54;;23282:158;;;:::o;41521:1878::-;41578:17;41981:3;41974:4;41968:11;41964:21;41957:28;;42068:3;42062:4;42055:17;42170:3;42606:5;42732:1;42727:3;42723:11;42716:18;;42865:2;42859:4;42855:13;42851:2;42847:22;42842:3;42834:36;42906:2;42900:4;42896:13;42888:21;;42502:663;42925:4;42502:663;;;43094:1;43089:3;43085:11;43078:18;;43145:2;43139:4;43135:13;43131:2;43127:22;43122:3;43114:36;43016:2;43010:4;43006:13;42998:21;;42502:663;;;42506:418;43204:3;43199;43195:13;43315:2;43310:3;43306:12;43299:19;;43374:6;43369:3;43362:19;41617:1775;;41521:1878;;;:::o;40143:159::-;;;;;:::o;24802:148::-;24866:14;24927:5;24917:15;;24802:148;;;:::o;40961:158::-;;;;;:::o;22213:322::-;22279:31;;:::i;:::-;22356:6;22323:9;:14;;:41;;;;;;;;;;;15459:3;22409:6;:32;;22375:9;:24;;:67;;;;;;;;;;;22499:1;15575:8;22472:6;:23;:28;;22453:9;:16;;:47;;;;;;;;;;;22213:322;;;:::o;28646:2114::-;28769:20;28792:13;;28769:36;;28834:1;28820:16;;:2;:16;;;28816:48;;;28845:19;;;;;;;;;;;;;;28816:48;28891:1;28879:8;:13;28875:44;;;28901:18;;;;;;;;;;;;;;28875:44;28932:61;28962:1;28966:2;28970:12;28984:8;28932:21;:61::i;:::-;29508:1;14942:2;29479:1;:25;;29478:31;29466:8;:44;29440:18;:22;29459:2;29440:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;15718:3;29861:29;29888:1;29876:8;:13;29861:14;:29::i;:::-;:56;;15459:3;29806:15;:41;;29772:21;29790:2;29772:17;:21::i;:::-;:76;:146;29729:17;:31;29747:12;29729:31;;;;;;;;;;;:189;;;;29931:20;29954:12;29931:35;;29977:11;30006:8;29991:12;:23;29977:37;;30049:1;30031:2;:14;;;:19;30027:609;;30067:306;30119:12;30115:2;30094:38;;30111:1;30094:38;;;;;;;;;;;;30156:69;30195:1;30199:2;30203:14;;;;;;30219:5;30156:30;:69::i;:::-;30151:166;;30257:40;;;;;;;;;;;;;;30151:166;30368:3;30353:12;:18;30067:306;;30446:12;30429:13;;:29;30425:43;;30460:8;;;30425:43;30027:609;;;30501:124;30553:14;;;;;;30549:2;30528:40;;30545:1;30528:40;;;;;;;;;;;;30620:3;30605:12;:18;30501:124;;30027:609;30662:12;30646:13;:28;;;;29241:1441;;30692:60;30721:1;30725:2;30729:12;30743:8;30692:20;:60::i;:::-;28758:2002;28646:2114;;;:::o;25037:142::-;25095:14;25156:5;25146:15;;25037:142;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:568::-;1821:8;1831:6;1881:3;1874:4;1866:6;1862:17;1858:27;1848:122;;1889:79;;:::i;:::-;1848:122;2002:6;1989:20;1979:30;;2032:18;2024:6;2021:30;2018:117;;;2054:79;;:::i;:::-;2018:117;2168:4;2160:6;2156:17;2144:29;;2222:3;2214:4;2206:6;2202:17;2192:8;2188:32;2185:41;2182:128;;;2229:79;;:::i;:::-;2182:128;1748:568;;;;;:::o;2339:::-;2412:8;2422:6;2472:3;2465:4;2457:6;2453:17;2449:27;2439:122;;2480:79;;:::i;:::-;2439:122;2593:6;2580:20;2570:30;;2623:18;2615:6;2612:30;2609:117;;;2645:79;;:::i;:::-;2609:117;2759:4;2751:6;2747:17;2735:29;;2813:3;2805:4;2797:6;2793:17;2783:8;2779:32;2776:41;2773:128;;;2820:79;;:::i;:::-;2773:128;2339:568;;;;;:::o;2930:370::-;3001:5;3050:3;3043:4;3035:6;3031:17;3027:27;3017:122;;3058:79;;:::i;:::-;3017:122;3175:6;3162:20;3200:94;3290:3;3282:6;3275:4;3267:6;3263:17;3200:94;:::i;:::-;3191:103;;3007:293;2930:370;;;;:::o;3306:133::-;3349:5;3387:6;3374:20;3365:29;;3403:30;3427:5;3403:30;:::i;:::-;3306:133;;;;:::o;3445:137::-;3490:5;3528:6;3515:20;3506:29;;3544:32;3570:5;3544:32;:::i;:::-;3445:137;;;;:::o;3588:141::-;3644:5;3675:6;3669:13;3660:22;;3691:32;3717:5;3691:32;:::i;:::-;3588:141;;;;:::o;3748:338::-;3803:5;3852:3;3845:4;3837:6;3833:17;3829:27;3819:122;;3860:79;;:::i;:::-;3819:122;3977:6;3964:20;4002:78;4076:3;4068:6;4061:4;4053:6;4049:17;4002:78;:::i;:::-;3993:87;;3809:277;3748:338;;;;:::o;4106:340::-;4162:5;4211:3;4204:4;4196:6;4192:17;4188:27;4178:122;;4219:79;;:::i;:::-;4178:122;4336:6;4323:20;4361:79;4436:3;4428:6;4421:4;4413:6;4409:17;4361:79;:::i;:::-;4352:88;;4168:278;4106:340;;;;:::o;4452:139::-;4498:5;4536:6;4523:20;4514:29;;4552:33;4579:5;4552:33;:::i;:::-;4452:139;;;;:::o;4597:135::-;4641:5;4679:6;4666:20;4657:29;;4695:31;4720:5;4695:31;:::i;:::-;4597:135;;;;:::o;4738:329::-;4797:6;4846:2;4834:9;4825:7;4821:23;4817:32;4814:119;;;4852:79;;:::i;:::-;4814:119;4972:1;4997:53;5042:7;5033:6;5022:9;5018:22;4997:53;:::i;:::-;4987:63;;4943:117;4738:329;;;;:::o;5073:474::-;5141:6;5149;5198:2;5186:9;5177:7;5173:23;5169:32;5166:119;;;5204:79;;:::i;:::-;5166:119;5324:1;5349:53;5394:7;5385:6;5374:9;5370:22;5349:53;:::i;:::-;5339:63;;5295:117;5451:2;5477:53;5522:7;5513:6;5502:9;5498:22;5477:53;:::i;:::-;5467:63;;5422:118;5073:474;;;;;:::o;5553:619::-;5630:6;5638;5646;5695:2;5683:9;5674:7;5670:23;5666:32;5663:119;;;5701:79;;:::i;:::-;5663:119;5821:1;5846:53;5891:7;5882:6;5871:9;5867:22;5846:53;:::i;:::-;5836:63;;5792:117;5948:2;5974:53;6019:7;6010:6;5999:9;5995:22;5974:53;:::i;:::-;5964:63;;5919:118;6076:2;6102:53;6147:7;6138:6;6127:9;6123:22;6102:53;:::i;:::-;6092:63;;6047:118;5553:619;;;;;:::o;6178:943::-;6273:6;6281;6289;6297;6346:3;6334:9;6325:7;6321:23;6317:33;6314:120;;;6353:79;;:::i;:::-;6314:120;6473:1;6498:53;6543:7;6534:6;6523:9;6519:22;6498:53;:::i;:::-;6488:63;;6444:117;6600:2;6626:53;6671:7;6662:6;6651:9;6647:22;6626:53;:::i;:::-;6616:63;;6571:118;6728:2;6754:53;6799:7;6790:6;6779:9;6775:22;6754:53;:::i;:::-;6744:63;;6699:118;6884:2;6873:9;6869:18;6856:32;6915:18;6907:6;6904:30;6901:117;;;6937:79;;:::i;:::-;6901:117;7042:62;7096:7;7087:6;7076:9;7072:22;7042:62;:::i;:::-;7032:72;;6827:287;6178:943;;;;;;;:::o;7127:468::-;7192:6;7200;7249:2;7237:9;7228:7;7224:23;7220:32;7217:119;;;7255:79;;:::i;:::-;7217:119;7375:1;7400:53;7445:7;7436:6;7425:9;7421:22;7400:53;:::i;:::-;7390:63;;7346:117;7502:2;7528:50;7570:7;7561:6;7550:9;7546:22;7528:50;:::i;:::-;7518:60;;7473:115;7127:468;;;;;:::o;7601:474::-;7669:6;7677;7726:2;7714:9;7705:7;7701:23;7697:32;7694:119;;;7732:79;;:::i;:::-;7694:119;7852:1;7877:53;7922:7;7913:6;7902:9;7898:22;7877:53;:::i;:::-;7867:63;;7823:117;7979:2;8005:53;8050:7;8041:6;8030:9;8026:22;8005:53;:::i;:::-;7995:63;;7950:118;7601:474;;;;;:::o;8081:619::-;8158:6;8166;8174;8223:2;8211:9;8202:7;8198:23;8194:32;8191:119;;;8229:79;;:::i;:::-;8191:119;8349:1;8374:53;8419:7;8410:6;8399:9;8395:22;8374:53;:::i;:::-;8364:63;;8320:117;8476:2;8502:53;8547:7;8538:6;8527:9;8523:22;8502:53;:::i;:::-;8492:63;;8447:118;8604:2;8630:53;8675:7;8666:6;8655:9;8651:22;8630:53;:::i;:::-;8620:63;;8575:118;8081:619;;;;;:::o;8706:934::-;8828:6;8836;8844;8852;8901:2;8889:9;8880:7;8876:23;8872:32;8869:119;;;8907:79;;:::i;:::-;8869:119;9055:1;9044:9;9040:17;9027:31;9085:18;9077:6;9074:30;9071:117;;;9107:79;;:::i;:::-;9071:117;9220:80;9292:7;9283:6;9272:9;9268:22;9220:80;:::i;:::-;9202:98;;;;8998:312;9377:2;9366:9;9362:18;9349:32;9408:18;9400:6;9397:30;9394:117;;;9430:79;;:::i;:::-;9394:117;9543:80;9615:7;9606:6;9595:9;9591:22;9543:80;:::i;:::-;9525:98;;;;9320:313;8706:934;;;;;;;:::o;9646:539::-;9730:6;9779:2;9767:9;9758:7;9754:23;9750:32;9747:119;;;9785:79;;:::i;:::-;9747:119;9933:1;9922:9;9918:17;9905:31;9963:18;9955:6;9952:30;9949:117;;;9985:79;;:::i;:::-;9949:117;10090:78;10160:7;10151:6;10140:9;10136:22;10090:78;:::i;:::-;10080:88;;9876:302;9646:539;;;;:::o;10191:323::-;10247:6;10296:2;10284:9;10275:7;10271:23;10267:32;10264:119;;;10302:79;;:::i;:::-;10264:119;10422:1;10447:50;10489:7;10480:6;10469:9;10465:22;10447:50;:::i;:::-;10437:60;;10393:114;10191:323;;;;:::o;10520:327::-;10578:6;10627:2;10615:9;10606:7;10602:23;10598:32;10595:119;;;10633:79;;:::i;:::-;10595:119;10753:1;10778:52;10822:7;10813:6;10802:9;10798:22;10778:52;:::i;:::-;10768:62;;10724:116;10520:327;;;;:::o;10853:349::-;10922:6;10971:2;10959:9;10950:7;10946:23;10942:32;10939:119;;;10977:79;;:::i;:::-;10939:119;11097:1;11122:63;11177:7;11168:6;11157:9;11153:22;11122:63;:::i;:::-;11112:73;;11068:127;10853:349;;;;:::o;11208:834::-;11296:6;11304;11353:2;11341:9;11332:7;11328:23;11324:32;11321:119;;;11359:79;;:::i;:::-;11321:119;11507:1;11496:9;11492:17;11479:31;11537:18;11529:6;11526:30;11523:117;;;11559:79;;:::i;:::-;11523:117;11664:63;11719:7;11710:6;11699:9;11695:22;11664:63;:::i;:::-;11654:73;;11450:287;11804:2;11793:9;11789:18;11776:32;11835:18;11827:6;11824:30;11821:117;;;11857:79;;:::i;:::-;11821:117;11962:63;12017:7;12008:6;11997:9;11993:22;11962:63;:::i;:::-;11952:73;;11747:288;11208:834;;;;;:::o;12048:329::-;12107:6;12156:2;12144:9;12135:7;12131:23;12127:32;12124:119;;;12162:79;;:::i;:::-;12124:119;12282:1;12307:53;12352:7;12343:6;12332:9;12328:22;12307:53;:::i;:::-;12297:63;;12253:117;12048:329;;;;:::o;12383:325::-;12440:6;12489:2;12477:9;12468:7;12464:23;12460:32;12457:119;;;12495:79;;:::i;:::-;12457:119;12615:1;12640:51;12683:7;12674:6;12663:9;12659:22;12640:51;:::i;:::-;12630:61;;12586:115;12383:325;;;;:::o;12714:299::-;12843:10;12864:106;12966:3;12958:6;12864:106;:::i;:::-;13002:4;12997:3;12993:14;12979:28;;12714:299;;;;:::o;13019:179::-;13088:10;13109:46;13151:3;13143:6;13109:46;:::i;:::-;13187:4;13182:3;13178:14;13164:28;;13019:179;;;;:::o;13204:108::-;13281:24;13299:5;13281:24;:::i;:::-;13276:3;13269:37;13204:108;;:::o;13318:118::-;13405:24;13423:5;13405:24;:::i;:::-;13400:3;13393:37;13318:118;;:::o;13518:972::-;13697:3;13726:84;13804:5;13726:84;:::i;:::-;13826:116;13935:6;13930:3;13826:116;:::i;:::-;13819:123;;13966:86;14046:5;13966:86;:::i;:::-;14075:7;14106:1;14091:374;14116:6;14113:1;14110:13;14091:374;;;14192:6;14186:13;14219:123;14338:3;14323:13;14219:123;:::i;:::-;14212:130;;14365:90;14448:6;14365:90;:::i;:::-;14355:100;;14151:314;14138:1;14135;14131:9;14126:14;;14091:374;;;14095:14;14481:3;14474:10;;13702:788;;;13518:972;;;;:::o;14526:732::-;14645:3;14674:54;14722:5;14674:54;:::i;:::-;14744:86;14823:6;14818:3;14744:86;:::i;:::-;14737:93;;14854:56;14904:5;14854:56;:::i;:::-;14933:7;14964:1;14949:284;14974:6;14971:1;14968:13;14949:284;;;15050:6;15044:13;15077:63;15136:3;15121:13;15077:63;:::i;:::-;15070:70;;15163:60;15216:6;15163:60;:::i;:::-;15153:70;;15009:224;14996:1;14993;14989:9;14984:14;;14949:284;;;14953:14;15249:3;15242:10;;14650:608;;;14526:732;;;;:::o;15264:99::-;15335:21;15350:5;15335:21;:::i;:::-;15330:3;15323:34;15264:99;;:::o;15369:109::-;15450:21;15465:5;15450:21;:::i;:::-;15445:3;15438:34;15369:109;;:::o;15484:360::-;15570:3;15598:38;15630:5;15598:38;:::i;:::-;15652:70;15715:6;15710:3;15652:70;:::i;:::-;15645:77;;15731:52;15776:6;15771:3;15764:4;15757:5;15753:16;15731:52;:::i;:::-;15808:29;15830:6;15808:29;:::i;:::-;15803:3;15799:39;15792:46;;15574:270;15484:360;;;;:::o;15850:364::-;15938:3;15966:39;15999:5;15966:39;:::i;:::-;16021:71;16085:6;16080:3;16021:71;:::i;:::-;16014:78;;16101:52;16146:6;16141:3;16134:4;16127:5;16123:16;16101:52;:::i;:::-;16178:29;16200:6;16178:29;:::i;:::-;16173:3;16169:39;16162:46;;15942:272;15850:364;;;;:::o;16220:377::-;16326:3;16354:39;16387:5;16354:39;:::i;:::-;16409:89;16491:6;16486:3;16409:89;:::i;:::-;16402:96;;16507:52;16552:6;16547:3;16540:4;16533:5;16529:16;16507:52;:::i;:::-;16584:6;16579:3;16575:16;16568:23;;16330:267;16220:377;;;;:::o;16627:845::-;16730:3;16767:5;16761:12;16796:36;16822:9;16796:36;:::i;:::-;16848:89;16930:6;16925:3;16848:89;:::i;:::-;16841:96;;16968:1;16957:9;16953:17;16984:1;16979:137;;;;17130:1;17125:341;;;;16946:520;;16979:137;17063:4;17059:9;17048;17044:25;17039:3;17032:38;17099:6;17094:3;17090:16;17083:23;;16979:137;;17125:341;17192:38;17224:5;17192:38;:::i;:::-;17252:1;17266:154;17280:6;17277:1;17274:13;17266:154;;;17354:7;17348:14;17344:1;17339:3;17335:11;17328:35;17404:1;17395:7;17391:15;17380:26;;17302:4;17299:1;17295:12;17290:17;;17266:154;;;17449:6;17444:3;17440:16;17433:23;;17132:334;;16946:520;;16734:738;;16627:845;;;;:::o;17478:366::-;17620:3;17641:67;17705:2;17700:3;17641:67;:::i;:::-;17634:74;;17717:93;17806:3;17717:93;:::i;:::-;17835:2;17830:3;17826:12;17819:19;;17478:366;;;:::o;17850:::-;17992:3;18013:67;18077:2;18072:3;18013:67;:::i;:::-;18006:74;;18089:93;18178:3;18089:93;:::i;:::-;18207:2;18202:3;18198:12;18191:19;;17850:366;;;:::o;18222:::-;18364:3;18385:67;18449:2;18444:3;18385:67;:::i;:::-;18378:74;;18461:93;18550:3;18461:93;:::i;:::-;18579:2;18574:3;18570:12;18563:19;;18222:366;;;:::o;18594:::-;18736:3;18757:67;18821:2;18816:3;18757:67;:::i;:::-;18750:74;;18833:93;18922:3;18833:93;:::i;:::-;18951:2;18946:3;18942:12;18935:19;;18594:366;;;:::o;18966:::-;19108:3;19129:67;19193:2;19188:3;19129:67;:::i;:::-;19122:74;;19205:93;19294:3;19205:93;:::i;:::-;19323:2;19318:3;19314:12;19307:19;;18966:366;;;:::o;19338:::-;19480:3;19501:67;19565:2;19560:3;19501:67;:::i;:::-;19494:74;;19577:93;19666:3;19577:93;:::i;:::-;19695:2;19690:3;19686:12;19679:19;;19338:366;;;:::o;19710:::-;19852:3;19873:67;19937:2;19932:3;19873:67;:::i;:::-;19866:74;;19949:93;20038:3;19949:93;:::i;:::-;20067:2;20062:3;20058:12;20051:19;;19710:366;;;:::o;20082:::-;20224:3;20245:67;20309:2;20304:3;20245:67;:::i;:::-;20238:74;;20321:93;20410:3;20321:93;:::i;:::-;20439:2;20434:3;20430:12;20423:19;;20082:366;;;:::o;20454:::-;20596:3;20617:67;20681:2;20676:3;20617:67;:::i;:::-;20610:74;;20693:93;20782:3;20693:93;:::i;:::-;20811:2;20806:3;20802:12;20795:19;;20454:366;;;:::o;20826:::-;20968:3;20989:67;21053:2;21048:3;20989:67;:::i;:::-;20982:74;;21065:93;21154:3;21065:93;:::i;:::-;21183:2;21178:3;21174:12;21167:19;;20826:366;;;:::o;21198:::-;21340:3;21361:67;21425:2;21420:3;21361:67;:::i;:::-;21354:74;;21437:93;21526:3;21437:93;:::i;:::-;21555:2;21550:3;21546:12;21539:19;;21198:366;;;:::o;21642:685::-;21789:4;21784:3;21780:14;21876:4;21869:5;21865:16;21859:23;21895:63;21952:4;21947:3;21943:14;21929:12;21895:63;:::i;:::-;21804:164;22060:4;22053:5;22049:16;22043:23;22079:61;22134:4;22129:3;22125:14;22111:12;22079:61;:::i;:::-;21978:172;22234:4;22227:5;22223:16;22217:23;22253:57;22304:4;22299:3;22295:14;22281:12;22253:57;:::i;:::-;22160:160;21758:569;21642:685;;:::o;22405:695::-;22562:4;22557:3;22553:14;22649:4;22642:5;22638:16;22632:23;22668:63;22725:4;22720:3;22716:14;22702:12;22668:63;:::i;:::-;22577:164;22833:4;22826:5;22822:16;22816:23;22852:61;22907:4;22902:3;22898:14;22884:12;22852:61;:::i;:::-;22751:172;23007:4;23000:5;22996:16;22990:23;23026:57;23077:4;23072:3;23068:14;23054:12;23026:57;:::i;:::-;22933:160;22531:569;22405:695;;:::o;23106:108::-;23183:24;23201:5;23183:24;:::i;:::-;23178:3;23171:37;23106:108;;:::o;23220:118::-;23307:24;23325:5;23307:24;:::i;:::-;23302:3;23295:37;23220:118;;:::o;23344:105::-;23419:23;23436:5;23419:23;:::i;:::-;23414:3;23407:36;23344:105;;:::o;23455:112::-;23538:22;23554:5;23538:22;:::i;:::-;23533:3;23526:35;23455:112;;:::o;23573:583::-;23795:3;23817:92;23905:3;23896:6;23817:92;:::i;:::-;23810:99;;23926:95;24017:3;24008:6;23926:95;:::i;:::-;23919:102;;24038:92;24126:3;24117:6;24038:92;:::i;:::-;24031:99;;24147:3;24140:10;;23573:583;;;;;;:::o;24162:222::-;24255:4;24293:2;24282:9;24278:18;24270:26;;24306:71;24374:1;24363:9;24359:17;24350:6;24306:71;:::i;:::-;24162:222;;;;:::o;24390:640::-;24585:4;24623:3;24612:9;24608:19;24600:27;;24637:71;24705:1;24694:9;24690:17;24681:6;24637:71;:::i;:::-;24718:72;24786:2;24775:9;24771:18;24762:6;24718:72;:::i;:::-;24800;24868:2;24857:9;24853:18;24844:6;24800:72;:::i;:::-;24919:9;24913:4;24909:20;24904:2;24893:9;24889:18;24882:48;24947:76;25018:4;25009:6;24947:76;:::i;:::-;24939:84;;24390:640;;;;;;;:::o;25036:493::-;25239:4;25277:2;25266:9;25262:18;25254:26;;25326:9;25320:4;25316:20;25312:1;25301:9;25297:17;25290:47;25354:168;25517:4;25508:6;25354:168;:::i;:::-;25346:176;;25036:493;;;;:::o;25535:373::-;25678:4;25716:2;25705:9;25701:18;25693:26;;25765:9;25759:4;25755:20;25751:1;25740:9;25736:17;25729:47;25793:108;25896:4;25887:6;25793:108;:::i;:::-;25785:116;;25535:373;;;;:::o;25914:210::-;26001:4;26039:2;26028:9;26024:18;26016:26;;26052:65;26114:1;26103:9;26099:17;26090:6;26052:65;:::i;:::-;25914:210;;;;:::o;26130:313::-;26243:4;26281:2;26270:9;26266:18;26258:26;;26330:9;26324:4;26320:20;26316:1;26305:9;26301:17;26294:47;26358:78;26431:4;26422:6;26358:78;:::i;:::-;26350:86;;26130:313;;;;:::o;26449:419::-;26615:4;26653:2;26642:9;26638:18;26630:26;;26702:9;26696:4;26692:20;26688:1;26677:9;26673:17;26666:47;26730:131;26856:4;26730:131;:::i;:::-;26722:139;;26449:419;;;:::o;26874:::-;27040:4;27078:2;27067:9;27063:18;27055:26;;27127:9;27121:4;27117:20;27113:1;27102:9;27098:17;27091:47;27155:131;27281:4;27155:131;:::i;:::-;27147:139;;26874:419;;;:::o;27299:::-;27465:4;27503:2;27492:9;27488:18;27480:26;;27552:9;27546:4;27542:20;27538:1;27527:9;27523:17;27516:47;27580:131;27706:4;27580:131;:::i;:::-;27572:139;;27299:419;;;:::o;27724:::-;27890:4;27928:2;27917:9;27913:18;27905:26;;27977:9;27971:4;27967:20;27963:1;27952:9;27948:17;27941:47;28005:131;28131:4;28005:131;:::i;:::-;27997:139;;27724:419;;;:::o;28149:::-;28315:4;28353:2;28342:9;28338:18;28330:26;;28402:9;28396:4;28392:20;28388:1;28377:9;28373:17;28366:47;28430:131;28556:4;28430:131;:::i;:::-;28422:139;;28149:419;;;:::o;28574:::-;28740:4;28778:2;28767:9;28763:18;28755:26;;28827:9;28821:4;28817:20;28813:1;28802:9;28798:17;28791:47;28855:131;28981:4;28855:131;:::i;:::-;28847:139;;28574:419;;;:::o;28999:::-;29165:4;29203:2;29192:9;29188:18;29180:26;;29252:9;29246:4;29242:20;29238:1;29227:9;29223:17;29216:47;29280:131;29406:4;29280:131;:::i;:::-;29272:139;;28999:419;;;:::o;29424:::-;29590:4;29628:2;29617:9;29613:18;29605:26;;29677:9;29671:4;29667:20;29663:1;29652:9;29648:17;29641:47;29705:131;29831:4;29705:131;:::i;:::-;29697:139;;29424:419;;;:::o;29849:::-;30015:4;30053:2;30042:9;30038:18;30030:26;;30102:9;30096:4;30092:20;30088:1;30077:9;30073:17;30066:47;30130:131;30256:4;30130:131;:::i;:::-;30122:139;;29849:419;;;:::o;30274:::-;30440:4;30478:2;30467:9;30463:18;30455:26;;30527:9;30521:4;30517:20;30513:1;30502:9;30498:17;30491:47;30555:131;30681:4;30555:131;:::i;:::-;30547:139;;30274:419;;;:::o;30699:::-;30865:4;30903:2;30892:9;30888:18;30880:26;;30952:9;30946:4;30942:20;30938:1;30927:9;30923:17;30916:47;30980:131;31106:4;30980:131;:::i;:::-;30972:139;;30699:419;;;:::o;31124:342::-;31277:4;31315:2;31304:9;31300:18;31292:26;;31328:131;31456:1;31445:9;31441:17;31432:6;31328:131;:::i;:::-;31124:342;;;;:::o;31472:222::-;31565:4;31603:2;31592:9;31588:18;31580:26;;31616:71;31684:1;31673:9;31669:17;31660:6;31616:71;:::i;:::-;31472:222;;;;:::o;31700:214::-;31789:4;31827:2;31816:9;31812:18;31804:26;;31840:67;31904:1;31893:9;31889:17;31880:6;31840:67;:::i;:::-;31700:214;;;;:::o;31920:129::-;31954:6;31981:20;;:::i;:::-;31971:30;;32010:33;32038:4;32030:6;32010:33;:::i;:::-;31920:129;;;:::o;32055:75::-;32088:6;32121:2;32115:9;32105:19;;32055:75;:::o;32136:311::-;32213:4;32303:18;32295:6;32292:30;32289:56;;;32325:18;;:::i;:::-;32289:56;32375:4;32367:6;32363:17;32355:25;;32435:4;32429;32425:15;32417:23;;32136:311;;;:::o;32453:307::-;32514:4;32604:18;32596:6;32593:30;32590:56;;;32626:18;;:::i;:::-;32590:56;32664:29;32686:6;32664:29;:::i;:::-;32656:37;;32748:4;32742;32738:15;32730:23;;32453:307;;;:::o;32766:308::-;32828:4;32918:18;32910:6;32907:30;32904:56;;;32940:18;;:::i;:::-;32904:56;32978:29;33000:6;32978:29;:::i;:::-;32970:37;;33062:4;33056;33052:15;33044:23;;32766:308;;;:::o;33080:162::-;33177:4;33200:3;33192:11;;33230:4;33225:3;33221:14;33213:22;;33080:162;;;:::o;33248:132::-;33315:4;33338:3;33330:11;;33368:4;33363:3;33359:14;33351:22;;33248:132;;;:::o;33386:141::-;33435:4;33458:3;33450:11;;33481:3;33478:1;33471:14;33515:4;33512:1;33502:18;33494:26;;33386:141;;;:::o;33533:144::-;33630:6;33664:5;33658:12;33648:22;;33533:144;;;:::o;33683:114::-;33750:6;33784:5;33778:12;33768:22;;33683:114;;;:::o;33803:98::-;33854:6;33888:5;33882:12;33872:22;;33803:98;;;:::o;33907:99::-;33959:6;33993:5;33987:12;33977:22;;33907:99;;;:::o;34012:143::-;34112:4;34144;34139:3;34135:14;34127:22;;34012:143;;;:::o;34161:113::-;34231:4;34263;34258:3;34254:14;34246:22;;34161:113;;;:::o;34280:214::-;34409:11;34443:6;34438:3;34431:19;34483:4;34478:3;34474:14;34459:29;;34280:214;;;;:::o;34500:184::-;34599:11;34633:6;34628:3;34621:19;34673:4;34668:3;34664:14;34649:29;;34500:184;;;;:::o;34690:168::-;34773:11;34807:6;34802:3;34795:19;34847:4;34842:3;34838:14;34823:29;;34690:168;;;;:::o;34864:169::-;34948:11;34982:6;34977:3;34970:19;35022:4;35017:3;35013:14;34998:29;;34864:169;;;;:::o;35039:148::-;35141:11;35178:3;35163:18;;35039:148;;;;:::o;35193:305::-;35233:3;35252:20;35270:1;35252:20;:::i;:::-;35247:25;;35286:20;35304:1;35286:20;:::i;:::-;35281:25;;35440:1;35372:66;35368:74;35365:1;35362:81;35359:107;;;35446:18;;:::i;:::-;35359:107;35490:1;35487;35483:9;35476:16;;35193:305;;;;:::o;35504:348::-;35544:7;35567:20;35585:1;35567:20;:::i;:::-;35562:25;;35601:20;35619:1;35601:20;:::i;:::-;35596:25;;35789:1;35721:66;35717:74;35714:1;35711:81;35706:1;35699:9;35692:17;35688:105;35685:131;;;35796:18;;:::i;:::-;35685:131;35844:1;35841;35837:9;35826:20;;35504:348;;;;:::o;35858:96::-;35895:7;35924:24;35942:5;35924:24;:::i;:::-;35913:35;;35858:96;;;:::o;35960:90::-;35994:7;36037:5;36030:13;36023:21;36012:32;;35960:90;;;:::o;36056:149::-;36092:7;36132:66;36125:5;36121:78;36110:89;;36056:149;;;:::o;36211:126::-;36248:7;36288:42;36281:5;36277:54;36266:65;;36211:126;;;:::o;36343:77::-;36380:7;36409:5;36398:16;;36343:77;;;:::o;36426:101::-;36462:7;36502:18;36495:5;36491:30;36480:41;;36426:101;;;:::o;36533:86::-;36568:7;36608:4;36601:5;36597:16;36586:27;;36533:86;;;:::o;36625:154::-;36709:6;36704:3;36699;36686:30;36771:1;36762:6;36757:3;36753:16;36746:27;36625:154;;;:::o;36785:307::-;36853:1;36863:113;36877:6;36874:1;36871:13;36863:113;;;36962:1;36957:3;36953:11;36947:18;36943:1;36938:3;36934:11;36927:39;36899:2;36896:1;36892:10;36887:15;;36863:113;;;36994:6;36991:1;36988:13;36985:101;;;37074:1;37065:6;37060:3;37056:16;37049:27;36985:101;36834:258;36785:307;;;:::o;37098:320::-;37142:6;37179:1;37173:4;37169:12;37159:22;;37226:1;37220:4;37216:12;37247:18;37237:81;;37303:4;37295:6;37291:17;37281:27;;37237:81;37365:2;37357:6;37354:14;37334:18;37331:38;37328:84;;;37384:18;;:::i;:::-;37328:84;37149:269;37098:320;;;:::o;37424:281::-;37507:27;37529:4;37507:27;:::i;:::-;37499:6;37495:40;37637:6;37625:10;37622:22;37601:18;37589:10;37586:34;37583:62;37580:88;;;37648:18;;:::i;:::-;37580:88;37688:10;37684:2;37677:22;37467:238;37424:281;;:::o;37711:233::-;37750:3;37773:24;37791:5;37773:24;:::i;:::-;37764:33;;37819:66;37812:5;37809:77;37806:103;;;37889:18;;:::i;:::-;37806:103;37936:1;37929:5;37925:13;37918:20;;37711:233;;;:::o;37950:180::-;37998:77;37995:1;37988:88;38095:4;38092:1;38085:15;38119:4;38116:1;38109:15;38136:180;38184:77;38181:1;38174:88;38281:4;38278:1;38271:15;38305:4;38302:1;38295:15;38322:180;38370:77;38367:1;38360:88;38467:4;38464:1;38457:15;38491:4;38488:1;38481:15;38508:180;38556:77;38553:1;38546:88;38653:4;38650:1;38643:15;38677:4;38674:1;38667:15;38694:117;38803:1;38800;38793:12;38817:117;38926:1;38923;38916:12;38940:117;39049:1;39046;39039:12;39063:117;39172:1;39169;39162:12;39186:117;39295:1;39292;39285:12;39309:117;39418:1;39415;39408:12;39432:102;39473:6;39524:2;39520:7;39515:2;39508:5;39504:14;39500:28;39490:38;;39432:102;;;:::o;39540:163::-;39680:15;39676:1;39668:6;39664:14;39657:39;39540:163;:::o;39709:168::-;39849:20;39845:1;39837:6;39833:14;39826:44;39709:168;:::o;39883:225::-;40023:34;40019:1;40011:6;40007:14;40000:58;40092:8;40087:2;40079:6;40075:15;40068:33;39883:225;:::o;40114:172::-;40254:24;40250:1;40242:6;40238:14;40231:48;40114:172;:::o;40292:170::-;40432:22;40428:1;40420:6;40416:14;40409:46;40292:170;:::o;40468:161::-;40608:13;40604:1;40596:6;40592:14;40585:37;40468:161;:::o;40635:163::-;40775:15;40771:1;40763:6;40759:14;40752:39;40635:163;:::o;40804:167::-;40944:19;40940:1;40932:6;40928:14;40921:43;40804:167;:::o;40977:224::-;41117:34;41113:1;41105:6;41101:14;41094:58;41186:7;41181:2;41173:6;41169:15;41162:32;40977:224;:::o;41207:182::-;41347:34;41343:1;41335:6;41331:14;41324:58;41207:182;:::o;41395:167::-;41535:19;41531:1;41523:6;41519:14;41512:43;41395:167;:::o;41568:122::-;41641:24;41659:5;41641:24;:::i;:::-;41634:5;41631:35;41621:63;;41680:1;41677;41670:12;41621:63;41568:122;:::o;41696:116::-;41766:21;41781:5;41766:21;:::i;:::-;41759:5;41756:32;41746:60;;41802:1;41799;41792:12;41746:60;41696:116;:::o;41818:120::-;41890:23;41907:5;41890:23;:::i;:::-;41883:5;41880:34;41870:62;;41928:1;41925;41918:12;41870:62;41818:120;:::o;41944:122::-;42017:24;42035:5;42017:24;:::i;:::-;42010:5;42007:35;41997:63;;42056:1;42053;42046:12;41997:63;41944:122;:::o;42072:118::-;42143:22;42159:5;42143:22;:::i;:::-;42136:5;42133:33;42123:61;;42180:1;42177;42170:12;42123:61;42072:118;:::o

Swarm Source

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