ETH Price: $3,329.81 (-3.50%)

Token

VerbToy (VerbToy)
 

Overview

Max Total Supply

2,774 VerbToy

Holders

630

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 VerbToy
0xb8407c337c8e32da7d6095eb527dec3c2d7fa0da
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:
VerbToy

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-24
*/

// SPDX-License-Identifier: MIT
// File: contracts/IERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

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);
}
// File: contracts/ERC721A.sol


// ERC721A Contracts v4.0.0
// Creator: Chiru Labs

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

/**
 * @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 (_addressToUint256(owner) == 0) revert BalanceQueryForZeroAddress();
        return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

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

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

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

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

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

        address approvedAddress = _tokenApprovals[tokenId];

        bool isApprovedOrOwner = (_msgSenderERC721A() == from ||
            isApprovedForAll(from, _msgSenderERC721A()) ||
            approvedAddress == _msgSenderERC721A());

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            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));
        address approvedAddress = _tokenApprovals[tokenId];

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner.
        if (_addressToUint256(approvedAddress) != 0) {
            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)
        }
    }
}
// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Tree proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Calldata version of {verify}
     *
     * _Available since v4.7._
     */
    function verifyCalldata(
        bytes32[] calldata proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProofCalldata(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Calldata version of {processProof}
     *
     * _Available since v4.7._
     */
    function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by
     * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProof(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Calldata version of {multiProofVerify}
     *
     * _Available since v4.7._
     */
    function multiProofVerifyCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32 root,
        bytes32[] memory leaves
    ) internal pure returns (bool) {
        return processMultiProofCalldata(proof, proofFlags, leaves) == root;
    }

    /**
     * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,
     * consuming from one or the other at each step according to the instructions given by
     * `proofFlags`.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory proof,
        bool[] memory proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    /**
     * @dev Calldata version of {processMultiProof}
     *
     * _Available since v4.7._
     */
    function processMultiProofCalldata(
        bytes32[] calldata proof,
        bool[] calldata proofFlags,
        bytes32[] memory leaves
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leavesLen = leaves.length;
        uint256 totalHashes = proofFlags.length;

        // Check proof validity.
        require(leavesLen + proof.length - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proof` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        if (totalHashes > 0) {
            return hashes[totalHashes - 1];
        } else if (leavesLen > 0) {
            return leaves[0];
        } else {
            return proof[0];
        }
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: @openzeppelin/contracts/utils/Strings.sol


// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)

pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

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

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

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

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

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

// File: @openzeppelin/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @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);
    }
}

// File: contracts/VerbToy.sol


pragma solidity ^0.8.0;




interface iVerb {
    function ownerOf(uint256 tokenId) external view returns (address);
    }
contract VerbToy is ERC721A, Ownable {
     iVerb public Verb;

    uint256 public MAX_SUPPLY = 7000;

    bool public isPresaleActive = false;

    bool _revealed = false;

    string private baseURI = "";

    bytes32 freemintRoot;

    struct UserPurchaseInfo {
        uint256 freeMinted;
    }

    mapping(address => UserPurchaseInfo) public userPurchase;
    mapping(address => uint256) addressBlockBought;
    mapping(uint256 => bool) public claimed;
    uint256[] public claimedIds;
    mapping(bytes32 => bool) public usedDigests;

    constructor(address VerbAddress) ERC721A("VerbToy", "VerbToy") {
          Verb = iVerb(VerbAddress);
    }

    modifier isSecured(uint8 mintType) {
        require(
            addressBlockBought[msg.sender] < block.timestamp,
            "CANNOT_MINT_ON_THE_SAME_BLOCK"
        );
        require(tx.origin == msg.sender, "CONTRACTS_NOT_ALLOWED_TO_MINT");
        if (mintType == 3) {
            require(isPresaleActive, "FREE_MINT_IS_NOT_YET_ACTIVE");
        }

        _;
    }

    modifier supplyMintLimit(uint256 numberOfTokens) {
        require(
            numberOfTokens + totalSupply() <= MAX_SUPPLY,
            "NOT_ENOUGH_SUPPLY"
        );
        _;
    }

    function mint(uint256[] memory tokenIds)
        external
        isSecured(3)
        supplyMintLimit(tokenIds.length)
    {
        for(uint256 id = 0; id < tokenIds.length; id++) {
            require(Verb.ownerOf(tokenIds[id]) == msg.sender, "MUST_OWN_ALL_TOKENS");
            require(claimed[tokenIds[id]] == false, "TOKEN_ALREADY_CLAIMED");
            claimed[tokenIds[id]] = true;
            claimedIds.push(tokenIds[id]);
        }
        addressBlockBought[msg.sender] = block.timestamp;

        uint256 bonus = 0;
        bonus = (tokenIds.length / 8) * 2;
        
        _mint(msg.sender, tokenIds.length + bonus);
    }

    function freeMint(
        bytes32[] memory proof,
        uint256 numberOfTokens,
        uint256 maxMint
    ) external isSecured(3) supplyMintLimit(numberOfTokens) {
        bytes32 leaf = keccak256(abi.encodePacked(msg.sender, maxMint));
        require(MerkleProof.verify(proof, freemintRoot, leaf), "PROOF_INVALID");
        require(
            userPurchase[msg.sender].freeMinted + numberOfTokens <= maxMint,
            "EXCEED_ALLOCATED_MINT_LIMIT"
        );
        addressBlockBought[msg.sender] = block.timestamp;
        userPurchase[msg.sender].freeMinted += numberOfTokens;
        _mint(msg.sender, numberOfTokens);
    }

    function devMint(address[] memory _addresses, uint256[] memory quantities)
        external
        onlyOwner
    {
        require(_addresses.length == quantities.length, "WRONG_PARAMETERS");
        uint256 totalTokens = 0;
        for (uint256 i = 0; i < quantities.length; i++) {
            totalTokens += quantities[i];
        }
        require(totalTokens + totalSupply() <= MAX_SUPPLY, "NOT_ENOUGH_SUPPLY");
        for (uint256 i = 0; i < _addresses.length; i++) {
            _safeMint(_addresses[i], quantities[i]);
        }
    }

    //Essential
    function setBaseURI(string calldata URI) external onlyOwner {
        baseURI = URI;
    }

    function reveal(bool revealed, string calldata _baseURI) public onlyOwner {
        _revealed = revealed;
        baseURI = _baseURI;
    }

    function setPreSaleStatus() external onlyOwner {
        isPresaleActive = !isPresaleActive;
    }

    function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory)
    {
        if (_revealed) {
            return string(abi.encodePacked(baseURI, Strings.toString(tokenId)));
        } else {
            return string(abi.encodePacked(baseURI));
        }
    }

    function setFreeMintRoot(bytes32 _freemintRoot) external onlyOwner {
        freemintRoot = _freemintRoot;
    }

    function decreaseSupply(uint256 _maxSupply) external onlyOwner {
        require(_maxSupply < MAX_SUPPLY, "CANT_INCREASE_SUPPLY");
        MAX_SUPPLY = _maxSupply;
    }

    function getClaimed()
        public
        view
        returns (uint256[] memory)
    {
        return claimedIds;
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"VerbAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApprovalToCurrentOwner","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"Verb","outputs":[{"internalType":"contract iVerb","name":"","type":"address"}],"stateMutability":"view","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"claimedIds","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupply","type":"uint256"}],"name":"decreaseSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_addresses","type":"address[]"},{"internalType":"uint256[]","name":"quantities","type":"uint256[]"}],"name":"devMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"},{"internalType":"uint256","name":"numberOfTokens","type":"uint256"},{"internalType":"uint256","name":"maxMint","type":"uint256"}],"name":"freeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getClaimed","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"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":"isPresaleActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"revealed","type":"bool"},{"internalType":"string","name":"_baseURI","type":"string"}],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"URI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_freemintRoot","type":"bytes32"}],"name":"setFreeMintRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"setPreSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"name":"usedDigests","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"userPurchase","outputs":[{"internalType":"uint256","name":"freeMinted","type":"uint256"}],"stateMutability":"view","type":"function"}]

6080604052611b58600a556000600b60006101000a81548160ff0219169083151502179055506000600b60016101000a81548160ff02191690831515021790555060405180602001604052806000815250600c9080519060200190620000679291906200028c565b503480156200007557600080fd5b50604051620047003803806200470083398181016040528101906200009b919062000353565b6040518060400160405280600781526020017f56657262546f79000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f56657262546f790000000000000000000000000000000000000000000000000081525081600290805190602001906200011f9291906200028c565b508060039080519060200190620001389291906200028c565b5062000149620001b960201b60201c565b60008190555050506200017162000165620001be60201b60201c565b620001c660201b60201c565b80600960006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550506200043d565b600090565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200029a90620003b9565b90600052602060002090601f016020900481019282620002be57600085556200030a565b82601f10620002d957805160ff19168380011785556200030a565b828001600101855582156200030a579182015b8281111562000309578251825591602001919060010190620002ec565b5b5090506200031991906200031d565b5090565b5b80821115620003385760008160009055506001016200031e565b5090565b6000815190506200034d8162000423565b92915050565b6000602082840312156200036c576200036b6200041e565b5b60006200037c848285016200033c565b91505092915050565b6000620003928262000399565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006002820490506001821680620003d257607f821691505b60208210811415620003e957620003e8620003ef565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6200042e8162000385565b81146200043a57600080fd5b50565b6142b3806200044d6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c806370c425751161011a578063ae3bb460116100ad578063d39c4de71161007c578063d39c4de714610588578063dbe7e3bd146105b8578063e985e9c5146105e8578063f2fde38b14610618578063f8e93ef914610634576101fb565b8063ae3bb460146104ee578063b484eff71461050c578063b88d4fde1461053c578063c87b56dd14610558576101fb565b806398e52f9a116100e957806398e52f9a1461047c578063a101ff6d14610498578063a22cb465146104b4578063a6179719146104d0576101fb565b806370c425751461041a578063715018a6146104365780638da5cb5b1461044057806395d89b411461045e576101fb565b806334837ad31161019257806360d938dc1161016157806360d938dc1461036c5780636352211e1461038a57806369cdcfdc146103ba57806370a08231146103ea576101fb565b806334837ad31461030e5780633e07ac021461032a57806342842e0e1461033457806355f804b314610350576101fb565b806318160ddd116101ce57806318160ddd1461029a57806323b872dd146102b85780632446548f146102d457806332cb6b0c146102f0576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a600480360381019061021591906132e4565b610650565b604051610227919061385d565b60405180910390f35b6102386106e2565b6040516102459190613893565b60405180910390f35b6102686004803603810190610263919061338b565b610774565b60405161027591906137d4565b60405180910390f35b610298600480360381019061029391906130e7565b6107f0565b005b6102a2610997565b6040516102af9190613a35565b60405180910390f35b6102d260048036038101906102cd9190612fd1565b6109ae565b005b6102ee60048036038101906102e99190613127565b6109be565b005b6102f8610b81565b6040516103059190613a35565b60405180910390f35b6103286004803603810190610323919061319f565b610b87565b005b610332610ee4565b005b61034e60048036038101906103499190612fd1565b610f8c565b005b61036a6004803603810190610365919061333e565b610fac565b005b61037461103e565b604051610381919061385d565b60405180910390f35b6103a4600480360381019061039f919061338b565b611051565b6040516103b191906137d4565b60405180910390f35b6103d460048036038101906103cf919061338b565b611063565b6040516103e19190613a35565b60405180910390f35b61040460048036038101906103ff9190612f37565b611087565b6040516104119190613a35565b60405180910390f35b610434600480360381019061042f91906132b7565b61111c565b005b61043e6111a2565b005b61044861122a565b60405161045591906137d4565b60405180910390f35b610466611254565b6040516104739190613893565b60405180910390f35b6104966004803603810190610491919061338b565b6112e6565b005b6104b260048036038101906104ad9190613257565b6113b0565b005b6104ce60048036038101906104c991906130a7565b61145d565b005b6104d86115d5565b6040516104e59190613878565b60405180910390f35b6104f66115fb565b604051610503919061383b565b60405180910390f35b61052660048036038101906105219190612f37565b611653565b6040516105339190613a35565b60405180910390f35b61055660048036038101906105519190613024565b611671565b005b610572600480360381019061056d919061338b565b6116e4565b60405161057f9190613893565b60405180910390f35b6105a2600480360381019061059d91906132b7565b611756565b6040516105af919061385d565b60405180910390f35b6105d260048036038101906105cd919061338b565b611776565b6040516105df919061385d565b60405180910390f35b61060260048036038101906105fd9190612f91565b611796565b60405161060f919061385d565b60405180910390f35b610632600480360381019061062d9190612f37565b61182a565b005b61064e6004803603810190610649919061320e565b611922565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106ab57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106db5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546106f190613dc6565b80601f016020809104026020016040519081016040528092919081815260200182805461071d90613dc6565b801561076a5780601f1061073f5761010080835404028352916020019161076a565b820191906000526020600020905b81548152906001019060200180831161074d57829003601f168201915b5050505050905090565b600061077f82611da2565b6107b5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107fb82611e01565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610863576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610882611ecf565b73ffffffffffffffffffffffffffffffffffffffff16146108e5576108ae816108a9611ecf565b611796565b6108e4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109a1611ed7565b6001546000540303905090565b6109b9838383611edc565b505050565b6109c66122a4565b73ffffffffffffffffffffffffffffffffffffffff166109e461122a565b73ffffffffffffffffffffffffffffffffffffffff1614610a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3190613995565b60405180910390fd5b8051825114610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a75906138b5565b60405180910390fd5b6000805b8251811015610ac657828181518110610a9e57610a9d613f5e565b5b602002602001015182610ab19190613bbb565b91508080610abe90613e29565b915050610a82565b50600a54610ad2610997565b82610add9190613bbb565b1115610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b15906139d5565b60405180910390fd5b60005b8351811015610b7b57610b68848281518110610b4057610b3f613f5e565b5b6020026020010151848381518110610b5b57610b5a613f5e565b5b60200260200101516122ac565b8080610b7390613e29565b915050610b21565b50505050565b600a5481565b600342600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0190613955565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6f906138d5565b60405180910390fd5b60038160ff161415610cd457600b60009054906101000a900460ff16610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90613935565b60405180910390fd5b5b82600a54610ce0610997565b82610ceb9190613bbb565b1115610d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d23906139d5565b60405180910390fd5b60003384604051602001610d4192919061376d565b604051602081830303815290604052805190602001209050610d6686600d54836122ca565b610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c90613a15565b60405180910390fd5b8385600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154610df49190613bbb565b1115610e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2c906139b5565b60405180910390fd5b42600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555084600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610ecb9190613bbb565b92505081905550610edc33866122e1565b505050505050565b610eec6122a4565b73ffffffffffffffffffffffffffffffffffffffff16610f0a61122a565b73ffffffffffffffffffffffffffffffffffffffff1614610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5790613995565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b610fa783838360405180602001604052806000815250611671565b505050565b610fb46122a4565b73ffffffffffffffffffffffffffffffffffffffff16610fd261122a565b73ffffffffffffffffffffffffffffffffffffffff1614611028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101f90613995565b60405180910390fd5b8181600c9190611039929190612b61565b505050565b600b60009054906101000a900460ff1681565b600061105c82611e01565b9050919050565b6011818154811061107357600080fd5b906000526020600020016000915090505481565b60008061109383612491565b14156110cb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111246122a4565b73ffffffffffffffffffffffffffffffffffffffff1661114261122a565b73ffffffffffffffffffffffffffffffffffffffff1614611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90613995565b60405180910390fd5b80600d8190555050565b6111aa6122a4565b73ffffffffffffffffffffffffffffffffffffffff166111c861122a565b73ffffffffffffffffffffffffffffffffffffffff161461121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590613995565b60405180910390fd5b611228600061249b565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461126390613dc6565b80601f016020809104026020016040519081016040528092919081815260200182805461128f90613dc6565b80156112dc5780601f106112b1576101008083540402835291602001916112dc565b820191906000526020600020905b8154815290600101906020018083116112bf57829003601f168201915b5050505050905090565b6112ee6122a4565b73ffffffffffffffffffffffffffffffffffffffff1661130c61122a565b73ffffffffffffffffffffffffffffffffffffffff1614611362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135990613995565b60405180910390fd5b600a5481106113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139d90613975565b60405180910390fd5b80600a8190555050565b6113b86122a4565b73ffffffffffffffffffffffffffffffffffffffff166113d661122a565b73ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142390613995565b60405180910390fd5b82600b60016101000a81548160ff0219169083151502179055508181600c9190611457929190612b61565b50505050565b611465611ecf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ca576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006114d7611ecf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611584611ecf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115c9919061385d565b60405180910390a35050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060601180548060200260200160405190810160405280929190818152602001828054801561164957602002820191906000526020600020905b815481526020019060010190808311611635575b5050505050905090565b600e6020528060005260406000206000915090508060000154905081565b61167c848484611edc565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116de576116a784848484612561565b6116dd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600b60019054906101000a900460ff161561172d57600c611706836126c1565b6040516020016117179291906137b0565b6040516020818303038152906040529050611751565b600c60405160200161173f9190613799565b60405160208183030381529060405290505b919050565b60126020528060005260406000206000915054906101000a900460ff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118326122a4565b73ffffffffffffffffffffffffffffffffffffffff1661185061122a565b73ffffffffffffffffffffffffffffffffffffffff16146118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90613995565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d90613915565b60405180910390fd5b61191f8161249b565b50565b600342600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199c90613955565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0a906138d5565b60405180910390fd5b60038160ff161415611a6f57600b60009054906101000a900460ff16611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6590613935565b60405180910390fd5b5b8151600a54611a7c610997565b82611a879190613bbb565b1115611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf906139d5565b60405180910390fd5b60005b8351811015611d23573373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e868481518110611b3c57611b3b613f5e565b5b60200260200101516040518263ffffffff1660e01b8152600401611b609190613a35565b60206040518083038186803b158015611b7857600080fd5b505afa158015611b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb09190612f64565b73ffffffffffffffffffffffffffffffffffffffff1614611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd906138f5565b60405180910390fd5b6000151560106000868481518110611c2157611c20613f5e565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff16151514611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e906139f5565b60405180910390fd5b600160106000868481518110611ca057611c9f613f5e565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055506011848281518110611ce257611ce1613f5e565b5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558080611d1b90613e29565b915050611acb565b5042600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600260088551611d7a9190613c11565b611d849190613c42565b9050611d9c33828651611d979190613bbb565b6122e1565b50505050565b600081611dad611ed7565b11158015611dbc575060005482105b8015611dfa575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611e10611ed7565b11611e9857600054811015611e975760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611e95575b6000811415611e8b576004600083600190039350838152602001908152602001600020549050611e60565b8092505050611eca565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611ee782611e01565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f4e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611fa7611ecf565b73ffffffffffffffffffffffffffffffffffffffff161480611fd65750611fd586611fd0611ecf565b611796565b5b806120135750611fe4611ecf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b90508061204c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061205786612491565b141561208f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61209c8686866001612822565b60006120a783612491565b146120e3576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6121aa87612491565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415612234576000600185019050600060046000838152602001908152602001600020541415612232576000548114612231578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461229c8686866001612828565b505050505050565b600033905090565b6122c682826040518060200160405280600081525061282e565b5050565b6000826122d78584612abf565b1490509392505050565b60008054905060006122f284612491565b141561232a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612365576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123726000848385612822565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16123d760018414612b15565b901b60a042901b6123e785612491565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061240d5781600081905550505061248c6000848385612828565b505050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612587611ecf565b8786866040518563ffffffff1660e01b81526004016125a994939291906137ef565b602060405180830381600087803b1580156125c357600080fd5b505af19250505080156125f457506040513d601f19601f820116820180604052508101906125f19190613311565b60015b61266e573d8060008114612624576040519150601f19603f3d011682016040523d82523d6000602084013e612629565b606091505b50600081511415612666576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612709576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061281d565b600082905060005b6000821461273b57808061272490613e29565b915050600a826127349190613c11565b9150612711565b60008167ffffffffffffffff81111561275757612756613f8d565b5b6040519080825280601f01601f1916602001820160405280156127895781602001600182028036833780820191505090505b5090505b60008514612816576001826127a29190613c9c565b9150600a856127b19190613ea0565b60306127bd9190613bbb565b60f81b8183815181106127d3576127d2613f5e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561280f9190613c11565b945061278d565b8093505050505b919050565b50505050565b50505050565b600080549050600061283f85612491565b1415612877576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156128b2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128bf6000858386612822565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161292460018514612b15565b901b60a042901b61293486612491565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612a38575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129e86000878480600101955087612561565b612a1e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612979578260005414612a3357600080fd5b612aa3565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612a39575b816000819055505050612ab96000858386612828565b50505050565b60008082905060005b8451811015612b0a57612af582868381518110612ae857612ae7613f5e565b5b6020026020010151612b1f565b91508080612b0290613e29565b915050612ac8565b508091505092915050565b6000819050919050565b6000818310612b3757612b328284612b4a565b612b42565b612b418383612b4a565b5b905092915050565b600082600052816020526040600020905092915050565b828054612b6d90613dc6565b90600052602060002090601f016020900481019282612b8f5760008555612bd6565b82601f10612ba857803560ff1916838001178555612bd6565b82800160010185558215612bd6579182015b82811115612bd5578235825591602001919060010190612bba565b5b509050612be39190612be7565b5090565b5b80821115612c00576000816000905550600101612be8565b5090565b6000612c17612c1284613a75565b613a50565b90508083825260208201905082856020860282011115612c3a57612c39613fc6565b5b60005b85811015612c6a5781612c508882612d96565b845260208401935060208301925050600181019050612c3d565b5050509392505050565b6000612c87612c8284613aa1565b613a50565b90508083825260208201905082856020860282011115612caa57612ca9613fc6565b5b60005b85811015612cda5781612cc08882612e5f565b845260208401935060208301925050600181019050612cad565b5050509392505050565b6000612cf7612cf284613acd565b613a50565b90508083825260208201905082856020860282011115612d1a57612d19613fc6565b5b60005b85811015612d4a5781612d308882612f22565b845260208401935060208301925050600181019050612d1d565b5050509392505050565b6000612d67612d6284613af9565b613a50565b905082815260208101848484011115612d8357612d82613fcb565b5b612d8e848285613d84565b509392505050565b600081359050612da58161420a565b92915050565b600081519050612dba8161420a565b92915050565b600082601f830112612dd557612dd4613fc1565b5b8135612de5848260208601612c04565b91505092915050565b600082601f830112612e0357612e02613fc1565b5b8135612e13848260208601612c74565b91505092915050565b600082601f830112612e3157612e30613fc1565b5b8135612e41848260208601612ce4565b91505092915050565b600081359050612e5981614221565b92915050565b600081359050612e6e81614238565b92915050565b600081359050612e838161424f565b92915050565b600081519050612e988161424f565b92915050565b600082601f830112612eb357612eb2613fc1565b5b8135612ec3848260208601612d54565b91505092915050565b60008083601f840112612ee257612ee1613fc1565b5b8235905067ffffffffffffffff811115612eff57612efe613fbc565b5b602083019150836001820283011115612f1b57612f1a613fc6565b5b9250929050565b600081359050612f3181614266565b92915050565b600060208284031215612f4d57612f4c613fd5565b5b6000612f5b84828501612d96565b91505092915050565b600060208284031215612f7a57612f79613fd5565b5b6000612f8884828501612dab565b91505092915050565b60008060408385031215612fa857612fa7613fd5565b5b6000612fb685828601612d96565b9250506020612fc785828601612d96565b9150509250929050565b600080600060608486031215612fea57612fe9613fd5565b5b6000612ff886828701612d96565b935050602061300986828701612d96565b925050604061301a86828701612f22565b9150509250925092565b6000806000806080858703121561303e5761303d613fd5565b5b600061304c87828801612d96565b945050602061305d87828801612d96565b935050604061306e87828801612f22565b925050606085013567ffffffffffffffff81111561308f5761308e613fd0565b5b61309b87828801612e9e565b91505092959194509250565b600080604083850312156130be576130bd613fd5565b5b60006130cc85828601612d96565b92505060206130dd85828601612e4a565b9150509250929050565b600080604083850312156130fe576130fd613fd5565b5b600061310c85828601612d96565b925050602061311d85828601612f22565b9150509250929050565b6000806040838503121561313e5761313d613fd5565b5b600083013567ffffffffffffffff81111561315c5761315b613fd0565b5b61316885828601612dc0565b925050602083013567ffffffffffffffff81111561318957613188613fd0565b5b61319585828601612e1c565b9150509250929050565b6000806000606084860312156131b8576131b7613fd5565b5b600084013567ffffffffffffffff8111156131d6576131d5613fd0565b5b6131e286828701612dee565b93505060206131f386828701612f22565b925050604061320486828701612f22565b9150509250925092565b60006020828403121561322457613223613fd5565b5b600082013567ffffffffffffffff81111561324257613241613fd0565b5b61324e84828501612e1c565b91505092915050565b6000806000604084860312156132705761326f613fd5565b5b600061327e86828701612e4a565b935050602084013567ffffffffffffffff81111561329f5761329e613fd0565b5b6132ab86828701612ecc565b92509250509250925092565b6000602082840312156132cd576132cc613fd5565b5b60006132db84828501612e5f565b91505092915050565b6000602082840312156132fa576132f9613fd5565b5b600061330884828501612e74565b91505092915050565b60006020828403121561332757613326613fd5565b5b600061333584828501612e89565b91505092915050565b6000806020838503121561335557613354613fd5565b5b600083013567ffffffffffffffff81111561337357613372613fd0565b5b61337f85828601612ecc565b92509250509250929050565b6000602082840312156133a1576133a0613fd5565b5b60006133af84828501612f22565b91505092915050565b60006133c48383613738565b60208301905092915050565b6133d981613cd0565b82525050565b6133f06133eb82613cd0565b613e72565b82525050565b600061340182613b4f565b61340b8185613b7d565b935061341683613b2a565b8060005b8381101561344757815161342e88826133b8565b975061343983613b70565b92505060018101905061341a565b5085935050505092915050565b61345d81613ce2565b82525050565b600061346e82613b5a565b6134788185613b8e565b9350613488818560208601613d93565b61349181613fda565b840191505092915050565b6134a581613d4e565b82525050565b60006134b682613b65565b6134c08185613b9f565b93506134d0818560208601613d93565b6134d981613fda565b840191505092915050565b60006134ef82613b65565b6134f98185613bb0565b9350613509818560208601613d93565b80840191505092915050565b6000815461352281613dc6565b61352c8186613bb0565b9450600182166000811461354757600181146135585761358b565b60ff1983168652818601935061358b565b61356185613b3a565b60005b8381101561358357815481890152600182019150602081019050613564565b838801955050505b50505092915050565b60006135a1601083613b9f565b91506135ac82613ff8565b602082019050919050565b60006135c4601d83613b9f565b91506135cf82614021565b602082019050919050565b60006135e7601383613b9f565b91506135f28261404a565b602082019050919050565b600061360a602683613b9f565b915061361582614073565b604082019050919050565b600061362d601b83613b9f565b9150613638826140c2565b602082019050919050565b6000613650601d83613b9f565b915061365b826140eb565b602082019050919050565b6000613673601483613b9f565b915061367e82614114565b602082019050919050565b6000613696602083613b9f565b91506136a18261413d565b602082019050919050565b60006136b9601b83613b9f565b91506136c482614166565b602082019050919050565b60006136dc601183613b9f565b91506136e78261418f565b602082019050919050565b60006136ff601583613b9f565b915061370a826141b8565b602082019050919050565b6000613722600d83613b9f565b915061372d826141e1565b602082019050919050565b61374181613d44565b82525050565b61375081613d44565b82525050565b61376761376282613d44565b613e96565b82525050565b600061377982856133df565b6014820191506137898284613756565b6020820191508190509392505050565b60006137a58284613515565b915081905092915050565b60006137bc8285613515565b91506137c882846134e4565b91508190509392505050565b60006020820190506137e960008301846133d0565b92915050565b600060808201905061380460008301876133d0565b61381160208301866133d0565b61381e6040830185613747565b81810360608301526138308184613463565b905095945050505050565b6000602082019050818103600083015261385581846133f6565b905092915050565b60006020820190506138726000830184613454565b92915050565b600060208201905061388d600083018461349c565b92915050565b600060208201905081810360008301526138ad81846134ab565b905092915050565b600060208201905081810360008301526138ce81613594565b9050919050565b600060208201905081810360008301526138ee816135b7565b9050919050565b6000602082019050818103600083015261390e816135da565b9050919050565b6000602082019050818103600083015261392e816135fd565b9050919050565b6000602082019050818103600083015261394e81613620565b9050919050565b6000602082019050818103600083015261396e81613643565b9050919050565b6000602082019050818103600083015261398e81613666565b9050919050565b600060208201905081810360008301526139ae81613689565b9050919050565b600060208201905081810360008301526139ce816136ac565b9050919050565b600060208201905081810360008301526139ee816136cf565b9050919050565b60006020820190508181036000830152613a0e816136f2565b9050919050565b60006020820190508181036000830152613a2e81613715565b9050919050565b6000602082019050613a4a6000830184613747565b92915050565b6000613a5a613a6b565b9050613a668282613df8565b919050565b6000604051905090565b600067ffffffffffffffff821115613a9057613a8f613f8d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613abc57613abb613f8d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ae857613ae7613f8d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b1457613b13613f8d565b5b613b1d82613fda565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bc682613d44565b9150613bd183613d44565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c0657613c05613ed1565b5b828201905092915050565b6000613c1c82613d44565b9150613c2783613d44565b925082613c3757613c36613f00565b5b828204905092915050565b6000613c4d82613d44565b9150613c5883613d44565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c9157613c90613ed1565b5b828202905092915050565b6000613ca782613d44565b9150613cb283613d44565b925082821015613cc557613cc4613ed1565b5b828203905092915050565b6000613cdb82613d24565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613d5982613d60565b9050919050565b6000613d6b82613d72565b9050919050565b6000613d7d82613d24565b9050919050565b82818337600083830152505050565b60005b83811015613db1578082015181840152602081019050613d96565b83811115613dc0576000848401525b50505050565b60006002820490506001821680613dde57607f821691505b60208210811415613df257613df1613f2f565b5b50919050565b613e0182613fda565b810181811067ffffffffffffffff82111715613e2057613e1f613f8d565b5b80604052505050565b6000613e3482613d44565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e6757613e66613ed1565b5b600182019050919050565b6000613e7d82613e84565b9050919050565b6000613e8f82613feb565b9050919050565b6000819050919050565b6000613eab82613d44565b9150613eb683613d44565b925082613ec657613ec5613f00565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f57524f4e475f504152414d455445525300000000000000000000000000000000600082015250565b7f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e54000000600082015250565b7f4d5553545f4f574e5f414c4c5f544f4b454e5300000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f465245455f4d494e545f49535f4e4f545f5945545f4143544956450000000000600082015250565b7f43414e4e4f545f4d494e545f4f4e5f5448455f53414d455f424c4f434b000000600082015250565b7f43414e545f494e4352454153455f535550504c59000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4558434545445f414c4c4f43415445445f4d494e545f4c494d49540000000000600082015250565b7f4e4f545f454e4f5547485f535550504c59000000000000000000000000000000600082015250565b7f544f4b454e5f414c52454144595f434c41494d45440000000000000000000000600082015250565b7f50524f4f465f494e56414c494400000000000000000000000000000000000000600082015250565b61421381613cd0565b811461421e57600080fd5b50565b61422a81613ce2565b811461423557600080fd5b50565b61424181613cee565b811461424c57600080fd5b50565b61425881613cf8565b811461426357600080fd5b50565b61426f81613d44565b811461427a57600080fd5b5056fea26469706673582212205ccad55c90cfc02551aa1c703e0da86af54b9bc560c939ced18cb3e5ec605c5c64736f6c63430008070033000000000000000000000000018befb7d1f3e84948466ef15cc46baf9ba5295f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c806370c425751161011a578063ae3bb460116100ad578063d39c4de71161007c578063d39c4de714610588578063dbe7e3bd146105b8578063e985e9c5146105e8578063f2fde38b14610618578063f8e93ef914610634576101fb565b8063ae3bb460146104ee578063b484eff71461050c578063b88d4fde1461053c578063c87b56dd14610558576101fb565b806398e52f9a116100e957806398e52f9a1461047c578063a101ff6d14610498578063a22cb465146104b4578063a6179719146104d0576101fb565b806370c425751461041a578063715018a6146104365780638da5cb5b1461044057806395d89b411461045e576101fb565b806334837ad31161019257806360d938dc1161016157806360d938dc1461036c5780636352211e1461038a57806369cdcfdc146103ba57806370a08231146103ea576101fb565b806334837ad31461030e5780633e07ac021461032a57806342842e0e1461033457806355f804b314610350576101fb565b806318160ddd116101ce57806318160ddd1461029a57806323b872dd146102b85780632446548f146102d457806332cb6b0c146102f0576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a600480360381019061021591906132e4565b610650565b604051610227919061385d565b60405180910390f35b6102386106e2565b6040516102459190613893565b60405180910390f35b6102686004803603810190610263919061338b565b610774565b60405161027591906137d4565b60405180910390f35b610298600480360381019061029391906130e7565b6107f0565b005b6102a2610997565b6040516102af9190613a35565b60405180910390f35b6102d260048036038101906102cd9190612fd1565b6109ae565b005b6102ee60048036038101906102e99190613127565b6109be565b005b6102f8610b81565b6040516103059190613a35565b60405180910390f35b6103286004803603810190610323919061319f565b610b87565b005b610332610ee4565b005b61034e60048036038101906103499190612fd1565b610f8c565b005b61036a6004803603810190610365919061333e565b610fac565b005b61037461103e565b604051610381919061385d565b60405180910390f35b6103a4600480360381019061039f919061338b565b611051565b6040516103b191906137d4565b60405180910390f35b6103d460048036038101906103cf919061338b565b611063565b6040516103e19190613a35565b60405180910390f35b61040460048036038101906103ff9190612f37565b611087565b6040516104119190613a35565b60405180910390f35b610434600480360381019061042f91906132b7565b61111c565b005b61043e6111a2565b005b61044861122a565b60405161045591906137d4565b60405180910390f35b610466611254565b6040516104739190613893565b60405180910390f35b6104966004803603810190610491919061338b565b6112e6565b005b6104b260048036038101906104ad9190613257565b6113b0565b005b6104ce60048036038101906104c991906130a7565b61145d565b005b6104d86115d5565b6040516104e59190613878565b60405180910390f35b6104f66115fb565b604051610503919061383b565b60405180910390f35b61052660048036038101906105219190612f37565b611653565b6040516105339190613a35565b60405180910390f35b61055660048036038101906105519190613024565b611671565b005b610572600480360381019061056d919061338b565b6116e4565b60405161057f9190613893565b60405180910390f35b6105a2600480360381019061059d91906132b7565b611756565b6040516105af919061385d565b60405180910390f35b6105d260048036038101906105cd919061338b565b611776565b6040516105df919061385d565b60405180910390f35b61060260048036038101906105fd9190612f91565b611796565b60405161060f919061385d565b60405180910390f35b610632600480360381019061062d9190612f37565b61182a565b005b61064e6004803603810190610649919061320e565b611922565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106ab57506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806106db5750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b6060600280546106f190613dc6565b80601f016020809104026020016040519081016040528092919081815260200182805461071d90613dc6565b801561076a5780601f1061073f5761010080835404028352916020019161076a565b820191906000526020600020905b81548152906001019060200180831161074d57829003601f168201915b5050505050905090565b600061077f82611da2565b6107b5576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107fb82611e01565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610863576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610882611ecf565b73ffffffffffffffffffffffffffffffffffffffff16146108e5576108ae816108a9611ecf565b611796565b6108e4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006109a1611ed7565b6001546000540303905090565b6109b9838383611edc565b505050565b6109c66122a4565b73ffffffffffffffffffffffffffffffffffffffff166109e461122a565b73ffffffffffffffffffffffffffffffffffffffff1614610a3a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3190613995565b60405180910390fd5b8051825114610a7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a75906138b5565b60405180910390fd5b6000805b8251811015610ac657828181518110610a9e57610a9d613f5e565b5b602002602001015182610ab19190613bbb565b91508080610abe90613e29565b915050610a82565b50600a54610ad2610997565b82610add9190613bbb565b1115610b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b15906139d5565b60405180910390fd5b60005b8351811015610b7b57610b68848281518110610b4057610b3f613f5e565b5b6020026020010151848381518110610b5b57610b5a613f5e565b5b60200260200101516122ac565b8080610b7390613e29565b915050610b21565b50505050565b600a5481565b600342600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205410610c0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c0190613955565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614610c78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6f906138d5565b60405180910390fd5b60038160ff161415610cd457600b60009054906101000a900460ff16610cd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cca90613935565b60405180910390fd5b5b82600a54610ce0610997565b82610ceb9190613bbb565b1115610d2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d23906139d5565b60405180910390fd5b60003384604051602001610d4192919061376d565b604051602081830303815290604052805190602001209050610d6686600d54836122ca565b610da5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9c90613a15565b60405180910390fd5b8385600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000154610df49190613bbb565b1115610e35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2c906139b5565b60405180910390fd5b42600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555084600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000016000828254610ecb9190613bbb565b92505081905550610edc33866122e1565b505050505050565b610eec6122a4565b73ffffffffffffffffffffffffffffffffffffffff16610f0a61122a565b73ffffffffffffffffffffffffffffffffffffffff1614610f60576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f5790613995565b60405180910390fd5b600b60009054906101000a900460ff1615600b60006101000a81548160ff021916908315150217905550565b610fa783838360405180602001604052806000815250611671565b505050565b610fb46122a4565b73ffffffffffffffffffffffffffffffffffffffff16610fd261122a565b73ffffffffffffffffffffffffffffffffffffffff1614611028576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161101f90613995565b60405180910390fd5b8181600c9190611039929190612b61565b505050565b600b60009054906101000a900460ff1681565b600061105c82611e01565b9050919050565b6011818154811061107357600080fd5b906000526020600020016000915090505481565b60008061109383612491565b14156110cb576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b6111246122a4565b73ffffffffffffffffffffffffffffffffffffffff1661114261122a565b73ffffffffffffffffffffffffffffffffffffffff1614611198576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118f90613995565b60405180910390fd5b80600d8190555050565b6111aa6122a4565b73ffffffffffffffffffffffffffffffffffffffff166111c861122a565b73ffffffffffffffffffffffffffffffffffffffff161461121e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121590613995565b60405180910390fd5b611228600061249b565b565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606003805461126390613dc6565b80601f016020809104026020016040519081016040528092919081815260200182805461128f90613dc6565b80156112dc5780601f106112b1576101008083540402835291602001916112dc565b820191906000526020600020905b8154815290600101906020018083116112bf57829003601f168201915b5050505050905090565b6112ee6122a4565b73ffffffffffffffffffffffffffffffffffffffff1661130c61122a565b73ffffffffffffffffffffffffffffffffffffffff1614611362576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161135990613995565b60405180910390fd5b600a5481106113a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161139d90613975565b60405180910390fd5b80600a8190555050565b6113b86122a4565b73ffffffffffffffffffffffffffffffffffffffff166113d661122a565b73ffffffffffffffffffffffffffffffffffffffff161461142c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142390613995565b60405180910390fd5b82600b60016101000a81548160ff0219169083151502179055508181600c9190611457929190612b61565b50505050565b611465611ecf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114ca576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80600760006114d7611ecf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611584611ecf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115c9919061385d565b60405180910390a35050565b600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6060601180548060200260200160405190810160405280929190818152602001828054801561164957602002820191906000526020600020905b815481526020019060010190808311611635575b5050505050905090565b600e6020528060005260406000206000915090508060000154905081565b61167c848484611edc565b60008373ffffffffffffffffffffffffffffffffffffffff163b146116de576116a784848484612561565b6116dd576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b6060600b60019054906101000a900460ff161561172d57600c611706836126c1565b6040516020016117179291906137b0565b6040516020818303038152906040529050611751565b600c60405160200161173f9190613799565b60405160208183030381529060405290505b919050565b60126020528060005260406000206000915054906101000a900460ff1681565b60106020528060005260406000206000915054906101000a900460ff1681565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118326122a4565b73ffffffffffffffffffffffffffffffffffffffff1661185061122a565b73ffffffffffffffffffffffffffffffffffffffff16146118a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161189d90613995565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611916576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161190d90613915565b60405180910390fd5b61191f8161249b565b50565b600342600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054106119a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161199c90613955565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff163273ffffffffffffffffffffffffffffffffffffffff1614611a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0a906138d5565b60405180910390fd5b60038160ff161415611a6f57600b60009054906101000a900460ff16611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6590613935565b60405180910390fd5b5b8151600a54611a7c610997565b82611a879190613bbb565b1115611ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abf906139d5565b60405180910390fd5b60005b8351811015611d23573373ffffffffffffffffffffffffffffffffffffffff16600960009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e868481518110611b3c57611b3b613f5e565b5b60200260200101516040518263ffffffff1660e01b8152600401611b609190613a35565b60206040518083038186803b158015611b7857600080fd5b505afa158015611b8c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611bb09190612f64565b73ffffffffffffffffffffffffffffffffffffffff1614611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd906138f5565b60405180910390fd5b6000151560106000868481518110611c2157611c20613f5e565b5b6020026020010151815260200190815260200160002060009054906101000a900460ff16151514611c87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c7e906139f5565b60405180910390fd5b600160106000868481518110611ca057611c9f613f5e565b5b6020026020010151815260200190815260200160002060006101000a81548160ff0219169083151502179055506011848281518110611ce257611ce1613f5e565b5b602002602001015190806001815401808255809150506001900390600052602060002001600090919091909150558080611d1b90613e29565b915050611acb565b5042600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055506000600260088551611d7a9190613c11565b611d849190613c42565b9050611d9c33828651611d979190613bbb565b6122e1565b50505050565b600081611dad611ed7565b11158015611dbc575060005482105b8015611dfa575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b60008082905080611e10611ed7565b11611e9857600054811015611e975760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082161415611e95575b6000811415611e8b576004600083600190039350838152602001908152602001600020549050611e60565b8092505050611eca565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b600033905090565b600090565b6000611ee782611e01565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611f4e576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60006006600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905060008573ffffffffffffffffffffffffffffffffffffffff16611fa7611ecf565b73ffffffffffffffffffffffffffffffffffffffff161480611fd65750611fd586611fd0611ecf565b611796565b5b806120135750611fe4611ecf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b90508061204c576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600061205786612491565b141561208f576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b61209c8686866001612822565b60006120a783612491565b146120e3576006600085815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008154600101919050819055507c020000000000000000000000000000000000000000000000000000000060a042901b6121aa87612491565b1717600460008681526020019081526020016000208190555060007c020000000000000000000000000000000000000000000000000000000084161415612234576000600185019050600060046000838152602001908152602001600020541415612232576000548114612231578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a461229c8686866001612828565b505050505050565b600033905090565b6122c682826040518060200160405280600081525061282e565b5050565b6000826122d78584612abf565b1490509392505050565b60008054905060006122f284612491565b141561232a576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000821415612365576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6123726000848385612822565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e16123d760018414612b15565b901b60a042901b6123e785612491565b171760046000838152602001908152602001600020819055506000819050600083820190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821061240d5781600081905550505061248c6000848385612828565b505050565b6000819050919050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612587611ecf565b8786866040518563ffffffff1660e01b81526004016125a994939291906137ef565b602060405180830381600087803b1580156125c357600080fd5b505af19250505080156125f457506040513d601f19601f820116820180604052508101906125f19190613311565b60015b61266e573d8060008114612624576040519150601f19603f3d011682016040523d82523d6000602084013e612629565b606091505b50600081511415612666576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b60606000821415612709576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061281d565b600082905060005b6000821461273b57808061272490613e29565b915050600a826127349190613c11565b9150612711565b60008167ffffffffffffffff81111561275757612756613f8d565b5b6040519080825280601f01601f1916602001820160405280156127895781602001600182028036833780820191505090505b5090505b60008514612816576001826127a29190613c9c565b9150600a856127b19190613ea0565b60306127bd9190613bbb565b60f81b8183815181106127d3576127d2613f5e565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561280f9190613c11565b945061278d565b8093505050505b919050565b50505050565b50505050565b600080549050600061283f85612491565b1415612877576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008314156128b2576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6128bf6000858386612822565b600160406001901b178302600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254019250508190555060e161292460018514612b15565b901b60a042901b61293486612491565b1717600460008381526020019081526020016000208190555060008190506000848201905060008673ffffffffffffffffffffffffffffffffffffffff163b14612a38575b818673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46129e86000878480600101955087612561565b612a1e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b808210612979578260005414612a3357600080fd5b612aa3565b5b818060010192508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612a39575b816000819055505050612ab96000858386612828565b50505050565b60008082905060005b8451811015612b0a57612af582868381518110612ae857612ae7613f5e565b5b6020026020010151612b1f565b91508080612b0290613e29565b915050612ac8565b508091505092915050565b6000819050919050565b6000818310612b3757612b328284612b4a565b612b42565b612b418383612b4a565b5b905092915050565b600082600052816020526040600020905092915050565b828054612b6d90613dc6565b90600052602060002090601f016020900481019282612b8f5760008555612bd6565b82601f10612ba857803560ff1916838001178555612bd6565b82800160010185558215612bd6579182015b82811115612bd5578235825591602001919060010190612bba565b5b509050612be39190612be7565b5090565b5b80821115612c00576000816000905550600101612be8565b5090565b6000612c17612c1284613a75565b613a50565b90508083825260208201905082856020860282011115612c3a57612c39613fc6565b5b60005b85811015612c6a5781612c508882612d96565b845260208401935060208301925050600181019050612c3d565b5050509392505050565b6000612c87612c8284613aa1565b613a50565b90508083825260208201905082856020860282011115612caa57612ca9613fc6565b5b60005b85811015612cda5781612cc08882612e5f565b845260208401935060208301925050600181019050612cad565b5050509392505050565b6000612cf7612cf284613acd565b613a50565b90508083825260208201905082856020860282011115612d1a57612d19613fc6565b5b60005b85811015612d4a5781612d308882612f22565b845260208401935060208301925050600181019050612d1d565b5050509392505050565b6000612d67612d6284613af9565b613a50565b905082815260208101848484011115612d8357612d82613fcb565b5b612d8e848285613d84565b509392505050565b600081359050612da58161420a565b92915050565b600081519050612dba8161420a565b92915050565b600082601f830112612dd557612dd4613fc1565b5b8135612de5848260208601612c04565b91505092915050565b600082601f830112612e0357612e02613fc1565b5b8135612e13848260208601612c74565b91505092915050565b600082601f830112612e3157612e30613fc1565b5b8135612e41848260208601612ce4565b91505092915050565b600081359050612e5981614221565b92915050565b600081359050612e6e81614238565b92915050565b600081359050612e838161424f565b92915050565b600081519050612e988161424f565b92915050565b600082601f830112612eb357612eb2613fc1565b5b8135612ec3848260208601612d54565b91505092915050565b60008083601f840112612ee257612ee1613fc1565b5b8235905067ffffffffffffffff811115612eff57612efe613fbc565b5b602083019150836001820283011115612f1b57612f1a613fc6565b5b9250929050565b600081359050612f3181614266565b92915050565b600060208284031215612f4d57612f4c613fd5565b5b6000612f5b84828501612d96565b91505092915050565b600060208284031215612f7a57612f79613fd5565b5b6000612f8884828501612dab565b91505092915050565b60008060408385031215612fa857612fa7613fd5565b5b6000612fb685828601612d96565b9250506020612fc785828601612d96565b9150509250929050565b600080600060608486031215612fea57612fe9613fd5565b5b6000612ff886828701612d96565b935050602061300986828701612d96565b925050604061301a86828701612f22565b9150509250925092565b6000806000806080858703121561303e5761303d613fd5565b5b600061304c87828801612d96565b945050602061305d87828801612d96565b935050604061306e87828801612f22565b925050606085013567ffffffffffffffff81111561308f5761308e613fd0565b5b61309b87828801612e9e565b91505092959194509250565b600080604083850312156130be576130bd613fd5565b5b60006130cc85828601612d96565b92505060206130dd85828601612e4a565b9150509250929050565b600080604083850312156130fe576130fd613fd5565b5b600061310c85828601612d96565b925050602061311d85828601612f22565b9150509250929050565b6000806040838503121561313e5761313d613fd5565b5b600083013567ffffffffffffffff81111561315c5761315b613fd0565b5b61316885828601612dc0565b925050602083013567ffffffffffffffff81111561318957613188613fd0565b5b61319585828601612e1c565b9150509250929050565b6000806000606084860312156131b8576131b7613fd5565b5b600084013567ffffffffffffffff8111156131d6576131d5613fd0565b5b6131e286828701612dee565b93505060206131f386828701612f22565b925050604061320486828701612f22565b9150509250925092565b60006020828403121561322457613223613fd5565b5b600082013567ffffffffffffffff81111561324257613241613fd0565b5b61324e84828501612e1c565b91505092915050565b6000806000604084860312156132705761326f613fd5565b5b600061327e86828701612e4a565b935050602084013567ffffffffffffffff81111561329f5761329e613fd0565b5b6132ab86828701612ecc565b92509250509250925092565b6000602082840312156132cd576132cc613fd5565b5b60006132db84828501612e5f565b91505092915050565b6000602082840312156132fa576132f9613fd5565b5b600061330884828501612e74565b91505092915050565b60006020828403121561332757613326613fd5565b5b600061333584828501612e89565b91505092915050565b6000806020838503121561335557613354613fd5565b5b600083013567ffffffffffffffff81111561337357613372613fd0565b5b61337f85828601612ecc565b92509250509250929050565b6000602082840312156133a1576133a0613fd5565b5b60006133af84828501612f22565b91505092915050565b60006133c48383613738565b60208301905092915050565b6133d981613cd0565b82525050565b6133f06133eb82613cd0565b613e72565b82525050565b600061340182613b4f565b61340b8185613b7d565b935061341683613b2a565b8060005b8381101561344757815161342e88826133b8565b975061343983613b70565b92505060018101905061341a565b5085935050505092915050565b61345d81613ce2565b82525050565b600061346e82613b5a565b6134788185613b8e565b9350613488818560208601613d93565b61349181613fda565b840191505092915050565b6134a581613d4e565b82525050565b60006134b682613b65565b6134c08185613b9f565b93506134d0818560208601613d93565b6134d981613fda565b840191505092915050565b60006134ef82613b65565b6134f98185613bb0565b9350613509818560208601613d93565b80840191505092915050565b6000815461352281613dc6565b61352c8186613bb0565b9450600182166000811461354757600181146135585761358b565b60ff1983168652818601935061358b565b61356185613b3a565b60005b8381101561358357815481890152600182019150602081019050613564565b838801955050505b50505092915050565b60006135a1601083613b9f565b91506135ac82613ff8565b602082019050919050565b60006135c4601d83613b9f565b91506135cf82614021565b602082019050919050565b60006135e7601383613b9f565b91506135f28261404a565b602082019050919050565b600061360a602683613b9f565b915061361582614073565b604082019050919050565b600061362d601b83613b9f565b9150613638826140c2565b602082019050919050565b6000613650601d83613b9f565b915061365b826140eb565b602082019050919050565b6000613673601483613b9f565b915061367e82614114565b602082019050919050565b6000613696602083613b9f565b91506136a18261413d565b602082019050919050565b60006136b9601b83613b9f565b91506136c482614166565b602082019050919050565b60006136dc601183613b9f565b91506136e78261418f565b602082019050919050565b60006136ff601583613b9f565b915061370a826141b8565b602082019050919050565b6000613722600d83613b9f565b915061372d826141e1565b602082019050919050565b61374181613d44565b82525050565b61375081613d44565b82525050565b61376761376282613d44565b613e96565b82525050565b600061377982856133df565b6014820191506137898284613756565b6020820191508190509392505050565b60006137a58284613515565b915081905092915050565b60006137bc8285613515565b91506137c882846134e4565b91508190509392505050565b60006020820190506137e960008301846133d0565b92915050565b600060808201905061380460008301876133d0565b61381160208301866133d0565b61381e6040830185613747565b81810360608301526138308184613463565b905095945050505050565b6000602082019050818103600083015261385581846133f6565b905092915050565b60006020820190506138726000830184613454565b92915050565b600060208201905061388d600083018461349c565b92915050565b600060208201905081810360008301526138ad81846134ab565b905092915050565b600060208201905081810360008301526138ce81613594565b9050919050565b600060208201905081810360008301526138ee816135b7565b9050919050565b6000602082019050818103600083015261390e816135da565b9050919050565b6000602082019050818103600083015261392e816135fd565b9050919050565b6000602082019050818103600083015261394e81613620565b9050919050565b6000602082019050818103600083015261396e81613643565b9050919050565b6000602082019050818103600083015261398e81613666565b9050919050565b600060208201905081810360008301526139ae81613689565b9050919050565b600060208201905081810360008301526139ce816136ac565b9050919050565b600060208201905081810360008301526139ee816136cf565b9050919050565b60006020820190508181036000830152613a0e816136f2565b9050919050565b60006020820190508181036000830152613a2e81613715565b9050919050565b6000602082019050613a4a6000830184613747565b92915050565b6000613a5a613a6b565b9050613a668282613df8565b919050565b6000604051905090565b600067ffffffffffffffff821115613a9057613a8f613f8d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613abc57613abb613f8d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613ae857613ae7613f8d565b5b602082029050602081019050919050565b600067ffffffffffffffff821115613b1457613b13613f8d565b5b613b1d82613fda565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613bc682613d44565b9150613bd183613d44565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c0657613c05613ed1565b5b828201905092915050565b6000613c1c82613d44565b9150613c2783613d44565b925082613c3757613c36613f00565b5b828204905092915050565b6000613c4d82613d44565b9150613c5883613d44565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613c9157613c90613ed1565b5b828202905092915050565b6000613ca782613d44565b9150613cb283613d44565b925082821015613cc557613cc4613ed1565b5b828203905092915050565b6000613cdb82613d24565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000613d5982613d60565b9050919050565b6000613d6b82613d72565b9050919050565b6000613d7d82613d24565b9050919050565b82818337600083830152505050565b60005b83811015613db1578082015181840152602081019050613d96565b83811115613dc0576000848401525b50505050565b60006002820490506001821680613dde57607f821691505b60208210811415613df257613df1613f2f565b5b50919050565b613e0182613fda565b810181811067ffffffffffffffff82111715613e2057613e1f613f8d565b5b80604052505050565b6000613e3482613d44565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e6757613e66613ed1565b5b600182019050919050565b6000613e7d82613e84565b9050919050565b6000613e8f82613feb565b9050919050565b6000819050919050565b6000613eab82613d44565b9150613eb683613d44565b925082613ec657613ec5613f00565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b7f57524f4e475f504152414d455445525300000000000000000000000000000000600082015250565b7f434f4e5452414354535f4e4f545f414c4c4f5745445f544f5f4d494e54000000600082015250565b7f4d5553545f4f574e5f414c4c5f544f4b454e5300000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f465245455f4d494e545f49535f4e4f545f5945545f4143544956450000000000600082015250565b7f43414e4e4f545f4d494e545f4f4e5f5448455f53414d455f424c4f434b000000600082015250565b7f43414e545f494e4352454153455f535550504c59000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4558434545445f414c4c4f43415445445f4d494e545f4c494d49540000000000600082015250565b7f4e4f545f454e4f5547485f535550504c59000000000000000000000000000000600082015250565b7f544f4b454e5f414c52454144595f434c41494d45440000000000000000000000600082015250565b7f50524f4f465f494e56414c494400000000000000000000000000000000000000600082015250565b61421381613cd0565b811461421e57600080fd5b50565b61422a81613ce2565b811461423557600080fd5b50565b61424181613cee565b811461424c57600080fd5b50565b61425881613cf8565b811461426357600080fd5b50565b61426f81613d44565b811461427a57600080fd5b5056fea26469706673582212205ccad55c90cfc02551aa1c703e0da86af54b9bc560c939ced18cb3e5ec605c5c64736f6c63430008070033

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

000000000000000000000000018befb7d1f3e84948466ef15cc46baf9ba5295f

-----Decoded View---------------
Arg [0] : VerbAddress (address): 0x018BeFB7D1F3e84948466ef15Cc46bAF9Ba5295F

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 000000000000000000000000018befb7d1f3e84948466ef15cc46baf9ba5295f


Deployed Bytecode Sourcemap

53468:4318:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13088:615;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18111:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20179:204;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19639:474;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;12142:315;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21065:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56067:556;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53539:32;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55406:653;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56898:100;;;:::i;:::-;;21306:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56648:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53580:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;17900:144;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53951:27;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13767:234;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57352:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52484:103;;;:::i;:::-;;51833:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18280:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57474:172;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56748:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;20455:308;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53513:17;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57654:129;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53789:56;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21562:396;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57006:338;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53985:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53905:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20834:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52742:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54743:655;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;13088:615;13173:4;13488:10;13473:25;;:11;:25;;;;:102;;;;13565:10;13550:25;;:11;:25;;;;13473:102;:179;;;;13642:10;13627:25;;:11;:25;;;;13473:179;13453:199;;13088:615;;;:::o;18111:100::-;18165:13;18198:5;18191:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18111:100;:::o;20179:204::-;20247:7;20272:16;20280:7;20272;:16::i;:::-;20267:64;;20297:34;;;;;;;;;;;;;;20267:64;20351:15;:24;20367:7;20351:24;;;;;;;;;;;;;;;;;;;;;20344:31;;20179:204;;;:::o;19639:474::-;19712:13;19744:27;19763:7;19744:18;:27::i;:::-;19712:61;;19794:5;19788:11;;:2;:11;;;19784:48;;;19808:24;;;;;;;;;;;;;;19784:48;19872:5;19849:28;;:19;:17;:19::i;:::-;:28;;;19845:175;;19897:44;19914:5;19921:19;:17;:19::i;:::-;19897:16;:44::i;:::-;19892:128;;19969:35;;;;;;;;;;;;;;19892:128;19845:175;20059:2;20032:15;:24;20048:7;20032:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;20097:7;20093:2;20077:28;;20086:5;20077:28;;;;;;;;;;;;19701:412;19639:474;;:::o;12142:315::-;12195:7;12423:15;:13;:15::i;:::-;12408:12;;12392:13;;:28;:46;12385:53;;12142:315;:::o;21065:170::-;21199:28;21209:4;21215:2;21219:7;21199:9;:28::i;:::-;21065:170;;;:::o;56067:556::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56224:10:::1;:17;56203:10;:17;:38;56195:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;56273:19;56312:9:::0;56307:103:::1;56331:10;:17;56327:1;:21;56307:103;;;56385:10;56396:1;56385:13;;;;;;;;:::i;:::-;;;;;;;;56370:28;;;;;:::i;:::-;;;56350:3;;;;;:::i;:::-;;;;56307:103;;;;56459:10;;56442:13;:11;:13::i;:::-;56428:11;:27;;;;:::i;:::-;:41;;56420:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56507:9;56502:114;56526:10;:17;56522:1;:21;56502:114;;;56565:39;56575:10;56586:1;56575:13;;;;;;;;:::i;:::-;;;;;;;;56590:10;56601:1;56590:13;;;;;;;;:::i;:::-;;;;;;;;56565:9;:39::i;:::-;56545:3;;;;;:::i;:::-;;;;56502:114;;;;56184:439;56067:556:::0;;:::o;53539:32::-;;;;:::o;55406:653::-;55542:1;54255:15;54222:18;:30;54241:10;54222:30;;;;;;;;;;;;;;;;:48;54200:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;54359:10;54346:23;;:9;:23;;;54338:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54430:1;54418:8;:13;;;54414:101;;;54456:15;;;;;;;;;;;54448:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54414:101;55561:14:::1;54660:10;;54643:13;:11;:13::i;:::-;54626:14;:30;;;;:::i;:::-;:44;;54604:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;55588:12:::2;55630:10;55642:7;55613:37;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55603:48;;;;;;55588:63;;55670:45;55689:5;55696:12;;55710:4;55670:18;:45::i;:::-;55662:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;55822:7;55804:14;55766:12;:24;55779:10;55766:24;;;;;;;;;;;;;;;:35;;;:52;;;;:::i;:::-;:63;;55744:140;;;;;;;;;;;;:::i;:::-;;;;;;;;;55928:15;55895:18;:30;55914:10;55895:30;;;;;;;;;;;;;;;:48;;;;55993:14;55954:12;:24;55967:10;55954:24;;;;;;;;;;;;;;;:35;;;:53;;;;;;;:::i;:::-;;;;;;;;56018:33;56024:10;56036:14;56018:5;:33::i;:::-;55577:482;54527:1:::1;55406:653:::0;;;;:::o;56898:100::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56975:15:::1;;;;;;;;;;;56974:16;56956:15;;:34;;;;;;;;;;;;;;;;;;56898:100::o:0;21306:185::-;21444:39;21461:4;21467:2;21471:7;21444:39;;;;;;;;;;;;:16;:39::i;:::-;21306:185;;;:::o;56648:92::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56729:3:::1;;56719:7;:13;;;;;;;:::i;:::-;;56648:92:::0;;:::o;53580:35::-;;;;;;;;;;;;;:::o;17900:144::-;17964:7;18007:27;18026:7;18007:18;:27::i;:::-;17984:52;;17900:144;;;:::o;53951:27::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;13767:234::-;13831:7;13883:1;13855:24;13873:5;13855:17;:24::i;:::-;:29;13851:70;;;13893:28;;;;;;;;;;;;;;13851:70;9106:13;13939:18;:25;13958:5;13939:25;;;;;;;;;;;;;;;;:54;13932:61;;13767:234;;;:::o;57352:114::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57445:13:::1;57430:12;:28;;;;57352:114:::0;:::o;52484:103::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52549:30:::1;52576:1;52549:18;:30::i;:::-;52484:103::o:0;51833:87::-;51879:7;51906:6;;;;;;;;;;;51899:13;;51833:87;:::o;18280:104::-;18336:13;18369:7;18362:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18280:104;:::o;57474:172::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57569:10:::1;;57556;:23;57548:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;57628:10;57615;:23;;;;57474:172:::0;:::o;56748:142::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56845:8:::1;56833:9;;:20;;;;;;;;;;;;;;;;;;56874:8;;56864:7;:18;;;;;;;:::i;:::-;;56748:142:::0;;;:::o;20455:308::-;20566:19;:17;:19::i;:::-;20554:31;;:8;:31;;;20550:61;;;20594:17;;;;;;;;;;;;;;20550:61;20676:8;20624:18;:39;20643:19;:17;:19::i;:::-;20624:39;;;;;;;;;;;;;;;:49;20664:8;20624:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;20736:8;20700:55;;20715:19;:17;:19::i;:::-;20700:55;;;20746:8;20700:55;;;;;;:::i;:::-;;;;;;;;20455:308;;:::o;53513:17::-;;;;;;;;;;;;;:::o;57654:129::-;57724:16;57765:10;57758:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57654:129;:::o;53789:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;21562:396::-;21729:28;21739:4;21745:2;21749:7;21729:9;:28::i;:::-;21790:1;21772:2;:14;;;:19;21768:183;;21811:56;21842:4;21848:2;21852:7;21861:5;21811:30;:56::i;:::-;21806:145;;21895:40;;;;;;;;;;;;;;21806:145;21768:183;21562:396;;;;:::o;57006:338::-;57124:13;57159:9;;;;;;;;;;;57155:182;;;57216:7;57225:25;57242:7;57225:16;:25::i;:::-;57199:52;;;;;;;;;:::i;:::-;;;;;;;;;;;;;57185:67;;;;57155:182;57316:7;57299:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;57285:40;;57006:338;;;;:::o;53985:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;53905:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;20834:164::-;20931:4;20955:18;:25;20974:5;20955:25;;;;;;;;;;;;;;;:35;20981:8;20955:35;;;;;;;;;;;;;;;;;;;;;;;;;20948:42;;20834:164;;;;:::o;52742:201::-;52064:12;:10;:12::i;:::-;52053:23;;:7;:5;:7::i;:::-;:23;;;52045:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;52851:1:::1;52831:22;;:8;:22;;;;52823:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52907:28;52926:8;52907:18;:28::i;:::-;52742:201:::0;:::o;54743:655::-;54821:1;54255:15;54222:18;:30;54241:10;54222:30;;;;;;;;;;;;;;;;:48;54200:127;;;;;;;;;;;;:::i;:::-;;;;;;;;;54359:10;54346:23;;:9;:23;;;54338:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54430:1;54418:8;:13;;;54414:101;;;54456:15;;;;;;;;;;;54448:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;54414:101;54849:8:::1;:15;54660:10;;54643:13;:11;:13::i;:::-;54626:14;:30;;;;:::i;:::-;:44;;54604:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;54886:10:::2;54882:313;54907:8;:15;54902:2;:20;54882:313;;;54983:10;54953:40;;:4;;;;;;;;;;;:12;;;54966:8;54975:2;54966:12;;;;;;;;:::i;:::-;;;;;;;;54953:26;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;::::0;::::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:40;;;54945:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;55065:5;55040:30;;:7;:21;55048:8;55057:2;55048:12;;;;;;;;:::i;:::-;;;;;;;;55040:21;;;;;;;;;;;;;;;;;;;;;:30;;;55032:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;55135:4;55111:7;:21;55119:8;55128:2;55119:12;;;;;;;;:::i;:::-;;;;;;;;55111:21;;;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;55154:10;55170:8;55179:2;55170:12;;;;;;;;:::i;:::-;;;;;;;;55154:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54924:4;;;;;:::i;:::-;;;;54882:313;;;;55238:15;55205:18;:30;55224:10;55205:30;;;;;;;;;;;;;;;:48;;;;55266:13;55326:1;55321;55303:8;:15;:19;;;;:::i;:::-;55302:25;;;;:::i;:::-;55294:33;;55348:42;55354:10;55384:5;55366:8;:15;:23;;;;:::i;:::-;55348:5;:42::i;:::-;54871:527;54527:1:::1;54743:655:::0;;:::o;22213:273::-;22270:4;22326:7;22307:15;:13;:15::i;:::-;:26;;:66;;;;;22360:13;;22350:7;:23;22307:66;:152;;;;;22458:1;9876:8;22411:17;:26;22429:7;22411:26;;;;;;;;;;;;:43;:48;22307:152;22287:172;;22213:273;;;:::o;15415:1129::-;15482:7;15502:12;15517:7;15502:22;;15585:4;15566:15;:13;:15::i;:::-;:23;15562:915;;15619:13;;15612:4;:20;15608:869;;;15657:14;15674:17;:23;15692:4;15674:23;;;;;;;;;;;;15657:40;;15790:1;9876:8;15763:6;:23;:28;15759:699;;;16282:113;16299:1;16289:6;:11;16282:113;;;16342:17;:25;16360:6;;;;;;;16342:25;;;;;;;;;;;;16333:34;;16282:113;;;16428:6;16421:13;;;;;;15759:699;15634:843;15608:869;15562:915;16505:31;;;;;;;;;;;;;;15415:1129;;;;:::o;36481:105::-;36541:7;36568:10;36561:17;;36481:105;:::o;11665:92::-;11721:7;11665:92;:::o;27472:2654::-;27587:27;27617;27636:7;27617:18;:27::i;:::-;27587:57;;27702:4;27661:45;;27677:19;27661:45;;;27657:86;;27715:28;;;;;;;;;;;;;;27657:86;27756:23;27782:15;:24;27798:7;27782:24;;;;;;;;;;;;;;;;;;;;;27756:50;;27819:22;27868:4;27845:27;;:19;:17;:19::i;:::-;:27;;;:87;;;;27889:43;27906:4;27912:19;:17;:19::i;:::-;27889:16;:43::i;:::-;27845:87;:142;;;;27968:19;:17;:19::i;:::-;27949:38;;:15;:38;;;27845:142;27819:169;;28006:17;28001:66;;28032:35;;;;;;;;;;;;;;28001:66;28107:1;28082:21;28100:2;28082:17;:21::i;:::-;:26;28078:62;;;28117:23;;;;;;;;;;;;;;28078:62;28153:43;28175:4;28181:2;28185:7;28194:1;28153:21;:43::i;:::-;28304:1;28266:34;28284:15;28266:17;:34::i;:::-;:39;28262:103;;28329:15;:24;28345:7;28329:24;;;;;;;;;;;;28322:31;;;;;;;;;;;28262:103;28732:18;:24;28751:4;28732:24;;;;;;;;;;;;;;;;28730:26;;;;;;;;;;;;28801:18;:22;28820:2;28801:22;;;;;;;;;;;;;;;;28799:24;;;;;;;;;;;10158:8;9760:3;29182:15;:41;;29140:21;29158:2;29140:17;:21::i;:::-;:84;:128;29094:17;:26;29112:7;29094:26;;;;;;;;;;;:174;;;;29438:1;10158:8;29388:19;:46;:51;29384:626;;;29460:19;29492:1;29482:7;:11;29460:33;;29649:1;29615:17;:30;29633:11;29615:30;;;;;;;;;;;;:35;29611:384;;;29753:13;;29738:11;:28;29734:242;;29933:19;29900:17;:30;29918:11;29900:30;;;;;;;;;;;:52;;;;29734:242;29611:384;29441:569;29384:626;30057:7;30053:2;30038:27;;30047:4;30038:27;;;;;;;;;;;;30076:42;30097:4;30103:2;30107:7;30116:1;30076:20;:42::i;:::-;27576:2550;;;27472:2654;;;:::o;50557:98::-;50610:7;50637:10;50630:17;;50557:98;:::o;22570:104::-;22639:27;22649:2;22653:8;22639:27;;;;;;;;;;;;:9;:27::i;:::-;22570:104;;:::o;39875:190::-;40000:4;40053;40024:25;40037:5;40044:4;40024:12;:25::i;:::-;:33;40017:40;;39875:190;;;;;:::o;25552:1666::-;25617:20;25640:13;;25617:36;;25693:1;25668:21;25686:2;25668:17;:21::i;:::-;:26;25664:58;;;25703:19;;;;;;;;;;;;;;25664:58;25749:1;25737:8;:13;25733:44;;;25759:18;;;;;;;;;;;;;;25733:44;25790:61;25820:1;25824:2;25828:12;25842:8;25790:21;:61::i;:::-;26394:1;9243:2;26365:1;:25;;26364:31;26352:8;:44;26326:18;:22;26345:2;26326:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;10023:3;26795:29;26822:1;26810:8;:13;26795:14;:29::i;:::-;:56;;9760:3;26732:15;:41;;26690:21;26708:2;26690:17;:21::i;:::-;:84;:162;26639:17;:31;26657:12;26639:31;;;;;;;;;;;:213;;;;26869:20;26892:12;26869:35;;26919:11;26948:8;26933:12;:23;26919:37;;26973:111;27025:14;;;;;;27021:2;27000:40;;27017:1;27000:40;;;;;;;;;;;;27079:3;27064:12;:18;26973:111;;27116:12;27100:13;:28;;;;26103:1037;;27150:60;27179:1;27183:2;27187:12;27201:8;27150:20;:60::i;:::-;25606:1612;25552:1666;;:::o;19200:148::-;19264:14;19325:5;19315:15;;19200:148;;;:::o;53103:191::-;53177:16;53196:6;;;;;;;;;;;53177:25;;53222:8;53213:6;;:17;;;;;;;;;;;;;;;;;;53277:8;53246:40;;53267:8;53246:40;;;;;;;;;;;;53166:128;53103:191;:::o;33950:716::-;34113:4;34159:2;34134:45;;;34180:19;:17;:19::i;:::-;34201:4;34207:7;34216:5;34134:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34130:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34434:1;34417:6;:13;:18;34413:235;;;34463:40;;;;;;;;;;;;;;34413:235;34606:6;34600:13;34591:6;34587:2;34583:15;34576:38;34130:529;34303:54;;;34293:64;;;:6;:64;;;;34286:71;;;33950:716;;;;;;:::o;47811:723::-;47867:13;48097:1;48088:5;:10;48084:53;;;48115:10;;;;;;;;;;;;;;;;;;;;;48084:53;48147:12;48162:5;48147:20;;48178:14;48203:78;48218:1;48210:4;:9;48203:78;;48236:8;;;;;:::i;:::-;;;;48267:2;48259:10;;;;;:::i;:::-;;;48203:78;;;48291:19;48323:6;48313:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48291:39;;48341:154;48357:1;48348:5;:10;48341:154;;48385:1;48375:11;;;;;:::i;:::-;;;48452:2;48444:5;:10;;;;:::i;:::-;48431:2;:24;;;;:::i;:::-;48418:39;;48401:6;48408;48401:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;48481:2;48472:11;;;;;:::i;:::-;;;48341:154;;;48519:6;48505:21;;;;;47811:723;;;;:::o;35314:159::-;;;;;:::o;36132:158::-;;;;;:::o;23047:2246::-;23170:20;23193:13;;23170:36;;23246:1;23221:21;23239:2;23221:17;:21::i;:::-;:26;23217:58;;;23256:19;;;;;;;;;;;;;;23217:58;23302:1;23290:8;:13;23286:44;;;23312:18;;;;;;;;;;;;;;23286:44;23343:61;23373:1;23377:2;23381:12;23395:8;23343:21;:61::i;:::-;23947:1;9243:2;23918:1;:25;;23917:31;23905:8;:44;23879:18;:22;23898:2;23879:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;10023:3;24348:29;24375:1;24363:8;:13;24348:14;:29::i;:::-;:56;;9760:3;24285:15;:41;;24243:21;24261:2;24243:17;:21::i;:::-;:84;:162;24192:17;:31;24210:12;24192:31;;;;;;;;;;;:213;;;;24422:20;24445:12;24422:35;;24472:11;24501:8;24486:12;:23;24472:37;;24548:1;24530:2;:14;;;:19;24526:635;;24570:313;24626:12;24622:2;24601:38;;24618:1;24601:38;;;;;;;;;;;;24667:69;24706:1;24710:2;24714:14;;;;;;24730:5;24667:30;:69::i;:::-;24662:174;;24772:40;;;;;;;;;;;;;;24662:174;24878:3;24863:12;:18;24570:313;;24964:12;24947:13;;:29;24943:43;;24978:8;;;24943:43;24526:635;;;25027:119;25083:14;;;;;;25079:2;25058:40;;25075:1;25058:40;;;;;;;;;;;;25141:3;25126:12;:18;25027:119;;24526:635;25191:12;25175:13;:28;;;;23656:1559;;25225:60;25254:1;25258:2;25262:12;25276:8;25225:20;:60::i;:::-;23159:2134;23047:2246;;;:::o;40742:296::-;40825:7;40845:20;40868:4;40845:27;;40888:9;40883:118;40907:5;:12;40903:1;:16;40883:118;;;40956:33;40966:12;40980:5;40986:1;40980:8;;;;;;;;:::i;:::-;;;;;;;;40956:9;:33::i;:::-;40941:48;;40921:3;;;;;:::i;:::-;;;;40883:118;;;;41018:12;41011:19;;;40742:296;;;;:::o;19435:142::-;19493:14;19554:5;19544:15;;19435:142;;;:::o;46949:149::-;47012:7;47043:1;47039;:5;:51;;47070:20;47085:1;47088;47070:14;:20::i;:::-;47039:51;;;47047:20;47062:1;47065;47047:14;:20::i;:::-;47039:51;47032:58;;46949:149;;;;:::o;47106:268::-;47174:13;47281:1;47275:4;47268:15;47310:1;47304:4;47297:15;47351:4;47345;47335:21;47326:30;;47106:268;;;;:::o;-1:-1:-1:-;;;;;;;:::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;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1514:::-;1610:5;1635:81;1651:64;1708:6;1651:64;:::i;:::-;1635:81;:::i;:::-;1626:90;;1736:5;1765:6;1758:5;1751:21;1799:4;1792:5;1788:16;1781:23;;1825:6;1875:3;1867:4;1859:6;1855:17;1850:3;1846:27;1843:36;1840:143;;;1894:79;;:::i;:::-;1840:143;2007:1;1992:238;2017:6;2014:1;2011:13;1992:238;;;2085:3;2114:37;2147:3;2135:10;2114:37;:::i;:::-;2109:3;2102:50;2181:4;2176:3;2172:14;2165:21;;2215:4;2210:3;2206:14;2199:21;;2052:178;2039:1;2036;2032:9;2027:14;;1992:238;;;1996:14;1616:620;;1514:722;;;;;:::o;2242:410::-;2319:5;2344:65;2360:48;2401:6;2360:48;:::i;:::-;2344:65;:::i;:::-;2335:74;;2432:6;2425:5;2418:21;2470:4;2463:5;2459:16;2508:3;2499:6;2494:3;2490:16;2487:25;2484:112;;;2515:79;;:::i;:::-;2484:112;2605:41;2639:6;2634:3;2629;2605:41;:::i;:::-;2325:327;2242:410;;;;;:::o;2658:139::-;2704:5;2742:6;2729:20;2720:29;;2758:33;2785:5;2758:33;:::i;:::-;2658:139;;;;:::o;2803:143::-;2860:5;2891:6;2885:13;2876:22;;2907:33;2934:5;2907:33;:::i;:::-;2803:143;;;;:::o;2969:370::-;3040:5;3089:3;3082:4;3074:6;3070:17;3066:27;3056:122;;3097:79;;:::i;:::-;3056:122;3214:6;3201:20;3239:94;3329:3;3321:6;3314:4;3306:6;3302:17;3239:94;:::i;:::-;3230:103;;3046:293;2969:370;;;;:::o;3362:::-;3433:5;3482:3;3475:4;3467:6;3463:17;3459:27;3449:122;;3490:79;;:::i;:::-;3449:122;3607:6;3594:20;3632:94;3722:3;3714:6;3707:4;3699:6;3695:17;3632:94;:::i;:::-;3623:103;;3439:293;3362:370;;;;:::o;3755:::-;3826:5;3875:3;3868:4;3860:6;3856:17;3852:27;3842:122;;3883:79;;:::i;:::-;3842:122;4000:6;3987:20;4025:94;4115:3;4107:6;4100:4;4092:6;4088:17;4025:94;:::i;:::-;4016:103;;3832:293;3755:370;;;;:::o;4131:133::-;4174:5;4212:6;4199:20;4190:29;;4228:30;4252:5;4228:30;:::i;:::-;4131:133;;;;:::o;4270:139::-;4316:5;4354:6;4341:20;4332:29;;4370:33;4397:5;4370:33;:::i;:::-;4270:139;;;;:::o;4415:137::-;4460:5;4498:6;4485:20;4476:29;;4514:32;4540:5;4514:32;:::i;:::-;4415:137;;;;:::o;4558:141::-;4614:5;4645:6;4639:13;4630:22;;4661:32;4687:5;4661:32;:::i;:::-;4558:141;;;;:::o;4718:338::-;4773:5;4822:3;4815:4;4807:6;4803:17;4799:27;4789:122;;4830:79;;:::i;:::-;4789:122;4947:6;4934:20;4972:78;5046:3;5038:6;5031:4;5023:6;5019:17;4972:78;:::i;:::-;4963:87;;4779:277;4718:338;;;;:::o;5076:553::-;5134:8;5144:6;5194:3;5187:4;5179:6;5175:17;5171:27;5161:122;;5202:79;;:::i;:::-;5161:122;5315:6;5302:20;5292:30;;5345:18;5337:6;5334:30;5331:117;;;5367:79;;:::i;:::-;5331:117;5481:4;5473:6;5469:17;5457:29;;5535:3;5527:4;5519:6;5515:17;5505:8;5501:32;5498:41;5495:128;;;5542:79;;:::i;:::-;5495:128;5076:553;;;;;:::o;5635:139::-;5681:5;5719:6;5706:20;5697:29;;5735:33;5762:5;5735:33;:::i;:::-;5635:139;;;;:::o;5780:329::-;5839:6;5888:2;5876:9;5867:7;5863:23;5859:32;5856:119;;;5894:79;;:::i;:::-;5856:119;6014:1;6039:53;6084:7;6075:6;6064:9;6060:22;6039:53;:::i;:::-;6029:63;;5985:117;5780:329;;;;:::o;6115:351::-;6185:6;6234:2;6222:9;6213:7;6209:23;6205:32;6202:119;;;6240:79;;:::i;:::-;6202:119;6360:1;6385:64;6441:7;6432:6;6421:9;6417:22;6385:64;:::i;:::-;6375:74;;6331:128;6115:351;;;;:::o;6472:474::-;6540:6;6548;6597:2;6585:9;6576:7;6572:23;6568:32;6565:119;;;6603:79;;:::i;:::-;6565:119;6723:1;6748:53;6793:7;6784:6;6773:9;6769:22;6748:53;:::i;:::-;6738:63;;6694:117;6850:2;6876:53;6921:7;6912:6;6901:9;6897:22;6876:53;:::i;:::-;6866:63;;6821:118;6472:474;;;;;:::o;6952:619::-;7029:6;7037;7045;7094:2;7082:9;7073:7;7069:23;7065:32;7062:119;;;7100:79;;:::i;:::-;7062:119;7220:1;7245:53;7290:7;7281:6;7270:9;7266:22;7245:53;:::i;:::-;7235:63;;7191:117;7347:2;7373:53;7418:7;7409:6;7398:9;7394:22;7373:53;:::i;:::-;7363:63;;7318:118;7475:2;7501:53;7546:7;7537:6;7526:9;7522:22;7501:53;:::i;:::-;7491:63;;7446:118;6952:619;;;;;:::o;7577:943::-;7672:6;7680;7688;7696;7745:3;7733:9;7724:7;7720:23;7716:33;7713:120;;;7752:79;;:::i;:::-;7713:120;7872:1;7897:53;7942:7;7933:6;7922:9;7918:22;7897:53;:::i;:::-;7887:63;;7843:117;7999:2;8025:53;8070:7;8061:6;8050:9;8046:22;8025:53;:::i;:::-;8015:63;;7970:118;8127:2;8153:53;8198:7;8189:6;8178:9;8174:22;8153:53;:::i;:::-;8143:63;;8098:118;8283:2;8272:9;8268:18;8255:32;8314:18;8306:6;8303:30;8300:117;;;8336:79;;:::i;:::-;8300:117;8441:62;8495:7;8486:6;8475:9;8471:22;8441:62;:::i;:::-;8431:72;;8226:287;7577:943;;;;;;;:::o;8526:468::-;8591:6;8599;8648:2;8636:9;8627:7;8623:23;8619:32;8616:119;;;8654:79;;:::i;:::-;8616:119;8774:1;8799:53;8844:7;8835:6;8824:9;8820:22;8799:53;:::i;:::-;8789:63;;8745:117;8901:2;8927:50;8969:7;8960:6;8949:9;8945:22;8927:50;:::i;:::-;8917:60;;8872:115;8526:468;;;;;:::o;9000:474::-;9068:6;9076;9125:2;9113:9;9104:7;9100:23;9096:32;9093:119;;;9131:79;;:::i;:::-;9093:119;9251:1;9276:53;9321:7;9312:6;9301:9;9297:22;9276:53;:::i;:::-;9266:63;;9222:117;9378:2;9404:53;9449:7;9440:6;9429:9;9425:22;9404:53;:::i;:::-;9394:63;;9349:118;9000:474;;;;;:::o;9480:894::-;9598:6;9606;9655:2;9643:9;9634:7;9630:23;9626:32;9623:119;;;9661:79;;:::i;:::-;9623:119;9809:1;9798:9;9794:17;9781:31;9839:18;9831:6;9828:30;9825:117;;;9861:79;;:::i;:::-;9825:117;9966:78;10036:7;10027:6;10016:9;10012:22;9966:78;:::i;:::-;9956:88;;9752:302;10121:2;10110:9;10106:18;10093:32;10152:18;10144:6;10141:30;10138:117;;;10174:79;;:::i;:::-;10138:117;10279:78;10349:7;10340:6;10329:9;10325:22;10279:78;:::i;:::-;10269:88;;10064:303;9480:894;;;;;:::o;10380:829::-;10482:6;10490;10498;10547:2;10535:9;10526:7;10522:23;10518:32;10515:119;;;10553:79;;:::i;:::-;10515:119;10701:1;10690:9;10686:17;10673:31;10731:18;10723:6;10720:30;10717:117;;;10753:79;;:::i;:::-;10717:117;10858:78;10928:7;10919:6;10908:9;10904:22;10858:78;:::i;:::-;10848:88;;10644:302;10985:2;11011:53;11056:7;11047:6;11036:9;11032:22;11011:53;:::i;:::-;11001:63;;10956:118;11113:2;11139:53;11184:7;11175:6;11164:9;11160:22;11139:53;:::i;:::-;11129:63;;11084:118;10380:829;;;;;:::o;11215:539::-;11299:6;11348:2;11336:9;11327:7;11323:23;11319:32;11316:119;;;11354:79;;:::i;:::-;11316:119;11502:1;11491:9;11487:17;11474:31;11532:18;11524:6;11521:30;11518:117;;;11554:79;;:::i;:::-;11518:117;11659:78;11729:7;11720:6;11709:9;11705:22;11659:78;:::i;:::-;11649:88;;11445:302;11215:539;;;;:::o;11760:668::-;11837:6;11845;11853;11902:2;11890:9;11881:7;11877:23;11873:32;11870:119;;;11908:79;;:::i;:::-;11870:119;12028:1;12053:50;12095:7;12086:6;12075:9;12071:22;12053:50;:::i;:::-;12043:60;;11999:114;12180:2;12169:9;12165:18;12152:32;12211:18;12203:6;12200:30;12197:117;;;12233:79;;:::i;:::-;12197:117;12346:65;12403:7;12394:6;12383:9;12379:22;12346:65;:::i;:::-;12328:83;;;;12123:298;11760:668;;;;;:::o;12434:329::-;12493:6;12542:2;12530:9;12521:7;12517:23;12513:32;12510:119;;;12548:79;;:::i;:::-;12510:119;12668:1;12693:53;12738:7;12729:6;12718:9;12714:22;12693:53;:::i;:::-;12683:63;;12639:117;12434:329;;;;:::o;12769:327::-;12827:6;12876:2;12864:9;12855:7;12851:23;12847:32;12844:119;;;12882:79;;:::i;:::-;12844:119;13002:1;13027:52;13071:7;13062:6;13051:9;13047:22;13027:52;:::i;:::-;13017:62;;12973:116;12769:327;;;;:::o;13102:349::-;13171:6;13220:2;13208:9;13199:7;13195:23;13191:32;13188:119;;;13226:79;;:::i;:::-;13188:119;13346:1;13371:63;13426:7;13417:6;13406:9;13402:22;13371:63;:::i;:::-;13361:73;;13317:127;13102:349;;;;:::o;13457:529::-;13528:6;13536;13585:2;13573:9;13564:7;13560:23;13556:32;13553:119;;;13591:79;;:::i;:::-;13553:119;13739:1;13728:9;13724:17;13711:31;13769:18;13761:6;13758:30;13755:117;;;13791:79;;:::i;:::-;13755:117;13904:65;13961:7;13952:6;13941:9;13937:22;13904:65;:::i;:::-;13886:83;;;;13682:297;13457:529;;;;;:::o;13992:329::-;14051:6;14100:2;14088:9;14079:7;14075:23;14071:32;14068:119;;;14106:79;;:::i;:::-;14068:119;14226:1;14251:53;14296:7;14287:6;14276:9;14272:22;14251:53;:::i;:::-;14241:63;;14197:117;13992:329;;;;:::o;14327:179::-;14396:10;14417:46;14459:3;14451:6;14417:46;:::i;:::-;14495:4;14490:3;14486:14;14472:28;;14327:179;;;;:::o;14512:118::-;14599:24;14617:5;14599:24;:::i;:::-;14594:3;14587:37;14512:118;;:::o;14636:157::-;14741:45;14761:24;14779:5;14761:24;:::i;:::-;14741:45;:::i;:::-;14736:3;14729:58;14636:157;;:::o;14829:732::-;14948:3;14977:54;15025:5;14977:54;:::i;:::-;15047:86;15126:6;15121:3;15047:86;:::i;:::-;15040:93;;15157:56;15207:5;15157:56;:::i;:::-;15236:7;15267:1;15252:284;15277:6;15274:1;15271:13;15252:284;;;15353:6;15347:13;15380:63;15439:3;15424:13;15380:63;:::i;:::-;15373:70;;15466:60;15519:6;15466:60;:::i;:::-;15456:70;;15312:224;15299:1;15296;15292:9;15287:14;;15252:284;;;15256:14;15552:3;15545:10;;14953:608;;;14829:732;;;;:::o;15567:109::-;15648:21;15663:5;15648:21;:::i;:::-;15643:3;15636:34;15567:109;;:::o;15682:360::-;15768:3;15796:38;15828:5;15796:38;:::i;:::-;15850:70;15913:6;15908:3;15850:70;:::i;:::-;15843:77;;15929:52;15974:6;15969:3;15962:4;15955:5;15951:16;15929:52;:::i;:::-;16006:29;16028:6;16006:29;:::i;:::-;16001:3;15997:39;15990:46;;15772:270;15682:360;;;;:::o;16048:159::-;16149:51;16194:5;16149:51;:::i;:::-;16144:3;16137:64;16048:159;;:::o;16213:364::-;16301:3;16329:39;16362:5;16329:39;:::i;:::-;16384:71;16448:6;16443:3;16384:71;:::i;:::-;16377:78;;16464:52;16509:6;16504:3;16497:4;16490:5;16486:16;16464:52;:::i;:::-;16541:29;16563:6;16541:29;:::i;:::-;16536:3;16532:39;16525:46;;16305:272;16213:364;;;;:::o;16583:377::-;16689:3;16717:39;16750:5;16717:39;:::i;:::-;16772:89;16854:6;16849:3;16772:89;:::i;:::-;16765:96;;16870:52;16915:6;16910:3;16903:4;16896:5;16892:16;16870:52;:::i;:::-;16947:6;16942:3;16938:16;16931:23;;16693:267;16583:377;;;;:::o;16990:845::-;17093:3;17130:5;17124:12;17159:36;17185:9;17159:36;:::i;:::-;17211:89;17293:6;17288:3;17211:89;:::i;:::-;17204:96;;17331:1;17320:9;17316:17;17347:1;17342:137;;;;17493:1;17488:341;;;;17309:520;;17342:137;17426:4;17422:9;17411;17407:25;17402:3;17395:38;17462:6;17457:3;17453:16;17446:23;;17342:137;;17488:341;17555:38;17587:5;17555:38;:::i;:::-;17615:1;17629:154;17643:6;17640:1;17637:13;17629:154;;;17717:7;17711:14;17707:1;17702:3;17698:11;17691:35;17767:1;17758:7;17754:15;17743:26;;17665:4;17662:1;17658:12;17653:17;;17629:154;;;17812:6;17807:3;17803:16;17796:23;;17495:334;;17309:520;;17097:738;;16990:845;;;;:::o;17841:366::-;17983:3;18004:67;18068:2;18063:3;18004:67;:::i;:::-;17997:74;;18080:93;18169:3;18080:93;:::i;:::-;18198:2;18193:3;18189:12;18182:19;;17841:366;;;:::o;18213:::-;18355:3;18376:67;18440:2;18435:3;18376:67;:::i;:::-;18369:74;;18452:93;18541:3;18452:93;:::i;:::-;18570:2;18565:3;18561:12;18554:19;;18213:366;;;:::o;18585:::-;18727:3;18748:67;18812:2;18807:3;18748:67;:::i;:::-;18741:74;;18824:93;18913:3;18824:93;:::i;:::-;18942:2;18937:3;18933:12;18926:19;;18585:366;;;:::o;18957:::-;19099:3;19120:67;19184:2;19179:3;19120:67;:::i;:::-;19113:74;;19196:93;19285:3;19196:93;:::i;:::-;19314:2;19309:3;19305:12;19298:19;;18957:366;;;:::o;19329:::-;19471:3;19492:67;19556:2;19551:3;19492:67;:::i;:::-;19485:74;;19568:93;19657:3;19568:93;:::i;:::-;19686:2;19681:3;19677:12;19670:19;;19329:366;;;:::o;19701:::-;19843:3;19864:67;19928:2;19923:3;19864:67;:::i;:::-;19857:74;;19940:93;20029:3;19940:93;:::i;:::-;20058:2;20053:3;20049:12;20042:19;;19701:366;;;:::o;20073:::-;20215:3;20236:67;20300:2;20295:3;20236:67;:::i;:::-;20229:74;;20312:93;20401:3;20312:93;:::i;:::-;20430:2;20425:3;20421:12;20414:19;;20073:366;;;:::o;20445:::-;20587:3;20608:67;20672:2;20667:3;20608:67;:::i;:::-;20601:74;;20684:93;20773:3;20684:93;:::i;:::-;20802:2;20797:3;20793:12;20786:19;;20445:366;;;:::o;20817:::-;20959:3;20980:67;21044:2;21039:3;20980:67;:::i;:::-;20973:74;;21056:93;21145:3;21056:93;:::i;:::-;21174:2;21169:3;21165:12;21158:19;;20817:366;;;:::o;21189:::-;21331:3;21352:67;21416:2;21411:3;21352:67;:::i;:::-;21345:74;;21428:93;21517:3;21428:93;:::i;:::-;21546:2;21541:3;21537:12;21530:19;;21189:366;;;:::o;21561:::-;21703:3;21724:67;21788:2;21783:3;21724:67;:::i;:::-;21717:74;;21800:93;21889:3;21800:93;:::i;:::-;21918:2;21913:3;21909:12;21902:19;;21561:366;;;:::o;21933:::-;22075:3;22096:67;22160:2;22155:3;22096:67;:::i;:::-;22089:74;;22172:93;22261:3;22172:93;:::i;:::-;22290:2;22285:3;22281:12;22274:19;;21933:366;;;:::o;22305:108::-;22382:24;22400:5;22382:24;:::i;:::-;22377:3;22370:37;22305:108;;:::o;22419:118::-;22506:24;22524:5;22506:24;:::i;:::-;22501:3;22494:37;22419:118;;:::o;22543:157::-;22648:45;22668:24;22686:5;22668:24;:::i;:::-;22648:45;:::i;:::-;22643:3;22636:58;22543:157;;:::o;22706:397::-;22846:3;22861:75;22932:3;22923:6;22861:75;:::i;:::-;22961:2;22956:3;22952:12;22945:19;;22974:75;23045:3;23036:6;22974:75;:::i;:::-;23074:2;23069:3;23065:12;23058:19;;23094:3;23087:10;;22706:397;;;;;:::o;23109:269::-;23238:3;23260:92;23348:3;23339:6;23260:92;:::i;:::-;23253:99;;23369:3;23362:10;;23109:269;;;;:::o;23384:429::-;23561:3;23583:92;23671:3;23662:6;23583:92;:::i;:::-;23576:99;;23692:95;23783:3;23774:6;23692:95;:::i;:::-;23685:102;;23804:3;23797:10;;23384:429;;;;;:::o;23819:222::-;23912:4;23950:2;23939:9;23935:18;23927:26;;23963:71;24031:1;24020:9;24016:17;24007:6;23963:71;:::i;:::-;23819:222;;;;:::o;24047:640::-;24242:4;24280:3;24269:9;24265:19;24257:27;;24294:71;24362:1;24351:9;24347:17;24338:6;24294:71;:::i;:::-;24375:72;24443:2;24432:9;24428:18;24419:6;24375:72;:::i;:::-;24457;24525:2;24514:9;24510:18;24501:6;24457:72;:::i;:::-;24576:9;24570:4;24566:20;24561:2;24550:9;24546:18;24539:48;24604:76;24675:4;24666:6;24604:76;:::i;:::-;24596:84;;24047:640;;;;;;;:::o;24693:373::-;24836:4;24874:2;24863:9;24859:18;24851:26;;24923:9;24917:4;24913:20;24909:1;24898:9;24894:17;24887:47;24951:108;25054:4;25045:6;24951:108;:::i;:::-;24943:116;;24693:373;;;;:::o;25072:210::-;25159:4;25197:2;25186:9;25182:18;25174:26;;25210:65;25272:1;25261:9;25257:17;25248:6;25210:65;:::i;:::-;25072:210;;;;:::o;25288:250::-;25395:4;25433:2;25422:9;25418:18;25410:26;;25446:85;25528:1;25517:9;25513:17;25504:6;25446:85;:::i;:::-;25288:250;;;;:::o;25544:313::-;25657:4;25695:2;25684:9;25680:18;25672:26;;25744:9;25738:4;25734:20;25730:1;25719:9;25715:17;25708:47;25772:78;25845:4;25836:6;25772:78;:::i;:::-;25764:86;;25544:313;;;;:::o;25863:419::-;26029:4;26067:2;26056:9;26052:18;26044:26;;26116:9;26110:4;26106:20;26102:1;26091:9;26087:17;26080:47;26144:131;26270:4;26144:131;:::i;:::-;26136:139;;25863:419;;;:::o;26288:::-;26454:4;26492:2;26481:9;26477:18;26469:26;;26541:9;26535:4;26531:20;26527:1;26516:9;26512:17;26505:47;26569:131;26695:4;26569:131;:::i;:::-;26561:139;;26288:419;;;:::o;26713:::-;26879:4;26917:2;26906:9;26902:18;26894:26;;26966:9;26960:4;26956:20;26952:1;26941:9;26937:17;26930:47;26994:131;27120:4;26994:131;:::i;:::-;26986:139;;26713:419;;;:::o;27138:::-;27304:4;27342:2;27331:9;27327:18;27319:26;;27391:9;27385:4;27381:20;27377:1;27366:9;27362:17;27355:47;27419:131;27545:4;27419:131;:::i;:::-;27411:139;;27138:419;;;:::o;27563:::-;27729:4;27767:2;27756:9;27752:18;27744:26;;27816:9;27810:4;27806:20;27802:1;27791:9;27787:17;27780:47;27844:131;27970:4;27844:131;:::i;:::-;27836:139;;27563:419;;;:::o;27988:::-;28154:4;28192:2;28181:9;28177:18;28169:26;;28241:9;28235:4;28231:20;28227:1;28216:9;28212:17;28205:47;28269:131;28395:4;28269:131;:::i;:::-;28261:139;;27988:419;;;:::o;28413:::-;28579:4;28617:2;28606:9;28602:18;28594:26;;28666:9;28660:4;28656:20;28652:1;28641:9;28637:17;28630:47;28694:131;28820:4;28694:131;:::i;:::-;28686:139;;28413:419;;;:::o;28838:::-;29004:4;29042:2;29031:9;29027:18;29019:26;;29091:9;29085:4;29081:20;29077:1;29066:9;29062:17;29055:47;29119:131;29245:4;29119:131;:::i;:::-;29111:139;;28838:419;;;:::o;29263:::-;29429:4;29467:2;29456:9;29452:18;29444:26;;29516:9;29510:4;29506:20;29502:1;29491:9;29487:17;29480:47;29544:131;29670:4;29544:131;:::i;:::-;29536:139;;29263:419;;;:::o;29688:::-;29854:4;29892:2;29881:9;29877:18;29869:26;;29941:9;29935:4;29931:20;29927:1;29916:9;29912:17;29905:47;29969:131;30095:4;29969:131;:::i;:::-;29961:139;;29688:419;;;:::o;30113:::-;30279:4;30317:2;30306:9;30302:18;30294:26;;30366:9;30360:4;30356:20;30352:1;30341:9;30337:17;30330:47;30394:131;30520:4;30394:131;:::i;:::-;30386:139;;30113:419;;;:::o;30538:::-;30704:4;30742:2;30731:9;30727:18;30719:26;;30791:9;30785:4;30781:20;30777:1;30766:9;30762:17;30755:47;30819:131;30945:4;30819:131;:::i;:::-;30811:139;;30538:419;;;:::o;30963:222::-;31056:4;31094:2;31083:9;31079:18;31071:26;;31107:71;31175:1;31164:9;31160:17;31151:6;31107:71;:::i;:::-;30963:222;;;;:::o;31191:129::-;31225:6;31252:20;;:::i;:::-;31242:30;;31281:33;31309:4;31301:6;31281:33;:::i;:::-;31191:129;;;:::o;31326:75::-;31359:6;31392:2;31386:9;31376:19;;31326:75;:::o;31407:311::-;31484:4;31574:18;31566:6;31563:30;31560:56;;;31596:18;;:::i;:::-;31560:56;31646:4;31638:6;31634:17;31626:25;;31706:4;31700;31696:15;31688:23;;31407:311;;;:::o;31724:::-;31801:4;31891:18;31883:6;31880:30;31877:56;;;31913:18;;:::i;:::-;31877:56;31963:4;31955:6;31951:17;31943:25;;32023:4;32017;32013:15;32005:23;;31724:311;;;:::o;32041:::-;32118:4;32208:18;32200:6;32197:30;32194:56;;;32230:18;;:::i;:::-;32194:56;32280:4;32272:6;32268:17;32260:25;;32340:4;32334;32330:15;32322:23;;32041:311;;;:::o;32358:307::-;32419:4;32509:18;32501:6;32498:30;32495:56;;;32531:18;;:::i;:::-;32495:56;32569:29;32591:6;32569:29;:::i;:::-;32561:37;;32653:4;32647;32643:15;32635:23;;32358:307;;;:::o;32671:132::-;32738:4;32761:3;32753:11;;32791:4;32786:3;32782:14;32774:22;;32671:132;;;:::o;32809:141::-;32858:4;32881:3;32873:11;;32904:3;32901:1;32894:14;32938:4;32935:1;32925:18;32917:26;;32809:141;;;:::o;32956:114::-;33023:6;33057:5;33051:12;33041:22;;32956:114;;;:::o;33076:98::-;33127:6;33161:5;33155:12;33145:22;;33076:98;;;:::o;33180:99::-;33232:6;33266:5;33260:12;33250:22;;33180:99;;;:::o;33285:113::-;33355:4;33387;33382:3;33378:14;33370:22;;33285:113;;;:::o;33404:184::-;33503:11;33537:6;33532:3;33525:19;33577:4;33572:3;33568:14;33553:29;;33404:184;;;;:::o;33594:168::-;33677:11;33711:6;33706:3;33699:19;33751:4;33746:3;33742:14;33727:29;;33594:168;;;;:::o;33768:169::-;33852:11;33886:6;33881:3;33874:19;33926:4;33921:3;33917:14;33902:29;;33768:169;;;;:::o;33943:148::-;34045:11;34082:3;34067:18;;33943:148;;;;:::o;34097:305::-;34137:3;34156:20;34174:1;34156:20;:::i;:::-;34151:25;;34190:20;34208:1;34190:20;:::i;:::-;34185:25;;34344:1;34276:66;34272:74;34269:1;34266:81;34263:107;;;34350:18;;:::i;:::-;34263:107;34394:1;34391;34387:9;34380:16;;34097:305;;;;:::o;34408:185::-;34448:1;34465:20;34483:1;34465:20;:::i;:::-;34460:25;;34499:20;34517:1;34499:20;:::i;:::-;34494:25;;34538:1;34528:35;;34543:18;;:::i;:::-;34528:35;34585:1;34582;34578:9;34573:14;;34408:185;;;;:::o;34599:348::-;34639:7;34662:20;34680:1;34662:20;:::i;:::-;34657:25;;34696:20;34714:1;34696:20;:::i;:::-;34691:25;;34884:1;34816:66;34812:74;34809:1;34806:81;34801:1;34794:9;34787:17;34783:105;34780:131;;;34891:18;;:::i;:::-;34780:131;34939:1;34936;34932:9;34921:20;;34599:348;;;;:::o;34953:191::-;34993:4;35013:20;35031:1;35013:20;:::i;:::-;35008:25;;35047:20;35065:1;35047:20;:::i;:::-;35042:25;;35086:1;35083;35080:8;35077:34;;;35091:18;;:::i;:::-;35077:34;35136:1;35133;35129:9;35121:17;;34953:191;;;;:::o;35150:96::-;35187:7;35216:24;35234:5;35216:24;:::i;:::-;35205:35;;35150:96;;;:::o;35252:90::-;35286:7;35329:5;35322:13;35315:21;35304:32;;35252:90;;;:::o;35348:77::-;35385:7;35414:5;35403:16;;35348:77;;;:::o;35431:149::-;35467:7;35507:66;35500:5;35496:78;35485:89;;35431:149;;;:::o;35586:126::-;35623:7;35663:42;35656:5;35652:54;35641:65;;35586:126;;;:::o;35718:77::-;35755:7;35784:5;35773:16;;35718:77;;;:::o;35801:140::-;35865:9;35898:37;35929:5;35898:37;:::i;:::-;35885:50;;35801:140;;;:::o;35947:126::-;35997:9;36030:37;36061:5;36030:37;:::i;:::-;36017:50;;35947:126;;;:::o;36079:113::-;36129:9;36162:24;36180:5;36162:24;:::i;:::-;36149:37;;36079:113;;;:::o;36198:154::-;36282:6;36277:3;36272;36259:30;36344:1;36335:6;36330:3;36326:16;36319:27;36198:154;;;:::o;36358:307::-;36426:1;36436:113;36450:6;36447:1;36444:13;36436:113;;;36535:1;36530:3;36526:11;36520:18;36516:1;36511:3;36507:11;36500:39;36472:2;36469:1;36465:10;36460:15;;36436:113;;;36567:6;36564:1;36561:13;36558:101;;;36647:1;36638:6;36633:3;36629:16;36622:27;36558:101;36407:258;36358:307;;;:::o;36671:320::-;36715:6;36752:1;36746:4;36742:12;36732:22;;36799:1;36793:4;36789:12;36820:18;36810:81;;36876:4;36868:6;36864:17;36854:27;;36810:81;36938:2;36930:6;36927:14;36907:18;36904:38;36901:84;;;36957:18;;:::i;:::-;36901:84;36722:269;36671:320;;;:::o;36997:281::-;37080:27;37102:4;37080:27;:::i;:::-;37072:6;37068:40;37210:6;37198:10;37195:22;37174:18;37162:10;37159:34;37156:62;37153:88;;;37221:18;;:::i;:::-;37153:88;37261:10;37257:2;37250:22;37040:238;36997:281;;:::o;37284:233::-;37323:3;37346:24;37364:5;37346:24;:::i;:::-;37337:33;;37392:66;37385:5;37382:77;37379:103;;;37462:18;;:::i;:::-;37379:103;37509:1;37502:5;37498:13;37491:20;;37284:233;;;:::o;37523:100::-;37562:7;37591:26;37611:5;37591:26;:::i;:::-;37580:37;;37523:100;;;:::o;37629:94::-;37668:7;37697:20;37711:5;37697:20;:::i;:::-;37686:31;;37629:94;;;:::o;37729:79::-;37768:7;37797:5;37786:16;;37729:79;;;:::o;37814:176::-;37846:1;37863:20;37881:1;37863:20;:::i;:::-;37858:25;;37897:20;37915:1;37897:20;:::i;:::-;37892:25;;37936:1;37926:35;;37941:18;;:::i;:::-;37926:35;37982:1;37979;37975:9;37970:14;;37814:176;;;;:::o;37996:180::-;38044:77;38041:1;38034:88;38141:4;38138:1;38131:15;38165:4;38162:1;38155:15;38182:180;38230:77;38227:1;38220:88;38327:4;38324:1;38317:15;38351:4;38348:1;38341:15;38368:180;38416:77;38413:1;38406:88;38513:4;38510:1;38503:15;38537:4;38534:1;38527:15;38554:180;38602:77;38599:1;38592:88;38699:4;38696:1;38689:15;38723:4;38720:1;38713:15;38740:180;38788:77;38785:1;38778:88;38885:4;38882:1;38875:15;38909:4;38906:1;38899:15;38926:117;39035:1;39032;39025:12;39049:117;39158:1;39155;39148:12;39172:117;39281:1;39278;39271:12;39295:117;39404:1;39401;39394:12;39418:117;39527:1;39524;39517:12;39541:117;39650:1;39647;39640:12;39664:102;39705:6;39756:2;39752:7;39747:2;39740:5;39736:14;39732:28;39722:38;;39664:102;;;:::o;39772:94::-;39805:8;39853:5;39849:2;39845:14;39824:35;;39772:94;;;:::o;39872:166::-;40012:18;40008:1;40000:6;39996:14;39989:42;39872:166;:::o;40044:179::-;40184:31;40180:1;40172:6;40168:14;40161:55;40044:179;:::o;40229:169::-;40369:21;40365:1;40357:6;40353:14;40346:45;40229:169;:::o;40404:225::-;40544:34;40540:1;40532:6;40528:14;40521:58;40613:8;40608:2;40600:6;40596:15;40589:33;40404:225;:::o;40635:177::-;40775:29;40771:1;40763:6;40759:14;40752:53;40635:177;:::o;40818:179::-;40958:31;40954:1;40946:6;40942:14;40935:55;40818:179;:::o;41003:170::-;41143:22;41139:1;41131:6;41127:14;41120:46;41003:170;:::o;41179:182::-;41319:34;41315:1;41307:6;41303:14;41296:58;41179:182;:::o;41367:177::-;41507:29;41503:1;41495:6;41491:14;41484:53;41367:177;:::o;41550:167::-;41690:19;41686:1;41678:6;41674:14;41667:43;41550:167;:::o;41723:171::-;41863:23;41859:1;41851:6;41847:14;41840:47;41723:171;:::o;41900:163::-;42040:15;42036:1;42028:6;42024:14;42017:39;41900:163;:::o;42069:122::-;42142:24;42160:5;42142:24;:::i;:::-;42135:5;42132:35;42122:63;;42181:1;42178;42171:12;42122:63;42069:122;:::o;42197:116::-;42267:21;42282:5;42267:21;:::i;:::-;42260:5;42257:32;42247:60;;42303:1;42300;42293:12;42247:60;42197:116;:::o;42319:122::-;42392:24;42410:5;42392:24;:::i;:::-;42385:5;42382:35;42372:63;;42431:1;42428;42421:12;42372:63;42319:122;:::o;42447:120::-;42519:23;42536:5;42519:23;:::i;:::-;42512:5;42509:34;42499:62;;42557:1;42554;42547:12;42499:62;42447:120;:::o;42573:122::-;42646:24;42664:5;42646:24;:::i;:::-;42639:5;42636:35;42626:63;;42685:1;42682;42675:12;42626:63;42573:122;:::o

Swarm Source

ipfs://5ccad55c90cfc02551aa1c703e0da86af54b9bc560c939ced18cb3e5ec605c5c
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.