ETH Price: $4,019.59 (+1.18%)

Token

Japanese Apes Flower Shop (JAFS)
 

Overview

Max Total Supply

10,000 JAFS

Holders

683

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x077023766c2eb9298f156369cc1954baa03bef6d
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:
JapaneseApesFlowerShop

Compiler Version
v0.8.16+commit.07a7930e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-12-05
*/

pragma solidity 0.8.16;

// SPDX-License-Identifier: MIT
// 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);
}

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

// OpenZeppelin Contracts (last updated v4.5.0) (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.
     *
     * NOTE: 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.
     *
     * NOTE: 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);
}

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

// OpenZeppelin Contracts (last updated v4.5.0) (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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// OpenZeppelin Contracts (last updated v4.6.0) (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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, 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);

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

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

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

        _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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

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

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

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

        _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();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

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

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

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

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

        _afterTokenTransfer(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 {}

    /**
     * @dev Hook that is called after 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 _afterTokenTransfer(
        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;
    }
}

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

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

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Allow spending tokens from addresses with balance
        // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
        // from an EOA.
        if (from != msg.sender) {
            _checkFilterOperator(msg.sender);
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        _checkFilterOperator(operator);
        _;
    }

    function _checkFilterOperator(address operator) internal view virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
    }
}

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

interface IJapaneseApesFlowerShop {
  function uri(uint256 tokenId) external view returns (string memory);

  function mintBatch(
    address initialOwner,
    uint256[] memory ids,
    uint256[] memory amounts,
    bytes memory data
  ) external;

  function saleManagerTransfer(
    address from,
    address to,
    uint256 id,
    uint256 amount,
    bytes memory data
  ) external;

  function setSaleManager(address _mintDrop) external;

  function balanceOf(address account, uint256 id) external view returns (uint256);

  function setBaseURI(string memory _baseUri) external;
}

contract JapaneseApesFlowerShop is IJapaneseApesFlowerShop, Ownable, ERC1155, DefaultOperatorFilterer {
  using Strings for uint256;

  string public baseURI;
  bool public revealed;
  address public saleManager;

  event BaseURI(string baseUri);

  string public constant name = "Japanese Apes Flower Shop";
  string public constant symbol = "JAFS";

  constructor() ERC1155("") {}

  modifier onlySaleManager() {
    require(msg.sender == saleManager, "only sale manager");
    _;
  }

  function reveal() external onlyOwner {
    revealed = true;
  }

  function setBaseURI(string memory _baseUri) external onlyOwner {
    baseURI = _baseUri;
  }

  function balanceOf(address account, uint256 id) public view virtual override(ERC1155, IJapaneseApesFlowerShop) returns (uint256){
    return ERC1155.balanceOf(account, id);
  }

  function uri(uint256 tokenId)
    public
    view
    virtual
    override(ERC1155, IJapaneseApesFlowerShop)
    returns (string memory)
  {
    if (revealed) {
      return string(abi.encodePacked(baseURI, tokenId.toString()));
    }
    
    return string(abi.encodePacked(baseURI));
  }

  function mintBatch(
    address initialOwner,
    uint256[] memory ids,
    uint256[] memory amounts,
    bytes memory data
  ) external onlySaleManager {
    _mintBatch(initialOwner, ids, amounts, data);
  }

  function saleManagerTransfer(
    address from,
    address to,
    uint256 id,
    uint256 amount,
    bytes memory data
  ) public onlySaleManager {
    _safeTransferFrom(from, to, id, amount, data);
  }

  /// @notice Set the address for the saleManager
  /// @param _saleManager: address of the sale contract
  function setSaleManager(address _saleManager) external onlyOwner {
    saleManager = _saleManager;
  }

  function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
    super.setApprovalForAll(operator, approved);
  }

  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    uint256 amount,
    bytes memory data
  ) public override onlyAllowedOperator(from) {
    super.safeTransferFrom(from, to, tokenId, amount, data);
  }

  function safeBatchTransferFrom(
    address from,
    address to,
    uint256[] memory ids,
    uint256[] memory amounts,
    bytes memory data
  ) public virtual override onlyAllowedOperator(from) {
    super.safeBatchTransferFrom(from, to, ids, amounts, data);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"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":false,"internalType":"string","name":"baseUri","type":"string"}],"name":"BaseURI","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"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"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"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":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"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":[{"internalType":"address","name":"initialOwner","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"reveal","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"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":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleManager","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","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":"saleManagerTransfer","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":"_baseUri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_saleManager","type":"address"}],"name":"setSaleManager","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":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60806040523480156200001157600080fd5b50733cc6cdda760b79bafa08df41ecfa224f810dceb6600160405180602001604052806000815250620000596200004d6200026860201b60201c565b6200027060201b60201c565b6200006a816200033460201b60201c565b5060006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156200026057801562000126576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16637d3e3dbe30846040518363ffffffff1660e01b8152600401620000ec9291906200038e565b600060405180830381600087803b1580156200010757600080fd5b505af11580156200011c573d6000803e3d6000fd5b505050506200025f565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614620001e0576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663a0af290330846040518363ffffffff1660e01b8152600401620001a69291906200038e565b600060405180830381600087803b158015620001c157600080fd5b505af1158015620001d6573d6000803e3d6000fd5b505050506200025e565b6daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff16634420e486306040518263ffffffff1660e01b8152600401620002299190620003bb565b600060405180830381600087803b1580156200024457600080fd5b505af115801562000259573d6000803e3d6000fd5b505050505b5b5b505062000739565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b806003908162000345919062000652565b5050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620003768262000349565b9050919050565b620003888162000369565b82525050565b6000604082019050620003a560008301856200037d565b620003b460208301846200037d565b9392505050565b6000602082019050620003d260008301846200037d565b92915050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200045a57607f821691505b60208210810362000470576200046f62000412565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004da7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826200049b565b620004e686836200049b565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620005336200052d6200052784620004fe565b62000508565b620004fe565b9050919050565b6000819050919050565b6200054f8362000512565b620005676200055e826200053a565b848454620004a8565b825550505050565b600090565b6200057e6200056f565b6200058b81848462000544565b505050565b5b81811015620005b357620005a760008262000574565b60018101905062000591565b5050565b601f8211156200060257620005cc8162000476565b620005d7846200048b565b81016020851015620005e7578190505b620005ff620005f6856200048b565b83018262000590565b50505b505050565b600082821c905092915050565b6000620006276000198460080262000607565b1980831691505092915050565b600062000642838362000614565b9150826002028217905092915050565b6200065d82620003d8565b67ffffffffffffffff811115620006795762000678620003e3565b5b62000685825462000441565b62000692828285620005b7565b600060209050601f831160018114620006ca5760008415620006b5578287015190505b620006c1858262000634565b86555062000731565b601f198416620006da8662000476565b60005b828110156200070457848901518255600182019150602085019450602081019050620006dd565b8683101562000724578489015162000720601f89168262000614565b8355505b6001600288020188555050505b505050505050565b613cdd80620007496000396000f3fe608060405234801561001057600080fd5b50600436106101415760003560e01c8063715018a6116100b8578063a22cb4651161007c578063a22cb46514610352578063a475b5dd1461036e578063e985e9c514610378578063f242432a146103a8578063f2fde38b146103c4578063f88b2f4d146103e057610141565b8063715018a6146102d2578063746e60b5146102dc5780637c56eeb1146102fa5780638da5cb5b1461031657806395d89b411461033457610141565b80632eb2c2d61161010a5780632eb2c2d61461021057806341f434341461022c5780634e1273f41461024a578063518302271461027a57806355f804b3146102985780636c0360eb146102b457610141565b8062fdd58e1461014657806301ffc9a71461017657806306fdde03146101a65780630e89341c146101c45780631f7fdffa146101f4575b600080fd5b610160600480360381019061015b9190612203565b6103fc565b60405161016d9190612252565b60405180910390f35b610190600480360381019061018b91906122c5565b610410565b60405161019d919061230d565b60405180910390f35b6101ae6104f2565b6040516101bb91906123b8565b60405180910390f35b6101de60048036038101906101d991906123da565b61052b565b6040516101eb91906123b8565b60405180910390f35b61020e60048036038101906102099190612604565b61059d565b005b61022a600480360381019061022591906126bf565b61063f565b005b610234610692565b60405161024191906127ed565b60405180910390f35b610264600480360381019061025f91906128cb565b6106a4565b6040516102719190612a01565b60405180910390f35b6102826107bd565b60405161028f919061230d565b60405180910390f35b6102b260048036038101906102ad9190612ac4565b6107d0565b005b6102bc61085f565b6040516102c991906123b8565b60405180910390f35b6102da6108ed565b005b6102e4610975565b6040516102f19190612b1c565b60405180910390f35b610314600480360381019061030f9190612b37565b61099b565b005b61031e610a3f565b60405161032b9190612b1c565b60405180910390f35b61033c610a68565b60405161034991906123b8565b60405180910390f35b61036c60048036038101906103679190612bfa565b610aa1565b005b610376610aba565b005b610392600480360381019061038d9190612c3a565b610b53565b60405161039f919061230d565b60405180910390f35b6103c260048036038101906103bd9190612b37565b610be7565b005b6103de60048036038101906103d99190612c7a565b610c3a565b005b6103fa60048036038101906103f59190612c7a565b610d31565b005b60006104088383610df1565b905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104db57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104eb57506104ea82610eba565b5b9050919050565b6040518060400160405280601981526020017f4a6170616e657365204170657320466c6f7765722053686f700000000000000081525081565b6060600560009054906101000a900460ff161561057457600461054d83610f24565b60405160200161055e929190612ddb565b6040516020818303038152906040529050610598565b60046040516020016105869190612dff565b60405160208183030381529060405290505b919050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461062d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062490612e62565b60405180910390fd5b61063984848484611084565b50505050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461067d5761067c336112b1565b5b61068a86868686866113ae565b505050505050565b6daaeb6d7670e522a718067333cd4e81565b606081518351146106ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e190612ef4565b60405180910390fd5b6000835167ffffffffffffffff8111156107075761070661240c565b5b6040519080825280602002602001820160405280156107355781602001602082028036833780820191505090505b50905060005b84518110156107b25761078285828151811061075a57610759612f14565b5b602002602001015185838151811061077557610774612f14565b5b60200260200101516103fc565b82828151811061079557610794612f14565b5b602002602001018181525050806107ab90612f72565b905061073b565b508091505092915050565b600560009054906101000a900460ff1681565b6107d861144f565b73ffffffffffffffffffffffffffffffffffffffff166107f6610a3f565b73ffffffffffffffffffffffffffffffffffffffff161461084c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084390613006565b60405180910390fd5b806004908161085b91906131b3565b5050565b6004805461086c90612cd6565b80601f016020809104026020016040519081016040528092919081815260200182805461089890612cd6565b80156108e55780601f106108ba576101008083540402835291602001916108e5565b820191906000526020600020905b8154815290600101906020018083116108c857829003601f168201915b505050505081565b6108f561144f565b73ffffffffffffffffffffffffffffffffffffffff16610913610a3f565b73ffffffffffffffffffffffffffffffffffffffff1614610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096090613006565b60405180910390fd5b6109736000611457565b565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2290612e62565b60405180910390fd5b610a38858585858561151b565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600481526020017f4a4146530000000000000000000000000000000000000000000000000000000081525081565b81610aab816112b1565b610ab583836117b9565b505050565b610ac261144f565b73ffffffffffffffffffffffffffffffffffffffff16610ae0610a3f565b73ffffffffffffffffffffffffffffffffffffffff1614610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d90613006565b60405180910390fd5b6001600560006101000a81548160ff021916908315150217905550565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c2557610c24336112b1565b5b610c3286868686866117cf565b505050505050565b610c4261144f565b73ffffffffffffffffffffffffffffffffffffffff16610c60610a3f565b73ffffffffffffffffffffffffffffffffffffffff1614610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad90613006565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c906132f7565b60405180910390fd5b610d2e81611457565b50565b610d3961144f565b73ffffffffffffffffffffffffffffffffffffffff16610d57610a3f565b73ffffffffffffffffffffffffffffffffffffffff1614610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da490613006565b60405180910390fd5b80600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890613389565b60405180910390fd5b6001600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060008203610f6b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061107f565b600082905060005b60008214610f9d578080610f8690612f72565b915050600a82610f9691906133d8565b9150610f73565b60008167ffffffffffffffff811115610fb957610fb861240c565b5b6040519080825280601f01601f191660200182016040528015610feb5781602001600182028036833780820191505090505b5090505b60008514611078576001826110049190613409565b9150600a85611013919061343d565b603061101f919061346e565b60f81b81838151811061103557611034612f14565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561107191906133d8565b9450610fef565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90613514565b60405180910390fd5b8151835114611137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112e906135a6565b60405180910390fd5b600061114161144f565b905061115281600087878787611870565b60005b845181101561120c5783818151811061117157611170612f14565b5b6020026020010151600160008784815181106111905761118f612f14565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111f2919061346e565b92505081905550808061120490612f72565b915050611155565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516112849291906135c6565b60405180910390a461129b81600087878787611878565b6112aa81600087878787611880565b5050505050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156113ab576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016113289291906135fd565b602060405180830381865afa158015611345573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611369919061363b565b6113aa57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016113a19190612b1c565b60405180910390fd5b5b50565b6113b661144f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806113fc57506113fb856113f661144f565b610b53565b5b61143b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611432906136da565b60405180910390fd5b6114488585858585611a57565b5050505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361158a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115819061376c565b60405180910390fd5b600061159461144f565b905060006115a185611d7b565b905060006115ae85611d7b565b90506115be838989858589611870565b60006001600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015611656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164d906137fe565b60405180910390fd5b8581036001600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856001600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461170d919061346e565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161178a92919061381e565b60405180910390a46117a0848a8a86868a611878565b6117ae848a8a8a8a8a611df5565b505050505050505050565b6117cb6117c461144f565b8383611fcc565b5050565b6117d761144f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061181d575061181c8561181761144f565b610b53565b5b61185c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611853906138b9565b60405180910390fd5b611869858585858561151b565b5050505050565b505050505050565b505050505050565b61189f8473ffffffffffffffffffffffffffffffffffffffff16612138565b15611a4f578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016118e595949392919061392e565b6020604051808303816000875af192505050801561192157506040513d601f19601f8201168201806040525081019061191e91906139ab565b60015b6119c65761192d6139e5565b806308c379a0036119895750611941613a07565b8061194c575061198b565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198091906123b8565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd90613b09565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4490613b9b565b60405180910390fd5b505b505050505050565b8151835114611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a92906135a6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b019061376c565b60405180910390fd5b6000611b1461144f565b9050611b24818787878787611870565b60005b8451811015611cd8576000858281518110611b4557611b44612f14565b5b602002602001015190506000858381518110611b6457611b63612f14565b5b6020026020010151905060006001600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd906137fe565b60405180910390fd5b8181036001600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816001600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cbd919061346e565b9250508190555050505080611cd190612f72565b9050611b27565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611d4f9291906135c6565b60405180910390a4611d65818787878787611878565b611d73818787878787611880565b505050505050565b60606000600167ffffffffffffffff811115611d9a57611d9961240c565b5b604051908082528060200260200182016040528015611dc85781602001602082028036833780820191505090505b5090508281600081518110611de057611ddf612f14565b5b60200260200101818152505080915050919050565b611e148473ffffffffffffffffffffffffffffffffffffffff16612138565b15611fc4578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611e5a959493929190613bbb565b6020604051808303816000875af1925050508015611e9657506040513d601f19601f82011682018060405250810190611e9391906139ab565b60015b611f3b57611ea26139e5565b806308c379a003611efe5750611eb6613a07565b80611ec15750611f00565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef591906123b8565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3290613b09565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb990613b9b565b60405180910390fd5b505b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361203a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203190613c87565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161212b919061230d565b60405180910390a3505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061219a8261216f565b9050919050565b6121aa8161218f565b81146121b557600080fd5b50565b6000813590506121c7816121a1565b92915050565b6000819050919050565b6121e0816121cd565b81146121eb57600080fd5b50565b6000813590506121fd816121d7565b92915050565b6000806040838503121561221a57612219612165565b5b6000612228858286016121b8565b9250506020612239858286016121ee565b9150509250929050565b61224c816121cd565b82525050565b60006020820190506122676000830184612243565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122a28161226d565b81146122ad57600080fd5b50565b6000813590506122bf81612299565b92915050565b6000602082840312156122db576122da612165565b5b60006122e9848285016122b0565b91505092915050565b60008115159050919050565b612307816122f2565b82525050565b600060208201905061232260008301846122fe565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612362578082015181840152602081019050612347565b60008484015250505050565b6000601f19601f8301169050919050565b600061238a82612328565b6123948185612333565b93506123a4818560208601612344565b6123ad8161236e565b840191505092915050565b600060208201905081810360008301526123d2818461237f565b905092915050565b6000602082840312156123f0576123ef612165565b5b60006123fe848285016121ee565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6124448261236e565b810181811067ffffffffffffffff821117156124635761246261240c565b5b80604052505050565b600061247661215b565b9050612482828261243b565b919050565b600067ffffffffffffffff8211156124a2576124a161240c565b5b602082029050602081019050919050565b600080fd5b60006124cb6124c684612487565b61246c565b905080838252602082019050602084028301858111156124ee576124ed6124b3565b5b835b81811015612517578061250388826121ee565b8452602084019350506020810190506124f0565b5050509392505050565b600082601f83011261253657612535612407565b5b81356125468482602086016124b8565b91505092915050565b600080fd5b600067ffffffffffffffff82111561256f5761256e61240c565b5b6125788261236e565b9050602081019050919050565b82818337600083830152505050565b60006125a76125a284612554565b61246c565b9050828152602081018484840111156125c3576125c261254f565b5b6125ce848285612585565b509392505050565b600082601f8301126125eb576125ea612407565b5b81356125fb848260208601612594565b91505092915050565b6000806000806080858703121561261e5761261d612165565b5b600061262c878288016121b8565b945050602085013567ffffffffffffffff81111561264d5761264c61216a565b5b61265987828801612521565b935050604085013567ffffffffffffffff81111561267a5761267961216a565b5b61268687828801612521565b925050606085013567ffffffffffffffff8111156126a7576126a661216a565b5b6126b3878288016125d6565b91505092959194509250565b600080600080600060a086880312156126db576126da612165565b5b60006126e9888289016121b8565b95505060206126fa888289016121b8565b945050604086013567ffffffffffffffff81111561271b5761271a61216a565b5b61272788828901612521565b935050606086013567ffffffffffffffff8111156127485761274761216a565b5b61275488828901612521565b925050608086013567ffffffffffffffff8111156127755761277461216a565b5b612781888289016125d6565b9150509295509295909350565b6000819050919050565b60006127b36127ae6127a98461216f565b61278e565b61216f565b9050919050565b60006127c582612798565b9050919050565b60006127d7826127ba565b9050919050565b6127e7816127cc565b82525050565b600060208201905061280260008301846127de565b92915050565b600067ffffffffffffffff8211156128235761282261240c565b5b602082029050602081019050919050565b600061284761284284612808565b61246c565b9050808382526020820190506020840283018581111561286a576128696124b3565b5b835b81811015612893578061287f88826121b8565b84526020840193505060208101905061286c565b5050509392505050565b600082601f8301126128b2576128b1612407565b5b81356128c2848260208601612834565b91505092915050565b600080604083850312156128e2576128e1612165565b5b600083013567ffffffffffffffff811115612900576128ff61216a565b5b61290c8582860161289d565b925050602083013567ffffffffffffffff81111561292d5761292c61216a565b5b61293985828601612521565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612978816121cd565b82525050565b600061298a838361296f565b60208301905092915050565b6000602082019050919050565b60006129ae82612943565b6129b8818561294e565b93506129c38361295f565b8060005b838110156129f45781516129db888261297e565b97506129e683612996565b9250506001810190506129c7565b5085935050505092915050565b60006020820190508181036000830152612a1b81846129a3565b905092915050565b600067ffffffffffffffff821115612a3e57612a3d61240c565b5b612a478261236e565b9050602081019050919050565b6000612a67612a6284612a23565b61246c565b905082815260208101848484011115612a8357612a8261254f565b5b612a8e848285612585565b509392505050565b600082601f830112612aab57612aaa612407565b5b8135612abb848260208601612a54565b91505092915050565b600060208284031215612ada57612ad9612165565b5b600082013567ffffffffffffffff811115612af857612af761216a565b5b612b0484828501612a96565b91505092915050565b612b168161218f565b82525050565b6000602082019050612b316000830184612b0d565b92915050565b600080600080600060a08688031215612b5357612b52612165565b5b6000612b61888289016121b8565b9550506020612b72888289016121b8565b9450506040612b83888289016121ee565b9350506060612b94888289016121ee565b925050608086013567ffffffffffffffff811115612bb557612bb461216a565b5b612bc1888289016125d6565b9150509295509295909350565b612bd7816122f2565b8114612be257600080fd5b50565b600081359050612bf481612bce565b92915050565b60008060408385031215612c1157612c10612165565b5b6000612c1f858286016121b8565b9250506020612c3085828601612be5565b9150509250929050565b60008060408385031215612c5157612c50612165565b5b6000612c5f858286016121b8565b9250506020612c70858286016121b8565b9150509250929050565b600060208284031215612c9057612c8f612165565b5b6000612c9e848285016121b8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cee57607f821691505b602082108103612d0157612d00612ca7565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154612d3481612cd6565b612d3e8186612d07565b94506001821660008114612d595760018114612d6e57612da1565b60ff1983168652811515820286019350612da1565b612d7785612d12565b60005b83811015612d9957815481890152600182019150602081019050612d7a565b838801955050505b50505092915050565b6000612db582612328565b612dbf8185612d07565b9350612dcf818560208601612344565b80840191505092915050565b6000612de78285612d27565b9150612df38284612daa565b91508190509392505050565b6000612e0b8284612d27565b915081905092915050565b7f6f6e6c792073616c65206d616e61676572000000000000000000000000000000600082015250565b6000612e4c601183612333565b9150612e5782612e16565b602082019050919050565b60006020820190508181036000830152612e7b81612e3f565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000612ede602983612333565b9150612ee982612e82565b604082019050919050565b60006020820190508181036000830152612f0d81612ed1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f7d826121cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612faf57612fae612f43565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612ff0602083612333565b9150612ffb82612fba565b602082019050919050565b6000602082019050818103600083015261301f81612fe3565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026130737fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613036565b61307d8683613036565b95508019841693508086168417925050509392505050565b60006130b06130ab6130a6846121cd565b61278e565b6121cd565b9050919050565b6000819050919050565b6130ca83613095565b6130de6130d6826130b7565b848454613043565b825550505050565b600090565b6130f36130e6565b6130fe8184846130c1565b505050565b5b81811015613122576131176000826130eb565b600181019050613104565b5050565b601f8211156131675761313881612d12565b61314184613026565b81016020851015613150578190505b61316461315c85613026565b830182613103565b50505b505050565b600082821c905092915050565b600061318a6000198460080261316c565b1980831691505092915050565b60006131a38383613179565b9150826002028217905092915050565b6131bc82612328565b67ffffffffffffffff8111156131d5576131d461240c565b5b6131df8254612cd6565b6131ea828285613126565b600060209050601f83116001811461321d576000841561320b578287015190505b6132158582613197565b86555061327d565b601f19841661322b86612d12565b60005b828110156132535784890151825560018201915060208501945060208101905061322e565b86831015613270578489015161326c601f891682613179565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006132e1602683612333565b91506132ec82613285565b604082019050919050565b60006020820190508181036000830152613310816132d4565b9050919050565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613373602b83612333565b915061337e82613317565b604082019050919050565b600060208201905081810360008301526133a281613366565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133e3826121cd565b91506133ee836121cd565b9250826133fe576133fd6133a9565b5b828204905092915050565b6000613414826121cd565b915061341f836121cd565b925082820390508181111561343757613436612f43565b5b92915050565b6000613448826121cd565b9150613453836121cd565b925082613463576134626133a9565b5b828206905092915050565b6000613479826121cd565b9150613484836121cd565b925082820190508082111561349c5761349b612f43565b5b92915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006134fe602183612333565b9150613509826134a2565b604082019050919050565b6000602082019050818103600083015261352d816134f1565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000613590602883612333565b915061359b82613534565b604082019050919050565b600060208201905081810360008301526135bf81613583565b9050919050565b600060408201905081810360008301526135e081856129a3565b905081810360208301526135f481846129a3565b90509392505050565b60006040820190506136126000830185612b0d565b61361f6020830184612b0d565b9392505050565b60008151905061363581612bce565b92915050565b60006020828403121561365157613650612165565b5b600061365f84828501613626565b91505092915050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006136c4603283612333565b91506136cf82613668565b604082019050919050565b600060208201905081810360008301526136f3816136b7565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613756602583612333565b9150613761826136fa565b604082019050919050565b6000602082019050818103600083015261378581613749565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b60006137e8602a83612333565b91506137f38261378c565b604082019050919050565b60006020820190508181036000830152613817816137db565b9050919050565b60006040820190506138336000830185612243565b6138406020830184612243565b9392505050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b60006138a3602983612333565b91506138ae82613847565b604082019050919050565b600060208201905081810360008301526138d281613896565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613900826138d9565b61390a81856138e4565b935061391a818560208601612344565b6139238161236e565b840191505092915050565b600060a0820190506139436000830188612b0d565b6139506020830187612b0d565b818103604083015261396281866129a3565b9050818103606083015261397681856129a3565b9050818103608083015261398a81846138f5565b90509695505050505050565b6000815190506139a581612299565b92915050565b6000602082840312156139c1576139c0612165565b5b60006139cf84828501613996565b91505092915050565b60008160e01c9050919050565b600060033d1115613a045760046000803e613a016000516139d8565b90505b90565b600060443d10613a9457613a1961215b565b60043d036004823e80513d602482011167ffffffffffffffff82111715613a41575050613a94565b808201805167ffffffffffffffff811115613a5f5750505050613a94565b80602083010160043d038501811115613a7c575050505050613a94565b613a8b8260200185018661243b565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000613af3603483612333565b9150613afe82613a97565b604082019050919050565b60006020820190508181036000830152613b2281613ae6565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000613b85602883612333565b9150613b9082613b29565b604082019050919050565b60006020820190508181036000830152613bb481613b78565b9050919050565b600060a082019050613bd06000830188612b0d565b613bdd6020830187612b0d565b613bea6040830186612243565b613bf76060830185612243565b8181036080830152613c0981846138f5565b90509695505050505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000613c71602983612333565b9150613c7c82613c15565b604082019050919050565b60006020820190508181036000830152613ca081613c64565b905091905056fea26469706673582212201a24dd852b72553e88c546bb2706c415afb66eccdf65fc9c63053a488bec57d664736f6c63430008100033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101415760003560e01c8063715018a6116100b8578063a22cb4651161007c578063a22cb46514610352578063a475b5dd1461036e578063e985e9c514610378578063f242432a146103a8578063f2fde38b146103c4578063f88b2f4d146103e057610141565b8063715018a6146102d2578063746e60b5146102dc5780637c56eeb1146102fa5780638da5cb5b1461031657806395d89b411461033457610141565b80632eb2c2d61161010a5780632eb2c2d61461021057806341f434341461022c5780634e1273f41461024a578063518302271461027a57806355f804b3146102985780636c0360eb146102b457610141565b8062fdd58e1461014657806301ffc9a71461017657806306fdde03146101a65780630e89341c146101c45780631f7fdffa146101f4575b600080fd5b610160600480360381019061015b9190612203565b6103fc565b60405161016d9190612252565b60405180910390f35b610190600480360381019061018b91906122c5565b610410565b60405161019d919061230d565b60405180910390f35b6101ae6104f2565b6040516101bb91906123b8565b60405180910390f35b6101de60048036038101906101d991906123da565b61052b565b6040516101eb91906123b8565b60405180910390f35b61020e60048036038101906102099190612604565b61059d565b005b61022a600480360381019061022591906126bf565b61063f565b005b610234610692565b60405161024191906127ed565b60405180910390f35b610264600480360381019061025f91906128cb565b6106a4565b6040516102719190612a01565b60405180910390f35b6102826107bd565b60405161028f919061230d565b60405180910390f35b6102b260048036038101906102ad9190612ac4565b6107d0565b005b6102bc61085f565b6040516102c991906123b8565b60405180910390f35b6102da6108ed565b005b6102e4610975565b6040516102f19190612b1c565b60405180910390f35b610314600480360381019061030f9190612b37565b61099b565b005b61031e610a3f565b60405161032b9190612b1c565b60405180910390f35b61033c610a68565b60405161034991906123b8565b60405180910390f35b61036c60048036038101906103679190612bfa565b610aa1565b005b610376610aba565b005b610392600480360381019061038d9190612c3a565b610b53565b60405161039f919061230d565b60405180910390f35b6103c260048036038101906103bd9190612b37565b610be7565b005b6103de60048036038101906103d99190612c7a565b610c3a565b005b6103fa60048036038101906103f59190612c7a565b610d31565b005b60006104088383610df1565b905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806104db57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806104eb57506104ea82610eba565b5b9050919050565b6040518060400160405280601981526020017f4a6170616e657365204170657320466c6f7765722053686f700000000000000081525081565b6060600560009054906101000a900460ff161561057457600461054d83610f24565b60405160200161055e929190612ddb565b6040516020818303038152906040529050610598565b60046040516020016105869190612dff565b60405160208183030381529060405290505b919050565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461062d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161062490612e62565b60405180910390fd5b61063984848484611084565b50505050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161461067d5761067c336112b1565b5b61068a86868686866113ae565b505050505050565b6daaeb6d7670e522a718067333cd4e81565b606081518351146106ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016106e190612ef4565b60405180910390fd5b6000835167ffffffffffffffff8111156107075761070661240c565b5b6040519080825280602002602001820160405280156107355781602001602082028036833780820191505090505b50905060005b84518110156107b25761078285828151811061075a57610759612f14565b5b602002602001015185838151811061077557610774612f14565b5b60200260200101516103fc565b82828151811061079557610794612f14565b5b602002602001018181525050806107ab90612f72565b905061073b565b508091505092915050565b600560009054906101000a900460ff1681565b6107d861144f565b73ffffffffffffffffffffffffffffffffffffffff166107f6610a3f565b73ffffffffffffffffffffffffffffffffffffffff161461084c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084390613006565b60405180910390fd5b806004908161085b91906131b3565b5050565b6004805461086c90612cd6565b80601f016020809104026020016040519081016040528092919081815260200182805461089890612cd6565b80156108e55780601f106108ba576101008083540402835291602001916108e5565b820191906000526020600020905b8154815290600101906020018083116108c857829003601f168201915b505050505081565b6108f561144f565b73ffffffffffffffffffffffffffffffffffffffff16610913610a3f565b73ffffffffffffffffffffffffffffffffffffffff1614610969576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161096090613006565b60405180910390fd5b6109736000611457565b565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600560019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610a2b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2290612e62565b60405180910390fd5b610a38858585858561151b565b5050505050565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6040518060400160405280600481526020017f4a4146530000000000000000000000000000000000000000000000000000000081525081565b81610aab816112b1565b610ab583836117b9565b505050565b610ac261144f565b73ffffffffffffffffffffffffffffffffffffffff16610ae0610a3f565b73ffffffffffffffffffffffffffffffffffffffff1614610b36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b2d90613006565b60405180910390fd5b6001600560006101000a81548160ff021916908315150217905550565b6000600260008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b843373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610c2557610c24336112b1565b5b610c3286868686866117cf565b505050505050565b610c4261144f565b73ffffffffffffffffffffffffffffffffffffffff16610c60610a3f565b73ffffffffffffffffffffffffffffffffffffffff1614610cb6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cad90613006565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d1c906132f7565b60405180910390fd5b610d2e81611457565b50565b610d3961144f565b73ffffffffffffffffffffffffffffffffffffffff16610d57610a3f565b73ffffffffffffffffffffffffffffffffffffffff1614610dad576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da490613006565b60405180910390fd5b80600560016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890613389565b60405180910390fd5b6001600083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b606060008203610f6b576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061107f565b600082905060005b60008214610f9d578080610f8690612f72565b915050600a82610f9691906133d8565b9150610f73565b60008167ffffffffffffffff811115610fb957610fb861240c565b5b6040519080825280601f01601f191660200182016040528015610feb5781602001600182028036833780820191505090505b5090505b60008514611078576001826110049190613409565b9150600a85611013919061343d565b603061101f919061346e565b60f81b81838151811061103557611034612f14565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561107191906133d8565b9450610fef565b8093505050505b919050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16036110f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ea90613514565b60405180910390fd5b8151835114611137576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112e906135a6565b60405180910390fd5b600061114161144f565b905061115281600087878787611870565b60005b845181101561120c5783818151811061117157611170612f14565b5b6020026020010151600160008784815181106111905761118f612f14565b5b6020026020010151815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546111f2919061346e565b92505081905550808061120490612f72565b915050611155565b508473ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516112849291906135c6565b60405180910390a461129b81600087878787611878565b6112aa81600087878787611880565b5050505050565b60006daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff163b11156113ab576daaeb6d7670e522a718067333cd4e73ffffffffffffffffffffffffffffffffffffffff1663c617113430836040518363ffffffff1660e01b81526004016113289291906135fd565b602060405180830381865afa158015611345573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611369919061363b565b6113aa57806040517fede71dcc0000000000000000000000000000000000000000000000000000000081526004016113a19190612b1c565b60405180910390fd5b5b50565b6113b661144f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614806113fc57506113fb856113f661144f565b610b53565b5b61143b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611432906136da565b60405180910390fd5b6114488585858585611a57565b5050505050565b600033905090565b60008060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050816000806101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361158a576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115819061376c565b60405180910390fd5b600061159461144f565b905060006115a185611d7b565b905060006115ae85611d7b565b90506115be838989858589611870565b60006001600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015611656576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161164d906137fe565b60405180910390fd5b8581036001600089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550856001600089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461170d919061346e565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a60405161178a92919061381e565b60405180910390a46117a0848a8a86868a611878565b6117ae848a8a8a8a8a611df5565b505050505050505050565b6117cb6117c461144f565b8383611fcc565b5050565b6117d761144f565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff16148061181d575061181c8561181761144f565b610b53565b5b61185c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611853906138b9565b60405180910390fd5b611869858585858561151b565b5050505050565b505050505050565b505050505050565b61189f8473ffffffffffffffffffffffffffffffffffffffff16612138565b15611a4f578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016118e595949392919061392e565b6020604051808303816000875af192505050801561192157506040513d601f19601f8201168201806040525081019061191e91906139ab565b60015b6119c65761192d6139e5565b806308c379a0036119895750611941613a07565b8061194c575061198b565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161198091906123b8565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119bd90613b09565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611a4d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4490613b9b565b60405180910390fd5b505b505050505050565b8151835114611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a92906135a6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603611b0a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b019061376c565b60405180910390fd5b6000611b1461144f565b9050611b24818787878787611870565b60005b8451811015611cd8576000858281518110611b4557611b44612f14565b5b602002602001015190506000858381518110611b6457611b63612f14565b5b6020026020010151905060006001600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015611c06576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bfd906137fe565b60405180910390fd5b8181036001600085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550816001600085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cbd919061346e565b9250508190555050505080611cd190612f72565b9050611b27565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611d4f9291906135c6565b60405180910390a4611d65818787878787611878565b611d73818787878787611880565b505050505050565b60606000600167ffffffffffffffff811115611d9a57611d9961240c565b5b604051908082528060200260200182016040528015611dc85781602001602082028036833780820191505090505b5090508281600081518110611de057611ddf612f14565b5b60200260200101818152505080915050919050565b611e148473ffffffffffffffffffffffffffffffffffffffff16612138565b15611fc4578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b8152600401611e5a959493929190613bbb565b6020604051808303816000875af1925050508015611e9657506040513d601f19601f82011682018060405250810190611e9391906139ab565b60015b611f3b57611ea26139e5565b806308c379a003611efe5750611eb6613a07565b80611ec15750611f00565b806040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ef591906123b8565b60405180910390fd5b505b6040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f3290613b09565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614611fc2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fb990613b9b565b60405180910390fd5b505b505050505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361203a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203190613c87565b60405180910390fd5b80600260008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161212b919061230d565b60405180910390a3505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061219a8261216f565b9050919050565b6121aa8161218f565b81146121b557600080fd5b50565b6000813590506121c7816121a1565b92915050565b6000819050919050565b6121e0816121cd565b81146121eb57600080fd5b50565b6000813590506121fd816121d7565b92915050565b6000806040838503121561221a57612219612165565b5b6000612228858286016121b8565b9250506020612239858286016121ee565b9150509250929050565b61224c816121cd565b82525050565b60006020820190506122676000830184612243565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6122a28161226d565b81146122ad57600080fd5b50565b6000813590506122bf81612299565b92915050565b6000602082840312156122db576122da612165565b5b60006122e9848285016122b0565b91505092915050565b60008115159050919050565b612307816122f2565b82525050565b600060208201905061232260008301846122fe565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612362578082015181840152602081019050612347565b60008484015250505050565b6000601f19601f8301169050919050565b600061238a82612328565b6123948185612333565b93506123a4818560208601612344565b6123ad8161236e565b840191505092915050565b600060208201905081810360008301526123d2818461237f565b905092915050565b6000602082840312156123f0576123ef612165565b5b60006123fe848285016121ee565b91505092915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6124448261236e565b810181811067ffffffffffffffff821117156124635761246261240c565b5b80604052505050565b600061247661215b565b9050612482828261243b565b919050565b600067ffffffffffffffff8211156124a2576124a161240c565b5b602082029050602081019050919050565b600080fd5b60006124cb6124c684612487565b61246c565b905080838252602082019050602084028301858111156124ee576124ed6124b3565b5b835b81811015612517578061250388826121ee565b8452602084019350506020810190506124f0565b5050509392505050565b600082601f83011261253657612535612407565b5b81356125468482602086016124b8565b91505092915050565b600080fd5b600067ffffffffffffffff82111561256f5761256e61240c565b5b6125788261236e565b9050602081019050919050565b82818337600083830152505050565b60006125a76125a284612554565b61246c565b9050828152602081018484840111156125c3576125c261254f565b5b6125ce848285612585565b509392505050565b600082601f8301126125eb576125ea612407565b5b81356125fb848260208601612594565b91505092915050565b6000806000806080858703121561261e5761261d612165565b5b600061262c878288016121b8565b945050602085013567ffffffffffffffff81111561264d5761264c61216a565b5b61265987828801612521565b935050604085013567ffffffffffffffff81111561267a5761267961216a565b5b61268687828801612521565b925050606085013567ffffffffffffffff8111156126a7576126a661216a565b5b6126b3878288016125d6565b91505092959194509250565b600080600080600060a086880312156126db576126da612165565b5b60006126e9888289016121b8565b95505060206126fa888289016121b8565b945050604086013567ffffffffffffffff81111561271b5761271a61216a565b5b61272788828901612521565b935050606086013567ffffffffffffffff8111156127485761274761216a565b5b61275488828901612521565b925050608086013567ffffffffffffffff8111156127755761277461216a565b5b612781888289016125d6565b9150509295509295909350565b6000819050919050565b60006127b36127ae6127a98461216f565b61278e565b61216f565b9050919050565b60006127c582612798565b9050919050565b60006127d7826127ba565b9050919050565b6127e7816127cc565b82525050565b600060208201905061280260008301846127de565b92915050565b600067ffffffffffffffff8211156128235761282261240c565b5b602082029050602081019050919050565b600061284761284284612808565b61246c565b9050808382526020820190506020840283018581111561286a576128696124b3565b5b835b81811015612893578061287f88826121b8565b84526020840193505060208101905061286c565b5050509392505050565b600082601f8301126128b2576128b1612407565b5b81356128c2848260208601612834565b91505092915050565b600080604083850312156128e2576128e1612165565b5b600083013567ffffffffffffffff811115612900576128ff61216a565b5b61290c8582860161289d565b925050602083013567ffffffffffffffff81111561292d5761292c61216a565b5b61293985828601612521565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612978816121cd565b82525050565b600061298a838361296f565b60208301905092915050565b6000602082019050919050565b60006129ae82612943565b6129b8818561294e565b93506129c38361295f565b8060005b838110156129f45781516129db888261297e565b97506129e683612996565b9250506001810190506129c7565b5085935050505092915050565b60006020820190508181036000830152612a1b81846129a3565b905092915050565b600067ffffffffffffffff821115612a3e57612a3d61240c565b5b612a478261236e565b9050602081019050919050565b6000612a67612a6284612a23565b61246c565b905082815260208101848484011115612a8357612a8261254f565b5b612a8e848285612585565b509392505050565b600082601f830112612aab57612aaa612407565b5b8135612abb848260208601612a54565b91505092915050565b600060208284031215612ada57612ad9612165565b5b600082013567ffffffffffffffff811115612af857612af761216a565b5b612b0484828501612a96565b91505092915050565b612b168161218f565b82525050565b6000602082019050612b316000830184612b0d565b92915050565b600080600080600060a08688031215612b5357612b52612165565b5b6000612b61888289016121b8565b9550506020612b72888289016121b8565b9450506040612b83888289016121ee565b9350506060612b94888289016121ee565b925050608086013567ffffffffffffffff811115612bb557612bb461216a565b5b612bc1888289016125d6565b9150509295509295909350565b612bd7816122f2565b8114612be257600080fd5b50565b600081359050612bf481612bce565b92915050565b60008060408385031215612c1157612c10612165565b5b6000612c1f858286016121b8565b9250506020612c3085828601612be5565b9150509250929050565b60008060408385031215612c5157612c50612165565b5b6000612c5f858286016121b8565b9250506020612c70858286016121b8565b9150509250929050565b600060208284031215612c9057612c8f612165565b5b6000612c9e848285016121b8565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680612cee57607f821691505b602082108103612d0157612d00612ca7565b5b50919050565b600081905092915050565b60008190508160005260206000209050919050565b60008154612d3481612cd6565b612d3e8186612d07565b94506001821660008114612d595760018114612d6e57612da1565b60ff1983168652811515820286019350612da1565b612d7785612d12565b60005b83811015612d9957815481890152600182019150602081019050612d7a565b838801955050505b50505092915050565b6000612db582612328565b612dbf8185612d07565b9350612dcf818560208601612344565b80840191505092915050565b6000612de78285612d27565b9150612df38284612daa565b91508190509392505050565b6000612e0b8284612d27565b915081905092915050565b7f6f6e6c792073616c65206d616e61676572000000000000000000000000000000600082015250565b6000612e4c601183612333565b9150612e5782612e16565b602082019050919050565b60006020820190508181036000830152612e7b81612e3f565b9050919050565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b6000612ede602983612333565b9150612ee982612e82565b604082019050919050565b60006020820190508181036000830152612f0d81612ed1565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612f7d826121cd565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203612faf57612fae612f43565b5b600182019050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000612ff0602083612333565b9150612ffb82612fba565b602082019050919050565b6000602082019050818103600083015261301f81612fe3565b9050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026130737fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613036565b61307d8683613036565b95508019841693508086168417925050509392505050565b60006130b06130ab6130a6846121cd565b61278e565b6121cd565b9050919050565b6000819050919050565b6130ca83613095565b6130de6130d6826130b7565b848454613043565b825550505050565b600090565b6130f36130e6565b6130fe8184846130c1565b505050565b5b81811015613122576131176000826130eb565b600181019050613104565b5050565b601f8211156131675761313881612d12565b61314184613026565b81016020851015613150578190505b61316461315c85613026565b830182613103565b50505b505050565b600082821c905092915050565b600061318a6000198460080261316c565b1980831691505092915050565b60006131a38383613179565b9150826002028217905092915050565b6131bc82612328565b67ffffffffffffffff8111156131d5576131d461240c565b5b6131df8254612cd6565b6131ea828285613126565b600060209050601f83116001811461321d576000841561320b578287015190505b6132158582613197565b86555061327d565b601f19841661322b86612d12565b60005b828110156132535784890151825560018201915060208501945060208101905061322e565b86831015613270578489015161326c601f891682613179565b8355505b6001600288020188555050505b505050505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b60006132e1602683612333565b91506132ec82613285565b604082019050919050565b60006020820190508181036000830152613310816132d4565b9050919050565b7f455243313135353a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b6000613373602b83612333565b915061337e82613317565b604082019050919050565b600060208201905081810360008301526133a281613366565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006133e3826121cd565b91506133ee836121cd565b9250826133fe576133fd6133a9565b5b828204905092915050565b6000613414826121cd565b915061341f836121cd565b925082820390508181111561343757613436612f43565b5b92915050565b6000613448826121cd565b9150613453836121cd565b925082613463576134626133a9565b5b828206905092915050565b6000613479826121cd565b9150613484836121cd565b925082820190508082111561349c5761349b612f43565b5b92915050565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b60006134fe602183612333565b9150613509826134a2565b604082019050919050565b6000602082019050818103600083015261352d816134f1565b9050919050565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b6000613590602883612333565b915061359b82613534565b604082019050919050565b600060208201905081810360008301526135bf81613583565b9050919050565b600060408201905081810360008301526135e081856129a3565b905081810360208301526135f481846129a3565b90509392505050565b60006040820190506136126000830185612b0d565b61361f6020830184612b0d565b9392505050565b60008151905061363581612bce565b92915050565b60006020828403121561365157613650612165565b5b600061365f84828501613626565b91505092915050565b7f455243313135353a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b60006136c4603283612333565b91506136cf82613668565b604082019050919050565b600060208201905081810360008301526136f3816136b7565b9050919050565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b6000613756602583612333565b9150613761826136fa565b604082019050919050565b6000602082019050818103600083015261378581613749565b9050919050565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b60006137e8602a83612333565b91506137f38261378c565b604082019050919050565b60006020820190508181036000830152613817816137db565b9050919050565b60006040820190506138336000830185612243565b6138406020830184612243565b9392505050565b7f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260008201527f20617070726f7665640000000000000000000000000000000000000000000000602082015250565b60006138a3602983612333565b91506138ae82613847565b604082019050919050565b600060208201905081810360008301526138d281613896565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000613900826138d9565b61390a81856138e4565b935061391a818560208601612344565b6139238161236e565b840191505092915050565b600060a0820190506139436000830188612b0d565b6139506020830187612b0d565b818103604083015261396281866129a3565b9050818103606083015261397681856129a3565b9050818103608083015261398a81846138f5565b90509695505050505050565b6000815190506139a581612299565b92915050565b6000602082840312156139c1576139c0612165565b5b60006139cf84828501613996565b91505092915050565b60008160e01c9050919050565b600060033d1115613a045760046000803e613a016000516139d8565b90505b90565b600060443d10613a9457613a1961215b565b60043d036004823e80513d602482011167ffffffffffffffff82111715613a41575050613a94565b808201805167ffffffffffffffff811115613a5f5750505050613a94565b80602083010160043d038501811115613a7c575050505050613a94565b613a8b8260200185018661243b565b82955050505050505b90565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b6000613af3603483612333565b9150613afe82613a97565b604082019050919050565b60006020820190508181036000830152613b2281613ae6565b9050919050565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b6000613b85602883612333565b9150613b9082613b29565b604082019050919050565b60006020820190508181036000830152613bb481613b78565b9050919050565b600060a082019050613bd06000830188612b0d565b613bdd6020830187612b0d565b613bea6040830186612243565b613bf76060830185612243565b8181036080830152613c0981846138f5565b90509695505050505050565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b6000613c71602983612333565b9150613c7c82613c15565b604082019050919050565b60006020820190508181036000830152613ca081613c64565b905091905056fea26469706673582212201a24dd852b72553e88c546bb2706c415afb66eccdf65fc9c63053a488bec57d664736f6c63430008100033

Deployed Bytecode Sourcemap

45209:2532:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45889:178;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;19153:310;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45468:57;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46073:301;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46380:215;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47464:274;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42200:143;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20527:524;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45374:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45789:94;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45348:21;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39174:103;;;:::i;:::-;;45399:26;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46601:213;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38523:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45530:38;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47038:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45718:65;;;:::i;:::-;;21351:168;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47214:244;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39432:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46928:104;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45889:178;46009:7;46031:30;46049:7;46058:2;46031:17;:30::i;:::-;46024:37;;45889:178;;;;:::o;19153:310::-;19255:4;19307:26;19292:41;;;:11;:41;;;;:110;;;;19365:37;19350:52;;;:11;:52;;;;19292:110;:163;;;;19419:36;19443:11;19419:23;:36::i;:::-;19292:163;19272:183;;19153:310;;;:::o;45468:57::-;;;;;;;;;;;;;;;;;;;:::o;46073:301::-;46200:13;46229:8;;;;;;;;;;;46225:91;;;46279:7;46288:18;:7;:16;:18::i;:::-;46262:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46248:60;;;;46225:91;46359:7;46342:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;46328:40;;46073:301;;;;:::o;46380:215::-;45665:11;;;;;;;;;;;45651:25;;:10;:25;;;45643:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;46545:44:::1;46556:12;46570:3;46575:7;46584:4;46545:10;:44::i;:::-;46380:215:::0;;;;:::o;47464:274::-;47662:4;43549:10;43541:18;;:4;:18;;;43537:83;;43576:32;43597:10;43576:20;:32::i;:::-;43537:83;47675:57:::1;47703:4;47709:2;47713:3;47718:7;47727:4;47675:27;:57::i;:::-;47464:274:::0;;;;;;:::o;42200:143::-;42300:42;42200:143;:::o;20527:524::-;20683:16;20744:3;:10;20725:8;:15;:29;20717:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;20813:30;20860:8;:15;20846:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20813:63;;20894:9;20889:122;20913:8;:15;20909:1;:19;20889:122;;;20969:30;20979:8;20988:1;20979:11;;;;;;;;:::i;:::-;;;;;;;;20992:3;20996:1;20992:6;;;;;;;;:::i;:::-;;;;;;;;20969:9;:30::i;:::-;20950:13;20964:1;20950:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;20930:3;;;;:::i;:::-;;;20889:122;;;;21030:13;21023:20;;;20527:524;;;;:::o;45374:20::-;;;;;;;;;;;;;:::o;45789:94::-;38754:12;:10;:12::i;:::-;38743:23;;:7;:5;:7::i;:::-;:23;;;38735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45869:8:::1;45859:7;:18;;;;;;:::i;:::-;;45789:94:::0;:::o;45348:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;39174:103::-;38754:12;:10;:12::i;:::-;38743:23;;:7;:5;:7::i;:::-;:23;;;38735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39239:30:::1;39266:1;39239:18;:30::i;:::-;39174:103::o:0;45399:26::-;;;;;;;;;;;;;:::o;46601:213::-;45665:11;;;;;;;;;;;45651:25;;:10;:25;;;45643:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;46763:45:::1;46781:4;46787:2;46791;46795:6;46803:4;46763:17;:45::i;:::-;46601:213:::0;;;;;:::o;38523:87::-;38569:7;38596:6;;;;;;;;;;;38589:13;;38523:87;:::o;45530:38::-;;;;;;;;;;;;;;;;;;;:::o;47038:170::-;47142:8;43721:30;43742:8;43721:20;:30::i;:::-;47159:43:::1;47183:8;47193;47159:23;:43::i;:::-;47038:170:::0;;;:::o;45718:65::-;38754:12;:10;:12::i;:::-;38743:23;;:7;:5;:7::i;:::-;:23;;;38735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45773:4:::1;45762:8;;:15;;;;;;;;;;;;;;;;;;45718:65::o:0;21351:168::-;21450:4;21474:18;:27;21493:7;21474:27;;;;;;;;;;;;;;;:37;21502:8;21474:37;;;;;;;;;;;;;;;;;;;;;;;;;21467:44;;21351:168;;;;:::o;47214:244::-;47384:4;43549:10;43541:18;;:4;:18;;;43537:83;;43576:32;43597:10;43576:20;:32::i;:::-;43537:83;47397:55:::1;47420:4;47426:2;47430:7;47439:6;47447:4;47397:22;:55::i;:::-;47214:244:::0;;;;;;:::o;39432:201::-;38754:12;:10;:12::i;:::-;38743:23;;:7;:5;:7::i;:::-;:23;;;38735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39541:1:::1;39521:22;;:8;:22;;::::0;39513:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;39597:28;39616:8;39597:18;:28::i;:::-;39432:201:::0;:::o;46928:104::-;38754:12;:10;:12::i;:::-;38743:23;;:7;:5;:7::i;:::-;:23;;;38735:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;47014:12:::1;47000:11;;:26;;;;;;;;;;;;;;;;;;46928:104:::0;:::o;20130:231::-;20216:7;20263:1;20244:21;;:7;:21;;;20236:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;20331:9;:13;20341:2;20331:13;;;;;;;;;;;:22;20345:7;20331:22;;;;;;;;;;;;;;;;20324:29;;20130:231;;;;:::o;18002:157::-;18087:4;18126:25;18111:40;;;:11;:40;;;;18104:47;;18002:157;;;:::o;35790:723::-;35846:13;36076:1;36067:5;:10;36063:53;;36094:10;;;;;;;;;;;;;;;;;;;;;36063:53;36126:12;36141:5;36126:20;;36157:14;36182:78;36197:1;36189:4;:9;36182:78;;36215:8;;;;;:::i;:::-;;;;36246:2;36238:10;;;;;:::i;:::-;;;36182:78;;;36270:19;36302:6;36292:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36270:39;;36320:154;36336:1;36327:5;:10;36320:154;;36364:1;36354:11;;;;;:::i;:::-;;;36431:2;36423:5;:10;;;;:::i;:::-;36410:2;:24;;;;:::i;:::-;36397:39;;36380:6;36387;36380:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;36460:2;36451:11;;;;;:::i;:::-;;;36320:154;;;36498:6;36484:21;;;;;35790:723;;;;:::o;27856:813::-;28048:1;28034:16;;:2;:16;;;28026:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;28121:7;:14;28107:3;:10;:28;28099:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;28193:16;28212:12;:10;:12::i;:::-;28193:31;;28237:66;28258:8;28276:1;28280:2;28284:3;28289:7;28298:4;28237:20;:66::i;:::-;28321:9;28316:103;28340:3;:10;28336:1;:14;28316:103;;;28397:7;28405:1;28397:10;;;;;;;;:::i;:::-;;;;;;;;28372:9;:17;28382:3;28386:1;28382:6;;;;;;;;:::i;:::-;;;;;;;;28372:17;;;;;;;;;;;:21;28390:2;28372:21;;;;;;;;;;;;;;;;:35;;;;;;;:::i;:::-;;;;;;;;28352:3;;;;;:::i;:::-;;;;28316:103;;;;28472:2;28436:53;;28468:1;28436:53;;28450:8;28436:53;;;28476:3;28481:7;28436:53;;;;;;;:::i;:::-;;;;;;;;28502:65;28522:8;28540:1;28544:2;28548:3;28553:7;28562:4;28502:19;:65::i;:::-;28580:81;28616:8;28634:1;28638:2;28642:3;28647:7;28656:4;28580:35;:81::i;:::-;28015:654;27856:813;;;;:::o;43779:419::-;44018:1;42300:42;43970:45;;;:49;43966:225;;;42300:42;44041;;;44092:4;44099:8;44041:67;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44036:144;;44155:8;44136:28;;;;;;;;;;;:::i;:::-;;;;;;;;44036:144;43966:225;43779:419;:::o;22069:442::-;22310:12;:10;:12::i;:::-;22302:20;;:4;:20;;;:60;;;;22326:36;22343:4;22349:12;:10;:12::i;:::-;22326:16;:36::i;:::-;22302:60;22280:160;;;;;;;;;;;;:::i;:::-;;;;;;;;;22451:52;22474:4;22480:2;22484:3;22489:7;22498:4;22451:22;:52::i;:::-;22069:442;;;;;:::o;17023:98::-;17076:7;17103:10;17096:17;;17023:98;:::o;39793:191::-;39867:16;39886:6;;;;;;;;;;;39867:25;;39912:8;39903:6;;:17;;;;;;;;;;;;;;;;;;39967:8;39936:40;;39957:8;39936:40;;;;;;;;;;;;39856:128;39793:191;:::o;22975:974::-;23177:1;23163:16;;:2;:16;;;23155:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;23234:16;23253:12;:10;:12::i;:::-;23234:31;;23276:20;23299:21;23317:2;23299:17;:21::i;:::-;23276:44;;23331:24;23358:25;23376:6;23358:17;:25::i;:::-;23331:52;;23396:60;23417:8;23427:4;23433:2;23437:3;23442:7;23451:4;23396:20;:60::i;:::-;23469:19;23491:9;:13;23501:2;23491:13;;;;;;;;;;;:19;23505:4;23491:19;;;;;;;;;;;;;;;;23469:41;;23544:6;23529:11;:21;;23521:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;23669:6;23655:11;:20;23633:9;:13;23643:2;23633:13;;;;;;;;;;;:19;23647:4;23633:19;;;;;;;;;;;;;;;:42;;;;23718:6;23697:9;:13;23707:2;23697:13;;;;;;;;;;;:17;23711:2;23697:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;23773:2;23742:46;;23767:4;23742:46;;23757:8;23742:46;;;23777:2;23781:6;23742:46;;;;;;;:::i;:::-;;;;;;;;23801:59;23821:8;23831:4;23837:2;23841:3;23846:7;23855:4;23801:19;:59::i;:::-;23873:68;23904:8;23914:4;23920:2;23924;23928:6;23936:4;23873:30;:68::i;:::-;23144:805;;;;22975:974;;;;;:::o;21124:155::-;21219:52;21238:12;:10;:12::i;:::-;21252:8;21262;21219:18;:52::i;:::-;21124:155;;:::o;21591:401::-;21807:12;:10;:12::i;:::-;21799:20;;:4;:20;;;:60;;;;21823:36;21840:4;21846:12;:10;:12::i;:::-;21823:16;:36::i;:::-;21799:60;21777:151;;;;;;;;;;;;:::i;:::-;;;;;;;;;21939:45;21957:4;21963:2;21967;21971:6;21979:4;21939:17;:45::i;:::-;21591:401;;;;;:::o;32328:221::-;;;;;;;:::o;33504:220::-;;;;;;;:::o;34484:813::-;34724:15;:2;:13;;;:15::i;:::-;34720:570;;;34777:2;34760:43;;;34804:8;34814:4;34820:3;34825:7;34834:4;34760:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;34756:523;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;35152:6;35145:14;;;;;;;;;;;:::i;:::-;;;;;;;;34756:523;;;35201:62;;;;;;;;;;:::i;:::-;;;;;;;;34756:523;34933:48;;;34921:60;;;:8;:60;;;;34917:159;;35006:50;;;;;;;;;;:::i;:::-;;;;;;;;34917:159;34840:251;34720:570;34484:813;;;;;;:::o;24307:1146::-;24534:7;:14;24520:3;:10;:28;24512:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;24626:1;24612:16;;:2;:16;;;24604:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;24683:16;24702:12;:10;:12::i;:::-;24683:31;;24727:60;24748:8;24758:4;24764:2;24768:3;24773:7;24782:4;24727:20;:60::i;:::-;24805:9;24800:421;24824:3;:10;24820:1;:14;24800:421;;;24856:10;24869:3;24873:1;24869:6;;;;;;;;:::i;:::-;;;;;;;;24856:19;;24890:14;24907:7;24915:1;24907:10;;;;;;;;:::i;:::-;;;;;;;;24890:27;;24934:19;24956:9;:13;24966:2;24956:13;;;;;;;;;;;:19;24970:4;24956:19;;;;;;;;;;;;;;;;24934:41;;25013:6;24998:11;:21;;24990:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;25146:6;25132:11;:20;25110:9;:13;25120:2;25110:13;;;;;;;;;;;:19;25124:4;25110:19;;;;;;;;;;;;;;;:42;;;;25203:6;25182:9;:13;25192:2;25182:13;;;;;;;;;;;:17;25196:2;25182:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;24841:380;;;24836:3;;;;:::i;:::-;;;24800:421;;;;25268:2;25238:47;;25262:4;25238:47;;25252:8;25238:47;;;25272:3;25277:7;25238:47;;;;;;;:::i;:::-;;;;;;;;25298:59;25318:8;25328:4;25334:2;25338:3;25343:7;25352:4;25298:19;:59::i;:::-;25370:75;25406:8;25416:4;25422:2;25426:3;25431:7;25440:4;25370:35;:75::i;:::-;24501:952;24307:1146;;;;;:::o;35305:198::-;35371:16;35400:22;35439:1;35425:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35400:41;;35463:7;35452:5;35458:1;35452:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;35490:5;35483:12;;;35305:198;;;:::o;33732:744::-;33947:15;:2;:13;;;:15::i;:::-;33943:526;;;34000:2;33983:38;;;34022:8;34032:4;34038:2;34042:6;34050:4;33983:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;33979:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;34331:6;34324:14;;;;;;;;;;;:::i;:::-;;;;;;;;33979:479;;;34380:62;;;;;;;;;;:::i;:::-;;;;;;;;33979:479;34117:43;;;34105:55;;;:8;:55;;;;34101:154;;34185:50;;;;;;;;;;:::i;:::-;;;;;;;;34101:154;34056:214;33943:526;33732:744;;;;;;:::o;31041:331::-;31196:8;31187:17;;:5;:17;;;31179:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;31299:8;31261:18;:25;31280:5;31261:25;;;;;;;;;;;;;;;:35;31287:8;31261:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31345:8;31323:41;;31338:5;31323:41;;;31355:8;31323:41;;;;;;:::i;:::-;;;;;;;;31041:331;;;:::o;9159:326::-;9219:4;9476:1;9454:7;:19;;;:23;9447:30;;9159:326;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:126;371:7;411:42;404:5;400:54;389:65;;334:126;;;:::o;466:96::-;503:7;532:24;550:5;532:24;:::i;:::-;521:35;;466:96;;;:::o;568:122::-;641:24;659:5;641:24;:::i;:::-;634:5;631:35;621:63;;680:1;677;670:12;621:63;568:122;:::o;696:139::-;742:5;780:6;767:20;758:29;;796:33;823:5;796:33;:::i;:::-;696:139;;;;:::o;841:77::-;878:7;907:5;896:16;;841:77;;;:::o;924:122::-;997:24;1015:5;997:24;:::i;:::-;990:5;987:35;977:63;;1036:1;1033;1026:12;977:63;924:122;:::o;1052:139::-;1098:5;1136:6;1123:20;1114:29;;1152:33;1179:5;1152:33;:::i;:::-;1052:139;;;;:::o;1197:474::-;1265:6;1273;1322:2;1310:9;1301:7;1297:23;1293:32;1290:119;;;1328:79;;:::i;:::-;1290:119;1448:1;1473:53;1518:7;1509:6;1498:9;1494:22;1473:53;:::i;:::-;1463:63;;1419:117;1575:2;1601:53;1646:7;1637:6;1626:9;1622:22;1601:53;:::i;:::-;1591:63;;1546:118;1197:474;;;;;:::o;1677:118::-;1764:24;1782:5;1764:24;:::i;:::-;1759:3;1752:37;1677:118;;:::o;1801:222::-;1894:4;1932:2;1921:9;1917:18;1909:26;;1945:71;2013:1;2002:9;1998:17;1989:6;1945:71;:::i;:::-;1801:222;;;;:::o;2029:149::-;2065:7;2105:66;2098:5;2094:78;2083:89;;2029:149;;;:::o;2184:120::-;2256:23;2273:5;2256:23;:::i;:::-;2249:5;2246:34;2236:62;;2294:1;2291;2284:12;2236:62;2184:120;:::o;2310:137::-;2355:5;2393:6;2380:20;2371:29;;2409:32;2435:5;2409:32;:::i;:::-;2310:137;;;;:::o;2453:327::-;2511:6;2560:2;2548:9;2539:7;2535:23;2531:32;2528:119;;;2566:79;;:::i;:::-;2528:119;2686:1;2711:52;2755:7;2746:6;2735:9;2731:22;2711:52;:::i;:::-;2701:62;;2657:116;2453:327;;;;:::o;2786:90::-;2820:7;2863:5;2856:13;2849:21;2838:32;;2786:90;;;:::o;2882:109::-;2963:21;2978:5;2963:21;:::i;:::-;2958:3;2951:34;2882:109;;:::o;2997:210::-;3084:4;3122:2;3111:9;3107:18;3099:26;;3135:65;3197:1;3186:9;3182:17;3173:6;3135:65;:::i;:::-;2997:210;;;;:::o;3213:99::-;3265:6;3299:5;3293:12;3283:22;;3213:99;;;:::o;3318:169::-;3402:11;3436:6;3431:3;3424:19;3476:4;3471:3;3467:14;3452:29;;3318:169;;;;:::o;3493:246::-;3574:1;3584:113;3598:6;3595:1;3592:13;3584:113;;;3683:1;3678:3;3674:11;3668:18;3664:1;3659:3;3655:11;3648:39;3620:2;3617:1;3613:10;3608:15;;3584:113;;;3731:1;3722:6;3717:3;3713:16;3706:27;3555:184;3493:246;;;:::o;3745:102::-;3786:6;3837:2;3833:7;3828:2;3821:5;3817:14;3813:28;3803:38;;3745:102;;;:::o;3853:377::-;3941:3;3969:39;4002:5;3969:39;:::i;:::-;4024:71;4088:6;4083:3;4024:71;:::i;:::-;4017:78;;4104:65;4162:6;4157:3;4150:4;4143:5;4139:16;4104:65;:::i;:::-;4194:29;4216:6;4194:29;:::i;:::-;4189:3;4185:39;4178:46;;3945:285;3853:377;;;;:::o;4236:313::-;4349:4;4387:2;4376:9;4372:18;4364:26;;4436:9;4430:4;4426:20;4422:1;4411:9;4407:17;4400:47;4464:78;4537:4;4528:6;4464:78;:::i;:::-;4456:86;;4236:313;;;;:::o;4555:329::-;4614:6;4663:2;4651:9;4642:7;4638:23;4634:32;4631:119;;;4669:79;;:::i;:::-;4631:119;4789:1;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4760:117;4555:329;;;;:::o;4890:117::-;4999:1;4996;4989:12;5013:180;5061:77;5058:1;5051:88;5158:4;5155:1;5148:15;5182:4;5179:1;5172:15;5199:281;5282:27;5304:4;5282:27;:::i;:::-;5274:6;5270:40;5412:6;5400:10;5397:22;5376:18;5364:10;5361:34;5358:62;5355:88;;;5423:18;;:::i;:::-;5355:88;5463:10;5459:2;5452:22;5242:238;5199:281;;:::o;5486:129::-;5520:6;5547:20;;:::i;:::-;5537:30;;5576:33;5604:4;5596:6;5576:33;:::i;:::-;5486:129;;;:::o;5621:311::-;5698:4;5788:18;5780:6;5777:30;5774:56;;;5810:18;;:::i;:::-;5774:56;5860:4;5852:6;5848:17;5840:25;;5920:4;5914;5910:15;5902:23;;5621:311;;;:::o;5938:117::-;6047:1;6044;6037:12;6078:710;6174:5;6199:81;6215:64;6272:6;6215:64;:::i;:::-;6199:81;:::i;:::-;6190:90;;6300:5;6329:6;6322:5;6315:21;6363:4;6356:5;6352:16;6345:23;;6416:4;6408:6;6404:17;6396:6;6392:30;6445:3;6437:6;6434:15;6431:122;;;6464:79;;:::i;:::-;6431:122;6579:6;6562:220;6596:6;6591:3;6588:15;6562:220;;;6671:3;6700:37;6733:3;6721:10;6700:37;:::i;:::-;6695:3;6688:50;6767:4;6762:3;6758:14;6751:21;;6638:144;6622:4;6617:3;6613:14;6606:21;;6562:220;;;6566:21;6180:608;;6078:710;;;;;:::o;6811:370::-;6882:5;6931:3;6924:4;6916:6;6912:17;6908:27;6898:122;;6939:79;;:::i;:::-;6898:122;7056:6;7043:20;7081:94;7171:3;7163:6;7156:4;7148:6;7144:17;7081:94;:::i;:::-;7072:103;;6888:293;6811:370;;;;:::o;7187:117::-;7296:1;7293;7286:12;7310:307;7371:4;7461:18;7453:6;7450:30;7447:56;;;7483:18;;:::i;:::-;7447:56;7521:29;7543:6;7521:29;:::i;:::-;7513:37;;7605:4;7599;7595:15;7587:23;;7310:307;;;:::o;7623:146::-;7720:6;7715:3;7710;7697:30;7761:1;7752:6;7747:3;7743:16;7736:27;7623:146;;;:::o;7775:423::-;7852:5;7877:65;7893:48;7934:6;7893:48;:::i;:::-;7877:65;:::i;:::-;7868:74;;7965:6;7958:5;7951:21;8003:4;7996:5;7992:16;8041:3;8032:6;8027:3;8023:16;8020:25;8017:112;;;8048:79;;:::i;:::-;8017:112;8138:54;8185:6;8180:3;8175;8138:54;:::i;:::-;7858:340;7775:423;;;;;:::o;8217:338::-;8272:5;8321:3;8314:4;8306:6;8302:17;8298:27;8288:122;;8329:79;;:::i;:::-;8288:122;8446:6;8433:20;8471:78;8545:3;8537:6;8530:4;8522:6;8518:17;8471:78;:::i;:::-;8462:87;;8278:277;8217:338;;;;:::o;8561:1363::-;8706:6;8714;8722;8730;8779:3;8767:9;8758:7;8754:23;8750:33;8747:120;;;8786:79;;:::i;:::-;8747:120;8906:1;8931:53;8976:7;8967:6;8956:9;8952:22;8931:53;:::i;:::-;8921:63;;8877:117;9061:2;9050:9;9046:18;9033:32;9092:18;9084:6;9081:30;9078:117;;;9114:79;;:::i;:::-;9078:117;9219:78;9289:7;9280:6;9269:9;9265:22;9219:78;:::i;:::-;9209:88;;9004:303;9374:2;9363:9;9359:18;9346:32;9405:18;9397:6;9394:30;9391:117;;;9427:79;;:::i;:::-;9391:117;9532:78;9602:7;9593:6;9582:9;9578:22;9532:78;:::i;:::-;9522:88;;9317:303;9687:2;9676:9;9672:18;9659:32;9718:18;9710:6;9707:30;9704:117;;;9740:79;;:::i;:::-;9704:117;9845:62;9899:7;9890:6;9879:9;9875:22;9845:62;:::i;:::-;9835:72;;9630:287;8561:1363;;;;;;;:::o;9930:1509::-;10084:6;10092;10100;10108;10116;10165:3;10153:9;10144:7;10140:23;10136:33;10133:120;;;10172:79;;:::i;:::-;10133:120;10292:1;10317:53;10362:7;10353:6;10342:9;10338:22;10317:53;:::i;:::-;10307:63;;10263:117;10419:2;10445:53;10490:7;10481:6;10470:9;10466:22;10445:53;:::i;:::-;10435:63;;10390:118;10575:2;10564:9;10560:18;10547:32;10606:18;10598:6;10595:30;10592:117;;;10628:79;;:::i;:::-;10592:117;10733:78;10803:7;10794:6;10783:9;10779:22;10733:78;:::i;:::-;10723:88;;10518:303;10888:2;10877:9;10873:18;10860:32;10919:18;10911:6;10908:30;10905:117;;;10941:79;;:::i;:::-;10905:117;11046:78;11116:7;11107:6;11096:9;11092:22;11046:78;:::i;:::-;11036:88;;10831:303;11201:3;11190:9;11186:19;11173:33;11233:18;11225:6;11222:30;11219:117;;;11255:79;;:::i;:::-;11219:117;11360:62;11414:7;11405:6;11394:9;11390:22;11360:62;:::i;:::-;11350:72;;11144:288;9930:1509;;;;;;;;:::o;11445:60::-;11473:3;11494:5;11487:12;;11445:60;;;:::o;11511:142::-;11561:9;11594:53;11612:34;11621:24;11639:5;11621:24;:::i;:::-;11612:34;:::i;:::-;11594:53;:::i;:::-;11581:66;;11511:142;;;:::o;11659:126::-;11709:9;11742:37;11773:5;11742:37;:::i;:::-;11729:50;;11659:126;;;:::o;11791:158::-;11873:9;11906:37;11937:5;11906:37;:::i;:::-;11893:50;;11791:158;;;:::o;11955:195::-;12074:69;12137:5;12074:69;:::i;:::-;12069:3;12062:82;11955:195;;:::o;12156:286::-;12281:4;12319:2;12308:9;12304:18;12296:26;;12332:103;12432:1;12421:9;12417:17;12408:6;12332:103;:::i;:::-;12156:286;;;;:::o;12448:311::-;12525:4;12615:18;12607:6;12604:30;12601:56;;;12637:18;;:::i;:::-;12601:56;12687:4;12679:6;12675:17;12667:25;;12747:4;12741;12737:15;12729:23;;12448:311;;;:::o;12782:710::-;12878:5;12903:81;12919:64;12976:6;12919:64;:::i;:::-;12903:81;:::i;:::-;12894:90;;13004:5;13033:6;13026:5;13019:21;13067:4;13060:5;13056:16;13049:23;;13120:4;13112:6;13108:17;13100:6;13096:30;13149:3;13141:6;13138:15;13135:122;;;13168:79;;:::i;:::-;13135:122;13283:6;13266:220;13300:6;13295:3;13292:15;13266:220;;;13375:3;13404:37;13437:3;13425:10;13404:37;:::i;:::-;13399:3;13392:50;13471:4;13466:3;13462:14;13455:21;;13342:144;13326:4;13321:3;13317:14;13310:21;;13266:220;;;13270:21;12884:608;;12782:710;;;;;:::o;13515:370::-;13586:5;13635:3;13628:4;13620:6;13616:17;13612:27;13602:122;;13643:79;;:::i;:::-;13602:122;13760:6;13747:20;13785:94;13875:3;13867:6;13860:4;13852:6;13848:17;13785:94;:::i;:::-;13776:103;;13592:293;13515:370;;;;:::o;13891:894::-;14009:6;14017;14066:2;14054:9;14045:7;14041:23;14037:32;14034:119;;;14072:79;;:::i;:::-;14034:119;14220:1;14209:9;14205:17;14192:31;14250:18;14242:6;14239:30;14236:117;;;14272:79;;:::i;:::-;14236:117;14377:78;14447:7;14438:6;14427:9;14423:22;14377:78;:::i;:::-;14367:88;;14163:302;14532:2;14521:9;14517:18;14504:32;14563:18;14555:6;14552:30;14549:117;;;14585:79;;:::i;:::-;14549:117;14690:78;14760:7;14751:6;14740:9;14736:22;14690:78;:::i;:::-;14680:88;;14475:303;13891:894;;;;;:::o;14791:114::-;14858:6;14892:5;14886:12;14876:22;;14791:114;;;:::o;14911:184::-;15010:11;15044:6;15039:3;15032:19;15084:4;15079:3;15075:14;15060:29;;14911:184;;;;:::o;15101:132::-;15168:4;15191:3;15183:11;;15221:4;15216:3;15212:14;15204:22;;15101:132;;;:::o;15239:108::-;15316:24;15334:5;15316:24;:::i;:::-;15311:3;15304:37;15239:108;;:::o;15353:179::-;15422:10;15443:46;15485:3;15477:6;15443:46;:::i;:::-;15521:4;15516:3;15512:14;15498:28;;15353:179;;;;:::o;15538:113::-;15608:4;15640;15635:3;15631:14;15623:22;;15538:113;;;:::o;15687:732::-;15806:3;15835:54;15883:5;15835:54;:::i;:::-;15905:86;15984:6;15979:3;15905:86;:::i;:::-;15898:93;;16015:56;16065:5;16015:56;:::i;:::-;16094:7;16125:1;16110:284;16135:6;16132:1;16129:13;16110:284;;;16211:6;16205:13;16238:63;16297:3;16282:13;16238:63;:::i;:::-;16231:70;;16324:60;16377:6;16324:60;:::i;:::-;16314:70;;16170:224;16157:1;16154;16150:9;16145:14;;16110:284;;;16114:14;16410:3;16403:10;;15811:608;;;15687:732;;;;:::o;16425:373::-;16568:4;16606:2;16595:9;16591:18;16583:26;;16655:9;16649:4;16645:20;16641:1;16630:9;16626:17;16619:47;16683:108;16786:4;16777:6;16683:108;:::i;:::-;16675:116;;16425:373;;;;:::o;16804:308::-;16866:4;16956:18;16948:6;16945:30;16942:56;;;16978:18;;:::i;:::-;16942:56;17016:29;17038:6;17016:29;:::i;:::-;17008:37;;17100:4;17094;17090:15;17082:23;;16804:308;;;:::o;17118:425::-;17196:5;17221:66;17237:49;17279:6;17237:49;:::i;:::-;17221:66;:::i;:::-;17212:75;;17310:6;17303:5;17296:21;17348:4;17341:5;17337:16;17386:3;17377:6;17372:3;17368:16;17365:25;17362:112;;;17393:79;;:::i;:::-;17362:112;17483:54;17530:6;17525:3;17520;17483:54;:::i;:::-;17202:341;17118:425;;;;;:::o;17563:340::-;17619:5;17668:3;17661:4;17653:6;17649:17;17645:27;17635:122;;17676:79;;:::i;:::-;17635:122;17793:6;17780:20;17818:79;17893:3;17885:6;17878:4;17870:6;17866:17;17818:79;:::i;:::-;17809:88;;17625:278;17563:340;;;;:::o;17909:509::-;17978:6;18027:2;18015:9;18006:7;18002:23;17998:32;17995:119;;;18033:79;;:::i;:::-;17995:119;18181:1;18170:9;18166:17;18153:31;18211:18;18203:6;18200:30;18197:117;;;18233:79;;:::i;:::-;18197:117;18338:63;18393:7;18384:6;18373:9;18369:22;18338:63;:::i;:::-;18328:73;;18124:287;17909:509;;;;:::o;18424:118::-;18511:24;18529:5;18511:24;:::i;:::-;18506:3;18499:37;18424:118;;:::o;18548:222::-;18641:4;18679:2;18668:9;18664:18;18656:26;;18692:71;18760:1;18749:9;18745:17;18736:6;18692:71;:::i;:::-;18548:222;;;;:::o;18776:1089::-;18880:6;18888;18896;18904;18912;18961:3;18949:9;18940:7;18936:23;18932:33;18929:120;;;18968:79;;:::i;:::-;18929:120;19088:1;19113:53;19158:7;19149:6;19138:9;19134:22;19113:53;:::i;:::-;19103:63;;19059:117;19215:2;19241:53;19286:7;19277:6;19266:9;19262:22;19241:53;:::i;:::-;19231:63;;19186:118;19343:2;19369:53;19414:7;19405:6;19394:9;19390:22;19369:53;:::i;:::-;19359:63;;19314:118;19471:2;19497:53;19542:7;19533:6;19522:9;19518:22;19497:53;:::i;:::-;19487:63;;19442:118;19627:3;19616:9;19612:19;19599:33;19659:18;19651:6;19648:30;19645:117;;;19681:79;;:::i;:::-;19645:117;19786:62;19840:7;19831:6;19820:9;19816:22;19786:62;:::i;:::-;19776:72;;19570:288;18776:1089;;;;;;;;:::o;19871:116::-;19941:21;19956:5;19941:21;:::i;:::-;19934:5;19931:32;19921:60;;19977:1;19974;19967:12;19921:60;19871:116;:::o;19993:133::-;20036:5;20074:6;20061:20;20052:29;;20090:30;20114:5;20090:30;:::i;:::-;19993:133;;;;:::o;20132:468::-;20197:6;20205;20254:2;20242:9;20233:7;20229:23;20225:32;20222:119;;;20260:79;;:::i;:::-;20222:119;20380:1;20405:53;20450:7;20441:6;20430:9;20426:22;20405:53;:::i;:::-;20395:63;;20351:117;20507:2;20533:50;20575:7;20566:6;20555:9;20551:22;20533:50;:::i;:::-;20523:60;;20478:115;20132:468;;;;;:::o;20606:474::-;20674:6;20682;20731:2;20719:9;20710:7;20706:23;20702:32;20699:119;;;20737:79;;:::i;:::-;20699:119;20857:1;20882:53;20927:7;20918:6;20907:9;20903:22;20882:53;:::i;:::-;20872:63;;20828:117;20984:2;21010:53;21055:7;21046:6;21035:9;21031:22;21010:53;:::i;:::-;21000:63;;20955:118;20606:474;;;;;:::o;21086:329::-;21145:6;21194:2;21182:9;21173:7;21169:23;21165:32;21162:119;;;21200:79;;:::i;:::-;21162:119;21320:1;21345:53;21390:7;21381:6;21370:9;21366:22;21345:53;:::i;:::-;21335:63;;21291:117;21086:329;;;;:::o;21421:180::-;21469:77;21466:1;21459:88;21566:4;21563:1;21556:15;21590:4;21587:1;21580:15;21607:320;21651:6;21688:1;21682:4;21678:12;21668:22;;21735:1;21729:4;21725:12;21756:18;21746:81;;21812:4;21804:6;21800:17;21790:27;;21746:81;21874:2;21866:6;21863:14;21843:18;21840:38;21837:84;;21893:18;;:::i;:::-;21837:84;21658:269;21607:320;;;:::o;21933:148::-;22035:11;22072:3;22057:18;;21933:148;;;;:::o;22087:141::-;22136:4;22159:3;22151:11;;22182:3;22179:1;22172:14;22216:4;22213:1;22203:18;22195:26;;22087:141;;;:::o;22258:874::-;22361:3;22398:5;22392:12;22427:36;22453:9;22427:36;:::i;:::-;22479:89;22561:6;22556:3;22479:89;:::i;:::-;22472:96;;22599:1;22588:9;22584:17;22615:1;22610:166;;;;22790:1;22785:341;;;;22577:549;;22610:166;22694:4;22690:9;22679;22675:25;22670:3;22663:38;22756:6;22749:14;22742:22;22734:6;22730:35;22725:3;22721:45;22714:52;;22610:166;;22785:341;22852:38;22884:5;22852:38;:::i;:::-;22912:1;22926:154;22940:6;22937:1;22934:13;22926:154;;;23014:7;23008:14;23004:1;22999:3;22995:11;22988:35;23064:1;23055:7;23051:15;23040:26;;22962:4;22959:1;22955:12;22950:17;;22926:154;;;23109:6;23104:3;23100:16;23093:23;;22792:334;;22577:549;;22365:767;;22258:874;;;;:::o;23138:390::-;23244:3;23272:39;23305:5;23272:39;:::i;:::-;23327:89;23409:6;23404:3;23327:89;:::i;:::-;23320:96;;23425:65;23483:6;23478:3;23471:4;23464:5;23460:16;23425:65;:::i;:::-;23515:6;23510:3;23506:16;23499:23;;23248:280;23138:390;;;;:::o;23534:429::-;23711:3;23733:92;23821:3;23812:6;23733:92;:::i;:::-;23726:99;;23842:95;23933:3;23924:6;23842:95;:::i;:::-;23835:102;;23954:3;23947:10;;23534:429;;;;;:::o;23969:269::-;24098:3;24120:92;24208:3;24199:6;24120:92;:::i;:::-;24113:99;;24229:3;24222:10;;23969:269;;;;:::o;24244:167::-;24384:19;24380:1;24372:6;24368:14;24361:43;24244:167;:::o;24417:366::-;24559:3;24580:67;24644:2;24639:3;24580:67;:::i;:::-;24573:74;;24656:93;24745:3;24656:93;:::i;:::-;24774:2;24769:3;24765:12;24758:19;;24417:366;;;:::o;24789:419::-;24955:4;24993:2;24982:9;24978:18;24970:26;;25042:9;25036:4;25032:20;25028:1;25017:9;25013:17;25006:47;25070:131;25196:4;25070:131;:::i;:::-;25062:139;;24789:419;;;:::o;25214:228::-;25354:34;25350:1;25342:6;25338:14;25331:58;25423:11;25418:2;25410:6;25406:15;25399:36;25214:228;:::o;25448:366::-;25590:3;25611:67;25675:2;25670:3;25611:67;:::i;:::-;25604:74;;25687:93;25776:3;25687:93;:::i;:::-;25805:2;25800:3;25796:12;25789:19;;25448:366;;;:::o;25820:419::-;25986:4;26024:2;26013:9;26009:18;26001:26;;26073:9;26067:4;26063:20;26059:1;26048:9;26044:17;26037:47;26101:131;26227:4;26101:131;:::i;:::-;26093:139;;25820:419;;;:::o;26245:180::-;26293:77;26290:1;26283:88;26390:4;26387:1;26380:15;26414:4;26411:1;26404:15;26431:180;26479:77;26476:1;26469:88;26576:4;26573:1;26566:15;26600:4;26597:1;26590:15;26617:233;26656:3;26679:24;26697:5;26679:24;:::i;:::-;26670:33;;26725:66;26718:5;26715:77;26712:103;;26795:18;;:::i;:::-;26712:103;26842:1;26835:5;26831:13;26824:20;;26617:233;;;:::o;26856:182::-;26996:34;26992:1;26984:6;26980:14;26973:58;26856:182;:::o;27044:366::-;27186:3;27207:67;27271:2;27266:3;27207:67;:::i;:::-;27200:74;;27283:93;27372:3;27283:93;:::i;:::-;27401:2;27396:3;27392:12;27385:19;;27044:366;;;:::o;27416:419::-;27582:4;27620:2;27609:9;27605:18;27597:26;;27669:9;27663:4;27659:20;27655:1;27644:9;27640:17;27633:47;27697:131;27823:4;27697:131;:::i;:::-;27689:139;;27416:419;;;:::o;27841:93::-;27878:6;27925:2;27920;27913:5;27909:14;27905:23;27895:33;;27841:93;;;:::o;27940:107::-;27984:8;28034:5;28028:4;28024:16;28003:37;;27940:107;;;;:::o;28053:393::-;28122:6;28172:1;28160:10;28156:18;28195:97;28225:66;28214:9;28195:97;:::i;:::-;28313:39;28343:8;28332:9;28313:39;:::i;:::-;28301:51;;28385:4;28381:9;28374:5;28370:21;28361:30;;28434:4;28424:8;28420:19;28413:5;28410:30;28400:40;;28129:317;;28053:393;;;;;:::o;28452:142::-;28502:9;28535:53;28553:34;28562:24;28580:5;28562:24;:::i;:::-;28553:34;:::i;:::-;28535:53;:::i;:::-;28522:66;;28452:142;;;:::o;28600:75::-;28643:3;28664:5;28657:12;;28600:75;;;:::o;28681:269::-;28791:39;28822:7;28791:39;:::i;:::-;28852:91;28901:41;28925:16;28901:41;:::i;:::-;28893:6;28886:4;28880:11;28852:91;:::i;:::-;28846:4;28839:105;28757:193;28681:269;;;:::o;28956:73::-;29001:3;28956:73;:::o;29035:189::-;29112:32;;:::i;:::-;29153:65;29211:6;29203;29197:4;29153:65;:::i;:::-;29088:136;29035:189;;:::o;29230:186::-;29290:120;29307:3;29300:5;29297:14;29290:120;;;29361:39;29398:1;29391:5;29361:39;:::i;:::-;29334:1;29327:5;29323:13;29314:22;;29290:120;;;29230:186;;:::o;29422:543::-;29523:2;29518:3;29515:11;29512:446;;;29557:38;29589:5;29557:38;:::i;:::-;29641:29;29659:10;29641:29;:::i;:::-;29631:8;29627:44;29824:2;29812:10;29809:18;29806:49;;;29845:8;29830:23;;29806:49;29868:80;29924:22;29942:3;29924:22;:::i;:::-;29914:8;29910:37;29897:11;29868:80;:::i;:::-;29527:431;;29512:446;29422:543;;;:::o;29971:117::-;30025:8;30075:5;30069:4;30065:16;30044:37;;29971:117;;;;:::o;30094:169::-;30138:6;30171:51;30219:1;30215:6;30207:5;30204:1;30200:13;30171:51;:::i;:::-;30167:56;30252:4;30246;30242:15;30232:25;;30145:118;30094:169;;;;:::o;30268:295::-;30344:4;30490:29;30515:3;30509:4;30490:29;:::i;:::-;30482:37;;30552:3;30549:1;30545:11;30539:4;30536:21;30528:29;;30268:295;;;;:::o;30568:1395::-;30685:37;30718:3;30685:37;:::i;:::-;30787:18;30779:6;30776:30;30773:56;;;30809:18;;:::i;:::-;30773:56;30853:38;30885:4;30879:11;30853:38;:::i;:::-;30938:67;30998:6;30990;30984:4;30938:67;:::i;:::-;31032:1;31056:4;31043:17;;31088:2;31080:6;31077:14;31105:1;31100:618;;;;31762:1;31779:6;31776:77;;;31828:9;31823:3;31819:19;31813:26;31804:35;;31776:77;31879:67;31939:6;31932:5;31879:67;:::i;:::-;31873:4;31866:81;31735:222;31070:887;;31100:618;31152:4;31148:9;31140:6;31136:22;31186:37;31218:4;31186:37;:::i;:::-;31245:1;31259:208;31273:7;31270:1;31267:14;31259:208;;;31352:9;31347:3;31343:19;31337:26;31329:6;31322:42;31403:1;31395:6;31391:14;31381:24;;31450:2;31439:9;31435:18;31422:31;;31296:4;31293:1;31289:12;31284:17;;31259:208;;;31495:6;31486:7;31483:19;31480:179;;;31553:9;31548:3;31544:19;31538:26;31596:48;31638:4;31630:6;31626:17;31615:9;31596:48;:::i;:::-;31588:6;31581:64;31503:156;31480:179;31705:1;31701;31693:6;31689:14;31685:22;31679:4;31672:36;31107:611;;;31070:887;;30660:1303;;;30568:1395;;:::o;31969:225::-;32109:34;32105:1;32097:6;32093:14;32086:58;32178:8;32173:2;32165:6;32161:15;32154:33;31969:225;:::o;32200:366::-;32342:3;32363:67;32427:2;32422:3;32363:67;:::i;:::-;32356:74;;32439:93;32528:3;32439:93;:::i;:::-;32557:2;32552:3;32548:12;32541:19;;32200:366;;;:::o;32572:419::-;32738:4;32776:2;32765:9;32761:18;32753:26;;32825:9;32819:4;32815:20;32811:1;32800:9;32796:17;32789:47;32853:131;32979:4;32853:131;:::i;:::-;32845:139;;32572:419;;;:::o;32997:230::-;33137:34;33133:1;33125:6;33121:14;33114:58;33206:13;33201:2;33193:6;33189:15;33182:38;32997:230;:::o;33233:366::-;33375:3;33396:67;33460:2;33455:3;33396:67;:::i;:::-;33389:74;;33472:93;33561:3;33472:93;:::i;:::-;33590:2;33585:3;33581:12;33574:19;;33233:366;;;:::o;33605:419::-;33771:4;33809:2;33798:9;33794:18;33786:26;;33858:9;33852:4;33848:20;33844:1;33833:9;33829:17;33822:47;33886:131;34012:4;33886:131;:::i;:::-;33878:139;;33605:419;;;:::o;34030:180::-;34078:77;34075:1;34068:88;34175:4;34172:1;34165:15;34199:4;34196:1;34189:15;34216:185;34256:1;34273:20;34291:1;34273:20;:::i;:::-;34268:25;;34307:20;34325:1;34307:20;:::i;:::-;34302:25;;34346:1;34336:35;;34351:18;;:::i;:::-;34336:35;34393:1;34390;34386:9;34381:14;;34216:185;;;;:::o;34407:194::-;34447:4;34467:20;34485:1;34467:20;:::i;:::-;34462:25;;34501:20;34519:1;34501:20;:::i;:::-;34496:25;;34545:1;34542;34538:9;34530:17;;34569:1;34563:4;34560:11;34557:37;;;34574:18;;:::i;:::-;34557:37;34407:194;;;;:::o;34607:176::-;34639:1;34656:20;34674:1;34656:20;:::i;:::-;34651:25;;34690:20;34708:1;34690:20;:::i;:::-;34685:25;;34729:1;34719:35;;34734:18;;:::i;:::-;34719:35;34775:1;34772;34768:9;34763:14;;34607:176;;;;:::o;34789:191::-;34829:3;34848:20;34866:1;34848:20;:::i;:::-;34843:25;;34882:20;34900:1;34882:20;:::i;:::-;34877:25;;34925:1;34922;34918:9;34911:16;;34946:3;34943:1;34940:10;34937:36;;;34953:18;;:::i;:::-;34937:36;34789:191;;;;:::o;34986:220::-;35126:34;35122:1;35114:6;35110:14;35103:58;35195:3;35190:2;35182:6;35178:15;35171:28;34986:220;:::o;35212:366::-;35354:3;35375:67;35439:2;35434:3;35375:67;:::i;:::-;35368:74;;35451:93;35540:3;35451:93;:::i;:::-;35569:2;35564:3;35560:12;35553:19;;35212:366;;;:::o;35584:419::-;35750:4;35788:2;35777:9;35773:18;35765:26;;35837:9;35831:4;35827:20;35823:1;35812:9;35808:17;35801:47;35865:131;35991:4;35865:131;:::i;:::-;35857:139;;35584:419;;;:::o;36009:227::-;36149:34;36145:1;36137:6;36133:14;36126:58;36218:10;36213:2;36205:6;36201:15;36194:35;36009:227;:::o;36242:366::-;36384:3;36405:67;36469:2;36464:3;36405:67;:::i;:::-;36398:74;;36481:93;36570:3;36481:93;:::i;:::-;36599:2;36594:3;36590:12;36583:19;;36242:366;;;:::o;36614:419::-;36780:4;36818:2;36807:9;36803:18;36795:26;;36867:9;36861:4;36857:20;36853:1;36842:9;36838:17;36831:47;36895:131;37021:4;36895:131;:::i;:::-;36887:139;;36614:419;;;:::o;37039:634::-;37260:4;37298:2;37287:9;37283:18;37275:26;;37347:9;37341:4;37337:20;37333:1;37322:9;37318:17;37311:47;37375:108;37478:4;37469:6;37375:108;:::i;:::-;37367:116;;37530:9;37524:4;37520:20;37515:2;37504:9;37500:18;37493:48;37558:108;37661:4;37652:6;37558:108;:::i;:::-;37550:116;;37039:634;;;;;:::o;37679:332::-;37800:4;37838:2;37827:9;37823:18;37815:26;;37851:71;37919:1;37908:9;37904:17;37895:6;37851:71;:::i;:::-;37932:72;38000:2;37989:9;37985:18;37976:6;37932:72;:::i;:::-;37679:332;;;;;:::o;38017:137::-;38071:5;38102:6;38096:13;38087:22;;38118:30;38142:5;38118:30;:::i;:::-;38017:137;;;;:::o;38160:345::-;38227:6;38276:2;38264:9;38255:7;38251:23;38247:32;38244:119;;;38282:79;;:::i;:::-;38244:119;38402:1;38427:61;38480:7;38471:6;38460:9;38456:22;38427:61;:::i;:::-;38417:71;;38373:125;38160:345;;;;:::o;38511:237::-;38651:34;38647:1;38639:6;38635:14;38628:58;38720:20;38715:2;38707:6;38703:15;38696:45;38511:237;:::o;38754:366::-;38896:3;38917:67;38981:2;38976:3;38917:67;:::i;:::-;38910:74;;38993:93;39082:3;38993:93;:::i;:::-;39111:2;39106:3;39102:12;39095:19;;38754:366;;;:::o;39126:419::-;39292:4;39330:2;39319:9;39315:18;39307:26;;39379:9;39373:4;39369:20;39365:1;39354:9;39350:17;39343:47;39407:131;39533:4;39407:131;:::i;:::-;39399:139;;39126:419;;;:::o;39551:224::-;39691:34;39687:1;39679:6;39675:14;39668:58;39760:7;39755:2;39747:6;39743:15;39736:32;39551:224;:::o;39781:366::-;39923:3;39944:67;40008:2;40003:3;39944:67;:::i;:::-;39937:74;;40020:93;40109:3;40020:93;:::i;:::-;40138:2;40133:3;40129:12;40122:19;;39781:366;;;:::o;40153:419::-;40319:4;40357:2;40346:9;40342:18;40334:26;;40406:9;40400:4;40396:20;40392:1;40381:9;40377:17;40370:47;40434:131;40560:4;40434:131;:::i;:::-;40426:139;;40153:419;;;:::o;40578:229::-;40718:34;40714:1;40706:6;40702:14;40695:58;40787:12;40782:2;40774:6;40770:15;40763:37;40578:229;:::o;40813:366::-;40955:3;40976:67;41040:2;41035:3;40976:67;:::i;:::-;40969:74;;41052:93;41141:3;41052:93;:::i;:::-;41170:2;41165:3;41161:12;41154:19;;40813:366;;;:::o;41185:419::-;41351:4;41389:2;41378:9;41374:18;41366:26;;41438:9;41432:4;41428:20;41424:1;41413:9;41409:17;41402:47;41466:131;41592:4;41466:131;:::i;:::-;41458:139;;41185:419;;;:::o;41610:332::-;41731:4;41769:2;41758:9;41754:18;41746:26;;41782:71;41850:1;41839:9;41835:17;41826:6;41782:71;:::i;:::-;41863:72;41931:2;41920:9;41916:18;41907:6;41863:72;:::i;:::-;41610:332;;;;;:::o;41948:228::-;42088:34;42084:1;42076:6;42072:14;42065:58;42157:11;42152:2;42144:6;42140:15;42133:36;41948:228;:::o;42182:366::-;42324:3;42345:67;42409:2;42404:3;42345:67;:::i;:::-;42338:74;;42421:93;42510:3;42421:93;:::i;:::-;42539:2;42534:3;42530:12;42523:19;;42182:366;;;:::o;42554:419::-;42720:4;42758:2;42747:9;42743:18;42735:26;;42807:9;42801:4;42797:20;42793:1;42782:9;42778:17;42771:47;42835:131;42961:4;42835:131;:::i;:::-;42827:139;;42554:419;;;:::o;42979:98::-;43030:6;43064:5;43058:12;43048:22;;42979:98;;;:::o;43083:168::-;43166:11;43200:6;43195:3;43188:19;43240:4;43235:3;43231:14;43216:29;;43083:168;;;;:::o;43257:373::-;43343:3;43371:38;43403:5;43371:38;:::i;:::-;43425:70;43488:6;43483:3;43425:70;:::i;:::-;43418:77;;43504:65;43562:6;43557:3;43550:4;43543:5;43539:16;43504:65;:::i;:::-;43594:29;43616:6;43594:29;:::i;:::-;43589:3;43585:39;43578:46;;43347:283;43257:373;;;;:::o;43636:1053::-;43959:4;43997:3;43986:9;43982:19;43974:27;;44011:71;44079:1;44068:9;44064:17;44055:6;44011:71;:::i;:::-;44092:72;44160:2;44149:9;44145:18;44136:6;44092:72;:::i;:::-;44211:9;44205:4;44201:20;44196:2;44185:9;44181:18;44174:48;44239:108;44342:4;44333:6;44239:108;:::i;:::-;44231:116;;44394:9;44388:4;44384:20;44379:2;44368:9;44364:18;44357:48;44422:108;44525:4;44516:6;44422:108;:::i;:::-;44414:116;;44578:9;44572:4;44568:20;44562:3;44551:9;44547:19;44540:49;44606:76;44677:4;44668:6;44606:76;:::i;:::-;44598:84;;43636:1053;;;;;;;;:::o;44695:141::-;44751:5;44782:6;44776:13;44767:22;;44798:32;44824:5;44798:32;:::i;:::-;44695:141;;;;:::o;44842:349::-;44911:6;44960:2;44948:9;44939:7;44935:23;44931:32;44928:119;;;44966:79;;:::i;:::-;44928:119;45086:1;45111:63;45166:7;45157:6;45146:9;45142:22;45111:63;:::i;:::-;45101:73;;45057:127;44842:349;;;;:::o;45197:106::-;45241:8;45290:5;45285:3;45281:15;45260:36;;45197:106;;;:::o;45309:183::-;45344:3;45382:1;45364:16;45361:23;45358:128;;;45420:1;45417;45414;45399:23;45442:34;45473:1;45467:8;45442:34;:::i;:::-;45435:41;;45358:128;45309:183;:::o;45498:711::-;45537:3;45575:4;45557:16;45554:26;45583:5;45551:39;45612:20;;:::i;:::-;45687:1;45669:16;45665:24;45662:1;45656:4;45641:49;45720:4;45714:11;45819:16;45812:4;45804:6;45800:17;45797:39;45764:18;45756:6;45753:30;45737:113;45734:146;;;45865:5;;;;45734:146;45911:6;45905:4;45901:17;45947:3;45941:10;45974:18;45966:6;45963:30;45960:43;;;45996:5;;;;;;45960:43;46044:6;46037:4;46032:3;46028:14;46024:27;46103:1;46085:16;46081:24;46075:4;46071:35;46066:3;46063:44;46060:57;;;46110:5;;;;;;;46060:57;46127;46175:6;46169:4;46165:17;46157:6;46153:30;46147:4;46127:57;:::i;:::-;46200:3;46193:10;;45541:668;;;;;45498:711;;:::o;46215:239::-;46355:34;46351:1;46343:6;46339:14;46332:58;46424:22;46419:2;46411:6;46407:15;46400:47;46215:239;:::o;46460:366::-;46602:3;46623:67;46687:2;46682:3;46623:67;:::i;:::-;46616:74;;46699:93;46788:3;46699:93;:::i;:::-;46817:2;46812:3;46808:12;46801:19;;46460:366;;;:::o;46832:419::-;46998:4;47036:2;47025:9;47021:18;47013:26;;47085:9;47079:4;47075:20;47071:1;47060:9;47056:17;47049:47;47113:131;47239:4;47113:131;:::i;:::-;47105:139;;46832:419;;;:::o;47257:227::-;47397:34;47393:1;47385:6;47381:14;47374:58;47466:10;47461:2;47453:6;47449:15;47442:35;47257:227;:::o;47490:366::-;47632:3;47653:67;47717:2;47712:3;47653:67;:::i;:::-;47646:74;;47729:93;47818:3;47729:93;:::i;:::-;47847:2;47842:3;47838:12;47831:19;;47490:366;;;:::o;47862:419::-;48028:4;48066:2;48055:9;48051:18;48043:26;;48115:9;48109:4;48105:20;48101:1;48090:9;48086:17;48079:47;48143:131;48269:4;48143:131;:::i;:::-;48135:139;;47862:419;;;:::o;48287:751::-;48510:4;48548:3;48537:9;48533:19;48525:27;;48562:71;48630:1;48619:9;48615:17;48606:6;48562:71;:::i;:::-;48643:72;48711:2;48700:9;48696:18;48687:6;48643:72;:::i;:::-;48725;48793:2;48782:9;48778:18;48769:6;48725:72;:::i;:::-;48807;48875:2;48864:9;48860:18;48851:6;48807:72;:::i;:::-;48927:9;48921:4;48917:20;48911:3;48900:9;48896:19;48889:49;48955:76;49026:4;49017:6;48955:76;:::i;:::-;48947:84;;48287:751;;;;;;;;:::o;49044:228::-;49184:34;49180:1;49172:6;49168:14;49161:58;49253:11;49248:2;49240:6;49236:15;49229:36;49044:228;:::o;49278:366::-;49420:3;49441:67;49505:2;49500:3;49441:67;:::i;:::-;49434:74;;49517:93;49606:3;49517:93;:::i;:::-;49635:2;49630:3;49626:12;49619:19;;49278:366;;;:::o;49650:419::-;49816:4;49854:2;49843:9;49839:18;49831:26;;49903:9;49897:4;49893:20;49889:1;49878:9;49874:17;49867:47;49931:131;50057:4;49931:131;:::i;:::-;49923:139;;49650:419;;;:::o

Swarm Source

ipfs://1a24dd852b72553e88c546bb2706c415afb66eccdf65fc9c63053a488bec57d6
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.