ETH Price: $2,489.27 (+2.04%)

Token

BULLY' APES (BULLY)
 

Overview

Max Total Supply

5,555 BULLY

Holders

229

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
kallekallinski.eth
Balance
1 BULLY
0x23355828d30DBE04457014D59Aed62C5477C2fc3
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:
bullyapes

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-05-10
*/

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

// 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: @openzeppelin/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

    /**
     * @dev Replacement for Solidity's `transfer`: sends `amount` wei to
     * `recipient`, forwarding all available gas and reverting on errors.
     *
     * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost
     * of certain opcodes, possibly making contracts go over the 2300 gas limit
     * imposed by `transfer`, making them unable to receive funds via
     * `transfer`. {sendValue} removes this limitation.
     *
     * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].
     *
     * IMPORTANT: because control is transferred to `recipient`, care must be
     * taken to not create reentrancy vulnerabilities. Consider using
     * {ReentrancyGuard} or the
     * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].
     */
    function sendValue(address payable recipient, uint256 amount) internal {
        require(address(this).balance >= amount, "Address: insufficient balance");

        (bool success, ) = recipient.call{value: amount}("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

    /**
     * @dev Performs a Solidity function call using a low level `call`. A
     * plain `call` is an unsafe replacement for a function call: use this
     * function instead.
     *
     * If `target` reverts with a revert reason, it is bubbled up by this
     * function (like regular Solidity function calls).
     *
     * Returns the raw returned data. To convert to the expected return value,
     * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].
     *
     * Requirements:
     *
     * - `target` must be a contract.
     * - calling `target` with `data` must not revert.
     *
     * _Available since v3.1._
     */
    function functionCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionCall(target, data, "Address: low-level call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with
     * `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, 0, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but also transferring `value` wei to `target`.
     *
     * Requirements:
     *
     * - the calling contract must have an ETH balance of at least `value`.
     * - the called Solidity function must be `payable`.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value
    ) internal returns (bytes memory) {
        return functionCallWithValue(target, data, value, "Address: low-level call with value failed");
    }

    /**
     * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but
     * with `errorMessage` as a fallback revert reason when `target` reverts.
     *
     * _Available since v3.1._
     */
    function functionCallWithValue(
        address target,
        bytes memory data,
        uint256 value,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(address(this).balance >= value, "Address: insufficient balance for call");
        require(isContract(target), "Address: call to non-contract");

        (bool success, bytes memory returndata) = target.call{value: value}(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {
        return functionStaticCall(target, data, "Address: low-level static call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a static call.
     *
     * _Available since v3.3._
     */
    function functionStaticCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        require(isContract(target), "Address: static call to non-contract");

        (bool success, bytes memory returndata) = target.staticcall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {
        return functionDelegateCall(target, data, "Address: low-level delegate call failed");
    }

    /**
     * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],
     * but performing a delegate call.
     *
     * _Available since v3.4._
     */
    function functionDelegateCall(
        address target,
        bytes memory data,
        string memory errorMessage
    ) internal returns (bytes memory) {
        require(isContract(target), "Address: delegate call to non-contract");

        (bool success, bytes memory returndata) = target.delegatecall(data);
        return verifyCallResult(success, returndata, errorMessage);
    }

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

/**
 * @title ERC721 token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721 asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}
     * by `operator` from `from`, this function is called.
     *
     * It must return its Solidity selector to confirm the token transfer.
     * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.
     *
     * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface 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);
}

// File: @openzeppelin/contracts/interfaces/IERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

// File: @openzeppelin/contracts/token/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {
        return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);
    }

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `tokenId` must be already minted.
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @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);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @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: erc721a/contracts/ERC721A.sol


// Creator: Chiru Labs

pragma solidity ^0.8.4;








error ApprovalCallerNotOwnerNorApproved();
error ApprovalQueryForNonexistentToken();
error ApproveToCaller();
error ApprovalToCurrentOwner();
error BalanceQueryForZeroAddress();
error MintToZeroAddress();
error MintZeroQuantity();
error OwnerQueryForNonexistentToken();
error TransferCallerNotOwnerNorApproved();
error TransferFromIncorrectOwner();
error TransferToNonERC721ReceiverImplementer();
error TransferToZeroAddress();
error URIQueryForNonexistentToken();

/**
 * @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 Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Compiler will pack this into a single 256bit word.
    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;
    }

    // Compiler will pack this into a single 256bit word.
    struct AddressData {
        // Realistically, 2**64-1 is more than enough.
        uint64 balance;
        // Keeps track of mint count with minimal overhead for tokenomics.
        uint64 numberMinted;
        // Keeps track of burn count with minimal overhead for tokenomics.
        uint64 numberBurned;
        // For miscellaneous variable(s) pertaining to the address
        // (e.g. number of whitelist mint slots used).
        // If there are multiple variables, please pack them into a uint64.
        uint64 aux;
    }

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

    // The number of tokens burned.
    uint256 internal _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 _ownershipOf implementation for details.
    mapping(uint256 => TokenOwnership) internal _ownerships;

    // Mapping owner address to address data
    mapping(address => AddressData) private _addressData;

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

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

    /**
     * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.
     */
    function totalSupply() public view returns (uint256) {
        // Counter underflow is impossible as _burnCounter cannot be incremented
        // more than _currentIndex - _startTokenId() times
        unchecked {
            return _currentIndex - _burnCounter - _startTokenId();
        }
    }

    /**
     * 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 See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {
        return
            interfaceId == type(IERC721).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * Returns the number of tokens minted by `owner`.
     */
    function _numberMinted(address owner) internal view returns (uint256) {
        return uint256(_addressData[owner].numberMinted);
    }

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

    /**
     * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).
     */
    function _getAux(address owner) internal view returns (uint64) {
        return _addressData[owner].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 {
        _addressData[owner].aux = aux;
    }

    /**
     * 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) {
        uint256 curr = tokenId;

        unchecked {
            if (_startTokenId() <= curr && curr < _currentIndex) {
                TokenOwnership memory ownership = _ownerships[curr];
                if (!ownership.burned) {
                    if (ownership.addr != address(0)) {
                        return ownership;
                    }
                    // 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.
                    while (true) {
                        curr--;
                        ownership = _ownerships[curr];
                        if (ownership.addr != address(0)) {
                            return ownership;
                        }
                    }
                }
            }
        }
        revert OwnerQueryForNonexistentToken();
    }

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

    /**
     * @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, tokenId.toString())) : '';
    }

    /**
     * @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 See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public override {
        address owner = ERC721A.ownerOf(tokenId);
        if (to == owner) revert ApprovalToCurrentOwner();

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

        _approve(to, tokenId, owner);
    }

    /**
     * @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 == _msgSender()) revert ApproveToCaller();

        _operatorApprovals[_msgSender()][operator] = approved;
        emit ApprovalForAll(_msgSender(), 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.isContract() && !_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 && !_ownerships[tokenId].burned;
    }

    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 {
        _mint(to, quantity, _data, true);
    }

    /**
     * @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,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = _currentIndex;
        if (to == address(0)) revert MintToZeroAddress();
        if (quantity == 0) revert MintZeroQuantity();

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1
        // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint64(quantity);
            _addressData[to].numberMinted += uint64(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

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

            if (safe && to.isContract()) {
                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 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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();

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

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

        _beforeTokenTransfers(from, to, tokenId, 1);

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // 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 {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = to;
            currSlot.startTimestamp = uint64(block.timestamp);

            // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

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

    /**
     * @dev This is 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 {
        TokenOwnership memory prevOwnership = _ownershipOf(tokenId);

        address from = prevOwnership.addr;

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

            if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();
        }

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

        // Clear approvals from the previous owner
        _approve(address(0), tokenId, from);

        // 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 {
            AddressData storage addressData = _addressData[from];
            addressData.balance -= 1;
            addressData.numberBurned += 1;

            // Keep track of who burned the token, and the timestamp of burning.
            TokenOwnership storage currSlot = _ownerships[tokenId];
            currSlot.addr = from;
            currSlot.startTimestamp = uint64(block.timestamp);
            currSlot.burned = true;

            // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.
            // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
            uint256 nextTokenId = tokenId + 1;
            TokenOwnership storage nextSlot = _ownerships[nextTokenId];
            if (nextSlot.addr == address(0)) {
                // This will suffice for checking _exists(nextTokenId),
                // as a burned slot cannot contain the zero address.
                if (nextTokenId != _currentIndex) {
                    nextSlot.addr = from;
                    nextSlot.startTimestamp = prevOwnership.startTimestamp;
                }
            }
        }

        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 Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(
        address to,
        uint256 tokenId,
        address owner
    ) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(owner, to, tokenId);
    }

    /**
     * @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 IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {
            return retval == 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 {}
}

// File: contracts/NFT.sol


pragma solidity ^0.8.4;






contract bullyapes is ERC721A, ERC2981, Ownable, ReentrancyGuard {
    using Strings for uint256;
    uint256 public constant maxSupply = 5555; //total NFTs available
    address public royaltyAddress = 0xca77410c4cFe7162971fD3a6f37a64e72615EeAE; //need to update before deploying
    uint96 public royaltyFee = 1000; //10% royalty
    string public _baseTokenURI = "ipfs://QmVPyA6TfyqX94m7y4u159ka7vbiShB3UXVCZSydMpKUrc/"; // IPFS link
    string public _baseTokenEXT = ".json"; 
   
    constructor() ERC721A("BULLY' APES", "BULLY") {
         _setDefaultRoyalty(royaltyAddress, royaltyFee); 
    }
    
    /**
     * @notice Mint tokens - owner only 
     */
    function mint(uint256 _mintAmount) external payable {
        uint256 supply = totalSupply();
        require(supply + _mintAmount <= maxSupply , "Exceeds max supply");
        _safeMint(msg.sender, _mintAmount);
    }
     
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }
    
    /**
     * @notice Obtains metadata url for token
     */
   function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");
            string memory currentBaseURI = _baseURI();
            return bytes(currentBaseURI).length > 0 ? string(abi.encodePacked(currentBaseURI, tokenId.toString(),_baseTokenEXT)) : "";
        
    }
    /**
     * @notice Updates the metadata url
     */
    function changeURLParams(string memory _nURL, string memory _nBaseExt) external onlyOwner {
        _baseTokenURI = _nURL;
        _baseTokenEXT = _nBaseExt;
        emit baseTokenURI (_nURL, _nBaseExt);
    }

    /**
     * @notice Mint tokens via airdrop by owner only
     */
    function gift(address _to, uint256 _mintAmount) external onlyOwner {
        uint256 supply = totalSupply();
        require(supply + _mintAmount <= maxSupply, "Exceeds Max Supply");
        _safeMint(_to, _mintAmount);
    }

    /**
     * @notice Change the royalty fee for the collection - denominator out of 10000
     */
    function setRoyaltyFee(uint96 _feeNumerator) external onlyOwner {
        royaltyFee = _feeNumerator;
        _setDefaultRoyalty(royaltyAddress, royaltyFee);
        emit RoyaltyFees(royaltyAddress, royaltyFee);
    }

    /**
     * @notice Change the royalty address where royalty payouts are sent
     */
    function setRoyaltyAddress(address _royaltyAddress) external onlyOwner {
        royaltyAddress = _royaltyAddress;
        _setDefaultRoyalty(royaltyAddress, royaltyFee);
        emit RoyaltyFees(royaltyAddress, royaltyFee);
    }
    /**
     * @notice Withdraw any funds
     */
    function withdrawFunds() external onlyOwner nonReentrant {
        (bool success, ) = msg.sender.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    function supportsInterface(bytes4 interfaceId)
        public
        view
        override(ERC721A, ERC2981)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @notice Event listeners
     */
    event RoyaltyFees(address, uint96);
    event baseTokenURI (string, string);
    event Received (address, uint256);
    
     /**
     * @notice Allow external funds
     */
    receive() external payable {
        emit Received(msg.sender,msg.value);
        }
    


}

Contract Security Audit

Contract ABI

[{"inputs":[],"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"},{"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":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint256","name":"","type":"uint256"}],"name":"Received","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"","type":"address"},{"indexed":false,"internalType":"uint96","name":"","type":"uint96"}],"name":"RoyaltyFees","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"","type":"string"},{"indexed":false,"internalType":"string","name":"","type":"string"}],"name":"baseTokenURI","type":"event"},{"inputs":[],"name":"_baseTokenEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"string","name":"_nURL","type":"string"},{"internalType":"string","name":"_nBaseExt","type":"string"}],"name":"changeURLParams","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"gift","outputs":[],"stateMutability":"nonpayable","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":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","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":[],"name":"royaltyAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"royaltyFee","outputs":[{"internalType":"uint96","name":"","type":"uint96"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"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":"address","name":"_royaltyAddress","type":"address"}],"name":"setRoyaltyAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint96","name":"_feeNumerator","type":"uint96"}],"name":"setRoyaltyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"stateMutability":"payable","type":"receive"}]

608060405273ca77410c4cfe7162971fd3a6f37a64e72615eeae600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506103e8600c60146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055506040518060600160405280603681526020016200472060369139600d9080519060200190620000bd929190620004cd565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600e90805190602001906200010b929190620004cd565b503480156200011957600080fd5b506040518060400160405280600b81526020017f42554c4c592720415045530000000000000000000000000000000000000000008152506040518060400160405280600581526020017f42554c4c5900000000000000000000000000000000000000000000000000000081525081600290805190602001906200019e929190620004cd565b508060039080519060200190620001b7929190620004cd565b50620001c86200024c60201b60201c565b6000819055505050620001f0620001e46200025160201b60201c565b6200025960201b60201c565b6001600b8190555062000246600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff166200031f60201b60201c565b620006fd565b600090565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200032f620004c360201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff16111562000390576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200038790620005cb565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000403576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003fa90620005ed565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6000612710905090565b828054620004db9062000620565b90600052602060002090601f016020900481019282620004ff57600085556200054b565b82601f106200051a57805160ff19168380011785556200054b565b828001600101855582156200054b579182015b828111156200054a5782518255916020019190600101906200052d565b5b5090506200055a91906200055e565b5090565b5b80821115620005795760008160009055506001016200055f565b5090565b60006200058c602a836200060f565b9150620005998262000685565b604082019050919050565b6000620005b36019836200060f565b9150620005c082620006d4565b602082019050919050565b60006020820190508181036000830152620005e6816200057d565b9050919050565b600060208201905081810360008301526200060881620005a4565b9050919050565b600082825260208201905092915050565b600060028204905060018216806200063957607f821691505b6020821081141562000650576200064f62000656565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b614013806200070d6000396000f3fe6080604052600436106101c65760003560e01c8063783fd922116100f7578063b88d4fde11610095578063cfc86f7b11610064578063cfc86f7b14610662578063d5abeb011461068d578063e985e9c5146106b8578063f2fde38b146106f557610206565b8063b88d4fde146105a8578063b8997a97146105d1578063c87b56dd146105fc578063cbce4c971461063957610206565b806395d89b41116100d157806395d89b411461050d578063a0712d6814610538578063a22cb46514610554578063ad2f852a1461057d57610206565b8063783fd9221461048e57806385fee168146104b75780638da5cb5b146104e257610206565b806324600fc31161016457806342842e0e1161013e57806342842e0e146103d45780636352211e146103fd57806370a082311461043a578063715018a61461047757610206565b806324600fc3146103565780632a55205a1461036d57806331faafb4146103ab57610206565b8063081812fc116101a0578063081812fc1461029c578063095ea7b3146102d957806318160ddd1461030257806323b872dd1461032d57610206565b806301ffc9a71461020b57806306d254da1461024857806306fdde031461027157610206565b36610206577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587433346040516101fc9291906136ae565b60405180910390a1005b600080fd5b34801561021757600080fd5b50610232600480360381019061022d91906131d9565b61071e565b60405161023f9190613700565b60405180910390f35b34801561025457600080fd5b5061026f600480360381019061026a9190613016565b610730565b005b34801561027d57600080fd5b506102866108ab565b604051610293919061371b565b60405180910390f35b3480156102a857600080fd5b506102c360048036038101906102be91906132ab565b61093d565b6040516102d09190613647565b60405180910390f35b3480156102e557600080fd5b5061030060048036038101906102fb9190613199565b6109b9565b005b34801561030e57600080fd5b50610317610ac4565b6040516103249190613894565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190613083565b610adb565b005b34801561036257600080fd5b5061036b610aeb565b005b34801561037957600080fd5b50610394600480360381019061038f91906132d8565b610c6c565b6040516103a29291906136ae565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd9190613318565b610e57565b005b3480156103e057600080fd5b506103fb60048036038101906103f69190613083565b610fc2565b005b34801561040957600080fd5b50610424600480360381019061041f91906132ab565b610fe2565b6040516104319190613647565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190613016565b610ff8565b60405161046e9190613894565b60405180910390f35b34801561048357600080fd5b5061048c6110c8565b005b34801561049a57600080fd5b506104b560048036038101906104b09190613233565b611150565b005b3480156104c357600080fd5b506104cc611237565b6040516104d9919061371b565b60405180910390f35b3480156104ee57600080fd5b506104f76112c5565b6040516105049190613647565b60405180910390f35b34801561051957600080fd5b506105226112ef565b60405161052f919061371b565b60405180910390f35b610552600480360381019061054d91906132ab565b611381565b005b34801561056057600080fd5b5061057b60048036038101906105769190613159565b6113eb565b005b34801561058957600080fd5b50610592611563565b60405161059f9190613647565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca91906130d6565b611589565b005b3480156105dd57600080fd5b506105e6611605565b6040516105f391906138af565b60405180910390f35b34801561060857600080fd5b50610623600480360381019061061e91906132ab565b611623565b604051610630919061371b565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b9190613199565b6116cd565b005b34801561066e57600080fd5b506106776117b4565b604051610684919061371b565b60405180910390f35b34801561069957600080fd5b506106a2611842565b6040516106af9190613894565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da9190613043565b611848565b6040516106ec9190613700565b60405180910390f35b34801561070157600080fd5b5061071c60048036038101906107179190613016565b6118dc565b005b6000610729826119d4565b9050919050565b610738611a4e565b73ffffffffffffffffffffffffffffffffffffffff166107566112c5565b73ffffffffffffffffffffffffffffffffffffffff16146107ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a3906137d4565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610833600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff16611a56565b7fa4ed690a721df50356d49a4d13a6678d1c9187a34e4e8602f87389208c396849600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff166040516108a09291906136d7565b60405180910390a150565b6060600280546108ba90613b97565b80601f01602080910402602001604051908101604052809291908181526020018280546108e690613b97565b80156109335780601f1061090857610100808354040283529160200191610933565b820191906000526020600020905b81548152906001019060200180831161091657829003601f168201915b5050505050905090565b600061094882611bec565b61097e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c482610fe2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a2c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4b611a4e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a7d5750610a7b81610a76611a4e565b611848565b155b15610ab4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610abf838383611c3a565b505050565b6000610ace611cec565b6001546000540303905090565b610ae6838383611cf1565b505050565b610af3611a4e565b73ffffffffffffffffffffffffffffffffffffffff16610b116112c5565b73ffffffffffffffffffffffffffffffffffffffff1614610b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5e906137d4565b60405180910390fd5b6002600b541415610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490613854565b60405180910390fd5b6002600b8190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610bdb90613632565b60006040518083038185875af1925050503d8060008114610c18576040519150601f19603f3d011682016040523d82523d6000602084013e610c1d565b606091505b5050905080610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5890613814565b60405180910390fd5b506001600b81905550565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610e025760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610e0c6121a7565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610e389190613a3b565b610e429190613a0a565b90508160000151819350935050509250929050565b610e5f611a4e565b73ffffffffffffffffffffffffffffffffffffffff16610e7d6112c5565b73ffffffffffffffffffffffffffffffffffffffff1614610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca906137d4565b60405180910390fd5b80600c60146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550610f4a600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff16611a56565b7fa4ed690a721df50356d49a4d13a6678d1c9187a34e4e8602f87389208c396849600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff16604051610fb79291906136d7565b60405180910390a150565b610fdd83838360405180602001604052806000815250611589565b505050565b6000610fed826121b1565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611060576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6110d0611a4e565b73ffffffffffffffffffffffffffffffffffffffff166110ee6112c5565b73ffffffffffffffffffffffffffffffffffffffff1614611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b906137d4565b60405180910390fd5b61114e6000612440565b565b611158611a4e565b73ffffffffffffffffffffffffffffffffffffffff166111766112c5565b73ffffffffffffffffffffffffffffffffffffffff16146111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c3906137d4565b60405180910390fd5b81600d90805190602001906111e2929190612dd2565b5080600e90805190602001906111f9929190612dd2565b507f5544cb0e3017f37e42ff90222f47bb6f1e6ee84c02d7c3d86d40fdd44058b3ee828260405161122b92919061373d565b60405180910390a15050565b600e805461124490613b97565b80601f016020809104026020016040519081016040528092919081815260200182805461127090613b97565b80156112bd5780601f10611292576101008083540402835291602001916112bd565b820191906000526020600020905b8154815290600101906020018083116112a057829003601f168201915b505050505081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112fe90613b97565b80601f016020809104026020016040519081016040528092919081815260200182805461132a90613b97565b80156113775780601f1061134c57610100808354040283529160200191611377565b820191906000526020600020905b81548152906001019060200180831161135a57829003601f168201915b5050505050905090565b600061138b610ac4565b90506115b3828261139c91906139b4565b11156113dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d4906137b4565b60405180910390fd5b6113e73383612506565b5050565b6113f3611a4e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611458576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611465611a4e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611512611a4e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115579190613700565b60405180910390a35050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611594848484611cf1565b6115b38373ffffffffffffffffffffffffffffffffffffffff16612524565b80156115c857506115c684848484612547565b155b156115ff576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c60149054906101000a90046bffffffffffffffffffffffff1681565b606061162e82611bec565b61166d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611664906137f4565b60405180910390fd5b60006116776126a7565b9050600081511161169757604051806020016040528060008152506116c5565b806116a184612739565b600e6040516020016116b593929190613601565b6040516020818303038152906040525b915050919050565b6116d5611a4e565b73ffffffffffffffffffffffffffffffffffffffff166116f36112c5565b73ffffffffffffffffffffffffffffffffffffffff1614611749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611740906137d4565b60405180910390fd5b6000611753610ac4565b90506115b3828261176491906139b4565b11156117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90613774565b60405180910390fd5b6117af8383612506565b505050565b600d80546117c190613b97565b80601f01602080910402602001604051908101604052809291908181526020018280546117ed90613b97565b801561183a5780601f1061180f5761010080835404028352916020019161183a565b820191906000526020600020905b81548152906001019060200180831161181d57829003601f168201915b505050505081565b6115b381565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118e4611a4e565b73ffffffffffffffffffffffffffffffffffffffff166119026112c5565b73ffffffffffffffffffffffffffffffffffffffff1614611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f906137d4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf90613794565b60405180910390fd5b6119d181612440565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a475750611a468261289a565b5b9050919050565b600033905090565b611a5e6121a7565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390613834565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2390613874565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600081611bf7611cec565b11158015611c06575060005482105b8015611c33575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611cfc826121b1565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d67576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611d88611a4e565b73ffffffffffffffffffffffffffffffffffffffff161480611db75750611db685611db1611a4e565b611848565b5b80611dfc5750611dc5611a4e565b73ffffffffffffffffffffffffffffffffffffffff16611de48461093d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611e35576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e9c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ea9858585600161297c565b611eb560008487611c3a565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561213557600054821461213457878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121a08585856001612982565b5050505050565b6000612710905090565b6121b9612e58565b6000829050806121c7611cec565b111580156121d6575060005481105b15612409576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161240757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122eb57809250505061243b565b5b60011561240657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461240157809250505061243b565b6122ec565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612520828260405180602001604052806000815250612988565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261256d611a4e565b8786866040518563ffffffff1660e01b815260040161258f9493929190613662565b602060405180830381600087803b1580156125a957600080fd5b505af19250505080156125da57506040513d601f19601f820116820180604052508101906125d79190613206565b60015b612654573d806000811461260a576040519150601f19603f3d011682016040523d82523d6000602084013e61260f565b606091505b5060008151141561264c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d80546126b690613b97565b80601f01602080910402602001604051908101604052809291908181526020018280546126e290613b97565b801561272f5780601f106127045761010080835404028352916020019161272f565b820191906000526020600020905b81548152906001019060200180831161271257829003601f168201915b5050505050905090565b60606000821415612781576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612895565b600082905060005b600082146127b357808061279c90613bfa565b915050600a826127ac9190613a0a565b9150612789565b60008167ffffffffffffffff8111156127cf576127ce613d30565b5b6040519080825280601f01601f1916602001820160405280156128015781602001600182028036833780820191505090505b5090505b6000851461288e5760018261281a9190613a95565b9150600a856128299190613c43565b603061283591906139b4565b60f81b81838151811061284b5761284a613d01565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128879190613a0a565b9450612805565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061296557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061297557506129748261299a565b5b9050919050565b50505050565b50505050565b6129958383836001612a04565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612a71576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612aac576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ab9600086838761297c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612c835750612c828773ffffffffffffffffffffffffffffffffffffffff16612524565b5b15612d49575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cf86000888480600101955088612547565b612d2e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612c89578260005414612d4457600080fd5b612db5565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612d4a575b816000819055505050612dcb6000868387612982565b5050505050565b828054612dde90613b97565b90600052602060002090601f016020900481019282612e005760008555612e47565b82601f10612e1957805160ff1916838001178555612e47565b82800160010185558215612e47579182015b82811115612e46578251825591602001919060010190612e2b565b5b509050612e549190612e9b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612eb4576000816000905550600101612e9c565b5090565b6000612ecb612ec6846138ef565b6138ca565b905082815260208101848484011115612ee757612ee6613d64565b5b612ef2848285613b55565b509392505050565b6000612f0d612f0884613920565b6138ca565b905082815260208101848484011115612f2957612f28613d64565b5b612f34848285613b55565b509392505050565b600081359050612f4b81613f6a565b92915050565b600081359050612f6081613f81565b92915050565b600081359050612f7581613f98565b92915050565b600081519050612f8a81613f98565b92915050565b600082601f830112612fa557612fa4613d5f565b5b8135612fb5848260208601612eb8565b91505092915050565b600082601f830112612fd357612fd2613d5f565b5b8135612fe3848260208601612efa565b91505092915050565b600081359050612ffb81613faf565b92915050565b60008135905061301081613fc6565b92915050565b60006020828403121561302c5761302b613d6e565b5b600061303a84828501612f3c565b91505092915050565b6000806040838503121561305a57613059613d6e565b5b600061306885828601612f3c565b925050602061307985828601612f3c565b9150509250929050565b60008060006060848603121561309c5761309b613d6e565b5b60006130aa86828701612f3c565b93505060206130bb86828701612f3c565b92505060406130cc86828701612fec565b9150509250925092565b600080600080608085870312156130f0576130ef613d6e565b5b60006130fe87828801612f3c565b945050602061310f87828801612f3c565b935050604061312087828801612fec565b925050606085013567ffffffffffffffff81111561314157613140613d69565b5b61314d87828801612f90565b91505092959194509250565b600080604083850312156131705761316f613d6e565b5b600061317e85828601612f3c565b925050602061318f85828601612f51565b9150509250929050565b600080604083850312156131b0576131af613d6e565b5b60006131be85828601612f3c565b92505060206131cf85828601612fec565b9150509250929050565b6000602082840312156131ef576131ee613d6e565b5b60006131fd84828501612f66565b91505092915050565b60006020828403121561321c5761321b613d6e565b5b600061322a84828501612f7b565b91505092915050565b6000806040838503121561324a57613249613d6e565b5b600083013567ffffffffffffffff81111561326857613267613d69565b5b61327485828601612fbe565b925050602083013567ffffffffffffffff81111561329557613294613d69565b5b6132a185828601612fbe565b9150509250929050565b6000602082840312156132c1576132c0613d6e565b5b60006132cf84828501612fec565b91505092915050565b600080604083850312156132ef576132ee613d6e565b5b60006132fd85828601612fec565b925050602061330e85828601612fec565b9150509250929050565b60006020828403121561332e5761332d613d6e565b5b600061333c84828501613001565b91505092915050565b61334e81613ac9565b82525050565b61335d81613adb565b82525050565b600061336e82613966565b613378818561397c565b9350613388818560208601613b64565b61339181613d73565b840191505092915050565b60006133a782613971565b6133b18185613998565b93506133c1818560208601613b64565b6133ca81613d73565b840191505092915050565b60006133e082613971565b6133ea81856139a9565b93506133fa818560208601613b64565b80840191505092915050565b6000815461341381613b97565b61341d81866139a9565b9450600182166000811461343857600181146134495761347c565b60ff1983168652818601935061347c565b61345285613951565b60005b8381101561347457815481890152600182019150602081019050613455565b838801955050505b50505092915050565b6000613492601283613998565b915061349d82613d84565b602082019050919050565b60006134b5602683613998565b91506134c082613dad565b604082019050919050565b60006134d8601283613998565b91506134e382613dfc565b602082019050919050565b60006134fb602083613998565b915061350682613e25565b602082019050919050565b600061351e602f83613998565b915061352982613e4e565b604082019050919050565b600061354160008361398d565b915061354c82613e9d565b600082019050919050565b6000613564601083613998565b915061356f82613ea0565b602082019050919050565b6000613587602a83613998565b915061359282613ec9565b604082019050919050565b60006135aa601f83613998565b91506135b582613f18565b602082019050919050565b60006135cd601983613998565b91506135d882613f41565b602082019050919050565b6135ec81613b33565b82525050565b6135fb81613b3d565b82525050565b600061360d82866133d5565b915061361982856133d5565b91506136258284613406565b9150819050949350505050565b600061363d82613534565b9150819050919050565b600060208201905061365c6000830184613345565b92915050565b60006080820190506136776000830187613345565b6136846020830186613345565b61369160408301856135e3565b81810360608301526136a38184613363565b905095945050505050565b60006040820190506136c36000830185613345565b6136d060208301846135e3565b9392505050565b60006040820190506136ec6000830185613345565b6136f960208301846135f2565b9392505050565b60006020820190506137156000830184613354565b92915050565b60006020820190508181036000830152613735818461339c565b905092915050565b60006040820190508181036000830152613757818561339c565b9050818103602083015261376b818461339c565b90509392505050565b6000602082019050818103600083015261378d81613485565b9050919050565b600060208201905081810360008301526137ad816134a8565b9050919050565b600060208201905081810360008301526137cd816134cb565b9050919050565b600060208201905081810360008301526137ed816134ee565b9050919050565b6000602082019050818103600083015261380d81613511565b9050919050565b6000602082019050818103600083015261382d81613557565b9050919050565b6000602082019050818103600083015261384d8161357a565b9050919050565b6000602082019050818103600083015261386d8161359d565b9050919050565b6000602082019050818103600083015261388d816135c0565b9050919050565b60006020820190506138a960008301846135e3565b92915050565b60006020820190506138c460008301846135f2565b92915050565b60006138d46138e5565b90506138e08282613bc9565b919050565b6000604051905090565b600067ffffffffffffffff82111561390a57613909613d30565b5b61391382613d73565b9050602081019050919050565b600067ffffffffffffffff82111561393b5761393a613d30565b5b61394482613d73565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006139bf82613b33565b91506139ca83613b33565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139ff576139fe613c74565b5b828201905092915050565b6000613a1582613b33565b9150613a2083613b33565b925082613a3057613a2f613ca3565b5b828204905092915050565b6000613a4682613b33565b9150613a5183613b33565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a8a57613a89613c74565b5b828202905092915050565b6000613aa082613b33565b9150613aab83613b33565b925082821015613abe57613abd613c74565b5b828203905092915050565b6000613ad482613b13565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613b82578082015181840152602081019050613b67565b83811115613b91576000848401525b50505050565b60006002820490506001821680613baf57607f821691505b60208210811415613bc357613bc2613cd2565b5b50919050565b613bd282613d73565b810181811067ffffffffffffffff82111715613bf157613bf0613d30565b5b80604052505050565b6000613c0582613b33565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c3857613c37613c74565b5b600182019050919050565b6000613c4e82613b33565b9150613c5983613b33565b925082613c6957613c68613ca3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45786365656473204d617820537570706c790000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b613f7381613ac9565b8114613f7e57600080fd5b50565b613f8a81613adb565b8114613f9557600080fd5b50565b613fa181613ae7565b8114613fac57600080fd5b50565b613fb881613b33565b8114613fc357600080fd5b50565b613fcf81613b3d565b8114613fda57600080fd5b5056fea26469706673582212209e46302eeb60a0b9cfcf9acee88a6797288b916c8ce407ab19e0b82cf91ca88a64736f6c63430008070033697066733a2f2f516d5650794136546679715839346d377934753135396b613776626953684233555856435a5379644d704b5572632f

Deployed Bytecode

0x6080604052600436106101c65760003560e01c8063783fd922116100f7578063b88d4fde11610095578063cfc86f7b11610064578063cfc86f7b14610662578063d5abeb011461068d578063e985e9c5146106b8578063f2fde38b146106f557610206565b8063b88d4fde146105a8578063b8997a97146105d1578063c87b56dd146105fc578063cbce4c971461063957610206565b806395d89b41116100d157806395d89b411461050d578063a0712d6814610538578063a22cb46514610554578063ad2f852a1461057d57610206565b8063783fd9221461048e57806385fee168146104b75780638da5cb5b146104e257610206565b806324600fc31161016457806342842e0e1161013e57806342842e0e146103d45780636352211e146103fd57806370a082311461043a578063715018a61461047757610206565b806324600fc3146103565780632a55205a1461036d57806331faafb4146103ab57610206565b8063081812fc116101a0578063081812fc1461029c578063095ea7b3146102d957806318160ddd1461030257806323b872dd1461032d57610206565b806301ffc9a71461020b57806306d254da1461024857806306fdde031461027157610206565b36610206577f88a5966d370b9919b20f3e2c13ff65706f196a4e32cc2c12bf57088f8852587433346040516101fc9291906136ae565b60405180910390a1005b600080fd5b34801561021757600080fd5b50610232600480360381019061022d91906131d9565b61071e565b60405161023f9190613700565b60405180910390f35b34801561025457600080fd5b5061026f600480360381019061026a9190613016565b610730565b005b34801561027d57600080fd5b506102866108ab565b604051610293919061371b565b60405180910390f35b3480156102a857600080fd5b506102c360048036038101906102be91906132ab565b61093d565b6040516102d09190613647565b60405180910390f35b3480156102e557600080fd5b5061030060048036038101906102fb9190613199565b6109b9565b005b34801561030e57600080fd5b50610317610ac4565b6040516103249190613894565b60405180910390f35b34801561033957600080fd5b50610354600480360381019061034f9190613083565b610adb565b005b34801561036257600080fd5b5061036b610aeb565b005b34801561037957600080fd5b50610394600480360381019061038f91906132d8565b610c6c565b6040516103a29291906136ae565b60405180910390f35b3480156103b757600080fd5b506103d260048036038101906103cd9190613318565b610e57565b005b3480156103e057600080fd5b506103fb60048036038101906103f69190613083565b610fc2565b005b34801561040957600080fd5b50610424600480360381019061041f91906132ab565b610fe2565b6040516104319190613647565b60405180910390f35b34801561044657600080fd5b50610461600480360381019061045c9190613016565b610ff8565b60405161046e9190613894565b60405180910390f35b34801561048357600080fd5b5061048c6110c8565b005b34801561049a57600080fd5b506104b560048036038101906104b09190613233565b611150565b005b3480156104c357600080fd5b506104cc611237565b6040516104d9919061371b565b60405180910390f35b3480156104ee57600080fd5b506104f76112c5565b6040516105049190613647565b60405180910390f35b34801561051957600080fd5b506105226112ef565b60405161052f919061371b565b60405180910390f35b610552600480360381019061054d91906132ab565b611381565b005b34801561056057600080fd5b5061057b60048036038101906105769190613159565b6113eb565b005b34801561058957600080fd5b50610592611563565b60405161059f9190613647565b60405180910390f35b3480156105b457600080fd5b506105cf60048036038101906105ca91906130d6565b611589565b005b3480156105dd57600080fd5b506105e6611605565b6040516105f391906138af565b60405180910390f35b34801561060857600080fd5b50610623600480360381019061061e91906132ab565b611623565b604051610630919061371b565b60405180910390f35b34801561064557600080fd5b50610660600480360381019061065b9190613199565b6116cd565b005b34801561066e57600080fd5b506106776117b4565b604051610684919061371b565b60405180910390f35b34801561069957600080fd5b506106a2611842565b6040516106af9190613894565b60405180910390f35b3480156106c457600080fd5b506106df60048036038101906106da9190613043565b611848565b6040516106ec9190613700565b60405180910390f35b34801561070157600080fd5b5061071c60048036038101906107179190613016565b6118dc565b005b6000610729826119d4565b9050919050565b610738611a4e565b73ffffffffffffffffffffffffffffffffffffffff166107566112c5565b73ffffffffffffffffffffffffffffffffffffffff16146107ac576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107a3906137d4565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550610833600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff16611a56565b7fa4ed690a721df50356d49a4d13a6678d1c9187a34e4e8602f87389208c396849600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff166040516108a09291906136d7565b60405180910390a150565b6060600280546108ba90613b97565b80601f01602080910402602001604051908101604052809291908181526020018280546108e690613b97565b80156109335780601f1061090857610100808354040283529160200191610933565b820191906000526020600020905b81548152906001019060200180831161091657829003601f168201915b5050505050905090565b600061094882611bec565b61097e576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c482610fe2565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a2c576040517f943f7b8c00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a4b611a4e565b73ffffffffffffffffffffffffffffffffffffffff1614158015610a7d5750610a7b81610a76611a4e565b611848565b155b15610ab4576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610abf838383611c3a565b505050565b6000610ace611cec565b6001546000540303905090565b610ae6838383611cf1565b505050565b610af3611a4e565b73ffffffffffffffffffffffffffffffffffffffff16610b116112c5565b73ffffffffffffffffffffffffffffffffffffffff1614610b67576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b5e906137d4565b60405180910390fd5b6002600b541415610bad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ba490613854565b60405180910390fd5b6002600b8190555060003373ffffffffffffffffffffffffffffffffffffffff1647604051610bdb90613632565b60006040518083038185875af1925050503d8060008114610c18576040519150601f19603f3d011682016040523d82523d6000602084013e610c1d565b606091505b5050905080610c61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c5890613814565b60405180910390fd5b506001600b81905550565b6000806000600960008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161415610e025760086040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610e0c6121a7565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610e389190613a3b565b610e429190613a0a565b90508160000151819350935050509250929050565b610e5f611a4e565b73ffffffffffffffffffffffffffffffffffffffff16610e7d6112c5565b73ffffffffffffffffffffffffffffffffffffffff1614610ed3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eca906137d4565b60405180910390fd5b80600c60146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550610f4a600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff16611a56565b7fa4ed690a721df50356d49a4d13a6678d1c9187a34e4e8602f87389208c396849600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600c60149054906101000a90046bffffffffffffffffffffffff16604051610fb79291906136d7565b60405180910390a150565b610fdd83838360405180602001604052806000815250611589565b505050565b6000610fed826121b1565b600001519050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611060576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a900467ffffffffffffffff1667ffffffffffffffff169050919050565b6110d0611a4e565b73ffffffffffffffffffffffffffffffffffffffff166110ee6112c5565b73ffffffffffffffffffffffffffffffffffffffff1614611144576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113b906137d4565b60405180910390fd5b61114e6000612440565b565b611158611a4e565b73ffffffffffffffffffffffffffffffffffffffff166111766112c5565b73ffffffffffffffffffffffffffffffffffffffff16146111cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c3906137d4565b60405180910390fd5b81600d90805190602001906111e2929190612dd2565b5080600e90805190602001906111f9929190612dd2565b507f5544cb0e3017f37e42ff90222f47bb6f1e6ee84c02d7c3d86d40fdd44058b3ee828260405161122b92919061373d565b60405180910390a15050565b600e805461124490613b97565b80601f016020809104026020016040519081016040528092919081815260200182805461127090613b97565b80156112bd5780601f10611292576101008083540402835291602001916112bd565b820191906000526020600020905b8154815290600101906020018083116112a057829003601f168201915b505050505081565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600380546112fe90613b97565b80601f016020809104026020016040519081016040528092919081815260200182805461132a90613b97565b80156113775780601f1061134c57610100808354040283529160200191611377565b820191906000526020600020905b81548152906001019060200180831161135a57829003601f168201915b5050505050905090565b600061138b610ac4565b90506115b3828261139c91906139b4565b11156113dd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113d4906137b4565b60405180910390fd5b6113e73383612506565b5050565b6113f3611a4e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611458576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611465611a4e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611512611a4e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516115579190613700565b60405180910390a35050565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b611594848484611cf1565b6115b38373ffffffffffffffffffffffffffffffffffffffff16612524565b80156115c857506115c684848484612547565b155b156115ff576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b50505050565b600c60149054906101000a90046bffffffffffffffffffffffff1681565b606061162e82611bec565b61166d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611664906137f4565b60405180910390fd5b60006116776126a7565b9050600081511161169757604051806020016040528060008152506116c5565b806116a184612739565b600e6040516020016116b593929190613601565b6040516020818303038152906040525b915050919050565b6116d5611a4e565b73ffffffffffffffffffffffffffffffffffffffff166116f36112c5565b73ffffffffffffffffffffffffffffffffffffffff1614611749576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611740906137d4565b60405180910390fd5b6000611753610ac4565b90506115b3828261176491906139b4565b11156117a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161179c90613774565b60405180910390fd5b6117af8383612506565b505050565b600d80546117c190613b97565b80601f01602080910402602001604051908101604052809291908181526020018280546117ed90613b97565b801561183a5780601f1061180f5761010080835404028352916020019161183a565b820191906000526020600020905b81548152906001019060200180831161181d57829003601f168201915b505050505081565b6115b381565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6118e4611a4e565b73ffffffffffffffffffffffffffffffffffffffff166119026112c5565b73ffffffffffffffffffffffffffffffffffffffff1614611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f906137d4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156119c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bf90613794565b60405180910390fd5b6119d181612440565b50565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611a475750611a468261289a565b5b9050919050565b600033905090565b611a5e6121a7565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611abc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ab390613834565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611b2c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b2390613874565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600860008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600081611bf7611cec565b11158015611c06575060005482105b8015611c33575060046000838152602001908152602001600020600001601c9054906101000a900460ff16155b9050919050565b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b600090565b6000611cfc826121b1565b90508373ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614611d67576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60008473ffffffffffffffffffffffffffffffffffffffff16611d88611a4e565b73ffffffffffffffffffffffffffffffffffffffff161480611db75750611db685611db1611a4e565b611848565b5b80611dfc5750611dc5611a4e565b73ffffffffffffffffffffffffffffffffffffffff16611de48461093d565b73ffffffffffffffffffffffffffffffffffffffff16145b905080611e35576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415611e9c576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ea9858585600161297c565b611eb560008487611c3a565b6001600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160392506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506001600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600460008581526020019081526020016000209050848160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550428160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555060006001850190506000600460008381526020019081526020016000209050600073ffffffffffffffffffffffffffffffffffffffff168160000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16141561213557600054821461213457878160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555084602001518160000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b505050828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46121a08585856001612982565b5050505050565b6000612710905090565b6121b9612e58565b6000829050806121c7611cec565b111580156121d6575060005481105b15612409576000600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050806040015161240757600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff16146122eb57809250505061243b565b5b60011561240657818060019003925050600460008381526020019081526020016000206040518060600160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815260200160008201601c9054906101000a900460ff1615151515815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff161461240157809250505061243b565b6122ec565b5b505b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612520828260405180602001604052806000815250612988565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261256d611a4e565b8786866040518563ffffffff1660e01b815260040161258f9493929190613662565b602060405180830381600087803b1580156125a957600080fd5b505af19250505080156125da57506040513d601f19601f820116820180604052508101906125d79190613206565b60015b612654573d806000811461260a576040519150601f19603f3d011682016040523d82523d6000602084013e61260f565b606091505b5060008151141561264c576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6060600d80546126b690613b97565b80601f01602080910402602001604051908101604052809291908181526020018280546126e290613b97565b801561272f5780601f106127045761010080835404028352916020019161272f565b820191906000526020600020905b81548152906001019060200180831161271257829003601f168201915b5050505050905090565b60606000821415612781576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612895565b600082905060005b600082146127b357808061279c90613bfa565b915050600a826127ac9190613a0a565b9150612789565b60008167ffffffffffffffff8111156127cf576127ce613d30565b5b6040519080825280601f01601f1916602001820160405280156128015781602001600182028036833780820191505090505b5090505b6000851461288e5760018261281a9190613a95565b9150600a856128299190613c43565b603061283591906139b4565b60f81b81838151811061284b5761284a613d01565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856128879190613a0a565b9450612805565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061296557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061297557506129748261299a565b5b9050919050565b50505050565b50505050565b6129958383836001612a04565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415612a71576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000841415612aac576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b612ab9600086838761297c565b83600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff16021790555083600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160088282829054906101000a900467ffffffffffffffff160192506101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550846004600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426004600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060008582019050838015612c835750612c828773ffffffffffffffffffffffffffffffffffffffff16612524565b5b15612d49575b818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612cf86000888480600101955088612547565b612d2e576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b80821415612c89578260005414612d4457600080fd5b612db5565b5b818060010192508773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a480821415612d4a575b816000819055505050612dcb6000868387612982565b5050505050565b828054612dde90613b97565b90600052602060002090601f016020900481019282612e005760008555612e47565b82601f10612e1957805160ff1916838001178555612e47565b82800160010185558215612e47579182015b82811115612e46578251825591602001919060010190612e2b565b5b509050612e549190612e9b565b5090565b6040518060600160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681526020016000151581525090565b5b80821115612eb4576000816000905550600101612e9c565b5090565b6000612ecb612ec6846138ef565b6138ca565b905082815260208101848484011115612ee757612ee6613d64565b5b612ef2848285613b55565b509392505050565b6000612f0d612f0884613920565b6138ca565b905082815260208101848484011115612f2957612f28613d64565b5b612f34848285613b55565b509392505050565b600081359050612f4b81613f6a565b92915050565b600081359050612f6081613f81565b92915050565b600081359050612f7581613f98565b92915050565b600081519050612f8a81613f98565b92915050565b600082601f830112612fa557612fa4613d5f565b5b8135612fb5848260208601612eb8565b91505092915050565b600082601f830112612fd357612fd2613d5f565b5b8135612fe3848260208601612efa565b91505092915050565b600081359050612ffb81613faf565b92915050565b60008135905061301081613fc6565b92915050565b60006020828403121561302c5761302b613d6e565b5b600061303a84828501612f3c565b91505092915050565b6000806040838503121561305a57613059613d6e565b5b600061306885828601612f3c565b925050602061307985828601612f3c565b9150509250929050565b60008060006060848603121561309c5761309b613d6e565b5b60006130aa86828701612f3c565b93505060206130bb86828701612f3c565b92505060406130cc86828701612fec565b9150509250925092565b600080600080608085870312156130f0576130ef613d6e565b5b60006130fe87828801612f3c565b945050602061310f87828801612f3c565b935050604061312087828801612fec565b925050606085013567ffffffffffffffff81111561314157613140613d69565b5b61314d87828801612f90565b91505092959194509250565b600080604083850312156131705761316f613d6e565b5b600061317e85828601612f3c565b925050602061318f85828601612f51565b9150509250929050565b600080604083850312156131b0576131af613d6e565b5b60006131be85828601612f3c565b92505060206131cf85828601612fec565b9150509250929050565b6000602082840312156131ef576131ee613d6e565b5b60006131fd84828501612f66565b91505092915050565b60006020828403121561321c5761321b613d6e565b5b600061322a84828501612f7b565b91505092915050565b6000806040838503121561324a57613249613d6e565b5b600083013567ffffffffffffffff81111561326857613267613d69565b5b61327485828601612fbe565b925050602083013567ffffffffffffffff81111561329557613294613d69565b5b6132a185828601612fbe565b9150509250929050565b6000602082840312156132c1576132c0613d6e565b5b60006132cf84828501612fec565b91505092915050565b600080604083850312156132ef576132ee613d6e565b5b60006132fd85828601612fec565b925050602061330e85828601612fec565b9150509250929050565b60006020828403121561332e5761332d613d6e565b5b600061333c84828501613001565b91505092915050565b61334e81613ac9565b82525050565b61335d81613adb565b82525050565b600061336e82613966565b613378818561397c565b9350613388818560208601613b64565b61339181613d73565b840191505092915050565b60006133a782613971565b6133b18185613998565b93506133c1818560208601613b64565b6133ca81613d73565b840191505092915050565b60006133e082613971565b6133ea81856139a9565b93506133fa818560208601613b64565b80840191505092915050565b6000815461341381613b97565b61341d81866139a9565b9450600182166000811461343857600181146134495761347c565b60ff1983168652818601935061347c565b61345285613951565b60005b8381101561347457815481890152600182019150602081019050613455565b838801955050505b50505092915050565b6000613492601283613998565b915061349d82613d84565b602082019050919050565b60006134b5602683613998565b91506134c082613dad565b604082019050919050565b60006134d8601283613998565b91506134e382613dfc565b602082019050919050565b60006134fb602083613998565b915061350682613e25565b602082019050919050565b600061351e602f83613998565b915061352982613e4e565b604082019050919050565b600061354160008361398d565b915061354c82613e9d565b600082019050919050565b6000613564601083613998565b915061356f82613ea0565b602082019050919050565b6000613587602a83613998565b915061359282613ec9565b604082019050919050565b60006135aa601f83613998565b91506135b582613f18565b602082019050919050565b60006135cd601983613998565b91506135d882613f41565b602082019050919050565b6135ec81613b33565b82525050565b6135fb81613b3d565b82525050565b600061360d82866133d5565b915061361982856133d5565b91506136258284613406565b9150819050949350505050565b600061363d82613534565b9150819050919050565b600060208201905061365c6000830184613345565b92915050565b60006080820190506136776000830187613345565b6136846020830186613345565b61369160408301856135e3565b81810360608301526136a38184613363565b905095945050505050565b60006040820190506136c36000830185613345565b6136d060208301846135e3565b9392505050565b60006040820190506136ec6000830185613345565b6136f960208301846135f2565b9392505050565b60006020820190506137156000830184613354565b92915050565b60006020820190508181036000830152613735818461339c565b905092915050565b60006040820190508181036000830152613757818561339c565b9050818103602083015261376b818461339c565b90509392505050565b6000602082019050818103600083015261378d81613485565b9050919050565b600060208201905081810360008301526137ad816134a8565b9050919050565b600060208201905081810360008301526137cd816134cb565b9050919050565b600060208201905081810360008301526137ed816134ee565b9050919050565b6000602082019050818103600083015261380d81613511565b9050919050565b6000602082019050818103600083015261382d81613557565b9050919050565b6000602082019050818103600083015261384d8161357a565b9050919050565b6000602082019050818103600083015261386d8161359d565b9050919050565b6000602082019050818103600083015261388d816135c0565b9050919050565b60006020820190506138a960008301846135e3565b92915050565b60006020820190506138c460008301846135f2565b92915050565b60006138d46138e5565b90506138e08282613bc9565b919050565b6000604051905090565b600067ffffffffffffffff82111561390a57613909613d30565b5b61391382613d73565b9050602081019050919050565b600067ffffffffffffffff82111561393b5761393a613d30565b5b61394482613d73565b9050602081019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006139bf82613b33565b91506139ca83613b33565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156139ff576139fe613c74565b5b828201905092915050565b6000613a1582613b33565b9150613a2083613b33565b925082613a3057613a2f613ca3565b5b828204905092915050565b6000613a4682613b33565b9150613a5183613b33565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613a8a57613a89613c74565b5b828202905092915050565b6000613aa082613b33565b9150613aab83613b33565b925082821015613abe57613abd613c74565b5b828203905092915050565b6000613ad482613b13565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60006bffffffffffffffffffffffff82169050919050565b82818337600083830152505050565b60005b83811015613b82578082015181840152602081019050613b67565b83811115613b91576000848401525b50505050565b60006002820490506001821680613baf57607f821691505b60208210811415613bc357613bc2613cd2565b5b50919050565b613bd282613d73565b810181811067ffffffffffffffff82111715613bf157613bf0613d30565b5b80604052505050565b6000613c0582613b33565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613c3857613c37613c74565b5b600182019050919050565b6000613c4e82613b33565b9150613c5983613b33565b925082613c6957613c68613ca3565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f45786365656473204d617820537570706c790000000000000000000000000000600082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d617820737570706c790000000000000000000000000000600082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b50565b7f5472616e73666572206661696c65642e00000000000000000000000000000000600082015250565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b613f7381613ac9565b8114613f7e57600080fd5b50565b613f8a81613adb565b8114613f9557600080fd5b50565b613fa181613ae7565b8114613fac57600080fd5b50565b613fb881613b33565b8114613fc357600080fd5b50565b613fcf81613b3d565b8114613fda57600080fd5b5056fea26469706673582212209e46302eeb60a0b9cfcf9acee88a6797288b916c8ce407ab19e0b82cf91ca88a64736f6c63430008070033

Deployed Bytecode Sourcemap

52678:3548:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56171:30;56180:10;56191:9;56171:30;;;;;;;:::i;:::-;;;;;;;;52678:3548;;;;;55681:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55189:234;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37977:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39480:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39043:371;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34113:303;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40345:170;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55482:191;;;;;;;;;;;;;:::i;:::-;;22363:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;54868:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40586:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37785:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35233:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7489:103;;;;;;;;;;;;;:::i;:::-;;54235:213;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53125:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6838:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38146:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53360:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39756:287;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52852:74;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40842:369;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52967:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53785:385;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54528:229;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53019:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52782:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40114:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;7747:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55681:204;55812:4;55841:36;55865:11;55841:23;:36::i;:::-;55834:43;;55681:204;;;:::o;55189:234::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55288:15:::1;55271:14;;:32;;;;;;;;;;;;;;;;;;55314:46;55333:14;;;;;;;;;;;55349:10;;;;;;;;;;;55314:18;:46::i;:::-;55376:39;55388:14;;;;;;;;;;;55404:10;;;;;;;;;;;55376:39;;;;;;;:::i;:::-;;;;;;;;55189:234:::0;:::o;37977:100::-;38031:13;38064:5;38057:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37977:100;:::o;39480:204::-;39548:7;39573:16;39581:7;39573;:16::i;:::-;39568:64;;39598:34;;;;;;;;;;;;;;39568:64;39652:15;:24;39668:7;39652:24;;;;;;;;;;;;;;;;;;;;;39645:31;;39480:204;;;:::o;39043:371::-;39116:13;39132:24;39148:7;39132:15;:24::i;:::-;39116:40;;39177:5;39171:11;;:2;:11;;;39167:48;;;39191:24;;;;;;;;;;;;;;39167:48;39248:5;39232:21;;:12;:10;:12::i;:::-;:21;;;;:63;;;;;39258:37;39275:5;39282:12;:10;:12::i;:::-;39258:16;:37::i;:::-;39257:38;39232:63;39228:138;;;39319:35;;;;;;;;;;;;;;39228:138;39378:28;39387:2;39391:7;39400:5;39378:8;:28::i;:::-;39105:309;39043:371;;:::o;34113:303::-;34157:7;34382:15;:13;:15::i;:::-;34367:12;;34351:13;;:28;:46;34344:53;;34113:303;:::o;40345:170::-;40479:28;40489:4;40495:2;40499:7;40479:9;:28::i;:::-;40345:170;;;:::o;55482:191::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1:::1;2410:7;;:19;;2402:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;1812:1;2543:7;:18;;;;55551:12:::2;55569:10;:15;;55592:21;55569:49;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55550:68;;;55637:7;55629:36;;;;;;;;;;;;:::i;:::-;;;;;;;;;55539:134;1768:1:::1;2722:7;:22;;;;55482:191::o:0;22363:442::-;22460:7;22469;22489:26;22518:17;:27;22536:8;22518:27;;;;;;;;;;;22489:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22590:1;22562:30;;:7;:16;;;:30;;;22558:92;;;22619:19;22609:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22558:92;22662:21;22727:17;:15;:17::i;:::-;22686:58;;22700:7;:23;;;22687:36;;:10;:36;;;;:::i;:::-;22686:58;;;;:::i;:::-;22662:82;;22765:7;:16;;;22783:13;22757:40;;;;;;22363:442;;;;;:::o;54868:221::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54956:13:::1;54943:10;;:26;;;;;;;;;;;;;;;;;;54980:46;54999:14;;;;;;;;;;;55015:10;;;;;;;;;;;54980:18;:46::i;:::-;55042:39;55054:14;;;;;;;;;;;55070:10;;;;;;;;;;;55042:39;;;;;;;:::i;:::-;;;;;;;;54868:221:::0;:::o;40586:185::-;40724:39;40741:4;40747:2;40751:7;40724:39;;;;;;;;;;;;:16;:39::i;:::-;40586:185;;;:::o;37785:125::-;37849:7;37876:21;37889:7;37876:12;:21::i;:::-;:26;;;37869:33;;37785:125;;;:::o;35233:206::-;35297:7;35338:1;35321:19;;:5;:19;;;35317:60;;;35349:28;;;;;;;;;;;;;;35317:60;35403:12;:19;35416:5;35403:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;35395:36;;35388:43;;35233:206;;;:::o;7489:103::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:30:::1;7581:1;7554:18;:30::i;:::-;7489:103::o:0;54235:213::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54352:5:::1;54336:13;:21;;;;;;;;;;;;:::i;:::-;;54384:9;54368:13;:25;;;;;;;;;;;;:::i;:::-;;54409:31;54423:5;54430:9;54409:31;;;;;;;:::i;:::-;;;;;;;;54235:213:::0;;:::o;53125:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;6838:87::-;6884:7;6911:6;;;;;;;;;;;6904:13;;6838:87;:::o;38146:104::-;38202:13;38235:7;38228:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38146:104;:::o;53360:222::-;53423:14;53440:13;:11;:13::i;:::-;53423:30;;52818:4;53481:11;53472:6;:20;;;;:::i;:::-;:33;;53464:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53540:34;53550:10;53562:11;53540:9;:34::i;:::-;53412:170;53360:222;:::o;39756:287::-;39867:12;:10;:12::i;:::-;39855:24;;:8;:24;;;39851:54;;;39888:17;;;;;;;;;;;;;;39851:54;39963:8;39918:18;:32;39937:12;:10;:12::i;:::-;39918:32;;;;;;;;;;;;;;;:42;39951:8;39918:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;40016:8;39987:48;;40002:12;:10;:12::i;:::-;39987:48;;;40026:8;39987:48;;;;;;:::i;:::-;;;;;;;;39756:287;;:::o;52852:74::-;;;;;;;;;;;;;:::o;40842:369::-;41009:28;41019:4;41025:2;41029:7;41009:9;:28::i;:::-;41052:15;:2;:13;;;:15::i;:::-;:76;;;;;41072:56;41103:4;41109:2;41113:7;41122:5;41072:30;:56::i;:::-;41071:57;41052:76;41048:156;;;41152:40;;;;;;;;;;;;;;41048:156;40842:369;;;;:::o;52967:31::-;;;;;;;;;;;;;:::o;53785:385::-;53858:13;53892:16;53900:7;53892;:16::i;:::-;53884:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;53975:28;54006:10;:8;:10::i;:::-;53975:41;;54069:1;54044:14;54038:28;:32;:114;;;;;;;;;;;;;;;;;54097:14;54113:18;:7;:16;:18::i;:::-;54132:13;54080:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54038:114;54031:121;;;53785:385;;;:::o;54528:229::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54606:14:::1;54623:13;:11;:13::i;:::-;54606:30;;52818:4;54664:11;54655:6;:20;;;;:::i;:::-;:33;;54647:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;54722:27;54732:3;54737:11;54722:9;:27::i;:::-;54595:162;54528:229:::0;;:::o;53019:86::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52782:40::-;52818:4;52782:40;:::o;40114:164::-;40211:4;40235:18;:25;40254:5;40235:25;;;;;;;;;;;;;;;:35;40261:8;40235:35;;;;;;;;;;;;;;;;;;;;;;;;;40228:42;;40114:164;;;;:::o;7747:201::-;7069:12;:10;:12::i;:::-;7058:23;;:7;:5;:7::i;:::-;:23;;;7050:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;7856:1:::1;7836:22;;:8;:22;;;;7828:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7912:28;7931:8;7912:18;:28::i;:::-;7747:201:::0;:::o;22093:215::-;22195:4;22234:26;22219:41;;;:11;:41;;;;:81;;;;22264:36;22288:11;22264:23;:36::i;:::-;22219:81;22212:88;;22093:215;;;:::o;5562:98::-;5615:7;5642:10;5635:17;;5562:98;:::o;23455:332::-;23574:17;:15;:17::i;:::-;23558:33;;:12;:33;;;;23550:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;23677:1;23657:22;;:8;:22;;;;23649:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;23744:35;;;;;;;;23756:8;23744:35;;;;;;23766:12;23744:35;;;;;23722:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;23455:332;;:::o;41466:174::-;41523:4;41566:7;41547:15;:13;:15::i;:::-;:26;;:53;;;;;41587:13;;41577:7;:23;41547:53;:85;;;;;41605:11;:20;41617:7;41605:20;;;;;;;;;;;:27;;;;;;;;;;;;41604:28;41547:85;41540:92;;41466:174;;;:::o;49623:196::-;49765:2;49738:15;:24;49754:7;49738:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;49803:7;49799:2;49783:28;;49792:5;49783:28;;;;;;;;;;;;49623:196;;;:::o;33887:92::-;33943:7;33887:92;:::o;44566:2130::-;44681:35;44719:21;44732:7;44719:12;:21::i;:::-;44681:59;;44779:4;44757:26;;:13;:18;;;:26;;;44753:67;;44792:28;;;;;;;;;;;;;;44753:67;44833:22;44875:4;44859:20;;:12;:10;:12::i;:::-;:20;;;:73;;;;44896:36;44913:4;44919:12;:10;:12::i;:::-;44896:16;:36::i;:::-;44859:73;:126;;;;44973:12;:10;:12::i;:::-;44949:36;;:20;44961:7;44949:11;:20::i;:::-;:36;;;44859:126;44833:153;;45004:17;44999:66;;45030:35;;;;;;;;;;;;;;44999:66;45094:1;45080:16;;:2;:16;;;45076:52;;;45105:23;;;;;;;;;;;;;;45076:52;45141:43;45163:4;45169:2;45173:7;45182:1;45141:21;:43::i;:::-;45249:35;45266:1;45270:7;45279:4;45249:8;:35::i;:::-;45610:1;45580:12;:18;45593:4;45580:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45654:1;45626:12;:16;45639:2;45626:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45672:31;45706:11;:20;45718:7;45706:20;;;;;;;;;;;45672:54;;45757:2;45741:8;:13;;;:18;;;;;;;;;;;;;;;;;;45807:15;45774:8;:23;;;:49;;;;;;;;;;;;;;;;;;46075:19;46107:1;46097:7;:11;46075:33;;46123:31;46157:11;:24;46169:11;46157:24;;;;;;;;;;;46123:58;;46225:1;46200:27;;:8;:13;;;;;;;;;;;;:27;;;46196:384;;;46410:13;;46395:11;:28;46391:174;;46464:4;46448:8;:13;;;:20;;;;;;;;;;;;;;;;;;46517:13;:28;;;46491:8;:23;;;:54;;;;;;;;;;;;;;;;;;46391:174;46196:384;45555:1036;;;46627:7;46623:2;46608:27;;46617:4;46608:27;;;;;;;;;;;;46646:42;46667:4;46673:2;46677:7;46686:1;46646:20;:42::i;:::-;44670:2026;;44566:2130;;;:::o;23087:97::-;23145:6;23171:5;23164:12;;23087:97;:::o;36614:1109::-;36676:21;;:::i;:::-;36710:12;36725:7;36710:22;;36793:4;36774:15;:13;:15::i;:::-;:23;;:47;;;;;36808:13;;36801:4;:20;36774:47;36770:886;;;36842:31;36876:11;:17;36888:4;36876:17;;;;;;;;;;;36842:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36917:9;:16;;;36912:729;;36988:1;36962:28;;:9;:14;;;:28;;;36958:101;;37026:9;37019:16;;;;;;36958:101;37361:261;37368:4;37361:261;;;37401:6;;;;;;;;37446:11;:17;37458:4;37446:17;;;;;;;;;;;37434:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37520:1;37494:28;;:9;:14;;;:28;;;37490:109;;37562:9;37555:16;;;;;;37490:109;37361:261;;;36912:729;36823:833;36770:886;37684:31;;;;;;;;;;;;;;36614:1109;;;;:::o;8108:191::-;8182:16;8201:6;;;;;;;;;;;8182:25;;8227:8;8218:6;;:17;;;;;;;;;;;;;;;;;;8282:8;8251:40;;8272:8;8251:40;;;;;;;;;;;;8171:128;8108:191;:::o;41648:104::-;41717:27;41727:2;41731:8;41717:27;;;;;;;;;;;;:9;:27::i;:::-;41648:104;;:::o;9539:326::-;9599:4;9856:1;9834:7;:19;;;:23;9827:30;;9539:326;;;:::o;50311:667::-;50474:4;50511:2;50495:36;;;50532:12;:10;:12::i;:::-;50546:4;50552:7;50561:5;50495:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;50491:480;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50746:1;50729:6;:13;:18;50725:235;;;50775:40;;;;;;;;;;;;;;50725:235;50918:6;50912:13;50903:6;50899:2;50895:15;50888:38;50491:480;50624:45;;;50614:55;;;:6;:55;;;;50607:62;;;50311:667;;;;;;:::o;53595:114::-;53655:13;53688;53681:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53595:114;:::o;3124:723::-;3180:13;3410:1;3401:5;:10;3397:53;;;3428:10;;;;;;;;;;;;;;;;;;;;;3397:53;3460:12;3475:5;3460:20;;3491:14;3516:78;3531:1;3523:4;:9;3516:78;;3549:8;;;;;:::i;:::-;;;;3580:2;3572:10;;;;;:::i;:::-;;;3516:78;;;3604:19;3636:6;3626:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3604:39;;3654:154;3670:1;3661:5;:10;3654:154;;3698:1;3688:11;;;;;:::i;:::-;;;3765:2;3757:5;:10;;;;:::i;:::-;3744:2;:24;;;;:::i;:::-;3731:39;;3714:6;3721;3714:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;3794:2;3785:11;;;;;:::i;:::-;;;3654:154;;;3832:6;3818:21;;;;;3124:723;;;;:::o;34864:305::-;34966:4;35018:25;35003:40;;;:11;:40;;;;:105;;;;35075:33;35060:48;;;:11;:48;;;;35003:105;:158;;;;35125:36;35149:11;35125:23;:36::i;:::-;35003:158;34983:178;;34864:305;;;:::o;51626:159::-;;;;;:::o;52444:158::-;;;;;:::o;42115:163::-;42238:32;42244:2;42248:8;42258:5;42265:4;42238:5;:32::i;:::-;42115:163;;;:::o;20543:157::-;20628:4;20667:25;20652:40;;;:11;:40;;;;20645:47;;20543:157;;;:::o;42537:1775::-;42676:20;42699:13;;42676:36;;42741:1;42727:16;;:2;:16;;;42723:48;;;42752:19;;;;;;;;;;;;;;42723:48;42798:1;42786:8;:13;42782:44;;;42808:18;;;;;;;;;;;;;;42782:44;42839:61;42869:1;42873:2;42877:12;42891:8;42839:21;:61::i;:::-;43212:8;43177:12;:16;43190:2;43177:16;;;;;;;;;;;;;;;:24;;;:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43276:8;43236:12;:16;43249:2;43236:16;;;;;;;;;;;;;;;:29;;;:49;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43335:2;43302:11;:25;43314:12;43302:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;43402:15;43352:11;:25;43364:12;43352:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;43435:20;43458:12;43435:35;;43485:11;43514:8;43499:12;:23;43485:37;;43543:4;:23;;;;;43551:15;:2;:13;;;:15::i;:::-;43543:23;43539:641;;;43587:314;43643:12;43639:2;43618:38;;43635:1;43618:38;;;;;;;;;;;;43684:69;43723:1;43727:2;43731:14;;;;;;43747:5;43684:30;:69::i;:::-;43679:174;;43789:40;;;;;;;;;;;;;;43679:174;43896:3;43880:12;:19;;43587:314;;43982:12;43965:13;;:29;43961:43;;43996:8;;;43961:43;43539:641;;;44045:120;44101:14;;;;;;44097:2;44076:40;;44093:1;44076:40;;;;;;;;;;;;44160:3;44144:12;:19;;44045:120;;43539:641;44210:12;44194:13;:28;;;;43152:1082;;44244:60;44273:1;44277:2;44281:12;44295:8;44244:20;:60::i;:::-;42665:1647;42537:1775;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:137::-;2322:5;2360:6;2347:20;2338:29;;2376:32;2402:5;2376:32;:::i;:::-;2277:137;;;;:::o;2420:329::-;2479:6;2528:2;2516:9;2507:7;2503:23;2499:32;2496:119;;;2534:79;;:::i;:::-;2496:119;2654:1;2679:53;2724:7;2715:6;2704:9;2700:22;2679:53;:::i;:::-;2669:63;;2625:117;2420:329;;;;:::o;2755:474::-;2823:6;2831;2880:2;2868:9;2859:7;2855:23;2851:32;2848:119;;;2886:79;;:::i;:::-;2848:119;3006:1;3031:53;3076:7;3067:6;3056:9;3052:22;3031:53;:::i;:::-;3021:63;;2977:117;3133:2;3159:53;3204:7;3195:6;3184:9;3180:22;3159:53;:::i;:::-;3149:63;;3104:118;2755:474;;;;;:::o;3235:619::-;3312:6;3320;3328;3377:2;3365:9;3356:7;3352:23;3348:32;3345:119;;;3383:79;;:::i;:::-;3345:119;3503:1;3528:53;3573:7;3564:6;3553:9;3549:22;3528:53;:::i;:::-;3518:63;;3474:117;3630:2;3656:53;3701:7;3692:6;3681:9;3677:22;3656:53;:::i;:::-;3646:63;;3601:118;3758:2;3784:53;3829:7;3820:6;3809:9;3805:22;3784:53;:::i;:::-;3774:63;;3729:118;3235:619;;;;;:::o;3860:943::-;3955:6;3963;3971;3979;4028:3;4016:9;4007:7;4003:23;3999:33;3996:120;;;4035:79;;:::i;:::-;3996:120;4155:1;4180:53;4225:7;4216:6;4205:9;4201:22;4180:53;:::i;:::-;4170:63;;4126:117;4282:2;4308:53;4353:7;4344:6;4333:9;4329:22;4308:53;:::i;:::-;4298:63;;4253:118;4410:2;4436:53;4481:7;4472:6;4461:9;4457:22;4436:53;:::i;:::-;4426:63;;4381:118;4566:2;4555:9;4551:18;4538:32;4597:18;4589:6;4586:30;4583:117;;;4619:79;;:::i;:::-;4583:117;4724:62;4778:7;4769:6;4758:9;4754:22;4724:62;:::i;:::-;4714:72;;4509:287;3860:943;;;;;;;:::o;4809:468::-;4874:6;4882;4931:2;4919:9;4910:7;4906:23;4902:32;4899:119;;;4937:79;;:::i;:::-;4899:119;5057:1;5082:53;5127:7;5118:6;5107:9;5103:22;5082:53;:::i;:::-;5072:63;;5028:117;5184:2;5210:50;5252:7;5243:6;5232:9;5228:22;5210:50;:::i;:::-;5200:60;;5155:115;4809:468;;;;;:::o;5283:474::-;5351:6;5359;5408:2;5396:9;5387:7;5383:23;5379:32;5376:119;;;5414:79;;:::i;:::-;5376:119;5534:1;5559:53;5604:7;5595:6;5584:9;5580:22;5559:53;:::i;:::-;5549:63;;5505:117;5661:2;5687:53;5732:7;5723:6;5712:9;5708:22;5687:53;:::i;:::-;5677:63;;5632:118;5283:474;;;;;:::o;5763:327::-;5821:6;5870:2;5858:9;5849:7;5845:23;5841:32;5838:119;;;5876:79;;:::i;:::-;5838:119;5996:1;6021:52;6065:7;6056:6;6045:9;6041:22;6021:52;:::i;:::-;6011:62;;5967:116;5763:327;;;;:::o;6096:349::-;6165:6;6214:2;6202:9;6193:7;6189:23;6185:32;6182:119;;;6220:79;;:::i;:::-;6182:119;6340:1;6365:63;6420:7;6411:6;6400:9;6396:22;6365:63;:::i;:::-;6355:73;;6311:127;6096:349;;;;:::o;6451:834::-;6539:6;6547;6596:2;6584:9;6575:7;6571:23;6567:32;6564:119;;;6602:79;;:::i;:::-;6564:119;6750:1;6739:9;6735:17;6722:31;6780:18;6772:6;6769:30;6766:117;;;6802:79;;:::i;:::-;6766:117;6907:63;6962:7;6953:6;6942:9;6938:22;6907:63;:::i;:::-;6897:73;;6693:287;7047:2;7036:9;7032:18;7019:32;7078:18;7070:6;7067:30;7064:117;;;7100:79;;:::i;:::-;7064:117;7205:63;7260:7;7251:6;7240:9;7236:22;7205:63;:::i;:::-;7195:73;;6990:288;6451:834;;;;;:::o;7291:329::-;7350:6;7399:2;7387:9;7378:7;7374:23;7370:32;7367:119;;;7405:79;;:::i;:::-;7367:119;7525:1;7550:53;7595:7;7586:6;7575:9;7571:22;7550:53;:::i;:::-;7540:63;;7496:117;7291:329;;;;:::o;7626:474::-;7694:6;7702;7751:2;7739:9;7730:7;7726:23;7722:32;7719:119;;;7757:79;;:::i;:::-;7719:119;7877:1;7902:53;7947:7;7938:6;7927:9;7923:22;7902:53;:::i;:::-;7892:63;;7848:117;8004:2;8030:53;8075:7;8066:6;8055:9;8051:22;8030:53;:::i;:::-;8020:63;;7975:118;7626:474;;;;;:::o;8106:327::-;8164:6;8213:2;8201:9;8192:7;8188:23;8184:32;8181:119;;;8219:79;;:::i;:::-;8181:119;8339:1;8364:52;8408:7;8399:6;8388:9;8384:22;8364:52;:::i;:::-;8354:62;;8310:116;8106:327;;;;:::o;8439:118::-;8526:24;8544:5;8526:24;:::i;:::-;8521:3;8514:37;8439:118;;:::o;8563:109::-;8644:21;8659:5;8644:21;:::i;:::-;8639:3;8632:34;8563:109;;:::o;8678:360::-;8764:3;8792:38;8824:5;8792:38;:::i;:::-;8846:70;8909:6;8904:3;8846:70;:::i;:::-;8839:77;;8925:52;8970:6;8965:3;8958:4;8951:5;8947:16;8925:52;:::i;:::-;9002:29;9024:6;9002:29;:::i;:::-;8997:3;8993:39;8986:46;;8768:270;8678:360;;;;:::o;9044:364::-;9132:3;9160:39;9193:5;9160:39;:::i;:::-;9215:71;9279:6;9274:3;9215:71;:::i;:::-;9208:78;;9295:52;9340:6;9335:3;9328:4;9321:5;9317:16;9295:52;:::i;:::-;9372:29;9394:6;9372:29;:::i;:::-;9367:3;9363:39;9356:46;;9136:272;9044:364;;;;:::o;9414:377::-;9520:3;9548:39;9581:5;9548:39;:::i;:::-;9603:89;9685:6;9680:3;9603:89;:::i;:::-;9596:96;;9701:52;9746:6;9741:3;9734:4;9727:5;9723:16;9701:52;:::i;:::-;9778:6;9773:3;9769:16;9762:23;;9524:267;9414:377;;;;:::o;9821:845::-;9924:3;9961:5;9955:12;9990:36;10016:9;9990:36;:::i;:::-;10042:89;10124:6;10119:3;10042:89;:::i;:::-;10035:96;;10162:1;10151:9;10147:17;10178:1;10173:137;;;;10324:1;10319:341;;;;10140:520;;10173:137;10257:4;10253:9;10242;10238:25;10233:3;10226:38;10293:6;10288:3;10284:16;10277:23;;10173:137;;10319:341;10386:38;10418:5;10386:38;:::i;:::-;10446:1;10460:154;10474:6;10471:1;10468:13;10460:154;;;10548:7;10542:14;10538:1;10533:3;10529:11;10522:35;10598:1;10589:7;10585:15;10574:26;;10496:4;10493:1;10489:12;10484:17;;10460:154;;;10643:6;10638:3;10634:16;10627:23;;10326:334;;10140:520;;9928:738;;9821:845;;;;:::o;10672:366::-;10814:3;10835:67;10899:2;10894:3;10835:67;:::i;:::-;10828:74;;10911:93;11000:3;10911:93;:::i;:::-;11029:2;11024:3;11020:12;11013:19;;10672:366;;;:::o;11044:::-;11186:3;11207:67;11271:2;11266:3;11207:67;:::i;:::-;11200:74;;11283:93;11372:3;11283:93;:::i;:::-;11401:2;11396:3;11392:12;11385:19;;11044:366;;;:::o;11416:::-;11558:3;11579:67;11643:2;11638:3;11579:67;:::i;:::-;11572:74;;11655:93;11744:3;11655:93;:::i;:::-;11773:2;11768:3;11764:12;11757:19;;11416:366;;;:::o;11788:::-;11930:3;11951:67;12015:2;12010:3;11951:67;:::i;:::-;11944:74;;12027:93;12116:3;12027:93;:::i;:::-;12145:2;12140:3;12136:12;12129:19;;11788:366;;;:::o;12160:::-;12302:3;12323:67;12387:2;12382:3;12323:67;:::i;:::-;12316:74;;12399:93;12488:3;12399:93;:::i;:::-;12517:2;12512:3;12508:12;12501:19;;12160:366;;;:::o;12532:398::-;12691:3;12712:83;12793:1;12788:3;12712:83;:::i;:::-;12705:90;;12804:93;12893:3;12804:93;:::i;:::-;12922:1;12917:3;12913:11;12906:18;;12532:398;;;:::o;12936:366::-;13078:3;13099:67;13163:2;13158:3;13099:67;:::i;:::-;13092:74;;13175:93;13264:3;13175:93;:::i;:::-;13293:2;13288:3;13284:12;13277:19;;12936:366;;;:::o;13308:::-;13450:3;13471:67;13535:2;13530:3;13471:67;:::i;:::-;13464:74;;13547:93;13636:3;13547:93;:::i;:::-;13665:2;13660:3;13656:12;13649:19;;13308:366;;;:::o;13680:::-;13822:3;13843:67;13907:2;13902:3;13843:67;:::i;:::-;13836:74;;13919:93;14008:3;13919:93;:::i;:::-;14037:2;14032:3;14028:12;14021:19;;13680:366;;;:::o;14052:::-;14194:3;14215:67;14279:2;14274:3;14215:67;:::i;:::-;14208:74;;14291:93;14380:3;14291:93;:::i;:::-;14409:2;14404:3;14400:12;14393:19;;14052:366;;;:::o;14424:118::-;14511:24;14529:5;14511:24;:::i;:::-;14506:3;14499:37;14424:118;;:::o;14548:115::-;14633:23;14650:5;14633:23;:::i;:::-;14628:3;14621:36;14548:115;;:::o;14669:589::-;14894:3;14916:95;15007:3;14998:6;14916:95;:::i;:::-;14909:102;;15028:95;15119:3;15110:6;15028:95;:::i;:::-;15021:102;;15140:92;15228:3;15219:6;15140:92;:::i;:::-;15133:99;;15249:3;15242:10;;14669:589;;;;;;:::o;15264:379::-;15448:3;15470:147;15613:3;15470:147;:::i;:::-;15463:154;;15634:3;15627:10;;15264:379;;;:::o;15649:222::-;15742:4;15780:2;15769:9;15765:18;15757:26;;15793:71;15861:1;15850:9;15846:17;15837:6;15793:71;:::i;:::-;15649:222;;;;:::o;15877:640::-;16072:4;16110:3;16099:9;16095:19;16087:27;;16124:71;16192:1;16181:9;16177:17;16168:6;16124:71;:::i;:::-;16205:72;16273:2;16262:9;16258:18;16249:6;16205:72;:::i;:::-;16287;16355:2;16344:9;16340:18;16331:6;16287:72;:::i;:::-;16406:9;16400:4;16396:20;16391:2;16380:9;16376:18;16369:48;16434:76;16505:4;16496:6;16434:76;:::i;:::-;16426:84;;15877:640;;;;;;;:::o;16523:332::-;16644:4;16682:2;16671:9;16667:18;16659:26;;16695:71;16763:1;16752:9;16748:17;16739:6;16695:71;:::i;:::-;16776:72;16844:2;16833:9;16829:18;16820:6;16776:72;:::i;:::-;16523:332;;;;;:::o;16861:328::-;16980:4;17018:2;17007:9;17003:18;16995:26;;17031:71;17099:1;17088:9;17084:17;17075:6;17031:71;:::i;:::-;17112:70;17178:2;17167:9;17163:18;17154:6;17112:70;:::i;:::-;16861:328;;;;;:::o;17195:210::-;17282:4;17320:2;17309:9;17305:18;17297:26;;17333:65;17395:1;17384:9;17380:17;17371:6;17333:65;:::i;:::-;17195:210;;;;:::o;17411:313::-;17524:4;17562:2;17551:9;17547:18;17539:26;;17611:9;17605:4;17601:20;17597:1;17586:9;17582:17;17575:47;17639:78;17712:4;17703:6;17639:78;:::i;:::-;17631:86;;17411:313;;;;:::o;17730:514::-;17891:4;17929:2;17918:9;17914:18;17906:26;;17978:9;17972:4;17968:20;17964:1;17953:9;17949:17;17942:47;18006:78;18079:4;18070:6;18006:78;:::i;:::-;17998:86;;18131:9;18125:4;18121:20;18116:2;18105:9;18101:18;18094:48;18159:78;18232:4;18223:6;18159:78;:::i;:::-;18151:86;;17730:514;;;;;:::o;18250:419::-;18416:4;18454:2;18443:9;18439:18;18431:26;;18503:9;18497:4;18493:20;18489:1;18478:9;18474:17;18467:47;18531:131;18657:4;18531:131;:::i;:::-;18523:139;;18250:419;;;:::o;18675:::-;18841:4;18879:2;18868:9;18864:18;18856:26;;18928:9;18922:4;18918:20;18914:1;18903:9;18899:17;18892:47;18956:131;19082:4;18956:131;:::i;:::-;18948:139;;18675:419;;;:::o;19100:::-;19266:4;19304:2;19293:9;19289:18;19281:26;;19353:9;19347:4;19343:20;19339:1;19328:9;19324:17;19317:47;19381:131;19507:4;19381:131;:::i;:::-;19373:139;;19100:419;;;:::o;19525:::-;19691:4;19729:2;19718:9;19714:18;19706:26;;19778:9;19772:4;19768:20;19764:1;19753:9;19749:17;19742:47;19806:131;19932:4;19806:131;:::i;:::-;19798:139;;19525:419;;;:::o;19950:::-;20116:4;20154:2;20143:9;20139:18;20131:26;;20203:9;20197:4;20193:20;20189:1;20178:9;20174:17;20167:47;20231:131;20357:4;20231:131;:::i;:::-;20223:139;;19950:419;;;:::o;20375:::-;20541:4;20579:2;20568:9;20564:18;20556:26;;20628:9;20622:4;20618:20;20614:1;20603:9;20599:17;20592:47;20656:131;20782:4;20656:131;:::i;:::-;20648:139;;20375:419;;;:::o;20800:::-;20966:4;21004:2;20993:9;20989:18;20981:26;;21053:9;21047:4;21043:20;21039:1;21028:9;21024:17;21017:47;21081:131;21207:4;21081:131;:::i;:::-;21073:139;;20800:419;;;:::o;21225:::-;21391:4;21429:2;21418:9;21414:18;21406:26;;21478:9;21472:4;21468:20;21464:1;21453:9;21449:17;21442:47;21506:131;21632:4;21506:131;:::i;:::-;21498:139;;21225:419;;;:::o;21650:::-;21816:4;21854:2;21843:9;21839:18;21831:26;;21903:9;21897:4;21893:20;21889:1;21878:9;21874:17;21867:47;21931:131;22057:4;21931:131;:::i;:::-;21923:139;;21650:419;;;:::o;22075:222::-;22168:4;22206:2;22195:9;22191:18;22183:26;;22219:71;22287:1;22276:9;22272:17;22263:6;22219:71;:::i;:::-;22075:222;;;;:::o;22303:218::-;22394:4;22432:2;22421:9;22417:18;22409:26;;22445:69;22511:1;22500:9;22496:17;22487:6;22445:69;:::i;:::-;22303:218;;;;:::o;22527:129::-;22561:6;22588:20;;:::i;:::-;22578:30;;22617:33;22645:4;22637:6;22617:33;:::i;:::-;22527:129;;;:::o;22662:75::-;22695:6;22728:2;22722:9;22712:19;;22662:75;:::o;22743:307::-;22804:4;22894:18;22886:6;22883:30;22880:56;;;22916:18;;:::i;:::-;22880:56;22954:29;22976:6;22954:29;:::i;:::-;22946:37;;23038:4;23032;23028:15;23020:23;;22743:307;;;:::o;23056:308::-;23118:4;23208:18;23200:6;23197:30;23194:56;;;23230:18;;:::i;:::-;23194:56;23268:29;23290:6;23268:29;:::i;:::-;23260:37;;23352:4;23346;23342:15;23334:23;;23056:308;;;:::o;23370:141::-;23419:4;23442:3;23434:11;;23465:3;23462:1;23455:14;23499:4;23496:1;23486:18;23478:26;;23370:141;;;:::o;23517:98::-;23568:6;23602:5;23596:12;23586:22;;23517:98;;;:::o;23621:99::-;23673:6;23707:5;23701:12;23691:22;;23621:99;;;:::o;23726:168::-;23809:11;23843:6;23838:3;23831:19;23883:4;23878:3;23874:14;23859:29;;23726:168;;;;:::o;23900:147::-;24001:11;24038:3;24023:18;;23900:147;;;;:::o;24053:169::-;24137:11;24171:6;24166:3;24159:19;24211:4;24206:3;24202:14;24187:29;;24053:169;;;;:::o;24228:148::-;24330:11;24367:3;24352:18;;24228:148;;;;:::o;24382:305::-;24422:3;24441:20;24459:1;24441:20;:::i;:::-;24436:25;;24475:20;24493:1;24475:20;:::i;:::-;24470:25;;24629:1;24561:66;24557:74;24554:1;24551:81;24548:107;;;24635:18;;:::i;:::-;24548:107;24679:1;24676;24672:9;24665:16;;24382:305;;;;:::o;24693:185::-;24733:1;24750:20;24768:1;24750:20;:::i;:::-;24745:25;;24784:20;24802:1;24784:20;:::i;:::-;24779:25;;24823:1;24813:35;;24828:18;;:::i;:::-;24813:35;24870:1;24867;24863:9;24858:14;;24693:185;;;;:::o;24884:348::-;24924:7;24947:20;24965:1;24947:20;:::i;:::-;24942:25;;24981:20;24999:1;24981:20;:::i;:::-;24976:25;;25169:1;25101:66;25097:74;25094:1;25091:81;25086:1;25079:9;25072:17;25068:105;25065:131;;;25176:18;;:::i;:::-;25065:131;25224:1;25221;25217:9;25206:20;;24884:348;;;;:::o;25238:191::-;25278:4;25298:20;25316:1;25298:20;:::i;:::-;25293:25;;25332:20;25350:1;25332:20;:::i;:::-;25327:25;;25371:1;25368;25365:8;25362:34;;;25376:18;;:::i;:::-;25362:34;25421:1;25418;25414:9;25406:17;;25238:191;;;;:::o;25435:96::-;25472:7;25501:24;25519:5;25501:24;:::i;:::-;25490:35;;25435:96;;;:::o;25537:90::-;25571:7;25614:5;25607:13;25600:21;25589:32;;25537:90;;;:::o;25633:149::-;25669:7;25709:66;25702:5;25698:78;25687:89;;25633:149;;;:::o;25788:126::-;25825:7;25865:42;25858:5;25854:54;25843:65;;25788:126;;;:::o;25920:77::-;25957:7;25986:5;25975:16;;25920:77;;;:::o;26003:109::-;26039:7;26079:26;26072:5;26068:38;26057:49;;26003:109;;;:::o;26118:154::-;26202:6;26197:3;26192;26179:30;26264:1;26255:6;26250:3;26246:16;26239:27;26118:154;;;:::o;26278:307::-;26346:1;26356:113;26370:6;26367:1;26364:13;26356:113;;;26455:1;26450:3;26446:11;26440:18;26436:1;26431:3;26427:11;26420:39;26392:2;26389:1;26385:10;26380:15;;26356:113;;;26487:6;26484:1;26481:13;26478:101;;;26567:1;26558:6;26553:3;26549:16;26542:27;26478:101;26327:258;26278:307;;;:::o;26591:320::-;26635:6;26672:1;26666:4;26662:12;26652:22;;26719:1;26713:4;26709:12;26740:18;26730:81;;26796:4;26788:6;26784:17;26774:27;;26730:81;26858:2;26850:6;26847:14;26827:18;26824:38;26821:84;;;26877:18;;:::i;:::-;26821:84;26642:269;26591:320;;;:::o;26917:281::-;27000:27;27022:4;27000:27;:::i;:::-;26992:6;26988:40;27130:6;27118:10;27115:22;27094:18;27082:10;27079:34;27076:62;27073:88;;;27141:18;;:::i;:::-;27073:88;27181:10;27177:2;27170:22;26960:238;26917:281;;:::o;27204:233::-;27243:3;27266:24;27284:5;27266:24;:::i;:::-;27257:33;;27312:66;27305:5;27302:77;27299:103;;;27382:18;;:::i;:::-;27299:103;27429:1;27422:5;27418:13;27411:20;;27204:233;;;:::o;27443:176::-;27475:1;27492:20;27510:1;27492:20;:::i;:::-;27487:25;;27526:20;27544:1;27526:20;:::i;:::-;27521:25;;27565:1;27555:35;;27570:18;;:::i;:::-;27555:35;27611:1;27608;27604:9;27599:14;;27443:176;;;;:::o;27625:180::-;27673:77;27670:1;27663:88;27770:4;27767:1;27760:15;27794:4;27791:1;27784:15;27811:180;27859:77;27856:1;27849:88;27956:4;27953:1;27946:15;27980:4;27977:1;27970:15;27997:180;28045:77;28042:1;28035:88;28142:4;28139:1;28132:15;28166:4;28163:1;28156:15;28183:180;28231:77;28228:1;28221:88;28328:4;28325:1;28318:15;28352:4;28349:1;28342:15;28369:180;28417:77;28414:1;28407:88;28514:4;28511:1;28504:15;28538:4;28535:1;28528:15;28555:117;28664:1;28661;28654:12;28678:117;28787:1;28784;28777:12;28801:117;28910:1;28907;28900:12;28924:117;29033:1;29030;29023:12;29047:102;29088:6;29139:2;29135:7;29130:2;29123:5;29119:14;29115:28;29105:38;;29047:102;;;:::o;29155:168::-;29295:20;29291:1;29283:6;29279:14;29272:44;29155:168;:::o;29329:225::-;29469:34;29465:1;29457:6;29453:14;29446:58;29538:8;29533:2;29525:6;29521:15;29514:33;29329:225;:::o;29560:168::-;29700:20;29696:1;29688:6;29684:14;29677:44;29560:168;:::o;29734:182::-;29874:34;29870:1;29862:6;29858:14;29851:58;29734:182;:::o;29922:234::-;30062:34;30058:1;30050:6;30046:14;30039:58;30131:17;30126:2;30118:6;30114:15;30107:42;29922:234;:::o;30162:114::-;;:::o;30282:166::-;30422:18;30418:1;30410:6;30406:14;30399:42;30282:166;:::o;30454:229::-;30594:34;30590:1;30582:6;30578:14;30571:58;30663:12;30658:2;30650:6;30646:15;30639:37;30454:229;:::o;30689:181::-;30829:33;30825:1;30817:6;30813:14;30806:57;30689:181;:::o;30876:175::-;31016:27;31012:1;31004:6;31000:14;30993:51;30876:175;:::o;31057:122::-;31130:24;31148:5;31130:24;:::i;:::-;31123:5;31120:35;31110:63;;31169:1;31166;31159:12;31110:63;31057:122;:::o;31185:116::-;31255:21;31270:5;31255:21;:::i;:::-;31248:5;31245:32;31235:60;;31291:1;31288;31281:12;31235:60;31185:116;:::o;31307:120::-;31379:23;31396:5;31379:23;:::i;:::-;31372:5;31369:34;31359:62;;31417:1;31414;31407:12;31359:62;31307:120;:::o;31433:122::-;31506:24;31524:5;31506:24;:::i;:::-;31499:5;31496:35;31486:63;;31545:1;31542;31535:12;31486:63;31433:122;:::o;31561:120::-;31633:23;31650:5;31633:23;:::i;:::-;31626:5;31623:34;31613:62;;31671:1;31668;31661:12;31613:62;31561:120;:::o

Swarm Source

ipfs://9e46302eeb60a0b9cfcf9acee88a6797288b916c8ce407ab19e0b82cf91ca88a
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.