ETH Price: $3,333.34 (-0.10%)
 

Overview

Max Total Supply

286 TCBP

Holders

77

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x31446df8955c407014035dcb9b5b5751034f614b
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:
TuneCrueBP

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-04-26
*/

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


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

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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


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


/**
 * @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/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)


/**
 * @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`, 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 Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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

// File: @openzeppelin/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)


/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must be have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

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


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


/**
 * @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/security/ReentrancyGuard.sol


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


/**
 * @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/Context.sol


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


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


/**
 * @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/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155Receiver.sol)


/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
        @dev Handles the receipt of a single ERC1155 token type. This function is
        called at the end of a `safeTransferFrom` after the balance has been updated.
        To accept the transfer, this must return
        `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
        (i.e. 0xf23a6e61, or its own function selector).
        @param operator The address which initiated the transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param id The ID of the token being transferred
        @param value The amount of tokens being transferred
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
    */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
        @dev Handles the receipt of a multiple ERC1155 token types. This function
        is called at the end of a `safeBatchTransferFrom` after the balances have
        been updated. To accept the transfer(s), this must return
        `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
        (i.e. 0xbc197c81, or its own function selector).
        @param operator The address which initiated the batch transfer (i.e. msg.sender)
        @param from The address which previously owned the token
        @param ids An array containing ids of each token being transferred (order and length must match values array)
        @param values An array containing amounts of each token being transferred (order and length must match ids array)
        @param data Additional data with no specified format
        @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
    */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)


/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

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


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

/**
 * @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
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 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/utils/introspection/ERC165.sol


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


/**
 * @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/ERC1155/ERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/ERC1155.sol)


/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: balance query for the zero address");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: transfer caller is not owner nor approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, _asSingletonArray(id), _asSingletonArray(amount), data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, _asSingletonArray(id), _asSingletonArray(amount), data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), _asSingletonArray(id), _asSingletonArray(amount), "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Burnable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol)


/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address account,
        uint256 id,
        uint256 value
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(account, id, value);
    }

    function burnBatch(
        address account,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual {
        require(
            account == _msgSender() || isApprovedForAll(account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(account, ids, values);
    }
}

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


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


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/contracts/token/ERC1155/extensions/ERC1155Supply.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol)


/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return ERC1155Supply.totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] -= amounts[i];
            }
        }
    }
}

// File: contracts/AbstractERC1155Factory.sol



abstract contract AbstractERC1155Factory is Pausable, ERC1155Supply, ERC1155Burnable, Ownable {

    string name_;
    string symbol_;   
    bool   locked_ = false;

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }    

    function setURI(string memory baseURI) external onlyOwner {
        require(!locked_, "Collection is Locked");
        _setURI(baseURI);
    }    

    function name() public view returns (string memory) {
        return name_;
    }

    function isLocked() public view returns (bool) {
        return locked_;
    }

    function symbol() public view returns (string memory) {
        return symbol_;
    }          

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override(ERC1155, ERC1155Supply) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }  

    /**
    * @dev  and for the eternity....
    **/
	function lockMetadata() public onlyOwner {
        require (!locked_, "Collection already locked !");
		locked_ = true;
	}
}


// File: contracts/extensions/MessageSigning.sol


abstract contract MessageSigning {
    // Signer Address
    address internal signerAddress; 

    constructor(address signerAddress_){
        signerAddress = signerAddress_;
    }

    /************
    * @dev message singing handling 
    ************/

    function isValidSignature(bytes memory message, bytes memory signature) public view returns (bool) {
        bytes32 _messageHash = keccak256(abi.encodePacked(message));
        bytes32 ethSignedMessageHash = keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", _messageHash));

        return _recoverSigner(ethSignedMessageHash, signature) == signerAddress;
    }

    /**
    * @dev Set the _signerAddress just in case
    */
    function _setSignerAddress(address newSignerAddress) internal virtual {
        require(newSignerAddress != signerAddress, "New Signer Address cannot be the same as current one");
        signerAddress = newSignerAddress;
    }

    function _recoverSigner(bytes32 _ethSignedMessageHash, bytes memory _signature) private pure returns (address) {
        (bytes32 r, bytes32 s, uint8 v) = _splitSignature(_signature);
        return ecrecover(_ethSignedMessageHash, v, r, s);
    }

    function _splitSignature(bytes memory sig) private pure returns (bytes32 r, bytes32 s, uint8 v) {
        require(sig.length == 65, "invalid signature length");

        assembly {
            r := mload(add(sig, 32))
            s := mload(add(sig, 64))
            v := byte(0, mload(add(sig, 96)))
        }
    }
}

// File: contracts/TuneCrue.sol

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.13;


//t
//o  _____                  _____                  ____________ 
//n |_   _|                /  __ \                 | ___ \ ___ \
//y   | |_   _ _ __   ___  | /  \/_ __ _   _  ___  | |_/ / |_/ /
//5   | | | | | '_ \ / _ \ | |   | '__| | | |/ _ \ | ___ \  __/ 
//6   | | |_| | | | |  __/ | \__/\ |  | |_| |  __/ | |_/ / |    
//5   \_/\__,_|_| |_|\___|  \____/_|   \__,_|\___| \____/\_|    
//.                                                            
//x                                                            


/*
* @title ERC1155 token for Tune Crue Backstage Pass
*/

contract TuneCrueBP is AbstractERC1155Factory, ReentrancyGuard, MessageSigning  {

    uint32 public maxSupply = 1444;

    uint32 public freeMintSupply = 200;

    bool public presale = true;
 
    mapping(string => uint256) private _price;
    mapping(address => uint16) private _WalletMintCounter;
    mapping(address => uint16) private _WalletFreeMintCounter;
    mapping(string => uint16)  private  _walletsLimit;

    address private _beneficiary;

    event Purchased(uint256 indexed index, address indexed account, uint256 amount);
    event Freeminted(uint256 indexed index, address indexed account, uint256 amount);

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _uri, 
        address reservesAddress, 
        address signerAddress_,
        address beneficiary_ 
    ) ERC1155(_uri) MessageSigning(signerAddress_) {
        name_ = _name;
        symbol_ = _symbol;

        _beneficiary = beneficiary_;

        _price["presale"] = 0.085 ether;
        _price["public"] = 0.085 ether;
        _price["vip"] = 0.05 ether;

        _walletsLimit["freemint"] = 1;
        _walletsLimit["presale"] = 1;
        _walletsLimit["vip"] = 2;
        _walletsLimit["public"] = 10;

        _mint(reservesAddress, 1, 194, "");
        _pause();
    }

   
    /**
     * @dev End the presale & sets the public Sales price
    */
    function endPresale() external onlyOwner {
        require(presale, "Presale already ended");
        presale = false;
    }

    /**
    * @notice edit the mint price
    *
    * @param newPrice the new price in wei
    */
    function setNewPrice(string memory list, uint256 newPrice) external onlyOwner {
        require(_price[list] != newPrice, "New Price should be different than the current one");
        _price[list] = newPrice;
    }

    /**
    * @notice edit setMaxPerWallet
    *
    * @param newMaxPerWallet the new max amount of tokens allowed to buy in one tx
    */

    function setMaxPerWallet(string memory list, uint16 newMaxPerWallet) external onlyOwner {
        require(_walletsLimit[list] != newMaxPerWallet, "New maxPerWallet should be different than the current one");
        _walletsLimit[list] = newMaxPerWallet;
    }

    /**
    * @notice purchase pass during early access sale
    *
    */
    function whitelistMinting(bytes memory WhitelistSignature, string memory list) external payable whenNotPaused {
        require (presale, "Presale over!");
        require (isValidSignature(abi.encodePacked(_msgSender(), list), WhitelistSignature), "Wallet not whitelisted");
        require(_WalletMintCounter[msg.sender] + 1 <= _walletsLimit[list] , "max Pass per address exceeded");

        _mintPass(list);
    }


    function freeMint(bytes memory FreemintSignature) external payable whenNotPaused nonReentrant{
        require (isValidSignature(abi.encodePacked(_msgSender(), "freemint"), FreemintSignature), "Wallet not allowed for freemint"); 
        require(_WalletFreeMintCounter[msg.sender] + 1 <= _walletsLimit["freemint"] , "max Pass per address exceeded");
        require(freeMintSupply > 0 , "Purchase: Freemint Supply supply reached");

        _mint(msg.sender, 1, 1, "");
        unchecked {
            _WalletFreeMintCounter[msg.sender]++;
            freeMintSupply--;
        }
        emit Freeminted(1, msg.sender, 1);
    }

    /**
    * @notice purchase pass during public sale
    */
    function publicMint() external payable whenNotPaused {
        require (!presale, "Presale is still on");
        require(_WalletMintCounter[msg.sender] + 1 <= _walletsLimit["public"] , "max Pass per address exceeded");
        _mintPass("public");
    }

    /**
    * @notice global purchase function used in early access and public sale
    */
    function _mintPass(string memory list) private nonReentrant {
        require(totalSupply(1) + 1 <= maxSupply - freeMintSupply, "Purchase: Max supply reached");
        require(msg.value >= _price[list], "Purchase: Incorrect payment");

        _mint(msg.sender, 1, 1, "");
        unchecked {
            _WalletMintCounter[msg.sender]++;
        }
        emit Purchased(1, msg.sender, 1);
    }

    /**
    * @dev Decreases the total supply
    *
    */
    function decreaseSupply(uint32 newSupply) external onlyOwner {
        require(newSupply < maxSupply,"Maximum supply can only be decreased");
        require(newSupply >= totalSupply(1) + freeMintSupply, "New Supply too low");
        
        maxSupply = newSupply;
    }

    function decreaseFreeMintSupply(uint32 newFreeMintSupply) external onlyOwner {
        require(newFreeMintSupply < freeMintSupply, "freeMintSupply can only be decreased");

        freeMintSupply = newFreeMintSupply;
    }

    /**
    * @dev change the signerAddress just in case
    */
    function setSignerAddress(address newsignerAddress) external onlyOwner{
        _setSignerAddress(newsignerAddress);
    }

    /**
     * @dev Return the number of minted tokens during the presales for a wallet address
    */
    function getNbrOfMintedToken(address wallet, bool asFree) external view returns (uint16) {
        if (asFree){
            return _WalletFreeMintCounter[wallet];   
        } else {
            return _WalletMintCounter[wallet];   
        }
    }

    /**
     * @dev Return the mint price for a specific list
    */
    function getTokenPrice(string memory list) external view returns (uint256){
        return _price[list];
    }

    /**
     * @dev Return the wallet limit for a specific list
    */
    function getWalletLimit(string memory list) external view returns (uint16){
        return _walletsLimit[list];
    }

    /**
     * @dev Withdraw funds to the `_beneficiary` 
    */

    function withdrawFunds() external onlyOwner nonReentrant {
        require(address(this).balance != 0, "Nothing to withdraw");
        (bool success, ) = _beneficiary.call{value: address(this).balance}("");
        require(success, "Transfer failed.");
    }

    function changeBeneficiary(address newBeneficiary) external onlyOwner{
        require(newBeneficiary != _beneficiary, "New beneficiary cannot be the same as the current one");
        _beneficiary = newBeneficiary;
    }

    function uri(uint256 _id) public view override returns (string memory) {
            require(exists(_id), "URI: nonexistent token");
            return string(abi.encodePacked(super.uri(_id), Strings.toString(_id), ".json"));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"},{"internalType":"address","name":"reservesAddress","type":"address"},{"internalType":"address","name":"signerAddress_","type":"address"},{"internalType":"address","name":"beneficiary_","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Freeminted","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":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"index","type":"uint256"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"Purchased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newBeneficiary","type":"address"}],"name":"changeBeneficiary","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newFreeMintSupply","type":"uint32"}],"name":"decreaseFreeMintSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint32","name":"newSupply","type":"uint32"}],"name":"decreaseSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"endPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"FreemintSignature","type":"bytes"}],"name":"freeMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"freeMintSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"bool","name":"asFree","type":"bool"}],"name":"getNbrOfMintedToken","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"list","type":"string"}],"name":"getTokenPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"list","type":"string"}],"name":"getWalletLimit","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"message","type":"bytes"},{"internalType":"bytes","name":"signature","type":"bytes"}],"name":"isValidSignature","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"list","type":"string"},{"internalType":"uint16","name":"newMaxPerWallet","type":"uint16"}],"name":"setMaxPerWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"list","type":"string"},{"internalType":"uint256","name":"newPrice","type":"uint256"}],"name":"setNewPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newsignerAddress","type":"address"}],"name":"setSignerAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setURI","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":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"WhitelistSignature","type":"bytes"},{"internalType":"string","name":"list","type":"string"}],"name":"whitelistMinting","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526008805460ff19169055600a8054600160a01b600160e81b0319167c01000000c8000005a400000000000000000000000000000000000000001790553480156200004d57600080fd5b50604051620046aa380380620046aa8339810160408190526200007091620009b0565b6000805460ff191690558184620000878162000241565b5062000093336200025a565b6001600955600a80546001600160a01b0319166001600160a01b03929092169190911790558551620000cd906006906020890190620007fd565b508451620000e3906007906020880190620007fd565b50600f80546001600160a01b0319166001600160a01b038316179055604080516670726573616c6560c81b808252600b60078084018290528451938490036027908101852067012dfb0cb5e8800090819055657075626c696360d01b808752600680880186905288519788900360269081018920939093556207669760ec1b8089526003808a019790975289519889900360239081018a2066b1a2bc2ec50000905567199c99595b5a5b9d60c21b8a52600e60088b018190528b519a8b90036028018b20805461ffff1990811660019081179092559a8c52978b018190528b519a8b90039096018a2080548a168817905590895295880184905288519788900390950187208054600290881617905586529285015284519384900390910183208054600a93169290921790915560208201909252600081526200022b91859160c290620002ac565b62000235620003d5565b50505050505062000c9a565b805162000256906003906020840190620007fd565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001600160a01b038416620003125760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084015b60405180910390fd5b336200033881600087620003268862000470565b620003318862000470565b87620004be565b60008481526001602090815260408083206001600160a01b0389168452909152812080548592906200036c90849062000a8e565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4620003ce81600087878787620004e1565b5050505050565b60005460ff16156200041d5760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b604482015260640162000309565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258620004533390565b6040516001600160a01b03909116815260200160405180910390a1565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110620004ad57620004ad62000aa9565b602090810291909101015292915050565b620004d9868686868686620006b660201b62001b261760201c565b505050505050565b62000500846001600160a01b0316620007f760201b62001c3c1760201c565b15620004d95760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e61906200053c908990899088908890889060040162000aed565b6020604051808303816000875af19250505080156200057a575060408051601f3d908101601f19168201909252620005779181019062000b34565b60015b6200063a576200058962000b67565b806308c379a003620005c95750620005a062000b84565b80620005ad5750620005cb565b8060405162461bcd60e51b815260040162000309919062000c13565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e204552433131353560448201527f526563656976657220696d706c656d656e746572000000000000000000000000606482015260840162000309565b6001600160e01b0319811663f23a6e6160e01b14620006ad5760405162461bcd60e51b815260206004820152602860248201527f455243313135353a204552433131353552656365697665722072656a656374656044820152676420746f6b656e7360c01b606482015260840162000309565b50505050505050565b620006d1868686868686620004d960201b62001c341760201c565b6001600160a01b038516620007655760005b8351811015620007635782818151811062000702576200070262000aa9565b60200260200101516004600086848151811062000723576200072362000aa9565b6020026020010151815260200190815260200160002060008282546200074a919062000a8e565b909155506200075b90508162000c28565b9050620006e3565b505b6001600160a01b038416620004d95760005b8351811015620006ad5782818151811062000796576200079662000aa9565b602002602001015160046000868481518110620007b757620007b762000aa9565b602002602001015181526020019081526020016000206000828254620007de919062000c44565b90915550620007ef90508162000c28565b905062000777565b3b151590565b8280546200080b9062000c5e565b90600052602060002090601f0160209004810192826200082f57600085556200087a565b82601f106200084a57805160ff19168380011785556200087a565b828001600101855582156200087a579182015b828111156200087a5782518255916020019190600101906200085d565b50620008889291506200088c565b5090565b5b808211156200088857600081556001016200088d565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715620008e157620008e1620008a3565b6040525050565b60005b8381101562000905578181015183820152602001620008eb565b8381111562000915576000848401525b50505050565b600082601f8301126200092d57600080fd5b81516001600160401b03811115620009495762000949620008a3565b60405162000962601f8301601f191660200182620008b9565b8181528460208386010111156200097857600080fd5b6200098b826020830160208701620008e8565b949350505050565b80516001600160a01b0381168114620009ab57600080fd5b919050565b60008060008060008060c08789031215620009ca57600080fd5b86516001600160401b0380821115620009e257600080fd5b620009f08a838b016200091b565b9750602089015191508082111562000a0757600080fd5b62000a158a838b016200091b565b9650604089015191508082111562000a2c57600080fd5b5062000a3b89828a016200091b565b94505062000a4c6060880162000993565b925062000a5c6080880162000993565b915062000a6c60a0880162000993565b90509295509295509295565b634e487b7160e01b600052601160045260246000fd5b6000821982111562000aa45762000aa462000a78565b500190565b634e487b7160e01b600052603260045260246000fd5b6000815180845262000ad9816020860160208601620008e8565b601f01601f19169290920160200192915050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a06080820181905260009062000b299083018462000abf565b979650505050505050565b60006020828403121562000b4757600080fd5b81516001600160e01b03198116811462000b6057600080fd5b9392505050565b600060033d111562000b815760046000803e5060005160e01c5b90565b600060443d101562000b935790565b6040516003193d81016004833e81513d6001600160401b03808311602484018310171562000bc357505050505090565b828501915081518181111562000bdc5750505050505090565b843d870101602082850101111562000bf75750505050505090565b62000c0860208286010187620008b9565b509095945050505050565b60208152600062000b60602083018462000abf565b60006001820162000c3d5762000c3d62000a78565b5060010190565b60008282101562000c595762000c5962000a78565b500390565b600181811c9082168062000c7357607f821691505b60208210810362000c9457634e487b7160e01b600052602260045260246000fd5b50919050565b613a008062000caa6000396000f3fe6080604052600436106102455760003560e01c8063717795fc11610139578063bd85b039116100b6578063e150007e1161007a578063e150007e1461069f578063e985e9c5146106c3578063f242432a1461070c578063f2fde38b1461072c578063f5298aca1461074c578063fdea8e0b1461076c57600080fd5b8063bd85b039146105d9578063d5abeb0114610606578063dc0706571461063f578063dd443f3a1461065f578063e00fc0de1461067f57600080fd5b8063a22cb465116100fd578063a22cb46514610559578063a43be57b14610579578063a4513e921461058e578063a4e2d634146105a1578063aab76c1a146105b957600080fd5b8063717795fc146104d25780638456cb59146104f25780638da5cb5b1461050757806395d89b411461052f578063989bdbb61461054457600080fd5b80632eb2c2d6116101c75780635c975abb1161018b5780635c975abb146104525780635d9c5c5c1461046a578063684b06bb1461048a5780636b20c4541461049d578063715018a6146104bd57600080fd5b80632eb2c2d6146103a15780633f4ba83a146103c15780634e1273f4146103d65780634f558e79146104035780635350758f1461043257600080fd5b80630e89341c1161020e5780630e89341c146103115780631c5a17af1461033157806320c13b0b1461036457806324600fc31461038457806326092b831461039957600080fd5b8062fdd58e1461024a57806301ffc9a71461027d57806302fe5305146102ad578063046dc166146102cf57806306fdde03146102ef575b600080fd5b34801561025657600080fd5b5061026a610265366004612ce3565b61078d565b6040519081526020015b60405180910390f35b34801561028957600080fd5b5061029d610298366004612d23565b610829565b6040519015158152602001610274565b3480156102b957600080fd5b506102cd6102c8366004612dfc565b610879565b005b3480156102db57600080fd5b506102cd6102ea366004612e30565b6108f9565b3480156102fb57600080fd5b5061030461092c565b6040516102749190612ea7565b34801561031d57600080fd5b5061030461032c366004612eba565b6109be565b34801561033d57600080fd5b5061035161034c366004612ed3565b610a4e565b60405161ffff9091168152602001610274565b34801561037057600080fd5b5061029d61037f366004612f0f565b610a9c565b34801561039057600080fd5b506102cd610b4b565b6102cd610c80565b3480156103ad57600080fd5b506102cd6103bc366004613006565b610d86565b3480156103cd57600080fd5b506102cd610e1d565b3480156103e257600080fd5b506103f66103f13660046130af565b610e4f565b60405161027491906131aa565b34801561040f57600080fd5b5061029d61041e366004612eba565b600090815260046020526040902054151590565b34801561043e57600080fd5b5061026a61044d366004612dfc565b610f78565b34801561045e57600080fd5b5060005460ff1661029d565b34801561047657600080fd5b50610351610485366004612dfc565b610fa0565b6102cd610498366004612f0f565b610fcc565b3480156104a957600080fd5b506102cd6104b83660046131bd565b61111a565b3480156104c957600080fd5b506102cd611162565b3480156104de57600080fd5b506102cd6104ed366004613230565b611196565b3480156104fe57600080fd5b506102cd6112e4565b34801561051357600080fd5b506005546040516001600160a01b039091168152602001610274565b34801561053b57600080fd5b50610304611316565b34801561055057600080fd5b506102cd611325565b34801561056557600080fd5b506102cd610574366004612ed3565b6113b1565b34801561058557600080fd5b506102cd6113bc565b6102cd61059c366004612dfc565b611446565b3480156105ad57600080fd5b5060085460ff1661029d565b3480156105c557600080fd5b506102cd6105d4366004613256565b6116a9565b3480156105e557600080fd5b5061026a6105f4366004612eba565b60009081526004602052604090205490565b34801561061257600080fd5b50600a5461062a90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610274565b34801561064b57600080fd5b506102cd61065a366004612e30565b6117a9565b34801561066b57600080fd5b506102cd61067a3660046132a3565b611871565b34801561068b57600080fd5b506102cd61069a366004613230565b611948565b3480156106ab57600080fd5b50600a5461062a90600160c01b900463ffffffff1681565b3480156106cf57600080fd5b5061029d6106de3660046132e7565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b34801561071857600080fd5b506102cd61072736600461331a565b611a06565b34801561073857600080fd5b506102cd610747366004612e30565b611a4b565b34801561075857600080fd5b506102cd61076736600461337e565b611ae3565b34801561077857600080fd5b50600a5461029d90600160e01b900460ff1681565b60006001600160a01b0383166107fe5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060008181526001602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061085a57506001600160e01b031982166303a24d0760e21b145b8061082357506301ffc9a760e01b6001600160e01b0319831614610823565b6005546001600160a01b031633146108a35760405162461bcd60e51b81526004016107f5906133b1565b60085460ff16156108ed5760405162461bcd60e51b815260206004820152601460248201527310dbdb1b1958dd1a5bdb881a5cc8131bd8dad95960621b60448201526064016107f5565b6108f681611c42565b50565b6005546001600160a01b031633146109235760405162461bcd60e51b81526004016107f5906133b1565b6108f681611c55565b60606006805461093b906133e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610967906133e6565b80156109b45780601f10610989576101008083540402835291602001916109b4565b820191906000526020600020905b81548152906001019060200180831161099757829003601f168201915b5050505050905090565b600081815260046020526040902054606090610a155760405162461bcd60e51b81526020600482015260166024820152752aa9249d103737b732bc34b9ba32b73a103a37b5b2b760511b60448201526064016107f5565b610a1e82611cf2565b610a2783611d86565b604051602001610a38929190613420565b6040516020818303038152906040529050919050565b60008115610a7957506001600160a01b0382166000908152600d602052604090205461ffff16610823565b506001600160a01b0382166000908152600c602052604090205461ffff16610823565b60008083604051602001610ab0919061345f565b604051602081830303815290604052805190602001209050600081604051602001610b0791907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f198184030181529190528051602090910120600a549091506001600160a01b0316610b388286611e8e565b6001600160a01b03161495945050505050565b6005546001600160a01b03163314610b755760405162461bcd60e51b81526004016107f5906133b1565b600260095403610b975760405162461bcd60e51b81526004016107f59061347b565b600260095547600003610be25760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b60448201526064016107f5565b600f546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610c2f576040519150601f19603f3d011682016040523d82523d6000602084013e610c34565b606091505b5050905080610c785760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016107f5565b506001600955565b60005460ff1615610ca35760405162461bcd60e51b81526004016107f5906134b2565b600a54600160e01b900460ff1615610cf35760405162461bcd60e51b8152602060048201526013602482015272283932b9b0b6329034b99039ba34b6361037b760691b60448201526064016107f5565b604051657075626c696360d01b8152600e90600601908152604080516020928190038301902054336000908152600c90935291205461ffff91821691610d3b911660016134f2565b61ffff161115610d5d5760405162461bcd60e51b81526004016107f590613518565b610d84604051806040016040528060068152602001657075626c696360d01b815250611f0d565b565b6001600160a01b038516331480610da25750610da285336106de565b610e095760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016107f5565b610e1685858585856120c9565b5050505050565b6005546001600160a01b03163314610e475760405162461bcd60e51b81526004016107f5906133b1565b610d8461226e565b60608151835114610eb45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016107f5565b600083516001600160401b03811115610ecf57610ecf612d47565b604051908082528060200260200182016040528015610ef8578160200160208202803683370190505b50905060005b8451811015610f7057610f43858281518110610f1c57610f1c61354f565b6020026020010151858381518110610f3657610f3661354f565b602002602001015161078d565b828281518110610f5557610f5561354f565b6020908102919091010152610f6981613565565b9050610efe565b509392505050565b6000600b82604051610f8a919061345f565b9081526020016040518091039020549050919050565b6000600e82604051610fb2919061345f565b9081526040519081900360200190205461ffff1692915050565b60005460ff1615610fef5760405162461bcd60e51b81526004016107f5906134b2565b600a54600160e01b900460ff166110385760405162461bcd60e51b815260206004820152600d60248201526c50726573616c65206f7665722160981b60448201526064016107f5565b611063338260405160200161104e92919061357e565b60405160208183030381529060405283610a9c565b6110a85760405162461bcd60e51b815260206004820152601660248201527515d85b1b195d081b9bdd081dda1a5d195b1a5cdd195960521b60448201526064016107f5565b600e816040516110b8919061345f565b908152604080516020928190038301902054336000908152600c90935291205461ffff918216916110eb911660016134f2565b61ffff16111561110d5760405162461bcd60e51b81526004016107f590613518565b61111681611f0d565b5050565b6001600160a01b038316331480611136575061113683336106de565b6111525760405162461bcd60e51b81526004016107f5906135b6565b61115d838383612301565b505050565b6005546001600160a01b0316331461118c5760405162461bcd60e51b81526004016107f5906133b1565b610d846000612492565b6005546001600160a01b031633146111c05760405162461bcd60e51b81526004016107f5906133b1565b600a5463ffffffff600160a01b90910481169082161061122e5760405162461bcd60e51b8152602060048201526024808201527f4d6178696d756d20737570706c792063616e206f6e6c79206265206465637265604482015263185cd95960e21b60648201526084016107f5565b600a54600160005260046020527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe055461127491600160c01b900463ffffffff16906135ff565b8163ffffffff1610156112be5760405162461bcd60e51b81526020600482015260126024820152714e657720537570706c7920746f6f206c6f7760701b60448201526064016107f5565b600a805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b6005546001600160a01b0316331461130e5760405162461bcd60e51b81526004016107f5906133b1565b610d846124e4565b60606007805461093b906133e6565b6005546001600160a01b0316331461134f5760405162461bcd60e51b81526004016107f5906133b1565b60085460ff16156113a25760405162461bcd60e51b815260206004820152601b60248201527f436f6c6c656374696f6e20616c7265616479206c6f636b65642021000000000060448201526064016107f5565b6008805460ff19166001179055565b61111633838361253c565b6005546001600160a01b031633146113e65760405162461bcd60e51b81526004016107f5906133b1565b600a54600160e01b900460ff166114375760405162461bcd60e51b8152602060048201526015602482015274141c995cd85b1948185b1c9958591e48195b991959605a1b60448201526064016107f5565b600a805460ff60e01b19169055565b60005460ff16156114695760405162461bcd60e51b81526004016107f5906134b2565b60026009540361148b5760405162461bcd60e51b81526004016107f59061347b565b60026009556040516bffffffffffffffffffffffff193360601b16602082015267199c99595b5a5b9d60c21b60348201526114d890603c0160405160208183030381529060405282610a9c565b6115245760405162461bcd60e51b815260206004820152601f60248201527f57616c6c6574206e6f7420616c6c6f77656420666f7220667265656d696e740060448201526064016107f5565b60405167199c99595b5a5b9d60c21b8152600e90600801908152604080516020928190038301902054336000908152600d90935291205461ffff9182169161156e911660016134f2565b61ffff1611156115905760405162461bcd60e51b81526004016107f590613518565b600a54600160c01b900463ffffffff166115fd5760405162461bcd60e51b815260206004820152602860248201527f50757263686173653a20467265656d696e7420537570706c7920737570706c79604482015267081c995858da195960c21b60648201526084016107f5565b611619336001806040518060200160405280600081525061261c565b336000818152600d6020908152604091829020805461ffff198116600161ffff928316810190921617909155600a805463ffffffff60c01b198116600160c01b9182900463ffffffff908116600019011690910217905591518281527f738ca2303cd8ac9cd442d1193272b1601e61a2f3b57a17cd2af37080597b0e9e91015b60405180910390a3506001600955565b6005546001600160a01b031633146116d35760405162461bcd60e51b81526004016107f5906133b1565b8061ffff16600e836040516116e8919061345f565b9081526040519081900360200190205461ffff160361176f5760405162461bcd60e51b815260206004820152603960248201527f4e6577206d617850657257616c6c65742073686f756c6420626520646966666560448201527f72656e74207468616e207468652063757272656e74206f6e650000000000000060648201526084016107f5565b80600e83604051611780919061345f565b908152604051908190036020019020805461ffff9290921661ffff199092169190911790555050565b6005546001600160a01b031633146117d35760405162461bcd60e51b81526004016107f5906133b1565b600f546001600160a01b039081169082160361184f5760405162461bcd60e51b815260206004820152603560248201527f4e65772062656e65666963696172792063616e6e6f74206265207468652073616044820152746d65206173207468652063757272656e74206f6e6560581b60648201526084016107f5565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461189b5760405162461bcd60e51b81526004016107f5906133b1565b80600b836040516118ac919061345f565b908152602001604051809103902054036119235760405162461bcd60e51b815260206004820152603260248201527f4e65772050726963652073686f756c6420626520646966666572656e74207468604482015271616e207468652063757272656e74206f6e6560701b60648201526084016107f5565b80600b83604051611934919061345f565b908152604051908190036020019020555050565b6005546001600160a01b031633146119725760405162461bcd60e51b81526004016107f5906133b1565b600a5463ffffffff600160c01b9091048116908216106119e05760405162461bcd60e51b8152602060048201526024808201527f667265654d696e74537570706c792063616e206f6e6c79206265206465637265604482015263185cd95960e21b60648201526084016107f5565b600a805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b6001600160a01b038516331480611a225750611a2285336106de565b611a3e5760405162461bcd60e51b81526004016107f5906135b6565b610e16858585858561272e565b6005546001600160a01b03163314611a755760405162461bcd60e51b81526004016107f5906133b1565b6001600160a01b038116611ada5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f5565b6108f681612492565b6001600160a01b038316331480611aff5750611aff83336106de565b611b1b5760405162461bcd60e51b81526004016107f5906135b6565b61115d838383612846565b6001600160a01b038516611bad5760005b8351811015611bab57828181518110611b5257611b5261354f565b602002602001015160046000868481518110611b7057611b7061354f565b602002602001015181526020019081526020016000206000828254611b9591906135ff565b90915550611ba4905081613565565b9050611b37565b505b6001600160a01b038416611c345760005b8351811015611c3257828181518110611bd957611bd961354f565b602002602001015160046000868481518110611bf757611bf761354f565b602002602001015181526020019081526020016000206000828254611c1c9190613617565b90915550611c2b905081613565565b9050611bbe565b505b505050505050565b3b151590565b8051611116906003906020840190612c2e565b600a546001600160a01b0390811690821603611cd05760405162461bcd60e51b815260206004820152603460248201527f4e6577205369676e657220416464726573732063616e6e6f74206265207468656044820152732073616d652061732063757272656e74206f6e6560601b60648201526084016107f5565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b606060038054611d01906133e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2d906133e6565b8015611d7a5780601f10611d4f57610100808354040283529160200191611d7a565b820191906000526020600020905b815481529060010190602001808311611d5d57829003601f168201915b50505050509050919050565b606081600003611dad5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611dd75780611dc181613565565b9150611dd09050600a83613644565b9150611db1565b6000816001600160401b03811115611df157611df1612d47565b6040519080825280601f01601f191660200182016040528015611e1b576020820181803683370190505b5090505b8415611e8657611e30600183613617565b9150611e3d600a86613658565b611e489060306135ff565b60f81b818381518110611e5d57611e5d61354f565b60200101906001600160f81b031916908160001a905350611e7f600a86613644565b9450611e1f565b949350505050565b600080600080611e9d8561294b565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015611ef8573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600260095403611f2f5760405162461bcd60e51b81526004016107f59061347b565b6002600955600a54611f579063ffffffff600160c01b8204811691600160a01b90041661366c565b600160005260046020527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe055463ffffffff9190911690611f989060016135ff565b1115611fe65760405162461bcd60e51b815260206004820152601c60248201527f50757263686173653a204d617820737570706c7920726561636865640000000060448201526064016107f5565b600b81604051611ff6919061345f565b9081526020016040518091039020543410156120545760405162461bcd60e51b815260206004820152601b60248201527f50757263686173653a20496e636f7272656374207061796d656e74000000000060448201526064016107f5565b612070336001806040518060200160405280600081525061261c565b336000818152600c6020908152604091829020805461ffff198116600161ffff92831681019092161790915591518281527ffd51b2c9f55c42d2b72ac683526519563be02fc0107f034ff430c05185ff1b669101611699565b81518351146120ea5760405162461bcd60e51b81526004016107f590613691565b6001600160a01b0384166121105760405162461bcd60e51b81526004016107f5906136d9565b3361211f8187878787876129bf565b60005b845181101561220857600085828151811061213f5761213f61354f565b60200260200101519050600085838151811061215d5761215d61354f565b60209081029190910181015160008481526001835260408082206001600160a01b038e1683529093529190912054909150818110156121ae5760405162461bcd60e51b81526004016107f59061371e565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906121ed9084906135ff565b925050819055505050508061220190613565565b9050612122565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612258929190613768565b60405180910390a4611c348187878787876129cd565b60005460ff166122b75760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107f5565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166123275760405162461bcd60e51b81526004016107f590613796565b80518251146123485760405162461bcd60e51b81526004016107f590613691565b600033905061236b818560008686604051806020016040528060008152506129bf565b60005b835181101561243357600084828151811061238b5761238b61354f565b6020026020010151905060008483815181106123a9576123a961354f565b60209081029190910181015160008481526001835260408082206001600160a01b038c1683529093529190912054909150818110156123fa5760405162461bcd60e51b81526004016107f5906137d9565b60009283526001602090815260408085206001600160a01b038b168652909152909220910390558061242b81613565565b91505061236e565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612484929190613768565b60405180910390a450505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005460ff16156125075760405162461bcd60e51b81526004016107f5906134b2565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122e43390565b816001600160a01b0316836001600160a01b0316036125af5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016107f5565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661267c5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107f5565b3361269c8160008761268d88612b28565b61269688612b28565b876129bf565b60008481526001602090815260408083206001600160a01b0389168452909152812080548592906126ce9084906135ff565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610e1681600087878787612b73565b6001600160a01b0384166127545760405162461bcd60e51b81526004016107f5906136d9565b3361276481878761268d88612b28565b60008481526001602090815260408083206001600160a01b038a168452909152902054838110156127a75760405162461bcd60e51b81526004016107f59061371e565b60008581526001602090815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906127e69084906135ff565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611c32828888888888612b73565b6001600160a01b03831661286c5760405162461bcd60e51b81526004016107f590613796565b3361289b8185600061287d87612b28565b61288687612b28565b604051806020016040528060008152506129bf565b60008381526001602090815260408083206001600160a01b0388168452909152902054828110156128de5760405162461bcd60e51b81526004016107f5906137d9565b60008481526001602090815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b600080600083516041146129a15760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016107f5565b50505060208101516040820151606090920151909260009190911a90565b611c34868686868686611b26565b6001600160a01b0384163b15611c345760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612a11908990899088908890889060040161381d565b6020604051808303816000875af1925050508015612a4c575060408051601f3d908101601f19168201909252612a499181019061387b565b60015b612af857612a58613898565b806308c379a003612a915750612a6c6138b4565b80612a775750612a93565b8060405162461bcd60e51b81526004016107f59190612ea7565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016107f5565b6001600160e01b0319811663bc197c8160e01b14611c325760405162461bcd60e51b81526004016107f59061393d565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110612b6257612b6261354f565b602090810291909101015292915050565b6001600160a01b0384163b15611c345760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612bb79089908990889088908890600401613985565b6020604051808303816000875af1925050508015612bf2575060408051601f3d908101601f19168201909252612bef9181019061387b565b60015b612bfe57612a58613898565b6001600160e01b0319811663f23a6e6160e01b14611c325760405162461bcd60e51b81526004016107f59061393d565b828054612c3a906133e6565b90600052602060002090601f016020900481019282612c5c5760008555612ca2565b82601f10612c7557805160ff1916838001178555612ca2565b82800160010185558215612ca2579182015b82811115612ca2578251825591602001919060010190612c87565b50612cae929150612cb2565b5090565b5b80821115612cae5760008155600101612cb3565b80356001600160a01b0381168114612cde57600080fd5b919050565b60008060408385031215612cf657600080fd5b612cff83612cc7565b946020939093013593505050565b6001600160e01b0319811681146108f657600080fd5b600060208284031215612d3557600080fd5b8135612d4081612d0d565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715612d8257612d82612d47565b6040525050565b600082601f830112612d9a57600080fd5b81356001600160401b03811115612db357612db3612d47565b604051612dca601f8301601f191660200182612d5d565b818152846020838601011115612ddf57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215612e0e57600080fd5b81356001600160401b03811115612e2457600080fd5b611e8684828501612d89565b600060208284031215612e4257600080fd5b612d4082612cc7565b60005b83811015612e66578181015183820152602001612e4e565b83811115612e75576000848401525b50505050565b60008151808452612e93816020860160208601612e4b565b601f01601f19169290920160200192915050565b602081526000612d406020830184612e7b565b600060208284031215612ecc57600080fd5b5035919050565b60008060408385031215612ee657600080fd5b612eef83612cc7565b915060208301358015158114612f0457600080fd5b809150509250929050565b60008060408385031215612f2257600080fd5b82356001600160401b0380821115612f3957600080fd5b612f4586838701612d89565b93506020850135915080821115612f5b57600080fd5b50612f6885828601612d89565b9150509250929050565b60006001600160401b03821115612f8b57612f8b612d47565b5060051b60200190565b600082601f830112612fa657600080fd5b81356020612fb382612f72565b604051612fc08282612d5d565b83815260059390931b8501820192828101915086841115612fe057600080fd5b8286015b84811015612ffb5780358352918301918301612fe4565b509695505050505050565b600080600080600060a0868803121561301e57600080fd5b61302786612cc7565b945061303560208701612cc7565b935060408601356001600160401b038082111561305157600080fd5b61305d89838a01612f95565b9450606088013591508082111561307357600080fd5b61307f89838a01612f95565b9350608088013591508082111561309557600080fd5b506130a288828901612d89565b9150509295509295909350565b600080604083850312156130c257600080fd5b82356001600160401b03808211156130d957600080fd5b818501915085601f8301126130ed57600080fd5b813560206130fa82612f72565b6040516131078282612d5d565b83815260059390931b850182019282810191508984111561312757600080fd5b948201945b8386101561314c5761313d86612cc7565b8252948201949082019061312c565b9650508601359250508082111561316257600080fd5b50612f6885828601612f95565b600081518084526020808501945080840160005b8381101561319f57815187529582019590820190600101613183565b509495945050505050565b602081526000612d40602083018461316f565b6000806000606084860312156131d257600080fd5b6131db84612cc7565b925060208401356001600160401b03808211156131f757600080fd5b61320387838801612f95565b9350604086013591508082111561321957600080fd5b5061322686828701612f95565b9150509250925092565b60006020828403121561324257600080fd5b813563ffffffff81168114612d4057600080fd5b6000806040838503121561326957600080fd5b82356001600160401b0381111561327f57600080fd5b61328b85828601612d89565b925050602083013561ffff81168114612f0457600080fd5b600080604083850312156132b657600080fd5b82356001600160401b038111156132cc57600080fd5b6132d885828601612d89565b95602094909401359450505050565b600080604083850312156132fa57600080fd5b61330383612cc7565b915061331160208401612cc7565b90509250929050565b600080600080600060a0868803121561333257600080fd5b61333b86612cc7565b945061334960208701612cc7565b9350604086013592506060860135915060808601356001600160401b0381111561337257600080fd5b6130a288828901612d89565b60008060006060848603121561339357600080fd5b61339c84612cc7565b95602085013595506040909401359392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806133fa57607f821691505b60208210810361341a57634e487b7160e01b600052602260045260246000fd5b50919050565b60008351613432818460208801612e4b565b835190830190613446818360208801612e4b565b64173539b7b760d91b9101908152600501949350505050565b60008251613471818460208701612e4b565b9190910192915050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600061ffff80831681851680830382111561350f5761350f6134dc565b01949350505050565b6020808252601d908201527f6d61782050617373207065722061646472657373206578636565646564000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060018201613577576135776134dc565b5060010190565b6bffffffffffffffffffffffff198360601b168152600082516135a8816014850160208701612e4b565b919091016014019392505050565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60008219821115613612576136126134dc565b500190565b600082821015613629576136296134dc565b500390565b634e487b7160e01b600052601260045260246000fd5b6000826136535761365361362e565b500490565b6000826136675761366761362e565b500690565b600063ffffffff83811690831681811015613689576136896134dc565b039392505050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061377b604083018561316f565b828103602084015261378d818561316f565b95945050505050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190526000906138499083018661316f565b828103606084015261385b818661316f565b9050828103608084015261386f8185612e7b565b98975050505050505050565b60006020828403121561388d57600080fd5b8151612d4081612d0d565b600060033d11156138b15760046000803e5060005160e01c5b90565b600060443d10156138c25790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156138f157505050505090565b82850191508151818111156139095750505050505090565b843d87010160208285010111156139235750505050505090565b61393260208286010187612d5d565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906139bf90830184612e7b565b97965050505050505056fea264697066735822122013e1c735fffce139cdc788ef1d883d4be779f9d2f1454b1d7c008f05d8c04a0564736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000008e3f2ce2789b955de04a8c233ae3539709a6c973000000000000000000000000bfa789a012107a94b4796ad78849195cf6e5a3830000000000000000000000008e3f2ce2789b955de04a8c233ae3539709a6c973000000000000000000000000000000000000000000000000000000000000000a54756e6543727565425000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000454434250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d514544394e6b3236644c455569614847426442634c65796d36777468766a5456526158486b627663693247522f00000000000000000000

Deployed Bytecode

0x6080604052600436106102455760003560e01c8063717795fc11610139578063bd85b039116100b6578063e150007e1161007a578063e150007e1461069f578063e985e9c5146106c3578063f242432a1461070c578063f2fde38b1461072c578063f5298aca1461074c578063fdea8e0b1461076c57600080fd5b8063bd85b039146105d9578063d5abeb0114610606578063dc0706571461063f578063dd443f3a1461065f578063e00fc0de1461067f57600080fd5b8063a22cb465116100fd578063a22cb46514610559578063a43be57b14610579578063a4513e921461058e578063a4e2d634146105a1578063aab76c1a146105b957600080fd5b8063717795fc146104d25780638456cb59146104f25780638da5cb5b1461050757806395d89b411461052f578063989bdbb61461054457600080fd5b80632eb2c2d6116101c75780635c975abb1161018b5780635c975abb146104525780635d9c5c5c1461046a578063684b06bb1461048a5780636b20c4541461049d578063715018a6146104bd57600080fd5b80632eb2c2d6146103a15780633f4ba83a146103c15780634e1273f4146103d65780634f558e79146104035780635350758f1461043257600080fd5b80630e89341c1161020e5780630e89341c146103115780631c5a17af1461033157806320c13b0b1461036457806324600fc31461038457806326092b831461039957600080fd5b8062fdd58e1461024a57806301ffc9a71461027d57806302fe5305146102ad578063046dc166146102cf57806306fdde03146102ef575b600080fd5b34801561025657600080fd5b5061026a610265366004612ce3565b61078d565b6040519081526020015b60405180910390f35b34801561028957600080fd5b5061029d610298366004612d23565b610829565b6040519015158152602001610274565b3480156102b957600080fd5b506102cd6102c8366004612dfc565b610879565b005b3480156102db57600080fd5b506102cd6102ea366004612e30565b6108f9565b3480156102fb57600080fd5b5061030461092c565b6040516102749190612ea7565b34801561031d57600080fd5b5061030461032c366004612eba565b6109be565b34801561033d57600080fd5b5061035161034c366004612ed3565b610a4e565b60405161ffff9091168152602001610274565b34801561037057600080fd5b5061029d61037f366004612f0f565b610a9c565b34801561039057600080fd5b506102cd610b4b565b6102cd610c80565b3480156103ad57600080fd5b506102cd6103bc366004613006565b610d86565b3480156103cd57600080fd5b506102cd610e1d565b3480156103e257600080fd5b506103f66103f13660046130af565b610e4f565b60405161027491906131aa565b34801561040f57600080fd5b5061029d61041e366004612eba565b600090815260046020526040902054151590565b34801561043e57600080fd5b5061026a61044d366004612dfc565b610f78565b34801561045e57600080fd5b5060005460ff1661029d565b34801561047657600080fd5b50610351610485366004612dfc565b610fa0565b6102cd610498366004612f0f565b610fcc565b3480156104a957600080fd5b506102cd6104b83660046131bd565b61111a565b3480156104c957600080fd5b506102cd611162565b3480156104de57600080fd5b506102cd6104ed366004613230565b611196565b3480156104fe57600080fd5b506102cd6112e4565b34801561051357600080fd5b506005546040516001600160a01b039091168152602001610274565b34801561053b57600080fd5b50610304611316565b34801561055057600080fd5b506102cd611325565b34801561056557600080fd5b506102cd610574366004612ed3565b6113b1565b34801561058557600080fd5b506102cd6113bc565b6102cd61059c366004612dfc565b611446565b3480156105ad57600080fd5b5060085460ff1661029d565b3480156105c557600080fd5b506102cd6105d4366004613256565b6116a9565b3480156105e557600080fd5b5061026a6105f4366004612eba565b60009081526004602052604090205490565b34801561061257600080fd5b50600a5461062a90600160a01b900463ffffffff1681565b60405163ffffffff9091168152602001610274565b34801561064b57600080fd5b506102cd61065a366004612e30565b6117a9565b34801561066b57600080fd5b506102cd61067a3660046132a3565b611871565b34801561068b57600080fd5b506102cd61069a366004613230565b611948565b3480156106ab57600080fd5b50600a5461062a90600160c01b900463ffffffff1681565b3480156106cf57600080fd5b5061029d6106de3660046132e7565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b34801561071857600080fd5b506102cd61072736600461331a565b611a06565b34801561073857600080fd5b506102cd610747366004612e30565b611a4b565b34801561075857600080fd5b506102cd61076736600461337e565b611ae3565b34801561077857600080fd5b50600a5461029d90600160e01b900460ff1681565b60006001600160a01b0383166107fe5760405162461bcd60e51b815260206004820152602b60248201527f455243313135353a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b60648201526084015b60405180910390fd5b5060008181526001602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b03198216636cdb3d1360e11b148061085a57506001600160e01b031982166303a24d0760e21b145b8061082357506301ffc9a760e01b6001600160e01b0319831614610823565b6005546001600160a01b031633146108a35760405162461bcd60e51b81526004016107f5906133b1565b60085460ff16156108ed5760405162461bcd60e51b815260206004820152601460248201527310dbdb1b1958dd1a5bdb881a5cc8131bd8dad95960621b60448201526064016107f5565b6108f681611c42565b50565b6005546001600160a01b031633146109235760405162461bcd60e51b81526004016107f5906133b1565b6108f681611c55565b60606006805461093b906133e6565b80601f0160208091040260200160405190810160405280929190818152602001828054610967906133e6565b80156109b45780601f10610989576101008083540402835291602001916109b4565b820191906000526020600020905b81548152906001019060200180831161099757829003601f168201915b5050505050905090565b600081815260046020526040902054606090610a155760405162461bcd60e51b81526020600482015260166024820152752aa9249d103737b732bc34b9ba32b73a103a37b5b2b760511b60448201526064016107f5565b610a1e82611cf2565b610a2783611d86565b604051602001610a38929190613420565b6040516020818303038152906040529050919050565b60008115610a7957506001600160a01b0382166000908152600d602052604090205461ffff16610823565b506001600160a01b0382166000908152600c602052604090205461ffff16610823565b60008083604051602001610ab0919061345f565b604051602081830303815290604052805190602001209050600081604051602001610b0791907f19457468657265756d205369676e6564204d6573736167653a0a3332000000008152601c810191909152603c0190565b60408051601f198184030181529190528051602090910120600a549091506001600160a01b0316610b388286611e8e565b6001600160a01b03161495945050505050565b6005546001600160a01b03163314610b755760405162461bcd60e51b81526004016107f5906133b1565b600260095403610b975760405162461bcd60e51b81526004016107f59061347b565b600260095547600003610be25760405162461bcd60e51b81526020600482015260136024820152724e6f7468696e6720746f20776974686472617760681b60448201526064016107f5565b600f546040516000916001600160a01b03169047908381818185875af1925050503d8060008114610c2f576040519150601f19603f3d011682016040523d82523d6000602084013e610c34565b606091505b5050905080610c785760405162461bcd60e51b815260206004820152601060248201526f2a3930b739b332b9103330b4b632b21760811b60448201526064016107f5565b506001600955565b60005460ff1615610ca35760405162461bcd60e51b81526004016107f5906134b2565b600a54600160e01b900460ff1615610cf35760405162461bcd60e51b8152602060048201526013602482015272283932b9b0b6329034b99039ba34b6361037b760691b60448201526064016107f5565b604051657075626c696360d01b8152600e90600601908152604080516020928190038301902054336000908152600c90935291205461ffff91821691610d3b911660016134f2565b61ffff161115610d5d5760405162461bcd60e51b81526004016107f590613518565b610d84604051806040016040528060068152602001657075626c696360d01b815250611f0d565b565b6001600160a01b038516331480610da25750610da285336106de565b610e095760405162461bcd60e51b815260206004820152603260248201527f455243313135353a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b60648201526084016107f5565b610e1685858585856120c9565b5050505050565b6005546001600160a01b03163314610e475760405162461bcd60e51b81526004016107f5906133b1565b610d8461226e565b60608151835114610eb45760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016107f5565b600083516001600160401b03811115610ecf57610ecf612d47565b604051908082528060200260200182016040528015610ef8578160200160208202803683370190505b50905060005b8451811015610f7057610f43858281518110610f1c57610f1c61354f565b6020026020010151858381518110610f3657610f3661354f565b602002602001015161078d565b828281518110610f5557610f5561354f565b6020908102919091010152610f6981613565565b9050610efe565b509392505050565b6000600b82604051610f8a919061345f565b9081526020016040518091039020549050919050565b6000600e82604051610fb2919061345f565b9081526040519081900360200190205461ffff1692915050565b60005460ff1615610fef5760405162461bcd60e51b81526004016107f5906134b2565b600a54600160e01b900460ff166110385760405162461bcd60e51b815260206004820152600d60248201526c50726573616c65206f7665722160981b60448201526064016107f5565b611063338260405160200161104e92919061357e565b60405160208183030381529060405283610a9c565b6110a85760405162461bcd60e51b815260206004820152601660248201527515d85b1b195d081b9bdd081dda1a5d195b1a5cdd195960521b60448201526064016107f5565b600e816040516110b8919061345f565b908152604080516020928190038301902054336000908152600c90935291205461ffff918216916110eb911660016134f2565b61ffff16111561110d5760405162461bcd60e51b81526004016107f590613518565b61111681611f0d565b5050565b6001600160a01b038316331480611136575061113683336106de565b6111525760405162461bcd60e51b81526004016107f5906135b6565b61115d838383612301565b505050565b6005546001600160a01b0316331461118c5760405162461bcd60e51b81526004016107f5906133b1565b610d846000612492565b6005546001600160a01b031633146111c05760405162461bcd60e51b81526004016107f5906133b1565b600a5463ffffffff600160a01b90910481169082161061122e5760405162461bcd60e51b8152602060048201526024808201527f4d6178696d756d20737570706c792063616e206f6e6c79206265206465637265604482015263185cd95960e21b60648201526084016107f5565b600a54600160005260046020527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe055461127491600160c01b900463ffffffff16906135ff565b8163ffffffff1610156112be5760405162461bcd60e51b81526020600482015260126024820152714e657720537570706c7920746f6f206c6f7760701b60448201526064016107f5565b600a805463ffffffff909216600160a01b0263ffffffff60a01b19909216919091179055565b6005546001600160a01b0316331461130e5760405162461bcd60e51b81526004016107f5906133b1565b610d846124e4565b60606007805461093b906133e6565b6005546001600160a01b0316331461134f5760405162461bcd60e51b81526004016107f5906133b1565b60085460ff16156113a25760405162461bcd60e51b815260206004820152601b60248201527f436f6c6c656374696f6e20616c7265616479206c6f636b65642021000000000060448201526064016107f5565b6008805460ff19166001179055565b61111633838361253c565b6005546001600160a01b031633146113e65760405162461bcd60e51b81526004016107f5906133b1565b600a54600160e01b900460ff166114375760405162461bcd60e51b8152602060048201526015602482015274141c995cd85b1948185b1c9958591e48195b991959605a1b60448201526064016107f5565b600a805460ff60e01b19169055565b60005460ff16156114695760405162461bcd60e51b81526004016107f5906134b2565b60026009540361148b5760405162461bcd60e51b81526004016107f59061347b565b60026009556040516bffffffffffffffffffffffff193360601b16602082015267199c99595b5a5b9d60c21b60348201526114d890603c0160405160208183030381529060405282610a9c565b6115245760405162461bcd60e51b815260206004820152601f60248201527f57616c6c6574206e6f7420616c6c6f77656420666f7220667265656d696e740060448201526064016107f5565b60405167199c99595b5a5b9d60c21b8152600e90600801908152604080516020928190038301902054336000908152600d90935291205461ffff9182169161156e911660016134f2565b61ffff1611156115905760405162461bcd60e51b81526004016107f590613518565b600a54600160c01b900463ffffffff166115fd5760405162461bcd60e51b815260206004820152602860248201527f50757263686173653a20467265656d696e7420537570706c7920737570706c79604482015267081c995858da195960c21b60648201526084016107f5565b611619336001806040518060200160405280600081525061261c565b336000818152600d6020908152604091829020805461ffff198116600161ffff928316810190921617909155600a805463ffffffff60c01b198116600160c01b9182900463ffffffff908116600019011690910217905591518281527f738ca2303cd8ac9cd442d1193272b1601e61a2f3b57a17cd2af37080597b0e9e91015b60405180910390a3506001600955565b6005546001600160a01b031633146116d35760405162461bcd60e51b81526004016107f5906133b1565b8061ffff16600e836040516116e8919061345f565b9081526040519081900360200190205461ffff160361176f5760405162461bcd60e51b815260206004820152603960248201527f4e6577206d617850657257616c6c65742073686f756c6420626520646966666560448201527f72656e74207468616e207468652063757272656e74206f6e650000000000000060648201526084016107f5565b80600e83604051611780919061345f565b908152604051908190036020019020805461ffff9290921661ffff199092169190911790555050565b6005546001600160a01b031633146117d35760405162461bcd60e51b81526004016107f5906133b1565b600f546001600160a01b039081169082160361184f5760405162461bcd60e51b815260206004820152603560248201527f4e65772062656e65666963696172792063616e6e6f74206265207468652073616044820152746d65206173207468652063757272656e74206f6e6560581b60648201526084016107f5565b600f80546001600160a01b0319166001600160a01b0392909216919091179055565b6005546001600160a01b0316331461189b5760405162461bcd60e51b81526004016107f5906133b1565b80600b836040516118ac919061345f565b908152602001604051809103902054036119235760405162461bcd60e51b815260206004820152603260248201527f4e65772050726963652073686f756c6420626520646966666572656e74207468604482015271616e207468652063757272656e74206f6e6560701b60648201526084016107f5565b80600b83604051611934919061345f565b908152604051908190036020019020555050565b6005546001600160a01b031633146119725760405162461bcd60e51b81526004016107f5906133b1565b600a5463ffffffff600160c01b9091048116908216106119e05760405162461bcd60e51b8152602060048201526024808201527f667265654d696e74537570706c792063616e206f6e6c79206265206465637265604482015263185cd95960e21b60648201526084016107f5565b600a805463ffffffff909216600160c01b0263ffffffff60c01b19909216919091179055565b6001600160a01b038516331480611a225750611a2285336106de565b611a3e5760405162461bcd60e51b81526004016107f5906135b6565b610e16858585858561272e565b6005546001600160a01b03163314611a755760405162461bcd60e51b81526004016107f5906133b1565b6001600160a01b038116611ada5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016107f5565b6108f681612492565b6001600160a01b038316331480611aff5750611aff83336106de565b611b1b5760405162461bcd60e51b81526004016107f5906135b6565b61115d838383612846565b6001600160a01b038516611bad5760005b8351811015611bab57828181518110611b5257611b5261354f565b602002602001015160046000868481518110611b7057611b7061354f565b602002602001015181526020019081526020016000206000828254611b9591906135ff565b90915550611ba4905081613565565b9050611b37565b505b6001600160a01b038416611c345760005b8351811015611c3257828181518110611bd957611bd961354f565b602002602001015160046000868481518110611bf757611bf761354f565b602002602001015181526020019081526020016000206000828254611c1c9190613617565b90915550611c2b905081613565565b9050611bbe565b505b505050505050565b3b151590565b8051611116906003906020840190612c2e565b600a546001600160a01b0390811690821603611cd05760405162461bcd60e51b815260206004820152603460248201527f4e6577205369676e657220416464726573732063616e6e6f74206265207468656044820152732073616d652061732063757272656e74206f6e6560601b60648201526084016107f5565b600a80546001600160a01b0319166001600160a01b0392909216919091179055565b606060038054611d01906133e6565b80601f0160208091040260200160405190810160405280929190818152602001828054611d2d906133e6565b8015611d7a5780601f10611d4f57610100808354040283529160200191611d7a565b820191906000526020600020905b815481529060010190602001808311611d5d57829003601f168201915b50505050509050919050565b606081600003611dad5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115611dd75780611dc181613565565b9150611dd09050600a83613644565b9150611db1565b6000816001600160401b03811115611df157611df1612d47565b6040519080825280601f01601f191660200182016040528015611e1b576020820181803683370190505b5090505b8415611e8657611e30600183613617565b9150611e3d600a86613658565b611e489060306135ff565b60f81b818381518110611e5d57611e5d61354f565b60200101906001600160f81b031916908160001a905350611e7f600a86613644565b9450611e1f565b949350505050565b600080600080611e9d8561294b565b6040805160008152602081018083528b905260ff8316918101919091526060810184905260808101839052929550909350915060019060a0016020604051602081039080840390855afa158015611ef8573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b600260095403611f2f5760405162461bcd60e51b81526004016107f59061347b565b6002600955600a54611f579063ffffffff600160c01b8204811691600160a01b90041661366c565b600160005260046020527fabd6e7cb50984ff9c2f3e18a2660c3353dadf4e3291deeb275dae2cd1e44fe055463ffffffff9190911690611f989060016135ff565b1115611fe65760405162461bcd60e51b815260206004820152601c60248201527f50757263686173653a204d617820737570706c7920726561636865640000000060448201526064016107f5565b600b81604051611ff6919061345f565b9081526020016040518091039020543410156120545760405162461bcd60e51b815260206004820152601b60248201527f50757263686173653a20496e636f7272656374207061796d656e74000000000060448201526064016107f5565b612070336001806040518060200160405280600081525061261c565b336000818152600c6020908152604091829020805461ffff198116600161ffff92831681019092161790915591518281527ffd51b2c9f55c42d2b72ac683526519563be02fc0107f034ff430c05185ff1b669101611699565b81518351146120ea5760405162461bcd60e51b81526004016107f590613691565b6001600160a01b0384166121105760405162461bcd60e51b81526004016107f5906136d9565b3361211f8187878787876129bf565b60005b845181101561220857600085828151811061213f5761213f61354f565b60200260200101519050600085838151811061215d5761215d61354f565b60209081029190910181015160008481526001835260408082206001600160a01b038e1683529093529190912054909150818110156121ae5760405162461bcd60e51b81526004016107f59061371e565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b168252812080548492906121ed9084906135ff565b925050819055505050508061220190613565565b9050612122565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612258929190613768565b60405180910390a4611c348187878787876129cd565b60005460ff166122b75760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016107f5565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b0383166123275760405162461bcd60e51b81526004016107f590613796565b80518251146123485760405162461bcd60e51b81526004016107f590613691565b600033905061236b818560008686604051806020016040528060008152506129bf565b60005b835181101561243357600084828151811061238b5761238b61354f565b6020026020010151905060008483815181106123a9576123a961354f565b60209081029190910181015160008481526001835260408082206001600160a01b038c1683529093529190912054909150818110156123fa5760405162461bcd60e51b81526004016107f5906137d9565b60009283526001602090815260408085206001600160a01b038b168652909152909220910390558061242b81613565565b91505061236e565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612484929190613768565b60405180910390a450505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005460ff16156125075760405162461bcd60e51b81526004016107f5906134b2565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586122e43390565b816001600160a01b0316836001600160a01b0316036125af5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016107f5565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661267c5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107f5565b3361269c8160008761268d88612b28565b61269688612b28565b876129bf565b60008481526001602090815260408083206001600160a01b0389168452909152812080548592906126ce9084906135ff565b909155505060408051858152602081018590526001600160a01b0380881692600092918516917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4610e1681600087878787612b73565b6001600160a01b0384166127545760405162461bcd60e51b81526004016107f5906136d9565b3361276481878761268d88612b28565b60008481526001602090815260408083206001600160a01b038a168452909152902054838110156127a75760405162461bcd60e51b81526004016107f59061371e565b60008581526001602090815260408083206001600160a01b038b81168552925280832087850390559088168252812080548692906127e69084906135ff565b909155505060408051868152602081018690526001600160a01b03808916928a821692918616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4611c32828888888888612b73565b6001600160a01b03831661286c5760405162461bcd60e51b81526004016107f590613796565b3361289b8185600061287d87612b28565b61288687612b28565b604051806020016040528060008152506129bf565b60008381526001602090815260408083206001600160a01b0388168452909152902054828110156128de5760405162461bcd60e51b81526004016107f5906137d9565b60008481526001602090815260408083206001600160a01b03898116808652918452828520888703905582518981529384018890529092908616917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a45050505050565b600080600083516041146129a15760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016107f5565b50505060208101516040820151606090920151909260009190911a90565b611c34868686868686611b26565b6001600160a01b0384163b15611c345760405163bc197c8160e01b81526001600160a01b0385169063bc197c8190612a11908990899088908890889060040161381d565b6020604051808303816000875af1925050508015612a4c575060408051601f3d908101601f19168201909252612a499181019061387b565b60015b612af857612a58613898565b806308c379a003612a915750612a6c6138b4565b80612a775750612a93565b8060405162461bcd60e51b81526004016107f59190612ea7565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016107f5565b6001600160e01b0319811663bc197c8160e01b14611c325760405162461bcd60e51b81526004016107f59061393d565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110612b6257612b6261354f565b602090810291909101015292915050565b6001600160a01b0384163b15611c345760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190612bb79089908990889088908890600401613985565b6020604051808303816000875af1925050508015612bf2575060408051601f3d908101601f19168201909252612bef9181019061387b565b60015b612bfe57612a58613898565b6001600160e01b0319811663f23a6e6160e01b14611c325760405162461bcd60e51b81526004016107f59061393d565b828054612c3a906133e6565b90600052602060002090601f016020900481019282612c5c5760008555612ca2565b82601f10612c7557805160ff1916838001178555612ca2565b82800160010185558215612ca2579182015b82811115612ca2578251825591602001919060010190612c87565b50612cae929150612cb2565b5090565b5b80821115612cae5760008155600101612cb3565b80356001600160a01b0381168114612cde57600080fd5b919050565b60008060408385031215612cf657600080fd5b612cff83612cc7565b946020939093013593505050565b6001600160e01b0319811681146108f657600080fd5b600060208284031215612d3557600080fd5b8135612d4081612d0d565b9392505050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b0381118282101715612d8257612d82612d47565b6040525050565b600082601f830112612d9a57600080fd5b81356001600160401b03811115612db357612db3612d47565b604051612dca601f8301601f191660200182612d5d565b818152846020838601011115612ddf57600080fd5b816020850160208301376000918101602001919091529392505050565b600060208284031215612e0e57600080fd5b81356001600160401b03811115612e2457600080fd5b611e8684828501612d89565b600060208284031215612e4257600080fd5b612d4082612cc7565b60005b83811015612e66578181015183820152602001612e4e565b83811115612e75576000848401525b50505050565b60008151808452612e93816020860160208601612e4b565b601f01601f19169290920160200192915050565b602081526000612d406020830184612e7b565b600060208284031215612ecc57600080fd5b5035919050565b60008060408385031215612ee657600080fd5b612eef83612cc7565b915060208301358015158114612f0457600080fd5b809150509250929050565b60008060408385031215612f2257600080fd5b82356001600160401b0380821115612f3957600080fd5b612f4586838701612d89565b93506020850135915080821115612f5b57600080fd5b50612f6885828601612d89565b9150509250929050565b60006001600160401b03821115612f8b57612f8b612d47565b5060051b60200190565b600082601f830112612fa657600080fd5b81356020612fb382612f72565b604051612fc08282612d5d565b83815260059390931b8501820192828101915086841115612fe057600080fd5b8286015b84811015612ffb5780358352918301918301612fe4565b509695505050505050565b600080600080600060a0868803121561301e57600080fd5b61302786612cc7565b945061303560208701612cc7565b935060408601356001600160401b038082111561305157600080fd5b61305d89838a01612f95565b9450606088013591508082111561307357600080fd5b61307f89838a01612f95565b9350608088013591508082111561309557600080fd5b506130a288828901612d89565b9150509295509295909350565b600080604083850312156130c257600080fd5b82356001600160401b03808211156130d957600080fd5b818501915085601f8301126130ed57600080fd5b813560206130fa82612f72565b6040516131078282612d5d565b83815260059390931b850182019282810191508984111561312757600080fd5b948201945b8386101561314c5761313d86612cc7565b8252948201949082019061312c565b9650508601359250508082111561316257600080fd5b50612f6885828601612f95565b600081518084526020808501945080840160005b8381101561319f57815187529582019590820190600101613183565b509495945050505050565b602081526000612d40602083018461316f565b6000806000606084860312156131d257600080fd5b6131db84612cc7565b925060208401356001600160401b03808211156131f757600080fd5b61320387838801612f95565b9350604086013591508082111561321957600080fd5b5061322686828701612f95565b9150509250925092565b60006020828403121561324257600080fd5b813563ffffffff81168114612d4057600080fd5b6000806040838503121561326957600080fd5b82356001600160401b0381111561327f57600080fd5b61328b85828601612d89565b925050602083013561ffff81168114612f0457600080fd5b600080604083850312156132b657600080fd5b82356001600160401b038111156132cc57600080fd5b6132d885828601612d89565b95602094909401359450505050565b600080604083850312156132fa57600080fd5b61330383612cc7565b915061331160208401612cc7565b90509250929050565b600080600080600060a0868803121561333257600080fd5b61333b86612cc7565b945061334960208701612cc7565b9350604086013592506060860135915060808601356001600160401b0381111561337257600080fd5b6130a288828901612d89565b60008060006060848603121561339357600080fd5b61339c84612cc7565b95602085013595506040909401359392505050565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b600181811c908216806133fa57607f821691505b60208210810361341a57634e487b7160e01b600052602260045260246000fd5b50919050565b60008351613432818460208801612e4b565b835190830190613446818360208801612e4b565b64173539b7b760d91b9101908152600501949350505050565b60008251613471818460208701612e4b565b9190910192915050565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b60208082526010908201526f14185d5cd8589b194e881c185d5cd95960821b604082015260600190565b634e487b7160e01b600052601160045260246000fd5b600061ffff80831681851680830382111561350f5761350f6134dc565b01949350505050565b6020808252601d908201527f6d61782050617373207065722061646472657373206578636565646564000000604082015260600190565b634e487b7160e01b600052603260045260246000fd5b600060018201613577576135776134dc565b5060010190565b6bffffffffffffffffffffffff198360601b168152600082516135a8816014850160208701612e4b565b919091016014019392505050565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60008219821115613612576136126134dc565b500190565b600082821015613629576136296134dc565b500390565b634e487b7160e01b600052601260045260246000fd5b6000826136535761365361362e565b500490565b6000826136675761366761362e565b500690565b600063ffffffff83811690831681811015613689576136896134dc565b039392505050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b60408152600061377b604083018561316f565b828103602084015261378d818561316f565b95945050505050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6001600160a01b0386811682528516602082015260a0604082018190526000906138499083018661316f565b828103606084015261385b818661316f565b9050828103608084015261386f8185612e7b565b98975050505050505050565b60006020828403121561388d57600080fd5b8151612d4081612d0d565b600060033d11156138b15760046000803e5060005160e01c5b90565b600060443d10156138c25790565b6040516003193d81016004833e81513d6001600160401b0381602484011181841117156138f157505050505090565b82850191508151818111156139095750505050505090565b843d87010160208285010111156139235750505050505090565b61393260208286010187612d5d565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906139bf90830184612e7b565b97965050505050505056fea264697066735822122013e1c735fffce139cdc788ef1d883d4be779f9d2f1454b1d7c008f05d8c04a0564736f6c634300080d0033

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

00000000000000000000000000000000000000000000000000000000000000c0000000000000000000000000000000000000000000000000000000000000010000000000000000000000000000000000000000000000000000000000000001400000000000000000000000008e3f2ce2789b955de04a8c233ae3539709a6c973000000000000000000000000bfa789a012107a94b4796ad78849195cf6e5a3830000000000000000000000008e3f2ce2789b955de04a8c233ae3539709a6c973000000000000000000000000000000000000000000000000000000000000000a54756e6543727565425000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000454434250000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000036697066733a2f2f516d514544394e6b3236644c455569614847426442634c65796d36777468766a5456526158486b627663693247522f00000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): TuneCrueBP
Arg [1] : _symbol (string): TCBP
Arg [2] : _uri (string): ipfs://QmQED9Nk26dLEUiaHGBdBcLeym6wthvjTVRaXHkbvci2GR/
Arg [3] : reservesAddress (address): 0x8e3f2ce2789b955de04a8C233Ae3539709a6c973
Arg [4] : signerAddress_ (address): 0xbFa789A012107A94b4796AD78849195CF6e5a383
Arg [5] : beneficiary_ (address): 0x8e3f2ce2789b955de04a8C233Ae3539709a6c973

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000140
Arg [3] : 0000000000000000000000008e3f2ce2789b955de04a8c233ae3539709a6c973
Arg [4] : 000000000000000000000000bfa789a012107a94b4796ad78849195cf6e5a383
Arg [5] : 0000000000000000000000008e3f2ce2789b955de04a8c233ae3539709a6c973
Arg [6] : 000000000000000000000000000000000000000000000000000000000000000a
Arg [7] : 54756e6543727565425000000000000000000000000000000000000000000000
Arg [8] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [9] : 5443425000000000000000000000000000000000000000000000000000000000
Arg [10] : 0000000000000000000000000000000000000000000000000000000000000036
Arg [11] : 697066733a2f2f516d514544394e6b3236644c455569614847426442634c6579
Arg [12] : 6d36777468766a5456526158486b627663693247522f00000000000000000000


Deployed Bytecode Sourcemap

56150:6666:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33835:231;;;;;;;;;;-1:-1:-1;33835:231:0;;;;;:::i;:::-;;:::i;:::-;;;597:25:1;;;585:2;570:18;33835:231:0;;;;;;;;32858:310;;;;;;;;;;-1:-1:-1;32858:310:0;;;;;:::i;:::-;;:::i;:::-;;;1184:14:1;;1177:22;1159:41;;1147:2;1132:18;32858:310:0;1019:187:1;52870:145:0;;;;;;;;;;-1:-1:-1;52870:145:0;;;;;:::i;:::-;;:::i;:::-;;61114:124;;;;;;;;;;-1:-1:-1;61114:124:0;;;;;:::i;:::-;;:::i;53027:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;62579:234::-;;;;;;;;;;-1:-1:-1;62579:234:0;;;;;:::i;:::-;;:::i;61352:254::-;;;;;;;;;;-1:-1:-1;61352:254:0;;;;;:::i;:::-;;:::i;:::-;;;4138:6:1;4126:19;;;4108:38;;4096:2;4081:18;61352:254:0;3964:188:1;54172:380:0;;;;;;;;;;-1:-1:-1;54172:380:0;;;;;:::i;:::-;;:::i;62077:262::-;;;;;;;;;;;;;:::i;59691:258::-;;;:::i;35774:442::-;;;;;;;;;;-1:-1:-1;35774:442:0;;;;;:::i;:::-;;:::i;52791:67::-;;;;;;;;;;;;;:::i;34232:524::-;;;;;;;;;;-1:-1:-1;34232:524:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;51631:122::-;;;;;;;;;;-1:-1:-1;51631:122:0;;;;;:::i;:::-;51688:4;51509:16;;;:12;:16;;;;;;-1:-1:-1;;;51631:122:0;61686:112;;;;;;;;;;-1:-1:-1;61686:112:0;;;;;:::i;:::-;;:::i;49536:86::-;;;;;;;;;;-1:-1:-1;49583:4:0;49607:7;;;49536:86;;61880:119;;;;;;;;;;-1:-1:-1;61880:119:0;;;;;:::i;:::-;;:::i;58546:423::-;;;;;;:::i;:::-;;:::i;48071:353::-;;;;;;;;;;-1:-1:-1;48071:353:0;;;;;:::i;:::-;;:::i;18697:103::-;;;;;;;;;;;;;:::i;60528:277::-;;;;;;;;;;-1:-1:-1;60528:277:0;;;;;:::i;:::-;;:::i;52720:63::-;;;;;;;;;;;;;:::i;18046:87::-;;;;;;;;;;-1:-1:-1;18119:6:0;;18046:87;;-1:-1:-1;;;;;18119:6:0;;;10136:51:1;;10124:2;10109:18;18046:87:0;9990:203:1;53206:87:0;;;;;;;;;;;;;:::i;53711:125::-;;;;;;;;;;;;;:::i;34829:155::-;;;;;;;;;;-1:-1:-1;34829:155:0;;;;;:::i;:::-;;:::i;57587:127::-;;;;;;;;;;;;;:::i;58979:639::-;;;;;;:::i;:::-;;:::i;53118:80::-;;;;;;;;;;-1:-1:-1;53183:7:0;;;;53118:80;;58197:263;;;;;;;;;;-1:-1:-1;58197:263:0;;;;;:::i;:::-;;:::i;51420:113::-;;;;;;;;;;-1:-1:-1;51420:113:0;;;;;:::i;:::-;51482:7;51509:16;;;:12;:16;;;;;;;51420:113;56239:30;;;;;;;;;;-1:-1:-1;56239:30:0;;;;-1:-1:-1;;;56239:30:0;;;;;;;;;11185:10:1;11173:23;;;11155:42;;11143:2;11128:18;56239:30:0;11011:192:1;62347:224:0;;;;;;;;;;-1:-1:-1;62347:224:0;;;;;:::i;:::-;;:::i;57825:218::-;;;;;;;;;;-1:-1:-1;57825:218:0;;;;;:::i;:::-;;:::i;60813:226::-;;;;;;;;;;-1:-1:-1;60813:226:0;;;;;:::i;:::-;;:::i;56278:34::-;;;;;;;;;;-1:-1:-1;56278:34:0;;;;-1:-1:-1;;;56278:34:0;;;;;;35056:168;;;;;;;;;;-1:-1:-1;35056:168:0;;;;;:::i;:::-;-1:-1:-1;;;;;35179:27:0;;;35155:4;35179:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;35056:168;35296:401;;;;;;;;;;-1:-1:-1;35296:401:0;;;;;:::i;:::-;;:::i;18955:201::-;;;;;;;;;;-1:-1:-1;18955:201:0;;;;;:::i;:::-;;:::i;47742:321::-;;;;;;;;;;-1:-1:-1;47742:321:0;;;;;:::i;:::-;;:::i;56321:26::-;;;;;;;;;;-1:-1:-1;56321:26:0;;;;-1:-1:-1;;;56321:26:0;;;;;;33835:231;33921:7;-1:-1:-1;;;;;33949:21:0;;33941:77;;;;-1:-1:-1;;;33941:77:0;;13009:2:1;33941:77:0;;;12991:21:1;13048:2;13028:18;;;13021:30;13087:34;13067:18;;;13060:62;-1:-1:-1;;;13138:18:1;;;13131:41;13189:19;;33941:77:0;;;;;;;;;-1:-1:-1;34036:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;34036:22:0;;;;;;;;;;33835:231;;;;;:::o;32858:310::-;32960:4;-1:-1:-1;;;;;;32997:41:0;;-1:-1:-1;;;32997:41:0;;:110;;-1:-1:-1;;;;;;;33055:52:0;;-1:-1:-1;;;33055:52:0;32997:110;:163;;;-1:-1:-1;;;;;;;;;;31763:40:0;;;33124:36;31654:157;52870:145;18119:6;;-1:-1:-1;;;;;18119:6:0;16877:10;18266:23;18258:68;;;;-1:-1:-1;;;18258:68:0;;;;;;;:::i;:::-;52948:7:::1;::::0;::::1;;52947:8;52939:41;;;::::0;-1:-1:-1;;;52939:41:0;;13782:2:1;52939:41:0::1;::::0;::::1;13764:21:1::0;13821:2;13801:18;;;13794:30;-1:-1:-1;;;13840:18:1;;;13833:50;13900:18;;52939:41:0::1;13580:344:1::0;52939:41:0::1;52991:16;52999:7;52991;:16::i;:::-;52870:145:::0;:::o;61114:124::-;18119:6;;-1:-1:-1;;;;;18119:6:0;16877:10;18266:23;18258:68;;;;-1:-1:-1;;;18258:68:0;;;;;;;:::i;:::-;61195:35:::1;61213:16;61195:17;:35::i;53027:83::-:0;53064:13;53097:5;53090:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53027:83;:::o;62579:234::-;51688:4;51509:16;;;:12;:16;;;;;;62635:13;;62665:46;;;;-1:-1:-1;;;62665:46:0;;14516:2:1;62665:46:0;;;14498:21:1;14555:2;14535:18;;;14528:30;-1:-1:-1;;;14574:18:1;;;14567:52;14636:18;;62665:46:0;14314:346:1;62665:46:0;62757:14;62767:3;62757:9;:14::i;:::-;62773:21;62790:3;62773:16;:21::i;:::-;62740:64;;;;;;;;;:::i;:::-;;;;;;;;;;;;;62726:79;;62579:234;;;:::o;61352:254::-;61433:6;61456;61452:147;;;-1:-1:-1;;;;;;61485:30:0;;;;;;:22;:30;;;;;;;;61478:37;;61452:147;-1:-1:-1;;;;;;61558:26:0;;;;;;:18;:26;;;;;;;;61551:33;;54172:380;54265:4;54282:20;54332:7;54315:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;54305:36;;;;;;54282:59;;54352:28;54446:12;54393:66;;;;;;;15828::1;15816:79;;15920:2;15911:12;;15904:28;;;;15957:2;15948:12;;15586:380;54393:66:0;;;;-1:-1:-1;;54393:66:0;;;;;;;;;54383:77;;54393:66;54383:77;;;;54531:13;;54383:77;;-1:-1:-1;;;;;;54531:13:0;54480:47;54383:77;54517:9;54480:14;:47::i;:::-;-1:-1:-1;;;;;54480:64:0;;;54172:380;-1:-1:-1;;;;;54172:380:0:o;62077:262::-;18119:6;;-1:-1:-1;;;;;18119:6:0;16877:10;18266:23;18258:68;;;;-1:-1:-1;;;18258:68:0;;;;;;;:::i;:::-;15196:1:::1;15794:7;;:19:::0;15786:63:::1;;;;-1:-1:-1::0;;;15786:63:0::1;;;;;;;:::i;:::-;15196:1;15927:7;:18:::0;62153:21:::2;62178:1;62153:26:::0;62145:58:::2;;;::::0;-1:-1:-1;;;62145:58:0;;16533:2:1;62145:58:0::2;::::0;::::2;16515:21:1::0;16572:2;16552:18;;;16545:30;-1:-1:-1;;;16591:18:1;;;16584:49;16650:18;;62145:58:0::2;16331:343:1::0;62145:58:0::2;62233:12;::::0;:51:::2;::::0;62215:12:::2;::::0;-1:-1:-1;;;;;62233:12:0::2;::::0;62258:21:::2;::::0;62215:12;62233:51;62215:12;62233:51;62258:21;62233:12;:51:::2;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62214:70;;;62303:7;62295:36;;;::::0;-1:-1:-1;;;62295:36:0;;17091:2:1;62295:36:0::2;::::0;::::2;17073:21:1::0;17130:2;17110:18;;;17103:30;-1:-1:-1;;;17149:18:1;;;17142:46;17205:18;;62295:36:0::2;16889:340:1::0;62295:36:0::2;-1:-1:-1::0;15152:1:0::1;16106:7;:22:::0;62077:262::o;59691:258::-;49583:4;49607:7;;;49861:9;49853:38;;;;-1:-1:-1;;;49853:38:0;;;;;;;:::i;:::-;59765:7:::1;::::0;-1:-1:-1;;;59765:7:0;::::1;;;59764:8;59755:41;;;::::0;-1:-1:-1;;;59755:41:0;;17781:2:1;59755:41:0::1;::::0;::::1;17763:21:1::0;17820:2;17800:18;;;17793:30;-1:-1:-1;;;17839:18:1;;;17832:49;17898:18;;59755:41:0::1;17579:343:1::0;59755:41:0::1;59853:23;::::0;-1:-1:-1;;;18129:21:1;;59853:13:0::1;::::0;18175:1:1;18166:11;59853:23:0;;;::::1;::::0;;::::1;::::0;;;;;;;;;59834:10:::1;59853:23;59815:30:::0;;;:18:::1;:30:::0;;;;;;59853:23:::1;::::0;;::::1;::::0;59815:34:::1;::::0;:30:::1;59853:23:::0;59815:34:::1;:::i;:::-;:61;;;;59807:104;;;;-1:-1:-1::0;;;59807:104:0::1;;;;;;;:::i;:::-;59922:19;;;;;;;;;;;;;;-1:-1:-1::0;;;59922:19:0::1;;::::0;:9:::1;:19::i;:::-;59691:258::o:0;35774:442::-;-1:-1:-1;;;;;36007:20:0;;16877:10;36007:20;;:60;;-1:-1:-1;36031:36:0;36048:4;16877:10;35056:168;:::i;36031:36::-;35985:160;;;;-1:-1:-1;;;35985:160:0;;19109:2:1;35985:160:0;;;19091:21:1;19148:2;19128:18;;;19121:30;19187:34;19167:18;;;19160:62;-1:-1:-1;;;19238:18:1;;;19231:48;19296:19;;35985:160:0;18907:414:1;35985:160:0;36156:52;36179:4;36185:2;36189:3;36194:7;36203:4;36156:22;:52::i;:::-;35774:442;;;;;:::o;52791:67::-;18119:6;;-1:-1:-1;;;;;18119:6:0;16877:10;18266:23;18258:68;;;;-1:-1:-1;;;18258:68:0;;;;;;;:::i;:::-;52840:10:::1;:8;:10::i;34232:524::-:0;34388:16;34449:3;:10;34430:8;:15;:29;34422:83;;;;-1:-1:-1;;;34422:83:0;;19528:2:1;34422:83:0;;;19510:21:1;19567:2;19547:18;;;19540:30;19606:34;19586:18;;;19579:62;-1:-1:-1;;;19657:18:1;;;19650:39;19706:19;;34422:83:0;19326:405:1;34422:83:0;34518:30;34565:8;:15;-1:-1:-1;;;;;34551:30:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;34551:30:0;;34518:63;;34599:9;34594:122;34618:8;:15;34614:1;:19;34594:122;;;34674:30;34684:8;34693:1;34684:11;;;;;;;;:::i;:::-;;;;;;;34697:3;34701:1;34697:6;;;;;;;;:::i;:::-;;;;;;;34674:9;:30::i;:::-;34655:13;34669:1;34655:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;34635:3;;;:::i;:::-;;;34594:122;;;-1:-1:-1;34735:13:0;34232:524;-1:-1:-1;;;34232:524:0:o;61686:112::-;61752:7;61778:6;61785:4;61778:12;;;;;;:::i;:::-;;;;;;;;;;;;;;61771:19;;61686:112;;;:::o;61880:119::-;61947:6;61972:13;61986:4;61972:19;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;61880:119;-1:-1:-1;;61880:119:0:o;58546:423::-;49583:4;49607:7;;;49861:9;49853:38;;;;-1:-1:-1;;;49853:38:0;;;;;;;:::i;:::-;58676:7:::1;::::0;-1:-1:-1;;;58676:7:0;::::1;;;58667:34;;;::::0;-1:-1:-1;;;58667:34:0;;20491:2:1;58667:34:0::1;::::0;::::1;20473:21:1::0;20530:2;20510:18;;;20503:30;-1:-1:-1;;;20549:18:1;;;20542:43;20602:18;;58667:34:0::1;20289:337:1::0;58667:34:0::1;58721:74;16877:10:::0;58769:4:::1;58738:36;;;;;;;;;:::i;:::-;;;;;;;;;;;;;58776:18;58721:16;:74::i;:::-;58712:110;;;::::0;-1:-1:-1;;;58712:110:0;;21235:2:1;58712:110:0::1;::::0;::::1;21217:21:1::0;21274:2;21254:18;;;21247:30;-1:-1:-1;;;21293:18:1;;;21286:52;21355:18;;58712:110:0::1;21033:346:1::0;58712:110:0::1;58879:13;58893:4;58879:19;;;;;;:::i;:::-;::::0;;;::::1;::::0;;::::1;::::0;;;;;;;;;58860:10:::1;58879:19;58841:30:::0;;;:18:::1;:30:::0;;;;;;58879:19:::1;::::0;;::::1;::::0;58841:34:::1;::::0;:30:::1;58879:19:::0;58841:34:::1;:::i;:::-;:57;;;;58833:100;;;;-1:-1:-1::0;;;58833:100:0::1;;;;;;;:::i;:::-;58946:15;58956:4;58946:9;:15::i;:::-;58546:423:::0;;:::o;48071:353::-;-1:-1:-1;;;;;48236:23:0;;16877:10;48236:23;;:66;;-1:-1:-1;48263:39:0;48280:7;16877:10;35056:168;:::i;48263:39::-;48214:157;;;;-1:-1:-1;;;48214:157:0;;;;;;;:::i;:::-;48384:32;48395:7;48404:3;48409:6;48384:10;:32::i;:::-;48071:353;;;:::o;18697:103::-;18119:6;;-1:-1:-1;;;;;18119:6:0;16877:10;18266:23;18258:68;;;;-1:-1:-1;;;18258:68:0;;;;;;;:::i;:::-;18762:30:::1;18789:1;18762:18;:30::i;60528:277::-:0;18119:6;;-1:-1:-1;;;;;18119:6:0;16877:10;18266:23;18258:68;;;;-1:-1:-1;;;18258:68:0;;;;;;;:::i;:::-;60620:9:::1;::::0;::::1;-1:-1:-1::0;;;60620:9:0;;::::1;::::0;::::1;60608:21:::0;;::::1;;60600:69;;;::::0;-1:-1:-1;;;60600:69:0;;21996:2:1;60600:69:0::1;::::0;::::1;21978:21:1::0;22035:2;22015:18;;;22008:30;22074:34;22054:18;;;22047:62;-1:-1:-1;;;22125:18:1;;;22118:34;22169:19;;60600:69:0::1;21794:400:1::0;60600:69:0::1;60718:14;::::0;60713:1:::1;51482:7:::0;51509:16;:12;:16;;;;60701:31:::1;::::0;-1:-1:-1;;;60718:14:0;::::1;;;::::0;60701:31:::1;:::i;:::-;60688:9;:44;;;;60680:75;;;::::0;-1:-1:-1;;;60680:75:0;;22534:2:1;60680:75:0::1;::::0;::::1;22516:21:1::0;22573:2;22553:18;;;22546:30;-1:-1:-1;;;22592:18:1;;;22585:48;22650:18;;60680:75:0::1;22332:342:1::0;60680:75:0::1;60776:9;:21:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;60776:21:0::1;-1:-1:-1::0;;;;60776:21:0;;::::1;::::0;;;::::1;::::0;;60528:277::o;52720:63::-;18119:6;;-1:-1:-1;;;;;18119:6:0;16877:10;18266:23;18258:68;;;;-1:-1:-1;;;18258:68:0;;;;;;;:::i;:::-;52767:8:::1;:6;:8::i;53206:87::-:0;53245:13;53278:7;53271:14;;;;;:::i;53711:125::-;18119:6;;-1:-1:-1;;;;;18119:6:0;16877:10;18266:23;18258:68;;;;-1:-1:-1;;;18258:68:0;;;;;;;:::i;:::-;53773:7:::1;::::0;::::1;;53772:8;53763:49;;;::::0;-1:-1:-1;;;53763:49:0;;22881:2:1;53763:49:0::1;::::0;::::1;22863:21:1::0;22920:2;22900:18;;;22893:30;22959:29;22939:18;;;22932:57;23006:18;;53763:49:0::1;22679:351:1::0;53763:49:0::1;53817:7;:14:::0;;-1:-1:-1;;53817:14:0::1;53827:4;53817:14;::::0;;53711:125::o;34829:155::-;34924:52;16877:10;34957:8;34967;34924:18;:52::i;57587:127::-;18119:6;;-1:-1:-1;;;;;18119:6:0;16877:10;18266:23;18258:68;;;;-1:-1:-1;;;18258:68:0;;;;;;;:::i;:::-;57647:7:::1;::::0;-1:-1:-1;;;57647:7:0;::::1;;;57639:41;;;::::0;-1:-1:-1;;;57639:41:0;;23237:2:1;57639:41:0::1;::::0;::::1;23219:21:1::0;23276:2;23256:18;;;23249:30;-1:-1:-1;;;23295:18:1;;;23288:51;23356:18;;57639:41:0::1;23035:345:1::0;57639:41:0::1;57691:7;:15:::0;;-1:-1:-1;;;;57691:15:0::1;::::0;;57587:127::o;58979:639::-;49583:4;49607:7;;;49861:9;49853:38;;;;-1:-1:-1;;;49853:38:0;;;;;;;:::i;:::-;15196:1:::1;15794:7;;:19:::0;15786:63:::1;;;;-1:-1:-1::0;;;15786:63:0::1;;;;;;;:::i;:::-;15196:1;15927:7;:18:::0;59109:42:::2;::::0;-1:-1:-1;;16877:10:0;23635:2:1;23631:15;23627:53;59109:42:0::2;::::0;::::2;23615:66:1::0;-1:-1:-1;;;23697:12:1;;;23690:32;59092:79:0::2;::::0;23738:12:1;;59109:42:0::2;;;;;;;;;;;;59153:17;59092:16;:79::i;:::-;59083:124;;;::::0;-1:-1:-1;;;59083:124:0;;23963:2:1;59083:124:0::2;::::0;::::2;23945:21:1::0;24002:2;23982:18;;;23975:30;24041:33;24021:18;;;24014:61;24092:18;;59083:124:0::2;23761:355:1::0;59083:124:0::2;59269:25;::::0;-1:-1:-1;;;24323:23:1;;59269:13:0::2;::::0;24371:1:1;24362:11;59269:25:0;;;::::2;::::0;;::::2;::::0;;;;;;;;;59250:10:::2;59269:25;59227:34:::0;;;:22:::2;:34:::0;;;;;;59269:25:::2;::::0;;::::2;::::0;59227:38:::2;::::0;:34:::2;59269:25:::0;59227:38:::2;:::i;:::-;:67;;;;59219:110;;;;-1:-1:-1::0;;;59219:110:0::2;;;;;;;:::i;:::-;59348:14;::::0;-1:-1:-1;;;59348:14:0;::::2;;;59340:72;;;::::0;-1:-1:-1;;;59340:72:0;;24586:2:1;59340:72:0::2;::::0;::::2;24568:21:1::0;24625:2;24605:18;;;24598:30;24664:34;24644:18;;;24637:62;-1:-1:-1;;;24715:18:1;;;24708:38;24763:19;;59340:72:0::2;24384:404:1::0;59340:72:0::2;59425:27;59431:10;59443:1;59446::::0;59425:27:::2;;;;;;;;;;;::::0;:5:::2;:27::i;:::-;59511:10;59488:34;::::0;;;:22:::2;:34;::::0;;;;;;;;:36;;-1:-1:-1;;59488:36:0;::::2;::::0;::::2;::::0;;::::2;::::0;::::2;::::0;;::::2;;::::0;;;59539:14:::2;:16:::0;;-1:-1:-1;;;;59539:16:0;::::2;-1:-1:-1::0;;;59539:16:0;;;::::2;;::::0;;::::2;-1:-1:-1::0;;59539:16:0;::::2;::::0;;::::2;;::::0;;59582:28;;597:25:1;;;59582:28:0::2;::::0;570:18:1;59582:28:0::2;;;;;;;;-1:-1:-1::0;15152:1:0::1;16106:7;:22:::0;58979:639::o;58197:263::-;18119:6;;-1:-1:-1;;;;;18119:6:0;16877:10;18266:23;18258:68;;;;-1:-1:-1;;;18258:68:0;;;;;;;:::i;:::-;58327:15:::1;58304:38;;:13;58318:4;58304:19;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;;::::1;;:38:::0;58296:108:::1;;;::::0;-1:-1:-1;;;58296:108:0;;25185:2:1;58296:108:0::1;::::0;::::1;25167:21:1::0;25224:2;25204:18;;;25197:30;25263:34;25243:18;;;25236:62;25334:27;25314:18;;;25307:55;25379:19;;58296:108:0::1;24983:421:1::0;58296:108:0::1;58437:15;58415:13;58429:4;58415:19;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:37;;::::1;::::0;;;::::1;-1:-1:-1::0;;58415:37:0;;::::1;::::0;;;::::1;::::0;;-1:-1:-1;;58197:263:0:o;62347:224::-;18119:6;;-1:-1:-1;;;;;18119:6:0;16877:10;18266:23;18258:68;;;;-1:-1:-1;;;18258:68:0;;;;;;;:::i;:::-;62453:12:::1;::::0;-1:-1:-1;;;;;62453:12:0;;::::1;62435:30:::0;;::::1;::::0;62427:96:::1;;;::::0;-1:-1:-1;;;62427:96:0;;25611:2:1;62427:96:0::1;::::0;::::1;25593:21:1::0;25650:2;25630:18;;;25623:30;25689:34;25669:18;;;25662:62;-1:-1:-1;;;25740:18:1;;;25733:51;25801:19;;62427:96:0::1;25409:417:1::0;62427:96:0::1;62534:12;:29:::0;;-1:-1:-1;;;;;;62534:29:0::1;-1:-1:-1::0;;;;;62534:29:0;;;::::1;::::0;;;::::1;::::0;;62347:224::o;57825:218::-;18119:6;;-1:-1:-1;;;;;18119:6:0;16877:10;18266:23;18258:68;;;;-1:-1:-1;;;18258:68:0;;;;;;;:::i;:::-;57938:8:::1;57922:6;57929:4;57922:12;;;;;;:::i;:::-;;;;;;;;;;;;;;:24:::0;57914:87:::1;;;::::0;-1:-1:-1;;;57914:87:0;;26033:2:1;57914:87:0::1;::::0;::::1;26015:21:1::0;26072:2;26052:18;;;26045:30;26111:34;26091:18;;;26084:62;-1:-1:-1;;;26162:18:1;;;26155:48;26220:19;;57914:87:0::1;25831:414:1::0;57914:87:0::1;58027:8;58012:6;58019:4;58012:12;;;;;;:::i;:::-;::::0;;;::::1;::::0;;;;;::::1;::::0;;;:23;-1:-1:-1;;57825:218:0:o;60813:226::-;18119:6;;-1:-1:-1;;;;;18119:6:0;16877:10;18266:23;18258:68;;;;-1:-1:-1;;;18258:68:0;;;;;;;:::i;:::-;60929:14:::1;::::0;::::1;-1:-1:-1::0;;;60929:14:0;;::::1;::::0;::::1;60909:34:::0;;::::1;;60901:83;;;::::0;-1:-1:-1;;;60901:83:0;;26452:2:1;60901:83:0::1;::::0;::::1;26434:21:1::0;26491:2;26471:18;;;26464:30;26530:34;26510:18;;;26503:62;-1:-1:-1;;;26581:18:1;;;26574:34;26625:19;;60901:83:0::1;26250:400:1::0;60901:83:0::1;60997:14;:34:::0;;::::1;::::0;;::::1;-1:-1:-1::0;;;60997:34:0::1;-1:-1:-1::0;;;;60997:34:0;;::::1;::::0;;;::::1;::::0;;60813:226::o;35296:401::-;-1:-1:-1;;;;;35504:20:0;;16877:10;35504:20;;:60;;-1:-1:-1;35528:36:0;35545:4;16877:10;35056:168;:::i;35528:36::-;35482:151;;;;-1:-1:-1;;;35482:151:0;;;;;;;:::i;:::-;35644:45;35662:4;35668:2;35672;35676:6;35684:4;35644:17;:45::i;18955:201::-;18119:6;;-1:-1:-1;;;;;18119:6:0;16877:10;18266:23;18258:68;;;;-1:-1:-1;;;18258:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;19044:22:0;::::1;19036:73;;;::::0;-1:-1:-1;;;19036:73:0;;26857:2:1;19036:73:0::1;::::0;::::1;26839:21:1::0;26896:2;26876:18;;;26869:30;26935:34;26915:18;;;26908:62;-1:-1:-1;;;26986:18:1;;;26979:36;27032:19;;19036:73:0::1;26655:402:1::0;19036:73:0::1;19120:28;19139:8;19120:18;:28::i;47742:321::-:0;-1:-1:-1;;;;;47882:23:0;;16877:10;47882:23;;:66;;-1:-1:-1;47909:39:0;47926:7;16877:10;35056:168;:::i;47909:39::-;47860:157;;;;-1:-1:-1;;;47860:157:0;;;;;;;:::i;:::-;48030:25;48036:7;48045:2;48049:5;48030;:25::i;51828:655::-;-1:-1:-1;;;;;52150:18:0;;52146:160;;52190:9;52185:110;52209:3;:10;52205:1;:14;52185:110;;;52269:7;52277:1;52269:10;;;;;;;;:::i;:::-;;;;;;;52245:12;:20;52258:3;52262:1;52258:6;;;;;;;;:::i;:::-;;;;;;;52245:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;52221:3:0;;-1:-1:-1;52221:3:0;;:::i;:::-;;;52185:110;;;;52146:160;-1:-1:-1;;;;;52322:16:0;;52318:158;;52360:9;52355:110;52379:3;:10;52375:1;:14;52355:110;;;52439:7;52447:1;52439:10;;;;;;;;:::i;:::-;;;;;;;52415:12;:20;52428:3;52432:1;52428:6;;;;;;;;:::i;:::-;;;;;;;52415:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;52391:3:0;;-1:-1:-1;52391:3:0;;:::i;:::-;;;52355:110;;;;52318:158;51828:655;;;;;;:::o;23485:387::-;23808:20;23856:8;;;23485:387::o;39776:88::-;39843:13;;;;:4;;:13;;;;;:::i;54625:230::-;54734:13;;-1:-1:-1;;;;;54734:13:0;;;54714:33;;;;54706:98;;;;-1:-1:-1;;;54706:98:0;;27394:2:1;54706:98:0;;;27376:21:1;27433:2;27413:18;;;27406:30;27472:34;27452:18;;;27445:62;-1:-1:-1;;;27523:18:1;;;27516:50;27583:19;;54706:98:0;27192:416:1;54706:98:0;54815:13;:32;;-1:-1:-1;;;;;;54815:32:0;-1:-1:-1;;;;;54815:32:0;;;;;;;;;;54625:230::o;33579:105::-;33639:13;33672:4;33665:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;33579:105;;;:::o;11650:723::-;11706:13;11927:5;11936:1;11927:10;11923:53;;-1:-1:-1;;11954:10:0;;;;;;;;;;;;-1:-1:-1;;;11954:10:0;;;;;11650:723::o;11923:53::-;12001:5;11986:12;12042:78;12049:9;;12042:78;;12075:8;;;;:::i;:::-;;-1:-1:-1;12098:10:0;;-1:-1:-1;12106:2:0;12098:10;;:::i;:::-;;;12042:78;;;12130:19;12162:6;-1:-1:-1;;;;;12152:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12152:17:0;;12130:39;;12180:154;12187:10;;12180:154;;12214:11;12224:1;12214:11;;:::i;:::-;;-1:-1:-1;12283:10:0;12291:2;12283:5;:10;:::i;:::-;12270:24;;:2;:24;:::i;:::-;12257:39;;12240:6;12247;12240:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;12240:56:0;;;;;;;;-1:-1:-1;12311:11:0;12320:2;12311:11;;:::i;:::-;;;12180:154;;;12358:6;11650:723;-1:-1:-1;;;;11650:723:0:o;54863:250::-;54965:7;54986:9;54997;55008:7;55019:27;55035:10;55019:15;:27::i;:::-;55064:41;;;;;;;;;;;;28214:25:1;;;28287:4;28275:17;;28255:18;;;28248:45;;;;28309:18;;;28302:34;;;28352:18;;;28345:34;;;54985:61:0;;-1:-1:-1;54985:61:0;;-1:-1:-1;54985:61:0;-1:-1:-1;55064:41:0;;28186:19:1;;55064:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;55064:41:0;;-1:-1:-1;;55064:41:0;;;54863:250;-1:-1:-1;;;;;;;54863:250:0:o;60051:406::-;15196:1;15794:7;;:19;15786:63;;;;-1:-1:-1;;;15786:63:0;;;;;;;:::i;:::-;15196:1;15927:7;:18;60164:14:::1;::::0;60152:26:::1;::::0;60164:14:::1;-1:-1:-1::0;;;60164:14:0;::::1;::::0;::::1;::::0;-1:-1:-1;;;60152:9:0;::::1;;:26;:::i;:::-;60142:1;51482:7:::0;51509:16;:12;:16;;;;60130:48:::1;::::0;;;::::1;::::0;:18:::1;::::0;60147:1:::1;60130:18;:::i;:::-;:48;;60122:89;;;::::0;-1:-1:-1;;;60122:89:0;;28818:2:1;60122:89:0::1;::::0;::::1;28800:21:1::0;28857:2;28837:18;;;28830:30;28896;28876:18;;;28869:58;28944:18;;60122:89:0::1;28616:352:1::0;60122:89:0::1;60243:6;60250:4;60243:12;;;;;;:::i;:::-;;;;;;;;;;;;;;60230:9;:25;;60222:65;;;::::0;-1:-1:-1;;;60222:65:0;;29175:2:1;60222:65:0::1;::::0;::::1;29157:21:1::0;29214:2;29194:18;;;29187:30;29253:29;29233:18;;;29226:57;29300:18;;60222:65:0::1;28973:351:1::0;60222:65:0::1;60300:27;60306:10;60318:1;60321::::0;60300:27:::1;;;;;;;;;;;::::0;:5:::1;:27::i;:::-;60382:10;60363:30;::::0;;;:18:::1;:30;::::0;;;;;;;;:32;;-1:-1:-1;;60363:32:0;::::1;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;;::::1;;::::0;;;60422:27;;597:25:1;;;60422:27:0::1;::::0;570:18:1;60422:27:0::1;451:177:1::0;37858:1074:0;38085:7;:14;38071:3;:10;:28;38063:81;;;;-1:-1:-1;;;38063:81:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;38163:16:0;;38155:66;;;;-1:-1:-1;;;38155:66:0;;;;;;;:::i;:::-;16877:10;38278:60;16877:10;38309:4;38315:2;38319:3;38324:7;38333:4;38278:20;:60::i;:::-;38356:9;38351:421;38375:3;:10;38371:1;:14;38351:421;;;38407:10;38420:3;38424:1;38420:6;;;;;;;;:::i;:::-;;;;;;;38407:19;;38441:14;38458:7;38466:1;38458:10;;;;;;;;:::i;:::-;;;;;;;;;;;;38485:19;38507:13;;;:9;:13;;;;;;-1:-1:-1;;;;;38507:19:0;;;;;;;;;;;;38458:10;;-1:-1:-1;38549:21:0;;;;38541:76;;;;-1:-1:-1;;;38541:76:0;;;;;;;:::i;:::-;38661:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;38661:19:0;;;;;;;;;;38683:20;;;38661:42;;38733:17;;;;;;;:27;;38683:20;;38661:13;38733:27;;38683:20;;38733:27;:::i;:::-;;;;;;;;38392:380;;;38387:3;;;;:::i;:::-;;;38351:421;;;;38819:2;-1:-1:-1;;;;;38789:47:0;38813:4;-1:-1:-1;;;;;38789:47:0;38803:8;-1:-1:-1;;;;;38789:47:0;;38823:3;38828:7;38789:47;;;;;;;:::i;:::-;;;;;;;;38849:75;38885:8;38895:4;38901:2;38905:3;38910:7;38919:4;38849:35;:75::i;50595:120::-;49583:4;49607:7;;;50131:41;;;;-1:-1:-1;;;50131:41:0;;31227:2:1;50131:41:0;;;31209:21:1;31266:2;31246:18;;;31239:30;-1:-1:-1;;;31285:18:1;;;31278:50;31345:18;;50131:41:0;31025:344:1;50131:41:0;50664:5:::1;50654:15:::0;;-1:-1:-1;;50654:15:0::1;::::0;;50685:22:::1;16877:10:::0;50694:12:::1;50685:22;::::0;-1:-1:-1;;;;;10154:32:1;;;10136:51;;10124:2;10109:18;50685:22:0::1;;;;;;;50595:120::o:0;43011:891::-;-1:-1:-1;;;;;43163:18:0;;43155:66;;;;-1:-1:-1;;;43155:66:0;;;;;;;:::i;:::-;43254:7;:14;43240:3;:10;:28;43232:81;;;;-1:-1:-1;;;43232:81:0;;;;;;;:::i;:::-;43326:16;16877:10;43326:31;;43370:66;43391:8;43401:4;43415:1;43419:3;43424:7;43370:66;;;;;;;;;;;;:20;:66::i;:::-;43454:9;43449:373;43473:3;:10;43469:1;:14;43449:373;;;43505:10;43518:3;43522:1;43518:6;;;;;;;;:::i;:::-;;;;;;;43505:19;;43539:14;43556:7;43564:1;43556:10;;;;;;;;:::i;:::-;;;;;;;;;;;;43583:19;43605:13;;;:9;:13;;;;;;-1:-1:-1;;;;;43605:19:0;;;;;;;;;;;;43556:10;;-1:-1:-1;43647:21:0;;;;43639:70;;;;-1:-1:-1;;;43639:70:0;;;;;;;:::i;:::-;43753:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;43753:19:0;;;;;;;;;;43775:20;;43753:42;;43485:3;;;;:::i;:::-;;;;43449:373;;;;43877:1;-1:-1:-1;;;;;43839:55:0;43863:4;-1:-1:-1;;;;;43839:55:0;43853:8;-1:-1:-1;;;;;43839:55:0;;43881:3;43886:7;43839:55;;;;;;;:::i;:::-;;;;;;;;43144:758;43011:891;;;:::o;19316:191::-;19409:6;;;-1:-1:-1;;;;;19426:17:0;;;-1:-1:-1;;;;;;19426:17:0;;;;;;;19459:40;;19409:6;;;19426:17;19409:6;;19459:40;;19390:16;;19459:40;19379:128;19316:191;:::o;50336:118::-;49583:4;49607:7;;;49861:9;49853:38;;;;-1:-1:-1;;;49853:38:0;;;;;;;:::i;:::-;50396:7:::1;:14:::0;;-1:-1:-1;;50396:14:0::1;50406:4;50396:14;::::0;;50426:20:::1;50433:12;16877:10:::0;;16797:98;44044:331;44199:8;-1:-1:-1;;;;;44190:17:0;:5;-1:-1:-1;;;;;44190:17:0;;44182:71;;;;-1:-1:-1;;;44182:71:0;;32385:2:1;44182:71:0;;;32367:21:1;32424:2;32404:18;;;32397:30;32463:34;32443:18;;;32436:62;-1:-1:-1;;;32514:18:1;;;32507:39;32563:19;;44182:71:0;32183:405:1;44182:71:0;-1:-1:-1;;;;;44264:25:0;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;44264:46:0;;;;;;;;;;44326:41;;1159::1;;;44326::0;;1132:18:1;44326:41:0;;;;;;;44044:331;;;:::o;40250:569::-;-1:-1:-1;;;;;40403:16:0;;40395:62;;;;-1:-1:-1;;;40395:62:0;;32795:2:1;40395:62:0;;;32777:21:1;32834:2;32814:18;;;32807:30;32873:34;32853:18;;;32846:62;-1:-1:-1;;;32924:18:1;;;32917:31;32965:19;;40395:62:0;32593:397:1;40395:62:0;16877:10;40514:102;16877:10;40470:16;40557:2;40561:21;40579:2;40561:17;:21::i;:::-;40584:25;40602:6;40584:17;:25::i;:::-;40611:4;40514:20;:102::i;:::-;40629:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;40629:17:0;;;;;;;;;:27;;40650:6;;40629:13;:27;;40650:6;;40629:27;:::i;:::-;;;;-1:-1:-1;;40672:52:0;;;33169:25:1;;;33225:2;33210:18;;33203:34;;;-1:-1:-1;;;;;40672:52:0;;;;40705:1;;40672:52;;;;;;33142:18:1;40672:52:0;;;;;;;40737:74;40768:8;40786:1;40790:2;40794;40798:6;40806:4;40737:30;:74::i;36680:820::-;-1:-1:-1;;;;;36868:16:0;;36860:66;;;;-1:-1:-1;;;36860:66:0;;;;;;;:::i;:::-;16877:10;36983:96;16877:10;37014:4;37020:2;37024:21;37042:2;37024:17;:21::i;36983:96::-;37092:19;37114:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;37114:19:0;;;;;;;;;;37152:21;;;;37144:76;;;;-1:-1:-1;;;37144:76:0;;;;;;;:::i;:::-;37256:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;37256:19:0;;;;;;;;;;37278:20;;;37256:42;;37320:17;;;;;;;:27;;37278:20;;37256:13;37320:27;;37278:20;;37320:27;:::i;:::-;;;;-1:-1:-1;;37365:46:0;;;33169:25:1;;;33225:2;33210:18;;33203:34;;;-1:-1:-1;;;;;37365:46:0;;;;;;;;;;;;;;33142:18:1;37365:46:0;;;;;;;37424:68;37455:8;37465:4;37471:2;37475;37479:6;37487:4;37424:30;:68::i;42160:648::-;-1:-1:-1;;;;;42287:18:0;;42279:66;;;;-1:-1:-1;;;42279:66:0;;;;;;;:::i;:::-;16877:10;42402:102;16877:10;42433:4;42358:16;42451:21;42469:2;42451:17;:21::i;:::-;42474:25;42492:6;42474:17;:25::i;:::-;42402:102;;;;;;;;;;;;:20;:102::i;:::-;42517:19;42539:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;42539:19:0;;;;;;;;;;42577:21;;;;42569:70;;;;-1:-1:-1;;;42569:70:0;;;;;;;:::i;:::-;42675:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;42675:19:0;;;;;;;;;;;;42697:20;;;42675:42;;42746:54;;33169:25:1;;;33210:18;;;33203:34;;;42675:19:0;;42746:54;;;;;;33142:18:1;42746:54:0;;;;;;;42268:540;;42160:648;;;:::o;55121:324::-;55186:9;55197;55208:7;55236:3;:10;55250:2;55236:16;55228:53;;;;-1:-1:-1;;;55228:53:0;;33450:2:1;55228:53:0;;;33432:21:1;33489:2;33469:18;;;33462:30;33528:26;33508:18;;;33501:54;33572:18;;55228:53:0;33248:348:1;55228:53:0;-1:-1:-1;;;55338:2:0;55329:12;;55323:19;55376:2;55367:12;;55361:19;55422:2;55413:12;;;55407:19;55323;;55404:1;55399:28;;;;;55121:324::o;53311:337::-;53574:66;53601:8;53611:4;53617:2;53621:3;53626:7;53635:4;53574:26;:66::i;46312:813::-;-1:-1:-1;;;;;46552:13:0;;23808:20;23856:8;46548:570;;46588:79;;-1:-1:-1;;;46588:79:0;;-1:-1:-1;;;;;46588:43:0;;;;;:79;;46632:8;;46642:4;;46648:3;;46653:7;;46662:4;;46588:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46588:79:0;;;;;;;;-1:-1:-1;;46588:79:0;;;;;;;;;;;;:::i;:::-;;;46584:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;46980:6;46973:14;;-1:-1:-1;;;46973:14:0;;;;;;;;:::i;46584:523::-;;;47029:62;;-1:-1:-1;;;47029:62:0;;35749:2:1;47029:62:0;;;35731:21:1;35788:2;35768:18;;;35761:30;35827:34;35807:18;;;35800:62;-1:-1:-1;;;35878:18:1;;;35871:50;35938:19;;47029:62:0;35547:416:1;46584:523:0;-1:-1:-1;;;;;;46749:60:0;;-1:-1:-1;;;46749:60:0;46745:159;;46834:50;;-1:-1:-1;;;46834:50:0;;;;;;;:::i;47133:198::-;47253:16;;;47267:1;47253:16;;;;;;;;;47199;;47228:22;;47253:16;;;;;;;;;;;;-1:-1:-1;47253:16:0;47228:41;;47291:7;47280:5;47286:1;47280:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;47318:5;47133:198;-1:-1:-1;;47133:198:0:o;45560:744::-;-1:-1:-1;;;;;45775:13:0;;23808:20;23856:8;45771:526;;45811:72;;-1:-1:-1;;;45811:72:0;;-1:-1:-1;;;;;45811:38:0;;;;;:72;;45850:8;;45860:4;;45866:2;;45870:6;;45878:4;;45811:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45811:72:0;;;;;;;;-1:-1:-1;;45811:72:0;;;;;;;;;;;;:::i;:::-;;;45807:479;;;;:::i;:::-;-1:-1:-1;;;;;;45933:55:0;;-1:-1:-1;;;45933:55:0;45929:154;;46013:50;;-1:-1:-1;;;46013:50:0;;;;;;;:::i;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:1;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:254::-;260:6;268;321:2;309:9;300:7;296:23;292:32;289:52;;;337:1;334;327:12;289:52;360:29;379:9;360:29;:::i;:::-;350:39;436:2;421:18;;;;408:32;;-1:-1:-1;;;192:254:1:o;633:131::-;-1:-1:-1;;;;;;707:32:1;;697:43;;687:71;;754:1;751;744:12;769:245;827:6;880:2;868:9;859:7;855:23;851:32;848:52;;;896:1;893;886:12;848:52;935:9;922:23;954:30;978:5;954:30;:::i;:::-;1003:5;769:245;-1:-1:-1;;;769:245:1:o;1211:127::-;1272:10;1267:3;1263:20;1260:1;1253:31;1303:4;1300:1;1293:15;1327:4;1324:1;1317:15;1343:249;1453:2;1434:13;;-1:-1:-1;;1430:27:1;1418:40;;-1:-1:-1;;;;;1473:34:1;;1509:22;;;1470:62;1467:88;;;1535:18;;:::i;:::-;1571:2;1564:22;-1:-1:-1;;1343:249:1:o;1597:556::-;1640:5;1693:3;1686:4;1678:6;1674:17;1670:27;1660:55;;1711:1;1708;1701:12;1660:55;1747:6;1734:20;-1:-1:-1;;;;;1769:2:1;1766:26;1763:52;;;1795:18;;:::i;:::-;1844:2;1838:9;1856:67;1911:2;1892:13;;-1:-1:-1;;1888:27:1;1917:4;1884:38;1838:9;1856:67;:::i;:::-;1947:2;1939:6;1932:18;1993:3;1986:4;1981:2;1973:6;1969:15;1965:26;1962:35;1959:55;;;2010:1;2007;2000:12;1959:55;2074:2;2067:4;2059:6;2055:17;2048:4;2040:6;2036:17;2023:54;2121:1;2097:15;;;2114:4;2093:26;2086:37;;;;2101:6;1597:556;-1:-1:-1;;;1597:556:1:o;2158:322::-;2227:6;2280:2;2268:9;2259:7;2255:23;2251:32;2248:52;;;2296:1;2293;2286:12;2248:52;2336:9;2323:23;-1:-1:-1;;;;;2361:6:1;2358:30;2355:50;;;2401:1;2398;2391:12;2355:50;2424;2466:7;2457:6;2446:9;2442:22;2424:50;:::i;2485:186::-;2544:6;2597:2;2585:9;2576:7;2572:23;2568:32;2565:52;;;2613:1;2610;2603:12;2565:52;2636:29;2655:9;2636:29;:::i;2676:258::-;2748:1;2758:113;2772:6;2769:1;2766:13;2758:113;;;2848:11;;;2842:18;2829:11;;;2822:39;2794:2;2787:10;2758:113;;;2889:6;2886:1;2883:13;2880:48;;;2924:1;2915:6;2910:3;2906:16;2899:27;2880:48;;2676:258;;;:::o;2939:::-;2981:3;3019:5;3013:12;3046:6;3041:3;3034:19;3062:63;3118:6;3111:4;3106:3;3102:14;3095:4;3088:5;3084:16;3062:63;:::i;:::-;3179:2;3158:15;-1:-1:-1;;3154:29:1;3145:39;;;;3186:4;3141:50;;2939:258;-1:-1:-1;;2939:258:1:o;3202:220::-;3351:2;3340:9;3333:21;3314:4;3371:45;3412:2;3401:9;3397:18;3389:6;3371:45;:::i;3427:180::-;3486:6;3539:2;3527:9;3518:7;3514:23;3510:32;3507:52;;;3555:1;3552;3545:12;3507:52;-1:-1:-1;3578:23:1;;3427:180;-1:-1:-1;3427:180:1:o;3612:347::-;3677:6;3685;3738:2;3726:9;3717:7;3713:23;3709:32;3706:52;;;3754:1;3751;3744:12;3706:52;3777:29;3796:9;3777:29;:::i;:::-;3767:39;;3856:2;3845:9;3841:18;3828:32;3903:5;3896:13;3889:21;3882:5;3879:32;3869:60;;3925:1;3922;3915:12;3869:60;3948:5;3938:15;;;3612:347;;;;;:::o;4157:541::-;4243:6;4251;4304:2;4292:9;4283:7;4279:23;4275:32;4272:52;;;4320:1;4317;4310:12;4272:52;4360:9;4347:23;-1:-1:-1;;;;;4430:2:1;4422:6;4419:14;4416:34;;;4446:1;4443;4436:12;4416:34;4469:50;4511:7;4502:6;4491:9;4487:22;4469:50;:::i;:::-;4459:60;;4572:2;4561:9;4557:18;4544:32;4528:48;;4601:2;4591:8;4588:16;4585:36;;;4617:1;4614;4607:12;4585:36;;4640:52;4684:7;4673:8;4662:9;4658:24;4640:52;:::i;:::-;4630:62;;;4157:541;;;;;:::o;4703:183::-;4763:4;-1:-1:-1;;;;;4788:6:1;4785:30;4782:56;;;4818:18;;:::i;:::-;-1:-1:-1;4863:1:1;4859:14;4875:4;4855:25;;4703:183::o;4891:724::-;4945:5;4998:3;4991:4;4983:6;4979:17;4975:27;4965:55;;5016:1;5013;5006:12;4965:55;5052:6;5039:20;5078:4;5101:43;5141:2;5101:43;:::i;:::-;5173:2;5167:9;5185:31;5213:2;5205:6;5185:31;:::i;:::-;5251:18;;;5343:1;5339:10;;;;5327:23;;5323:32;;;5285:15;;;;-1:-1:-1;5367:15:1;;;5364:35;;;5395:1;5392;5385:12;5364:35;5431:2;5423:6;5419:15;5443:142;5459:6;5454:3;5451:15;5443:142;;;5525:17;;5513:30;;5563:12;;;;5476;;5443:142;;;-1:-1:-1;5603:6:1;4891:724;-1:-1:-1;;;;;;4891:724:1:o;5620:944::-;5774:6;5782;5790;5798;5806;5859:3;5847:9;5838:7;5834:23;5830:33;5827:53;;;5876:1;5873;5866:12;5827:53;5899:29;5918:9;5899:29;:::i;:::-;5889:39;;5947:38;5981:2;5970:9;5966:18;5947:38;:::i;:::-;5937:48;;6036:2;6025:9;6021:18;6008:32;-1:-1:-1;;;;;6100:2:1;6092:6;6089:14;6086:34;;;6116:1;6113;6106:12;6086:34;6139:61;6192:7;6183:6;6172:9;6168:22;6139:61;:::i;:::-;6129:71;;6253:2;6242:9;6238:18;6225:32;6209:48;;6282:2;6272:8;6269:16;6266:36;;;6298:1;6295;6288:12;6266:36;6321:63;6376:7;6365:8;6354:9;6350:24;6321:63;:::i;:::-;6311:73;;6437:3;6426:9;6422:19;6409:33;6393:49;;6467:2;6457:8;6454:16;6451:36;;;6483:1;6480;6473:12;6451:36;;6506:52;6550:7;6539:8;6528:9;6524:24;6506:52;:::i;:::-;6496:62;;;5620:944;;;;;;;;:::o;6569:1208::-;6687:6;6695;6748:2;6736:9;6727:7;6723:23;6719:32;6716:52;;;6764:1;6761;6754:12;6716:52;6804:9;6791:23;-1:-1:-1;;;;;6874:2:1;6866:6;6863:14;6860:34;;;6890:1;6887;6880:12;6860:34;6928:6;6917:9;6913:22;6903:32;;6973:7;6966:4;6962:2;6958:13;6954:27;6944:55;;6995:1;6992;6985:12;6944:55;7031:2;7018:16;7053:4;7076:43;7116:2;7076:43;:::i;:::-;7148:2;7142:9;7160:31;7188:2;7180:6;7160:31;:::i;:::-;7226:18;;;7314:1;7310:10;;;;7302:19;;7298:28;;;7260:15;;;;-1:-1:-1;7338:19:1;;;7335:39;;;7370:1;7367;7360:12;7335:39;7394:11;;;;7414:148;7430:6;7425:3;7422:15;7414:148;;;7496:23;7515:3;7496:23;:::i;:::-;7484:36;;7447:12;;;;7540;;;;7414:148;;;7581:6;-1:-1:-1;;7625:18:1;;7612:32;;-1:-1:-1;;7656:16:1;;;7653:36;;;7685:1;7682;7675:12;7653:36;;7708:63;7763:7;7752:8;7741:9;7737:24;7708:63;:::i;7782:435::-;7835:3;7873:5;7867:12;7900:6;7895:3;7888:19;7926:4;7955:2;7950:3;7946:12;7939:19;;7992:2;7985:5;7981:14;8013:1;8023:169;8037:6;8034:1;8031:13;8023:169;;;8098:13;;8086:26;;8132:12;;;;8167:15;;;;8059:1;8052:9;8023:169;;;-1:-1:-1;8208:3:1;;7782:435;-1:-1:-1;;;;;7782:435:1:o;8222:261::-;8401:2;8390:9;8383:21;8364:4;8421:56;8473:2;8462:9;8458:18;8450:6;8421:56;:::i;9035:669::-;9162:6;9170;9178;9231:2;9219:9;9210:7;9206:23;9202:32;9199:52;;;9247:1;9244;9237:12;9199:52;9270:29;9289:9;9270:29;:::i;:::-;9260:39;;9350:2;9339:9;9335:18;9322:32;-1:-1:-1;;;;;9414:2:1;9406:6;9403:14;9400:34;;;9430:1;9427;9420:12;9400:34;9453:61;9506:7;9497:6;9486:9;9482:22;9453:61;:::i;:::-;9443:71;;9567:2;9556:9;9552:18;9539:32;9523:48;;9596:2;9586:8;9583:16;9580:36;;;9612:1;9609;9602:12;9580:36;;9635:63;9690:7;9679:8;9668:9;9664:24;9635:63;:::i;:::-;9625:73;;;9035:669;;;;;:::o;9709:276::-;9767:6;9820:2;9808:9;9799:7;9795:23;9791:32;9788:52;;;9836:1;9833;9826:12;9788:52;9875:9;9862:23;9925:10;9918:5;9914:22;9907:5;9904:33;9894:61;;9951:1;9948;9941:12;10524:482;10601:6;10609;10662:2;10650:9;10641:7;10637:23;10633:32;10630:52;;;10678:1;10675;10668:12;10630:52;10718:9;10705:23;-1:-1:-1;;;;;10743:6:1;10740:30;10737:50;;;10783:1;10780;10773:12;10737:50;10806;10848:7;10839:6;10828:9;10824:22;10806:50;:::i;:::-;10796:60;;;10906:2;10895:9;10891:18;10878:32;10950:6;10943:5;10939:18;10932:5;10929:29;10919:57;;10972:1;10969;10962:12;11208:390;11286:6;11294;11347:2;11335:9;11326:7;11322:23;11318:32;11315:52;;;11363:1;11360;11353:12;11315:52;11403:9;11390:23;-1:-1:-1;;;;;11428:6:1;11425:30;11422:50;;;11468:1;11465;11458:12;11422:50;11491;11533:7;11524:6;11513:9;11509:22;11491:50;:::i;:::-;11481:60;11588:2;11573:18;;;;11560:32;;-1:-1:-1;;;;11208:390:1:o;11603:260::-;11671:6;11679;11732:2;11720:9;11711:7;11707:23;11703:32;11700:52;;;11748:1;11745;11738:12;11700:52;11771:29;11790:9;11771:29;:::i;:::-;11761:39;;11819:38;11853:2;11842:9;11838:18;11819:38;:::i;:::-;11809:48;;11603:260;;;;;:::o;11868:607::-;11972:6;11980;11988;11996;12004;12057:3;12045:9;12036:7;12032:23;12028:33;12025:53;;;12074:1;12071;12064:12;12025:53;12097:29;12116:9;12097:29;:::i;:::-;12087:39;;12145:38;12179:2;12168:9;12164:18;12145:38;:::i;:::-;12135:48;;12230:2;12219:9;12215:18;12202:32;12192:42;;12281:2;12270:9;12266:18;12253:32;12243:42;;12336:3;12325:9;12321:19;12308:33;-1:-1:-1;;;;;12356:6:1;12353:30;12350:50;;;12396:1;12393;12386:12;12350:50;12419;12461:7;12452:6;12441:9;12437:22;12419:50;:::i;12480:322::-;12557:6;12565;12573;12626:2;12614:9;12605:7;12601:23;12597:32;12594:52;;;12642:1;12639;12632:12;12594:52;12665:29;12684:9;12665:29;:::i;:::-;12655:39;12741:2;12726:18;;12713:32;;-1:-1:-1;12792:2:1;12777:18;;;12764:32;;12480:322;-1:-1:-1;;;12480:322:1:o;13219:356::-;13421:2;13403:21;;;13440:18;;;13433:30;13499:34;13494:2;13479:18;;13472:62;13566:2;13551:18;;13219:356::o;13929:380::-;14008:1;14004:12;;;;14051;;;14072:61;;14126:4;14118:6;14114:17;14104:27;;14072:61;14179:2;14171:6;14168:14;14148:18;14145:38;14142:161;;14225:10;14220:3;14216:20;14213:1;14206:31;14260:4;14257:1;14250:15;14288:4;14285:1;14278:15;14142:161;;13929:380;;;:::o;14665:637::-;14945:3;14983:6;14977:13;14999:53;15045:6;15040:3;15033:4;15025:6;15021:17;14999:53;:::i;:::-;15115:13;;15074:16;;;;15137:57;15115:13;15074:16;15171:4;15159:17;;15137:57;:::i;:::-;-1:-1:-1;;;15216:20:1;;15245:22;;;15294:1;15283:13;;14665:637;-1:-1:-1;;;;14665:637:1:o;15307:274::-;15436:3;15474:6;15468:13;15490:53;15536:6;15531:3;15524:4;15516:6;15512:17;15490:53;:::i;:::-;15559:16;;;;;15307:274;-1:-1:-1;;15307:274:1:o;15971:355::-;16173:2;16155:21;;;16212:2;16192:18;;;16185:30;16251:33;16246:2;16231:18;;16224:61;16317:2;16302:18;;15971:355::o;17234:340::-;17436:2;17418:21;;;17475:2;17455:18;;;17448:30;-1:-1:-1;;;17509:2:1;17494:18;;17487:46;17565:2;17550:18;;17234:340::o;18188:127::-;18249:10;18244:3;18240:20;18237:1;18230:31;18280:4;18277:1;18270:15;18304:4;18301:1;18294:15;18320:224;18359:3;18387:6;18420:2;18417:1;18413:10;18450:2;18447:1;18443:10;18481:3;18477:2;18473:12;18468:3;18465:21;18462:47;;;18489:18;;:::i;:::-;18525:13;;18320:224;-1:-1:-1;;;;18320:224:1:o;18549:353::-;18751:2;18733:21;;;18790:2;18770:18;;;18763:30;18829:31;18824:2;18809:18;;18802:59;18893:2;18878:18;;18549:353::o;19736:127::-;19797:10;19792:3;19788:20;19785:1;19778:31;19828:4;19825:1;19818:15;19852:4;19849:1;19842:15;19868:135;19907:3;19928:17;;;19925:43;;19948:18;;:::i;:::-;-1:-1:-1;19995:1:1;19984:13;;19868:135::o;20631:397::-;20845:26;20841:31;20832:6;20828:2;20824:15;20820:53;20815:3;20808:66;20790:3;20903:6;20897:13;20919:62;20974:6;20969:2;20964:3;20960:12;20953:4;20945:6;20941:17;20919:62;:::i;:::-;21001:16;;;;21019:2;20997:25;;20631:397;-1:-1:-1;;;20631:397:1:o;21384:405::-;21586:2;21568:21;;;21625:2;21605:18;;;21598:30;21664:34;21659:2;21644:18;;21637:62;-1:-1:-1;;;21730:2:1;21715:18;;21708:39;21779:3;21764:19;;21384:405::o;22199:128::-;22239:3;22270:1;22266:6;22263:1;22260:13;22257:39;;;22276:18;;:::i;:::-;-1:-1:-1;22312:9:1;;22199:128::o;27062:125::-;27102:4;27130:1;27127;27124:8;27121:34;;;27135:18;;:::i;:::-;-1:-1:-1;27172:9:1;;27062:125::o;27613:127::-;27674:10;27669:3;27665:20;27662:1;27655:31;27705:4;27702:1;27695:15;27729:4;27726:1;27719:15;27745:120;27785:1;27811;27801:35;;27816:18;;:::i;:::-;-1:-1:-1;27850:9:1;;27745:120::o;27870:112::-;27902:1;27928;27918:35;;27933:18;;:::i;:::-;-1:-1:-1;27967:9:1;;27870:112::o;28390:221::-;28429:4;28458:10;28518;;;;28488;;28540:12;;;28537:38;;;28555:18;;:::i;:::-;28592:13;;28390:221;-1:-1:-1;;;28390:221:1:o;29329:404::-;29531:2;29513:21;;;29570:2;29550:18;;;29543:30;29609:34;29604:2;29589:18;;29582:62;-1:-1:-1;;;29675:2:1;29660:18;;29653:38;29723:3;29708:19;;29329:404::o;29738:401::-;29940:2;29922:21;;;29979:2;29959:18;;;29952:30;30018:34;30013:2;29998:18;;29991:62;-1:-1:-1;;;30084:2:1;30069:18;;30062:35;30129:3;30114:19;;29738:401::o;30144:406::-;30346:2;30328:21;;;30385:2;30365:18;;;30358:30;30424:34;30419:2;30404:18;;30397:62;-1:-1:-1;;;30490:2:1;30475:18;;30468:40;30540:3;30525:19;;30144:406::o;30555:465::-;30812:2;30801:9;30794:21;30775:4;30838:56;30890:2;30879:9;30875:18;30867:6;30838:56;:::i;:::-;30942:9;30934:6;30930:22;30925:2;30914:9;30910:18;30903:50;30970:44;31007:6;30999;30970:44;:::i;:::-;30962:52;30555:465;-1:-1:-1;;;;;30555:465:1:o;31374:399::-;31576:2;31558:21;;;31615:2;31595:18;;;31588:30;31654:34;31649:2;31634:18;;31627:62;-1:-1:-1;;;31720:2:1;31705:18;;31698:33;31763:3;31748:19;;31374:399::o;31778:400::-;31980:2;31962:21;;;32019:2;31999:18;;;31992:30;32058:34;32053:2;32038:18;;32031:62;-1:-1:-1;;;32124:2:1;32109:18;;32102:34;32168:3;32153:19;;31778:400::o;33601:827::-;-1:-1:-1;;;;;33998:15:1;;;33980:34;;34050:15;;34045:2;34030:18;;34023:43;33960:3;34097:2;34082:18;;34075:31;;;33923:4;;34129:57;;34166:19;;34158:6;34129:57;:::i;:::-;34234:9;34226:6;34222:22;34217:2;34206:9;34202:18;34195:50;34268:44;34305:6;34297;34268:44;:::i;:::-;34254:58;;34361:9;34353:6;34349:22;34343:3;34332:9;34328:19;34321:51;34389:33;34415:6;34407;34389:33;:::i;:::-;34381:41;33601:827;-1:-1:-1;;;;;;;;33601:827:1:o;34433:249::-;34502:6;34555:2;34543:9;34534:7;34530:23;34526:32;34523:52;;;34571:1;34568;34561:12;34523:52;34603:9;34597:16;34622:30;34646:5;34622:30;:::i;34687:179::-;34722:3;34764:1;34746:16;34743:23;34740:120;;;34810:1;34807;34804;34789:23;-1:-1:-1;34847:1:1;34841:8;34836:3;34832:18;34740:120;34687:179;:::o;34871:671::-;34910:3;34952:4;34934:16;34931:26;34928:39;;;34871:671;:::o;34928:39::-;34994:2;34988:9;-1:-1:-1;;35059:16:1;35055:25;;35052:1;34988:9;35031:50;35110:4;35104:11;35134:16;-1:-1:-1;;;;;35240:2:1;35233:4;35225:6;35221:17;35218:25;35213:2;35205:6;35202:14;35199:45;35196:58;;;35247:5;;;;;34871:671;:::o;35196:58::-;35284:6;35278:4;35274:17;35263:28;;35320:3;35314:10;35347:2;35339:6;35336:14;35333:27;;;35353:5;;;;;;34871:671;:::o;35333:27::-;35437:2;35418:16;35412:4;35408:27;35404:36;35397:4;35388:6;35383:3;35379:16;35375:27;35372:69;35369:82;;;35444:5;;;;;;34871:671;:::o;35369:82::-;35460:57;35511:4;35502:6;35494;35490:19;35486:30;35480:4;35460:57;:::i;:::-;-1:-1:-1;35533:3:1;;34871:671;-1:-1:-1;;;;;34871:671:1:o;35968:404::-;36170:2;36152:21;;;36209:2;36189:18;;;36182:30;36248:34;36243:2;36228:18;;36221:62;-1:-1:-1;;;36314:2:1;36299:18;;36292:38;36362:3;36347:19;;35968:404::o;36377:561::-;-1:-1:-1;;;;;36674:15:1;;;36656:34;;36726:15;;36721:2;36706:18;;36699:43;36773:2;36758:18;;36751:34;;;36816:2;36801:18;;36794:34;;;36636:3;36859;36844:19;;36837:32;;;36599:4;;36886:46;;36912:19;;36904:6;36886:46;:::i;:::-;36878:54;36377:561;-1:-1:-1;;;;;;;36377:561:1:o

Swarm Source

ipfs://13e1c735fffce139cdc788ef1d883d4be779f9d2f1454b1d7c008f05d8c04a05
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.