ETH Price: $3,280.13 (+1.08%)

Token

Turtle People Yatch Club (TPYC)
 

Overview

Max Total Supply

21 TPYC

Holders

15

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 TPYC
0x531a0dd30906366fa738acc2d48e790de54bd33e
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:
TurtlePeopleYC

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-11-13
*/

/**
 *Submitted for verification at Etherscan.io on 2021-11-01
*/

// SPDX-License-Identifier: GPL-3.0

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

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol
pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165[EIP].
 *
 * Implementers can declare support of contract interfaces, which can then be
 * queried by others ({ERC165Checker}).
 *
 * For an implementation, see {ERC165}.
 */
interface IERC165 {
    /**
     * @dev Returns true if this contract implements the interface defined by
     * `interfaceId`. See the corresponding
     * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]
     * to learn more about how these ids are created.
     *
     * This function call must use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) external view returns (bool);
}

// File: @openzeppelin/contracts/token/ERC721/IERC721.sol
pragma solidity ^0.8.0;
/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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


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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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



pragma solidity ^0.8.0;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize, which returns 0 for contracts in
        // construction, since the code is only stored at the end of the
        // constructor execution.

        uint256 size;
        assembly {
            size := extcodesize(account)
        }
        return size > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

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

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

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



pragma solidity ^0.8.0;

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


// File: @openzeppelin/contracts/token/ERC721/ERC721.sol
pragma solidity ^0.8.0;
/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

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

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: balance query for the zero address");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        string memory baseURI = _baseURI();
        return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : "";
    }

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

    /**
     * @dev See {IERC721-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721.ownerOf(tokenId);
        require(to != owner, "ERC721: approval to current owner");

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        require(_exists(tokenId), "ERC721: approved query for nonexistent token");

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        require(operator != _msgSender(), "ERC721: approve to caller");

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved");
        _safeTransfer(from, to, tokenId, _data);
    }

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `_data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _owners[tokenId] != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        require(_exists(tokenId), "ERC721: operator query for nonexistent token");
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory _data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, _data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId);

        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);
    }

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

        _beforeTokenTransfer(owner, address(0), tokenId);

        // Clear approvals
        _approve(address(0), tokenId);

        _balances[owner] -= 1;
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits a {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

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

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}

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



pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        return _allTokens.length;
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds");
        return _allTokens[index];
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, tokenId);

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

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



pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _setOwner(_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 {
        _setOwner(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");
        _setOwner(newOwner);
    }

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

pragma solidity ^0.8.0;

contract TurtlePeopleYC is ERC721Enumerable, Ownable {
    using Strings for uint256;
    string public baseURI;
    string public baseExtension = ".json";
        uint256 public cost = 0.005 ether;
    uint256 public maxSupply = 10000;
    uint256 public maxMintAmount = 20;
    bool public paused = false;

    constructor() ERC721("Turtle People Yatch Club", "TPYC") {}
        // internal
        function _baseURI() internal view virtual override returns (string memory) {
        return "https://gateway.pinata.cloud/ipfs/QmWy5VuZckjjSe1qWzhKcfqFuZNPiLcLC2PDD3uvYxAW5a/";
    }
        // public

        function mint(address _to, uint256 _mintAmount) public payable {
            uint256 supply = totalSupply();
            require(!paused);
            require(_mintAmount > 0);
            require(_mintAmount <= maxMintAmount);
            require(supply + _mintAmount <= maxSupply);
            
            if (msg.sender != owner()) {
            require(msg.value == cost * _mintAmount, "Need to send 0.08 ether!");
            }
            
            for (uint256 i = 1; i <= _mintAmount; i++) {
                _safeMint(_to, supply + i);
            }
        }

        function walletOfOwner(address _owner)
        public
        view
        returns (uint256[] memory)
        {
            uint256 ownerTokenCount = balanceOf(_owner);
            uint256[] memory tokenIds = new uint256[](ownerTokenCount);
            for (uint256 i; i < ownerTokenCount; i++) {
                tokenIds[i] = tokenOfOwnerByIndex(_owner, i);
            }
            return tokenIds;
        }
    
        
        function tokenURI(uint256 tokenId)
        public
        view
        virtual
        override
        returns (string memory) {
            require(
                _exists(tokenId),
                "ERC721Metadata: URI query for nonexistent token"
                );
                
                string memory currentBaseURI = _baseURI();
                return
                bytes(currentBaseURI).length > 0 
                ? string(abi.encodePacked(currentBaseURI, tokenId.toString(), baseExtension))
                : "";
        }
        // only owner
        
        function setmaxMintAmount(uint256 _newmaxMintAmount) public onlyOwner() {
            maxMintAmount = _newmaxMintAmount;
        }
        
        function setBaseURI(string memory _newBaseURI) public onlyOwner() {
            baseURI = _newBaseURI;
        }
        
        function setBaseExtension(string memory _newBaseExtension) public onlyOwner() {
            baseExtension = _newBaseExtension;
        }
        
        function pause(bool _state) public onlyOwner() {
            paused = _state;
        }
        
        function withdraw() public payable onlyOwner() {
            require(payable(msg.sender).send(address(this).balance));
        }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseExtension","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseExtension","type":"string"}],"name":"setBaseExtension","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newmaxMintAmount","type":"uint256"}],"name":"setmaxMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600c90805190602001906200005192919062000225565b506611c37937e08000600d55612710600e556014600f556000601060006101000a81548160ff0219169083151502179055503480156200009057600080fd5b506040518060400160405280601881526020017f547572746c652050656f706c6520596174636820436c756200000000000000008152506040518060400160405280600481526020017f545059430000000000000000000000000000000000000000000000000000000081525081600090805190602001906200011592919062000225565b5080600190805190602001906200012e92919062000225565b50505062000151620001456200015760201b60201c565b6200015f60201b60201c565b6200033a565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200023390620002d5565b90600052602060002090601f016020900481019282620002575760008555620002a3565b82601f106200027257805160ff1916838001178555620002a3565b82800160010185558215620002a3579182015b82811115620002a257825182559160200191906001019062000285565b5b509050620002b29190620002b6565b5090565b5b80821115620002d1576000816000905550600101620002b7565b5090565b60006002820490506001821680620002ee57607f821691505b602082108114156200030557620003046200030b565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b61401e806200034a6000396000f3fe6080604052600436106101e35760003560e01c80635c975abb11610102578063a22cb46511610095578063d5abeb0111610064578063d5abeb01146106d8578063da3ef23f14610703578063e985e9c51461072c578063f2fde38b14610769576101e3565b8063a22cb4651461061e578063b88d4fde14610647578063c668286214610670578063c87b56dd1461069b576101e3565b8063715018a6116100d1578063715018a6146105885780637f00c7a61461059f5780638da5cb5b146105c857806395d89b41146105f3576101e3565b80635c975abb146104b85780636352211e146104e35780636c0360eb1461052057806370a082311461054b576101e3565b806323b872dd1161017a57806342842e0e1161014957806342842e0e146103ec578063438b6300146104155780634f6ccce71461045257806355f804b31461048f576101e3565b806323b872dd146103605780632f745c59146103895780633ccfd60b146103c657806340c10f19146103d0576101e3565b8063095ea7b3116101b6578063095ea7b3146102b657806313faede6146102df57806318160ddd1461030a578063239c70ae14610335576101e3565b806301ffc9a7146101e857806302329a291461022557806306fdde031461024e578063081812fc14610279575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612dff565b610792565b60405161021c919061381d565b60405180910390f35b34801561023157600080fd5b5061024c60048036038101906102479190612dd6565b61080c565b005b34801561025a57600080fd5b506102636108a5565b6040516102709190613838565b60405180910390f35b34801561028557600080fd5b506102a0600480360381019061029b9190612e92565b610937565b6040516102ad9190613794565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d89190612d9a565b6109bc565b005b3480156102eb57600080fd5b506102f4610ad4565b6040516103019190613aba565b60405180910390f35b34801561031657600080fd5b5061031f610ada565b60405161032c9190613aba565b60405180910390f35b34801561034157600080fd5b5061034a610ae7565b6040516103579190613aba565b60405180910390f35b34801561036c57600080fd5b5061038760048036038101906103829190612c94565b610aed565b005b34801561039557600080fd5b506103b060048036038101906103ab9190612d9a565b610b4d565b6040516103bd9190613aba565b60405180910390f35b6103ce610bf2565b005b6103ea60048036038101906103e59190612d9a565b610cae565b005b3480156103f857600080fd5b50610413600480360381019061040e9190612c94565b610dd0565b005b34801561042157600080fd5b5061043c60048036038101906104379190612c2f565b610df0565b60405161044991906137fb565b60405180910390f35b34801561045e57600080fd5b5061047960048036038101906104749190612e92565b610eea565b6040516104869190613aba565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190612e51565b610f81565b005b3480156104c457600080fd5b506104cd611017565b6040516104da919061381d565b60405180910390f35b3480156104ef57600080fd5b5061050a60048036038101906105059190612e92565b61102a565b6040516105179190613794565b60405180910390f35b34801561052c57600080fd5b506105356110dc565b6040516105429190613838565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d9190612c2f565b61116a565b60405161057f9190613aba565b60405180910390f35b34801561059457600080fd5b5061059d611222565b005b3480156105ab57600080fd5b506105c660048036038101906105c19190612e92565b6112aa565b005b3480156105d457600080fd5b506105dd611330565b6040516105ea9190613794565b60405180910390f35b3480156105ff57600080fd5b5061060861135a565b6040516106159190613838565b60405180910390f35b34801561062a57600080fd5b5061064560048036038101906106409190612d5e565b6113ec565b005b34801561065357600080fd5b5061066e60048036038101906106699190612ce3565b61156d565b005b34801561067c57600080fd5b506106856115cf565b6040516106929190613838565b60405180910390f35b3480156106a757600080fd5b506106c260048036038101906106bd9190612e92565b61165d565b6040516106cf9190613838565b60405180910390f35b3480156106e457600080fd5b506106ed611707565b6040516106fa9190613aba565b60405180910390f35b34801561070f57600080fd5b5061072a60048036038101906107259190612e51565b61170d565b005b34801561073857600080fd5b50610753600480360381019061074e9190612c58565b6117a3565b604051610760919061381d565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190612c2f565b611837565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080557506108048261192f565b5b9050919050565b610814611a11565b73ffffffffffffffffffffffffffffffffffffffff16610832611330565b73ffffffffffffffffffffffffffffffffffffffff1614610888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087f906139da565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6060600080546108b490613dc2565b80601f01602080910402602001604051908101604052809291908181526020018280546108e090613dc2565b801561092d5780601f106109025761010080835404028352916020019161092d565b820191906000526020600020905b81548152906001019060200180831161091057829003601f168201915b5050505050905090565b600061094282611a19565b610981576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610978906139ba565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c78261102a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2f90613a3a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a57611a11565b73ffffffffffffffffffffffffffffffffffffffff161480610a865750610a8581610a80611a11565b6117a3565b5b610ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abc9061393a565b60405180910390fd5b610acf8383611a85565b505050565b600d5481565b6000600880549050905090565b600f5481565b610afe610af8611a11565b82611b3e565b610b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3490613a5a565b60405180910390fd5b610b48838383611c1c565b505050565b6000610b588361116a565b8210610b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b909061385a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bfa611a11565b73ffffffffffffffffffffffffffffffffffffffff16610c18611330565b73ffffffffffffffffffffffffffffffffffffffff1614610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c65906139da565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610cac57600080fd5b565b6000610cb8610ada565b9050601060009054906101000a900460ff1615610cd457600080fd5b60008211610ce157600080fd5b600f54821115610cf057600080fd5b600e548282610cff9190613bf7565b1115610d0a57600080fd5b610d12611330565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d945781600d54610d529190613c7e565b3414610d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a90613a7a565b60405180910390fd5b5b6000600190505b828111610dca57610db7848284610db29190613bf7565b611e78565b8080610dc290613df4565b915050610d9b565b50505050565b610deb8383836040518060200160405280600081525061156d565b505050565b60606000610dfd8361116a565b905060008167ffffffffffffffff811115610e41577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610e6f5781602001602082028036833780820191505090505b50905060005b82811015610edf57610e878582610b4d565b828281518110610ec0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610ed790613df4565b915050610e75565b508092505050919050565b6000610ef4610ada565b8210610f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2c90613a9a565b60405180910390fd5b60088281548110610f6f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f89611a11565b73ffffffffffffffffffffffffffffffffffffffff16610fa7611330565b73ffffffffffffffffffffffffffffffffffffffff1614610ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff4906139da565b60405180910390fd5b80600b9080519060200190611013929190612a53565b5050565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ca9061397a565b60405180910390fd5b80915050919050565b600b80546110e990613dc2565b80601f016020809104026020016040519081016040528092919081815260200182805461111590613dc2565b80156111625780601f1061113757610100808354040283529160200191611162565b820191906000526020600020905b81548152906001019060200180831161114557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d29061395a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61122a611a11565b73ffffffffffffffffffffffffffffffffffffffff16611248611330565b73ffffffffffffffffffffffffffffffffffffffff161461129e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611295906139da565b60405180910390fd5b6112a86000611e96565b565b6112b2611a11565b73ffffffffffffffffffffffffffffffffffffffff166112d0611330565b73ffffffffffffffffffffffffffffffffffffffff1614611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d906139da565b60405180910390fd5b80600f8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461136990613dc2565b80601f016020809104026020016040519081016040528092919081815260200182805461139590613dc2565b80156113e25780601f106113b7576101008083540402835291602001916113e2565b820191906000526020600020905b8154815290600101906020018083116113c557829003601f168201915b5050505050905090565b6113f4611a11565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611462576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611459906138fa565b60405180910390fd5b806005600061146f611a11565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661151c611a11565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611561919061381d565b60405180910390a35050565b61157e611578611a11565b83611b3e565b6115bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b490613a5a565b60405180910390fd5b6115c984848484611f5c565b50505050565b600c80546115dc90613dc2565b80601f016020809104026020016040519081016040528092919081815260200182805461160890613dc2565b80156116555780601f1061162a57610100808354040283529160200191611655565b820191906000526020600020905b81548152906001019060200180831161163857829003601f168201915b505050505081565b606061166882611a19565b6116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e90613a1a565b60405180910390fd5b60006116b1611fb8565b905060008151116116d157604051806020016040528060008152506116ff565b806116db84611fd8565b600c6040516020016116ef93929190613763565b6040516020818303038152906040525b915050919050565b600e5481565b611715611a11565b73ffffffffffffffffffffffffffffffffffffffff16611733611330565b73ffffffffffffffffffffffffffffffffffffffff1614611789576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611780906139da565b60405180910390fd5b80600c908051906020019061179f929190612a53565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61183f611a11565b73ffffffffffffffffffffffffffffffffffffffff1661185d611330565b73ffffffffffffffffffffffffffffffffffffffff16146118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa906139da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191a9061389a565b60405180910390fd5b61192c81611e96565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119fa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a0a5750611a0982612185565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611af88361102a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b4982611a19565b611b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7f9061391a565b60405180910390fd5b6000611b938361102a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c0257508373ffffffffffffffffffffffffffffffffffffffff16611bea84610937565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c135750611c1281856117a3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c3c8261102a565b73ffffffffffffffffffffffffffffffffffffffff1614611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c89906139fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf9906138da565b60405180910390fd5b611d0d8383836121ef565b611d18600082611a85565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d689190613cd8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dbf9190613bf7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e92828260405180602001604052806000815250612303565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f67848484611c1c565b611f738484848461235e565b611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa99061387a565b60405180910390fd5b50505050565b6060604051806080016040528060518152602001613f9860519139905090565b60606000821415612020576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612180565b600082905060005b6000821461205257808061203b90613df4565b915050600a8261204b9190613c4d565b9150612028565b60008167ffffffffffffffff811115612094577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120c65781602001600182028036833780820191505090505b5090505b60008514612179576001826120df9190613cd8565b9150600a856120ee9190613e3d565b60306120fa9190613bf7565b60f81b818381518110612136577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121729190613c4d565b94506120ca565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121fa8383836124f5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561223d57612238816124fa565b61227c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461227b5761227a8382612543565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122bf576122ba816126b0565b6122fe565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122fd576122fc82826127f3565b5b5b505050565b61230d8383612872565b61231a600084848461235e565b612359576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123509061387a565b60405180910390fd5b505050565b600061237f8473ffffffffffffffffffffffffffffffffffffffff16612a40565b156124e8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123a8611a11565b8786866040518563ffffffff1660e01b81526004016123ca94939291906137af565b602060405180830381600087803b1580156123e457600080fd5b505af192505050801561241557506040513d601f19601f820116820180604052508101906124129190612e28565b60015b612498573d8060008114612445576040519150601f19603f3d011682016040523d82523d6000602084013e61244a565b606091505b50600081511415612490576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124879061387a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124ed565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016125508461116a565b61255a9190613cd8565b905060006007600084815260200190815260200160002054905081811461263f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126c49190613cd8565b905060006009600084815260200190815260200160002054905060006008838154811061271a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612762577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806127d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127fe8361116a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d99061399a565b60405180910390fd5b6128eb81611a19565b1561292b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612922906138ba565b60405180910390fd5b612937600083836121ef565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129879190613bf7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612a5f90613dc2565b90600052602060002090601f016020900481019282612a815760008555612ac8565b82601f10612a9a57805160ff1916838001178555612ac8565b82800160010185558215612ac8579182015b82811115612ac7578251825591602001919060010190612aac565b5b509050612ad59190612ad9565b5090565b5b80821115612af2576000816000905550600101612ada565b5090565b6000612b09612b0484613b06565b613ad5565b905082815260208101848484011115612b2157600080fd5b612b2c848285613d80565b509392505050565b6000612b47612b4284613b36565b613ad5565b905082815260208101848484011115612b5f57600080fd5b612b6a848285613d80565b509392505050565b600081359050612b8181613f3b565b92915050565b600081359050612b9681613f52565b92915050565b600081359050612bab81613f69565b92915050565b600081519050612bc081613f69565b92915050565b600082601f830112612bd757600080fd5b8135612be7848260208601612af6565b91505092915050565b600082601f830112612c0157600080fd5b8135612c11848260208601612b34565b91505092915050565b600081359050612c2981613f80565b92915050565b600060208284031215612c4157600080fd5b6000612c4f84828501612b72565b91505092915050565b60008060408385031215612c6b57600080fd5b6000612c7985828601612b72565b9250506020612c8a85828601612b72565b9150509250929050565b600080600060608486031215612ca957600080fd5b6000612cb786828701612b72565b9350506020612cc886828701612b72565b9250506040612cd986828701612c1a565b9150509250925092565b60008060008060808587031215612cf957600080fd5b6000612d0787828801612b72565b9450506020612d1887828801612b72565b9350506040612d2987828801612c1a565b925050606085013567ffffffffffffffff811115612d4657600080fd5b612d5287828801612bc6565b91505092959194509250565b60008060408385031215612d7157600080fd5b6000612d7f85828601612b72565b9250506020612d9085828601612b87565b9150509250929050565b60008060408385031215612dad57600080fd5b6000612dbb85828601612b72565b9250506020612dcc85828601612c1a565b9150509250929050565b600060208284031215612de857600080fd5b6000612df684828501612b87565b91505092915050565b600060208284031215612e1157600080fd5b6000612e1f84828501612b9c565b91505092915050565b600060208284031215612e3a57600080fd5b6000612e4884828501612bb1565b91505092915050565b600060208284031215612e6357600080fd5b600082013567ffffffffffffffff811115612e7d57600080fd5b612e8984828501612bf0565b91505092915050565b600060208284031215612ea457600080fd5b6000612eb284828501612c1a565b91505092915050565b6000612ec78383613745565b60208301905092915050565b612edc81613d0c565b82525050565b6000612eed82613b8b565b612ef78185613bb9565b9350612f0283613b66565b8060005b83811015612f33578151612f1a8882612ebb565b9750612f2583613bac565b925050600181019050612f06565b5085935050505092915050565b612f4981613d1e565b82525050565b6000612f5a82613b96565b612f648185613bca565b9350612f74818560208601613d8f565b612f7d81613f2a565b840191505092915050565b6000612f9382613ba1565b612f9d8185613bdb565b9350612fad818560208601613d8f565b612fb681613f2a565b840191505092915050565b6000612fcc82613ba1565b612fd68185613bec565b9350612fe6818560208601613d8f565b80840191505092915050565b60008154612fff81613dc2565b6130098186613bec565b94506001821660008114613024576001811461303557613068565b60ff19831686528186019350613068565b61303e85613b76565b60005b8381101561306057815481890152600182019150602081019050613041565b838801955050505b50505092915050565b600061307e602b83613bdb565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006130e4603283613bdb565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061314a602683613bdb565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131b0601c83613bdb565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006131f0602483613bdb565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613256601983613bdb565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613296602c83613bdb565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006132fc603883613bdb565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613362602a83613bdb565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006133c8602983613bdb565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061342e602083613bdb565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061346e602c83613bdb565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006134d4602083613bdb565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613514602983613bdb565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061357a602f83613bdb565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006135e0602183613bdb565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613646603183613bdb565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006136ac601883613bdb565b91507f4e65656420746f2073656e6420302e30382065746865722100000000000000006000830152602082019050919050565b60006136ec602c83613bdb565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b61374e81613d76565b82525050565b61375d81613d76565b82525050565b600061376f8286612fc1565b915061377b8285612fc1565b91506137878284612ff2565b9150819050949350505050565b60006020820190506137a96000830184612ed3565b92915050565b60006080820190506137c46000830187612ed3565b6137d16020830186612ed3565b6137de6040830185613754565b81810360608301526137f08184612f4f565b905095945050505050565b600060208201905081810360008301526138158184612ee2565b905092915050565b60006020820190506138326000830184612f40565b92915050565b600060208201905081810360008301526138528184612f88565b905092915050565b6000602082019050818103600083015261387381613071565b9050919050565b60006020820190508181036000830152613893816130d7565b9050919050565b600060208201905081810360008301526138b38161313d565b9050919050565b600060208201905081810360008301526138d3816131a3565b9050919050565b600060208201905081810360008301526138f3816131e3565b9050919050565b6000602082019050818103600083015261391381613249565b9050919050565b6000602082019050818103600083015261393381613289565b9050919050565b60006020820190508181036000830152613953816132ef565b9050919050565b6000602082019050818103600083015261397381613355565b9050919050565b60006020820190508181036000830152613993816133bb565b9050919050565b600060208201905081810360008301526139b381613421565b9050919050565b600060208201905081810360008301526139d381613461565b9050919050565b600060208201905081810360008301526139f3816134c7565b9050919050565b60006020820190508181036000830152613a1381613507565b9050919050565b60006020820190508181036000830152613a338161356d565b9050919050565b60006020820190508181036000830152613a53816135d3565b9050919050565b60006020820190508181036000830152613a7381613639565b9050919050565b60006020820190508181036000830152613a938161369f565b9050919050565b60006020820190508181036000830152613ab3816136df565b9050919050565b6000602082019050613acf6000830184613754565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613afc57613afb613efb565b5b8060405250919050565b600067ffffffffffffffff821115613b2157613b20613efb565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613b5157613b50613efb565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c0282613d76565b9150613c0d83613d76565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c4257613c41613e6e565b5b828201905092915050565b6000613c5882613d76565b9150613c6383613d76565b925082613c7357613c72613e9d565b5b828204905092915050565b6000613c8982613d76565b9150613c9483613d76565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ccd57613ccc613e6e565b5b828202905092915050565b6000613ce382613d76565b9150613cee83613d76565b925082821015613d0157613d00613e6e565b5b828203905092915050565b6000613d1782613d56565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613dad578082015181840152602081019050613d92565b83811115613dbc576000848401525b50505050565b60006002820490506001821680613dda57607f821691505b60208210811415613dee57613ded613ecc565b5b50919050565b6000613dff82613d76565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e3257613e31613e6e565b5b600182019050919050565b6000613e4882613d76565b9150613e5383613d76565b925082613e6357613e62613e9d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613f4481613d0c565b8114613f4f57600080fd5b50565b613f5b81613d1e565b8114613f6657600080fd5b50565b613f7281613d2a565b8114613f7d57600080fd5b50565b613f8981613d76565b8114613f9457600080fd5b5056fe68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d57793556755a636b6a6a53653171577a684b63667146755a4e50694c634c43325044443375765978415735612fa2646970667358221220f48e1c6bf090c27188d0c3b3ea70c5a98d217ea031f29580f5fd62344813879d64736f6c63430008000033

Deployed Bytecode

0x6080604052600436106101e35760003560e01c80635c975abb11610102578063a22cb46511610095578063d5abeb0111610064578063d5abeb01146106d8578063da3ef23f14610703578063e985e9c51461072c578063f2fde38b14610769576101e3565b8063a22cb4651461061e578063b88d4fde14610647578063c668286214610670578063c87b56dd1461069b576101e3565b8063715018a6116100d1578063715018a6146105885780637f00c7a61461059f5780638da5cb5b146105c857806395d89b41146105f3576101e3565b80635c975abb146104b85780636352211e146104e35780636c0360eb1461052057806370a082311461054b576101e3565b806323b872dd1161017a57806342842e0e1161014957806342842e0e146103ec578063438b6300146104155780634f6ccce71461045257806355f804b31461048f576101e3565b806323b872dd146103605780632f745c59146103895780633ccfd60b146103c657806340c10f19146103d0576101e3565b8063095ea7b3116101b6578063095ea7b3146102b657806313faede6146102df57806318160ddd1461030a578063239c70ae14610335576101e3565b806301ffc9a7146101e857806302329a291461022557806306fdde031461024e578063081812fc14610279575b600080fd5b3480156101f457600080fd5b5061020f600480360381019061020a9190612dff565b610792565b60405161021c919061381d565b60405180910390f35b34801561023157600080fd5b5061024c60048036038101906102479190612dd6565b61080c565b005b34801561025a57600080fd5b506102636108a5565b6040516102709190613838565b60405180910390f35b34801561028557600080fd5b506102a0600480360381019061029b9190612e92565b610937565b6040516102ad9190613794565b60405180910390f35b3480156102c257600080fd5b506102dd60048036038101906102d89190612d9a565b6109bc565b005b3480156102eb57600080fd5b506102f4610ad4565b6040516103019190613aba565b60405180910390f35b34801561031657600080fd5b5061031f610ada565b60405161032c9190613aba565b60405180910390f35b34801561034157600080fd5b5061034a610ae7565b6040516103579190613aba565b60405180910390f35b34801561036c57600080fd5b5061038760048036038101906103829190612c94565b610aed565b005b34801561039557600080fd5b506103b060048036038101906103ab9190612d9a565b610b4d565b6040516103bd9190613aba565b60405180910390f35b6103ce610bf2565b005b6103ea60048036038101906103e59190612d9a565b610cae565b005b3480156103f857600080fd5b50610413600480360381019061040e9190612c94565b610dd0565b005b34801561042157600080fd5b5061043c60048036038101906104379190612c2f565b610df0565b60405161044991906137fb565b60405180910390f35b34801561045e57600080fd5b5061047960048036038101906104749190612e92565b610eea565b6040516104869190613aba565b60405180910390f35b34801561049b57600080fd5b506104b660048036038101906104b19190612e51565b610f81565b005b3480156104c457600080fd5b506104cd611017565b6040516104da919061381d565b60405180910390f35b3480156104ef57600080fd5b5061050a60048036038101906105059190612e92565b61102a565b6040516105179190613794565b60405180910390f35b34801561052c57600080fd5b506105356110dc565b6040516105429190613838565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d9190612c2f565b61116a565b60405161057f9190613aba565b60405180910390f35b34801561059457600080fd5b5061059d611222565b005b3480156105ab57600080fd5b506105c660048036038101906105c19190612e92565b6112aa565b005b3480156105d457600080fd5b506105dd611330565b6040516105ea9190613794565b60405180910390f35b3480156105ff57600080fd5b5061060861135a565b6040516106159190613838565b60405180910390f35b34801561062a57600080fd5b5061064560048036038101906106409190612d5e565b6113ec565b005b34801561065357600080fd5b5061066e60048036038101906106699190612ce3565b61156d565b005b34801561067c57600080fd5b506106856115cf565b6040516106929190613838565b60405180910390f35b3480156106a757600080fd5b506106c260048036038101906106bd9190612e92565b61165d565b6040516106cf9190613838565b60405180910390f35b3480156106e457600080fd5b506106ed611707565b6040516106fa9190613aba565b60405180910390f35b34801561070f57600080fd5b5061072a60048036038101906107259190612e51565b61170d565b005b34801561073857600080fd5b50610753600480360381019061074e9190612c58565b6117a3565b604051610760919061381d565b60405180910390f35b34801561077557600080fd5b50610790600480360381019061078b9190612c2f565b611837565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061080557506108048261192f565b5b9050919050565b610814611a11565b73ffffffffffffffffffffffffffffffffffffffff16610832611330565b73ffffffffffffffffffffffffffffffffffffffff1614610888576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087f906139da565b60405180910390fd5b80601060006101000a81548160ff02191690831515021790555050565b6060600080546108b490613dc2565b80601f01602080910402602001604051908101604052809291908181526020018280546108e090613dc2565b801561092d5780601f106109025761010080835404028352916020019161092d565b820191906000526020600020905b81548152906001019060200180831161091057829003601f168201915b5050505050905090565b600061094282611a19565b610981576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610978906139ba565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006109c78261102a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2f90613a3a565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a57611a11565b73ffffffffffffffffffffffffffffffffffffffff161480610a865750610a8581610a80611a11565b6117a3565b5b610ac5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abc9061393a565b60405180910390fd5b610acf8383611a85565b505050565b600d5481565b6000600880549050905090565b600f5481565b610afe610af8611a11565b82611b3e565b610b3d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b3490613a5a565b60405180910390fd5b610b48838383611c1c565b505050565b6000610b588361116a565b8210610b99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b909061385a565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610bfa611a11565b73ffffffffffffffffffffffffffffffffffffffff16610c18611330565b73ffffffffffffffffffffffffffffffffffffffff1614610c6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c65906139da565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050610cac57600080fd5b565b6000610cb8610ada565b9050601060009054906101000a900460ff1615610cd457600080fd5b60008211610ce157600080fd5b600f54821115610cf057600080fd5b600e548282610cff9190613bf7565b1115610d0a57600080fd5b610d12611330565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610d945781600d54610d529190613c7e565b3414610d93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d8a90613a7a565b60405180910390fd5b5b6000600190505b828111610dca57610db7848284610db29190613bf7565b611e78565b8080610dc290613df4565b915050610d9b565b50505050565b610deb8383836040518060200160405280600081525061156d565b505050565b60606000610dfd8361116a565b905060008167ffffffffffffffff811115610e41577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610e6f5781602001602082028036833780820191505090505b50905060005b82811015610edf57610e878582610b4d565b828281518110610ec0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610ed790613df4565b915050610e75565b508092505050919050565b6000610ef4610ada565b8210610f35576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f2c90613a9a565b60405180910390fd5b60088281548110610f6f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f89611a11565b73ffffffffffffffffffffffffffffffffffffffff16610fa7611330565b73ffffffffffffffffffffffffffffffffffffffff1614610ffd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ff4906139da565b60405180910390fd5b80600b9080519060200190611013929190612a53565b5050565b601060009054906101000a900460ff1681565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110d3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ca9061397a565b60405180910390fd5b80915050919050565b600b80546110e990613dc2565b80601f016020809104026020016040519081016040528092919081815260200182805461111590613dc2565b80156111625780601f1061113757610100808354040283529160200191611162565b820191906000526020600020905b81548152906001019060200180831161114557829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d29061395a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61122a611a11565b73ffffffffffffffffffffffffffffffffffffffff16611248611330565b73ffffffffffffffffffffffffffffffffffffffff161461129e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611295906139da565b60405180910390fd5b6112a86000611e96565b565b6112b2611a11565b73ffffffffffffffffffffffffffffffffffffffff166112d0611330565b73ffffffffffffffffffffffffffffffffffffffff1614611326576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161131d906139da565b60405180910390fd5b80600f8190555050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461136990613dc2565b80601f016020809104026020016040519081016040528092919081815260200182805461139590613dc2565b80156113e25780601f106113b7576101008083540402835291602001916113e2565b820191906000526020600020905b8154815290600101906020018083116113c557829003601f168201915b5050505050905090565b6113f4611a11565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611462576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611459906138fa565b60405180910390fd5b806005600061146f611a11565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661151c611a11565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611561919061381d565b60405180910390a35050565b61157e611578611a11565b83611b3e565b6115bd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115b490613a5a565b60405180910390fd5b6115c984848484611f5c565b50505050565b600c80546115dc90613dc2565b80601f016020809104026020016040519081016040528092919081815260200182805461160890613dc2565b80156116555780601f1061162a57610100808354040283529160200191611655565b820191906000526020600020905b81548152906001019060200180831161163857829003601f168201915b505050505081565b606061166882611a19565b6116a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169e90613a1a565b60405180910390fd5b60006116b1611fb8565b905060008151116116d157604051806020016040528060008152506116ff565b806116db84611fd8565b600c6040516020016116ef93929190613763565b6040516020818303038152906040525b915050919050565b600e5481565b611715611a11565b73ffffffffffffffffffffffffffffffffffffffff16611733611330565b73ffffffffffffffffffffffffffffffffffffffff1614611789576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611780906139da565b60405180910390fd5b80600c908051906020019061179f929190612a53565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61183f611a11565b73ffffffffffffffffffffffffffffffffffffffff1661185d611330565b73ffffffffffffffffffffffffffffffffffffffff16146118b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118aa906139da565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611923576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161191a9061389a565b60405180910390fd5b61192c81611e96565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806119fa57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611a0a5750611a0982612185565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611af88361102a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611b4982611a19565b611b88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7f9061391a565b60405180910390fd5b6000611b938361102a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611c0257508373ffffffffffffffffffffffffffffffffffffffff16611bea84610937565b73ffffffffffffffffffffffffffffffffffffffff16145b80611c135750611c1281856117a3565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611c3c8261102a565b73ffffffffffffffffffffffffffffffffffffffff1614611c92576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c89906139fa565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611d02576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cf9906138da565b60405180910390fd5b611d0d8383836121ef565b611d18600082611a85565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d689190613cd8565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611dbf9190613bf7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611e92828260405180602001604052806000815250612303565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611f67848484611c1c565b611f738484848461235e565b611fb2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fa99061387a565b60405180910390fd5b50505050565b6060604051806080016040528060518152602001613f9860519139905090565b60606000821415612020576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612180565b600082905060005b6000821461205257808061203b90613df4565b915050600a8261204b9190613c4d565b9150612028565b60008167ffffffffffffffff811115612094577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156120c65781602001600182028036833780820191505090505b5090505b60008514612179576001826120df9190613cd8565b9150600a856120ee9190613e3d565b60306120fa9190613bf7565b60f81b818381518110612136577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856121729190613c4d565b94506120ca565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6121fa8383836124f5565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561223d57612238816124fa565b61227c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461227b5761227a8382612543565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156122bf576122ba816126b0565b6122fe565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16146122fd576122fc82826127f3565b5b5b505050565b61230d8383612872565b61231a600084848461235e565b612359576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123509061387a565b60405180910390fd5b505050565b600061237f8473ffffffffffffffffffffffffffffffffffffffff16612a40565b156124e8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123a8611a11565b8786866040518563ffffffff1660e01b81526004016123ca94939291906137af565b602060405180830381600087803b1580156123e457600080fd5b505af192505050801561241557506040513d601f19601f820116820180604052508101906124129190612e28565b60015b612498573d8060008114612445576040519150601f19603f3d011682016040523d82523d6000602084013e61244a565b606091505b50600081511415612490576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124879061387a565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506124ed565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016125508461116a565b61255a9190613cd8565b905060006007600084815260200190815260200160002054905081811461263f576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506126c49190613cd8565b905060006009600084815260200190815260200160002054905060006008838154811061271a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612762577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806127d7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006127fe8361116a565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128d99061399a565b60405180910390fd5b6128eb81611a19565b1561292b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612922906138ba565b60405180910390fd5b612937600083836121ef565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129879190613bf7565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b828054612a5f90613dc2565b90600052602060002090601f016020900481019282612a815760008555612ac8565b82601f10612a9a57805160ff1916838001178555612ac8565b82800160010185558215612ac8579182015b82811115612ac7578251825591602001919060010190612aac565b5b509050612ad59190612ad9565b5090565b5b80821115612af2576000816000905550600101612ada565b5090565b6000612b09612b0484613b06565b613ad5565b905082815260208101848484011115612b2157600080fd5b612b2c848285613d80565b509392505050565b6000612b47612b4284613b36565b613ad5565b905082815260208101848484011115612b5f57600080fd5b612b6a848285613d80565b509392505050565b600081359050612b8181613f3b565b92915050565b600081359050612b9681613f52565b92915050565b600081359050612bab81613f69565b92915050565b600081519050612bc081613f69565b92915050565b600082601f830112612bd757600080fd5b8135612be7848260208601612af6565b91505092915050565b600082601f830112612c0157600080fd5b8135612c11848260208601612b34565b91505092915050565b600081359050612c2981613f80565b92915050565b600060208284031215612c4157600080fd5b6000612c4f84828501612b72565b91505092915050565b60008060408385031215612c6b57600080fd5b6000612c7985828601612b72565b9250506020612c8a85828601612b72565b9150509250929050565b600080600060608486031215612ca957600080fd5b6000612cb786828701612b72565b9350506020612cc886828701612b72565b9250506040612cd986828701612c1a565b9150509250925092565b60008060008060808587031215612cf957600080fd5b6000612d0787828801612b72565b9450506020612d1887828801612b72565b9350506040612d2987828801612c1a565b925050606085013567ffffffffffffffff811115612d4657600080fd5b612d5287828801612bc6565b91505092959194509250565b60008060408385031215612d7157600080fd5b6000612d7f85828601612b72565b9250506020612d9085828601612b87565b9150509250929050565b60008060408385031215612dad57600080fd5b6000612dbb85828601612b72565b9250506020612dcc85828601612c1a565b9150509250929050565b600060208284031215612de857600080fd5b6000612df684828501612b87565b91505092915050565b600060208284031215612e1157600080fd5b6000612e1f84828501612b9c565b91505092915050565b600060208284031215612e3a57600080fd5b6000612e4884828501612bb1565b91505092915050565b600060208284031215612e6357600080fd5b600082013567ffffffffffffffff811115612e7d57600080fd5b612e8984828501612bf0565b91505092915050565b600060208284031215612ea457600080fd5b6000612eb284828501612c1a565b91505092915050565b6000612ec78383613745565b60208301905092915050565b612edc81613d0c565b82525050565b6000612eed82613b8b565b612ef78185613bb9565b9350612f0283613b66565b8060005b83811015612f33578151612f1a8882612ebb565b9750612f2583613bac565b925050600181019050612f06565b5085935050505092915050565b612f4981613d1e565b82525050565b6000612f5a82613b96565b612f648185613bca565b9350612f74818560208601613d8f565b612f7d81613f2a565b840191505092915050565b6000612f9382613ba1565b612f9d8185613bdb565b9350612fad818560208601613d8f565b612fb681613f2a565b840191505092915050565b6000612fcc82613ba1565b612fd68185613bec565b9350612fe6818560208601613d8f565b80840191505092915050565b60008154612fff81613dc2565b6130098186613bec565b94506001821660008114613024576001811461303557613068565b60ff19831686528186019350613068565b61303e85613b76565b60005b8381101561306057815481890152600182019150602081019050613041565b838801955050505b50505092915050565b600061307e602b83613bdb565b91507f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008301527f74206f6620626f756e64730000000000000000000000000000000000000000006020830152604082019050919050565b60006130e4603283613bdb565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600061314a602683613bdb565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006131b0601c83613bdb565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b60006131f0602483613bdb565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613256601983613bdb565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000613296602c83613bdb565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006132fc603883613bdb565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000613362602a83613bdb565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b60006133c8602983613bdb565b91507f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008301527f656e7420746f6b656e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061342e602083613bdb565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600061346e602c83613bdb565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b60006134d4602083613bdb565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000613514602983613bdb565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b600061357a602f83613bdb565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b60006135e0602183613bdb565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000613646603183613bdb565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006136ac601883613bdb565b91507f4e65656420746f2073656e6420302e30382065746865722100000000000000006000830152602082019050919050565b60006136ec602c83613bdb565b91507f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008301527f7574206f6620626f756e647300000000000000000000000000000000000000006020830152604082019050919050565b61374e81613d76565b82525050565b61375d81613d76565b82525050565b600061376f8286612fc1565b915061377b8285612fc1565b91506137878284612ff2565b9150819050949350505050565b60006020820190506137a96000830184612ed3565b92915050565b60006080820190506137c46000830187612ed3565b6137d16020830186612ed3565b6137de6040830185613754565b81810360608301526137f08184612f4f565b905095945050505050565b600060208201905081810360008301526138158184612ee2565b905092915050565b60006020820190506138326000830184612f40565b92915050565b600060208201905081810360008301526138528184612f88565b905092915050565b6000602082019050818103600083015261387381613071565b9050919050565b60006020820190508181036000830152613893816130d7565b9050919050565b600060208201905081810360008301526138b38161313d565b9050919050565b600060208201905081810360008301526138d3816131a3565b9050919050565b600060208201905081810360008301526138f3816131e3565b9050919050565b6000602082019050818103600083015261391381613249565b9050919050565b6000602082019050818103600083015261393381613289565b9050919050565b60006020820190508181036000830152613953816132ef565b9050919050565b6000602082019050818103600083015261397381613355565b9050919050565b60006020820190508181036000830152613993816133bb565b9050919050565b600060208201905081810360008301526139b381613421565b9050919050565b600060208201905081810360008301526139d381613461565b9050919050565b600060208201905081810360008301526139f3816134c7565b9050919050565b60006020820190508181036000830152613a1381613507565b9050919050565b60006020820190508181036000830152613a338161356d565b9050919050565b60006020820190508181036000830152613a53816135d3565b9050919050565b60006020820190508181036000830152613a7381613639565b9050919050565b60006020820190508181036000830152613a938161369f565b9050919050565b60006020820190508181036000830152613ab3816136df565b9050919050565b6000602082019050613acf6000830184613754565b92915050565b6000604051905081810181811067ffffffffffffffff82111715613afc57613afb613efb565b5b8060405250919050565b600067ffffffffffffffff821115613b2157613b20613efb565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff821115613b5157613b50613efb565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613c0282613d76565b9150613c0d83613d76565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613c4257613c41613e6e565b5b828201905092915050565b6000613c5882613d76565b9150613c6383613d76565b925082613c7357613c72613e9d565b5b828204905092915050565b6000613c8982613d76565b9150613c9483613d76565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613ccd57613ccc613e6e565b5b828202905092915050565b6000613ce382613d76565b9150613cee83613d76565b925082821015613d0157613d00613e6e565b5b828203905092915050565b6000613d1782613d56565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613dad578082015181840152602081019050613d92565b83811115613dbc576000848401525b50505050565b60006002820490506001821680613dda57607f821691505b60208210811415613dee57613ded613ecc565b5b50919050565b6000613dff82613d76565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613e3257613e31613e6e565b5b600182019050919050565b6000613e4882613d76565b9150613e5383613d76565b925082613e6357613e62613e9d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b613f4481613d0c565b8114613f4f57600080fd5b50565b613f5b81613d1e565b8114613f6657600080fd5b50565b613f7281613d2a565b8114613f7d57600080fd5b50565b613f8981613d76565b8114613f9457600080fd5b5056fe68747470733a2f2f676174657761792e70696e6174612e636c6f75642f697066732f516d57793556755a636b6a6a53653171577a684b63667146755a4e50694c634c43325044443375765978415735612fa2646970667358221220f48e1c6bf090c27188d0c3b3ea70c5a98d217ea031f29580f5fd62344813879d64736f6c63430008000033

Deployed Bytecode Sourcemap

43214:2961:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34761:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45933:89;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;22653:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24212:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23735:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43382:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35401:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43461:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25102:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35069:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46042:130;;;:::i;:::-;;43841:585;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25512:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44438:422;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35591:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45641:114;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43501:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22347:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43306:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22077:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42558:94;;;;;;;;;;;;;:::i;:::-;;45489:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41907:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22822:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24505:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25768:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43334:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44886:560;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43422:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45775:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24871:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42807:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34761:224;34863:4;34902:35;34887:50;;;:11;:50;;;;:90;;;;34941:36;34965:11;34941:23;:36::i;:::-;34887:90;34880:97;;34761:224;;;:::o;45933:89::-;42138:12;:10;:12::i;:::-;42127:23;;:7;:5;:7::i;:::-;:23;;;42119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46004:6:::1;45995;;:15;;;;;;;;;;;;;;;;;;45933:89:::0;:::o;22653:100::-;22707:13;22740:5;22733:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22653:100;:::o;24212:221::-;24288:7;24316:16;24324:7;24316;:16::i;:::-;24308:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;24401:15;:24;24417:7;24401:24;;;;;;;;;;;;;;;;;;;;;24394:31;;24212:221;;;:::o;23735:411::-;23816:13;23832:23;23847:7;23832:14;:23::i;:::-;23816:39;;23880:5;23874:11;;:2;:11;;;;23866:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23974:5;23958:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23983:37;24000:5;24007:12;:10;:12::i;:::-;23983:16;:37::i;:::-;23958:62;23936:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;24117:21;24126:2;24130:7;24117:8;:21::i;:::-;23735:411;;;:::o;43382:33::-;;;;:::o;35401:113::-;35462:7;35489:10;:17;;;;35482:24;;35401:113;:::o;43461:33::-;;;;:::o;25102:339::-;25297:41;25316:12;:10;:12::i;:::-;25330:7;25297:18;:41::i;:::-;25289:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25405:28;25415:4;25421:2;25425:7;25405:9;:28::i;:::-;25102:339;;;:::o;35069:256::-;35166:7;35202:23;35219:5;35202:16;:23::i;:::-;35194:5;:31;35186:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35291:12;:19;35304:5;35291:19;;;;;;;;;;;;;;;:26;35311:5;35291:26;;;;;;;;;;;;35284:33;;35069:256;;;;:::o;46042:130::-;42138:12;:10;:12::i;:::-;42127:23;;:7;:5;:7::i;:::-;:23;;;42119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;46120:10:::1;46112:24;;:47;46137:21;46112:47;;;;;;;;;;;;;;;;;;;;;;;46104:56;;;::::0;::::1;;46042:130::o:0;43841:585::-;43919:14;43936:13;:11;:13::i;:::-;43919:30;;43973:6;;;;;;;;;;;43972:7;43964:16;;;;;;44017:1;44003:11;:15;43995:24;;;;;;44057:13;;44042:11;:28;;44034:37;;;;;;44118:9;;44103:11;44094:6;:20;;;;:::i;:::-;:33;;44086:42;;;;;;44175:7;:5;:7::i;:::-;44161:21;;:10;:21;;;44157:126;;44227:11;44220:4;;:18;;;;:::i;:::-;44207:9;:31;44199:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44157:126;44316:9;44328:1;44316:13;;44311:104;44336:11;44331:1;:16;44311:104;;44373:26;44383:3;44397:1;44388:6;:10;;;;:::i;:::-;44373:9;:26::i;:::-;44349:3;;;;;:::i;:::-;;;;44311:104;;;;43841:585;;;:::o;25512:185::-;25650:39;25667:4;25673:2;25677:7;25650:39;;;;;;;;;;;;:16;:39::i;:::-;25512:185;;;:::o;44438:422::-;44525:16;44567:23;44593:17;44603:6;44593:9;:17::i;:::-;44567:43;;44625:25;44667:15;44653:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44625:58;;44703:9;44698:121;44718:15;44714:1;:19;44698:121;;;44773:30;44793:6;44801:1;44773:19;:30::i;:::-;44759:8;44768:1;44759:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;44735:3;;;;;:::i;:::-;;;;44698:121;;;;44840:8;44833:15;;;;44438:422;;;:::o;35591:233::-;35666:7;35702:30;:28;:30::i;:::-;35694:5;:38;35686:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35799:10;35810:5;35799:17;;;;;;;;;;;;;;;;;;;;;;;;35792:24;;35591:233;;;:::o;45641:114::-;42138:12;:10;:12::i;:::-;42127:23;;:7;:5;:7::i;:::-;:23;;;42119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45732:11:::1;45722:7;:21;;;;;;;;;;;;:::i;:::-;;45641:114:::0;:::o;43501:26::-;;;;;;;;;;;;;:::o;22347:239::-;22419:7;22439:13;22455:7;:16;22463:7;22455:16;;;;;;;;;;;;;;;;;;;;;22439:32;;22507:1;22490:19;;:5;:19;;;;22482:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;22573:5;22566:12;;;22347:239;;;:::o;43306:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;22077:208::-;22149:7;22194:1;22177:19;;:5;:19;;;;22169:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;22261:9;:16;22271:5;22261:16;;;;;;;;;;;;;;;;22254:23;;22077:208;;;:::o;42558:94::-;42138:12;:10;:12::i;:::-;42127:23;;:7;:5;:7::i;:::-;:23;;;42119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42623:21:::1;42641:1;42623:9;:21::i;:::-;42558:94::o:0;45489:132::-;42138:12;:10;:12::i;:::-;42127:23;;:7;:5;:7::i;:::-;:23;;;42119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45592:17:::1;45576:13;:33;;;;45489:132:::0;:::o;41907:87::-;41953:7;41980:6;;;;;;;;;;;41973:13;;41907:87;:::o;22822:104::-;22878:13;22911:7;22904:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;22822:104;:::o;24505:295::-;24620:12;:10;:12::i;:::-;24608:24;;:8;:24;;;;24600:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;24720:8;24675:18;:32;24694:12;:10;:12::i;:::-;24675:32;;;;;;;;;;;;;;;:42;24708:8;24675:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;24773:8;24744:48;;24759:12;:10;:12::i;:::-;24744:48;;;24783:8;24744:48;;;;;;:::i;:::-;;;;;;;;24505:295;;:::o;25768:328::-;25943:41;25962:12;:10;:12::i;:::-;25976:7;25943:18;:41::i;:::-;25935:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;26049:39;26063:4;26069:2;26073:7;26082:5;26049:13;:39::i;:::-;25768:328;;;;:::o;43334:37::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;44886:560::-;45004:13;45060:16;45068:7;45060;:16::i;:::-;45034:129;;;;;;;;;;;;:::i;:::-;;;;;;;;;45200:28;45231:10;:8;:10::i;:::-;45200:41;;45315:1;45290:14;45284:28;:32;:150;;;;;;;;;;;;;;;;;45361:14;45377:18;:7;:16;:18::i;:::-;45397:13;45344:67;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45284:150;45260:174;;;44886:560;;;:::o;43422:32::-;;;;:::o;45775:138::-;42138:12;:10;:12::i;:::-;42127:23;;:7;:5;:7::i;:::-;:23;;;42119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45884:17:::1;45868:13;:33;;;;;;;;;;;;:::i;:::-;;45775:138:::0;:::o;24871:164::-;24968:4;24992:18;:25;25011:5;24992:25;;;;;;;;;;;;;;;:35;25018:8;24992:35;;;;;;;;;;;;;;;;;;;;;;;;;24985:42;;24871:164;;;;:::o;42807:192::-;42138:12;:10;:12::i;:::-;42127:23;;:7;:5;:7::i;:::-;:23;;;42119:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42916:1:::1;42896:22;;:8;:22;;;;42888:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42972:19;42982:8;42972:9;:19::i;:::-;42807:192:::0;:::o;21708:305::-;21810:4;21862:25;21847:40;;;:11;:40;;;;:105;;;;21919:33;21904:48;;;:11;:48;;;;21847:105;:158;;;;21969:36;21993:11;21969:23;:36::i;:::-;21847:158;21827:178;;21708:305;;;:::o;731:98::-;784:7;811:10;804:17;;731:98;:::o;27606:127::-;27671:4;27723:1;27695:30;;:7;:16;27703:7;27695:16;;;;;;;;;;;;;;;;;;;;;:30;;;;27688:37;;27606:127;;;:::o;31588:174::-;31690:2;31663:15;:24;31679:7;31663:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;31746:7;31742:2;31708:46;;31717:23;31732:7;31717:14;:23::i;:::-;31708:46;;;;;;;;;;;;31588:174;;:::o;27900:348::-;27993:4;28018:16;28026:7;28018;:16::i;:::-;28010:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;28094:13;28110:23;28125:7;28110:14;:23::i;:::-;28094:39;;28163:5;28152:16;;:7;:16;;;:51;;;;28196:7;28172:31;;:20;28184:7;28172:11;:20::i;:::-;:31;;;28152:51;:87;;;;28207:32;28224:5;28231:7;28207:16;:32::i;:::-;28152:87;28144:96;;;27900:348;;;;:::o;30892:578::-;31051:4;31024:31;;:23;31039:7;31024:14;:23::i;:::-;:31;;;31016:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;31134:1;31120:16;;:2;:16;;;;31112:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;31190:39;31211:4;31217:2;31221:7;31190:20;:39::i;:::-;31294:29;31311:1;31315:7;31294:8;:29::i;:::-;31355:1;31336:9;:15;31346:4;31336:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;31384:1;31367:9;:13;31377:2;31367:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;31415:2;31396:7;:16;31404:7;31396:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;31454:7;31450:2;31435:27;;31444:4;31435:27;;;;;;;;;;;;30892:578;;;:::o;28590:110::-;28666:26;28676:2;28680:7;28666:26;;;;;;;;;;;;:9;:26::i;:::-;28590:110;;:::o;43007:173::-;43063:16;43082:6;;;;;;;;;;;43063:25;;43108:8;43099:6;;:17;;;;;;;;;;;;;;;;;;43163:8;43132:40;;43153:8;43132:40;;;;;;;;;;;;43007:173;;:::o;26978:315::-;27135:28;27145:4;27151:2;27155:7;27135:9;:28::i;:::-;27182:48;27205:4;27211:2;27215:7;27224:5;27182:22;:48::i;:::-;27174:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;26978:315;;;;:::o;43626:184::-;43686:13;43712:90;;;;;;;;;;;;;;;;;;;43626:184;:::o;8845:723::-;8901:13;9131:1;9122:5;:10;9118:53;;;9149:10;;;;;;;;;;;;;;;;;;;;;9118:53;9181:12;9196:5;9181:20;;9212:14;9237:78;9252:1;9244:4;:9;9237:78;;9270:8;;;;;:::i;:::-;;;;9301:2;9293:10;;;;;:::i;:::-;;;9237:78;;;9325:19;9357:6;9347:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9325:39;;9375:154;9391:1;9382:5;:10;9375:154;;9419:1;9409:11;;;;;:::i;:::-;;;9486:2;9478:5;:10;;;;:::i;:::-;9465:2;:24;;;;:::i;:::-;9452:39;;9435:6;9442;9435:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;9515:2;9506:11;;;;;:::i;:::-;;;9375:154;;;9553:6;9539:21;;;;;8845:723;;;;:::o;8370:157::-;8455:4;8494:25;8479:40;;;:11;:40;;;;8472:47;;8370:157;;;:::o;36437:589::-;36581:45;36608:4;36614:2;36618:7;36581:26;:45::i;:::-;36659:1;36643:18;;:4;:18;;;36639:187;;;36678:40;36710:7;36678:31;:40::i;:::-;36639:187;;;36748:2;36740:10;;:4;:10;;;36736:90;;36767:47;36800:4;36806:7;36767:32;:47::i;:::-;36736:90;36639:187;36854:1;36840:16;;:2;:16;;;36836:183;;;36873:45;36910:7;36873:36;:45::i;:::-;36836:183;;;36946:4;36940:10;;:2;:10;;;36936:83;;36967:40;36995:2;36999:7;36967:27;:40::i;:::-;36936:83;36836:183;36437:589;;;:::o;28927:321::-;29057:18;29063:2;29067:7;29057:5;:18::i;:::-;29108:54;29139:1;29143:2;29147:7;29156:5;29108:22;:54::i;:::-;29086:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;28927:321;;;:::o;32327:799::-;32482:4;32503:15;:2;:13;;;:15::i;:::-;32499:620;;;32555:2;32539:36;;;32576:12;:10;:12::i;:::-;32590:4;32596:7;32605:5;32539:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32535:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32798:1;32781:6;:13;:18;32777:272;;;32824:60;;;;;;;;;;:::i;:::-;;;;;;;;32777:272;32999:6;32993:13;32984:6;32980:2;32976:15;32969:38;32535:529;32672:41;;;32662:51;;;:6;:51;;;;32655:58;;;;;32499:620;33103:4;33096:11;;32327:799;;;;;;;:::o;33698:126::-;;;;:::o;37749:164::-;37853:10;:17;;;;37826:15;:24;37842:7;37826:24;;;;;;;;;;;:44;;;;37881:10;37897:7;37881:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37749:164;:::o;38540:988::-;38806:22;38856:1;38831:22;38848:4;38831:16;:22::i;:::-;:26;;;;:::i;:::-;38806:51;;38868:18;38889:17;:26;38907:7;38889:26;;;;;;;;;;;;38868:47;;39036:14;39022:10;:28;39018:328;;39067:19;39089:12;:18;39102:4;39089:18;;;;;;;;;;;;;;;:34;39108:14;39089:34;;;;;;;;;;;;39067:56;;39173:11;39140:12;:18;39153:4;39140:18;;;;;;;;;;;;;;;:30;39159:10;39140:30;;;;;;;;;;;:44;;;;39290:10;39257:17;:30;39275:11;39257:30;;;;;;;;;;;:43;;;;39018:328;;39442:17;:26;39460:7;39442:26;;;;;;;;;;;39435:33;;;39486:12;:18;39499:4;39486:18;;;;;;;;;;;;;;;:34;39505:14;39486:34;;;;;;;;;;;39479:41;;;38540:988;;;;:::o;39823:1079::-;40076:22;40121:1;40101:10;:17;;;;:21;;;;:::i;:::-;40076:46;;40133:18;40154:15;:24;40170:7;40154:24;;;;;;;;;;;;40133:45;;40505:19;40527:10;40538:14;40527:26;;;;;;;;;;;;;;;;;;;;;;;;40505:48;;40591:11;40566:10;40577;40566:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40702:10;40671:15;:28;40687:11;40671:28;;;;;;;;;;;:41;;;;40843:15;:24;40859:7;40843:24;;;;;;;;;;;40836:31;;;40878:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39823:1079;;;;:::o;37327:221::-;37412:14;37429:20;37446:2;37429:16;:20::i;:::-;37412:37;;37487:7;37460:12;:16;37473:2;37460:16;;;;;;;;;;;;;;;:24;37477:6;37460:24;;;;;;;;;;;:34;;;;37534:6;37505:17;:26;37523:7;37505:26;;;;;;;;;;;:35;;;;37327:221;;;:::o;29584:382::-;29678:1;29664:16;;:2;:16;;;;29656:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;29737:16;29745:7;29737;:16::i;:::-;29736:17;29728:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;29799:45;29828:1;29832:2;29836:7;29799:20;:45::i;:::-;29874:1;29857:9;:13;29867:2;29857:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;29905:2;29886:7;:16;29894:7;29886:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;29950:7;29946:2;29925:33;;29942:1;29925:33;;;;;;;;;;;;29584:382;;:::o;11370:387::-;11430:4;11638:12;11705:7;11693:20;11685:28;;11748:1;11741:4;:8;11734:15;;;11370:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:342:1:-;;109:64;124:48;165:6;124:48;:::i;:::-;109:64;:::i;:::-;100:73;;196:6;189:5;182:21;234:4;227:5;223:16;272:3;263:6;258:3;254:16;251:25;248:2;;;289:1;286;279:12;248:2;302:41;336:6;331:3;326;302:41;:::i;:::-;90:259;;;;;;:::o;355:344::-;;458:65;473:49;515:6;473:49;:::i;:::-;458:65;:::i;:::-;449:74;;546:6;539:5;532:21;584:4;577:5;573:16;622:3;613:6;608:3;604:16;601:25;598:2;;;639:1;636;629:12;598:2;652:41;686:6;681:3;676;652:41;:::i;:::-;439:260;;;;;;:::o;705:139::-;;789:6;776:20;767:29;;805:33;832:5;805:33;:::i;:::-;757:87;;;;:::o;850:133::-;;931:6;918:20;909:29;;947:30;971:5;947:30;:::i;:::-;899:84;;;;:::o;989:137::-;;1072:6;1059:20;1050:29;;1088:32;1114:5;1088:32;:::i;:::-;1040:86;;;;:::o;1132:141::-;;1219:6;1213:13;1204:22;;1235:32;1261:5;1235:32;:::i;:::-;1194:79;;;;:::o;1292:271::-;;1396:3;1389:4;1381:6;1377:17;1373:27;1363:2;;1414:1;1411;1404:12;1363:2;1454:6;1441:20;1479:78;1553:3;1545:6;1538:4;1530:6;1526:17;1479:78;:::i;:::-;1470:87;;1353:210;;;;;:::o;1583:273::-;;1688:3;1681:4;1673:6;1669:17;1665:27;1655:2;;1706:1;1703;1696:12;1655:2;1746:6;1733:20;1771:79;1846:3;1838:6;1831:4;1823:6;1819:17;1771:79;:::i;:::-;1762:88;;1645:211;;;;;:::o;1862:139::-;;1946:6;1933:20;1924:29;;1962:33;1989:5;1962:33;:::i;:::-;1914:87;;;;:::o;2007:262::-;;2115:2;2103:9;2094:7;2090:23;2086:32;2083:2;;;2131:1;2128;2121:12;2083:2;2174:1;2199:53;2244:7;2235:6;2224:9;2220:22;2199:53;:::i;:::-;2189:63;;2145:117;2073:196;;;;:::o;2275:407::-;;;2400:2;2388:9;2379:7;2375:23;2371:32;2368:2;;;2416:1;2413;2406:12;2368:2;2459:1;2484:53;2529:7;2520:6;2509:9;2505:22;2484:53;:::i;:::-;2474:63;;2430:117;2586:2;2612:53;2657:7;2648:6;2637:9;2633:22;2612:53;:::i;:::-;2602:63;;2557:118;2358:324;;;;;:::o;2688:552::-;;;;2830:2;2818:9;2809:7;2805:23;2801:32;2798:2;;;2846:1;2843;2836:12;2798:2;2889:1;2914:53;2959:7;2950:6;2939:9;2935:22;2914:53;:::i;:::-;2904:63;;2860:117;3016:2;3042:53;3087:7;3078:6;3067:9;3063:22;3042:53;:::i;:::-;3032:63;;2987:118;3144:2;3170:53;3215:7;3206:6;3195:9;3191:22;3170:53;:::i;:::-;3160:63;;3115:118;2788:452;;;;;:::o;3246:809::-;;;;;3414:3;3402:9;3393:7;3389:23;3385:33;3382:2;;;3431:1;3428;3421:12;3382:2;3474:1;3499:53;3544:7;3535:6;3524:9;3520:22;3499:53;:::i;:::-;3489:63;;3445:117;3601:2;3627:53;3672:7;3663:6;3652:9;3648:22;3627:53;:::i;:::-;3617:63;;3572:118;3729:2;3755:53;3800:7;3791:6;3780:9;3776:22;3755:53;:::i;:::-;3745:63;;3700:118;3885:2;3874:9;3870:18;3857:32;3916:18;3908:6;3905:30;3902:2;;;3948:1;3945;3938:12;3902:2;3976:62;4030:7;4021:6;4010:9;4006:22;3976:62;:::i;:::-;3966:72;;3828:220;3372:683;;;;;;;:::o;4061:401::-;;;4183:2;4171:9;4162:7;4158:23;4154:32;4151:2;;;4199:1;4196;4189:12;4151:2;4242:1;4267:53;4312:7;4303:6;4292:9;4288:22;4267:53;:::i;:::-;4257:63;;4213:117;4369:2;4395:50;4437:7;4428:6;4417:9;4413:22;4395:50;:::i;:::-;4385:60;;4340:115;4141:321;;;;;:::o;4468:407::-;;;4593:2;4581:9;4572:7;4568:23;4564:32;4561:2;;;4609:1;4606;4599:12;4561:2;4652:1;4677:53;4722:7;4713:6;4702:9;4698:22;4677:53;:::i;:::-;4667:63;;4623:117;4779:2;4805:53;4850:7;4841:6;4830:9;4826:22;4805:53;:::i;:::-;4795:63;;4750:118;4551:324;;;;;:::o;4881:256::-;;4986:2;4974:9;4965:7;4961:23;4957:32;4954:2;;;5002:1;4999;4992:12;4954:2;5045:1;5070:50;5112:7;5103:6;5092:9;5088:22;5070:50;:::i;:::-;5060:60;;5016:114;4944:193;;;;:::o;5143:260::-;;5250:2;5238:9;5229:7;5225:23;5221:32;5218:2;;;5266:1;5263;5256:12;5218:2;5309:1;5334:52;5378:7;5369:6;5358:9;5354:22;5334:52;:::i;:::-;5324:62;;5280:116;5208:195;;;;:::o;5409:282::-;;5527:2;5515:9;5506:7;5502:23;5498:32;5495:2;;;5543:1;5540;5533:12;5495:2;5586:1;5611:63;5666:7;5657:6;5646:9;5642:22;5611:63;:::i;:::-;5601:73;;5557:127;5485:206;;;;:::o;5697:375::-;;5815:2;5803:9;5794:7;5790:23;5786:32;5783:2;;;5831:1;5828;5821:12;5783:2;5902:1;5891:9;5887:17;5874:31;5932:18;5924:6;5921:30;5918:2;;;5964:1;5961;5954:12;5918:2;5992:63;6047:7;6038:6;6027:9;6023:22;5992:63;:::i;:::-;5982:73;;5845:220;5773:299;;;;:::o;6078:262::-;;6186:2;6174:9;6165:7;6161:23;6157:32;6154:2;;;6202:1;6199;6192:12;6154:2;6245:1;6270:53;6315:7;6306:6;6295:9;6291:22;6270:53;:::i;:::-;6260:63;;6216:117;6144:196;;;;:::o;6346:179::-;;6436:46;6478:3;6470:6;6436:46;:::i;:::-;6514:4;6509:3;6505:14;6491:28;;6426:99;;;;:::o;6531:118::-;6618:24;6636:5;6618:24;:::i;:::-;6613:3;6606:37;6596:53;;:::o;6685:732::-;;6833:54;6881:5;6833:54;:::i;:::-;6903:86;6982:6;6977:3;6903:86;:::i;:::-;6896:93;;7013:56;7063:5;7013:56;:::i;:::-;7092:7;7123:1;7108:284;7133:6;7130:1;7127:13;7108:284;;;7209:6;7203:13;7236:63;7295:3;7280:13;7236:63;:::i;:::-;7229:70;;7322:60;7375:6;7322:60;:::i;:::-;7312:70;;7168:224;7155:1;7152;7148:9;7143:14;;7108:284;;;7112:14;7408:3;7401:10;;6809:608;;;;;;;:::o;7423:109::-;7504:21;7519:5;7504:21;:::i;:::-;7499:3;7492:34;7482:50;;:::o;7538:360::-;;7652:38;7684:5;7652:38;:::i;:::-;7706:70;7769:6;7764:3;7706:70;:::i;:::-;7699:77;;7785:52;7830:6;7825:3;7818:4;7811:5;7807:16;7785:52;:::i;:::-;7862:29;7884:6;7862:29;:::i;:::-;7857:3;7853:39;7846:46;;7628:270;;;;;:::o;7904:364::-;;8020:39;8053:5;8020:39;:::i;:::-;8075:71;8139:6;8134:3;8075:71;:::i;:::-;8068:78;;8155:52;8200:6;8195:3;8188:4;8181:5;8177:16;8155:52;:::i;:::-;8232:29;8254:6;8232:29;:::i;:::-;8227:3;8223:39;8216:46;;7996:272;;;;;:::o;8274:377::-;;8408:39;8441:5;8408:39;:::i;:::-;8463:89;8545:6;8540:3;8463:89;:::i;:::-;8456:96;;8561:52;8606:6;8601:3;8594:4;8587:5;8583:16;8561:52;:::i;:::-;8638:6;8633:3;8629:16;8622:23;;8384:267;;;;;:::o;8681:845::-;;8821:5;8815:12;8850:36;8876:9;8850:36;:::i;:::-;8902:89;8984:6;8979:3;8902:89;:::i;:::-;8895:96;;9022:1;9011:9;9007:17;9038:1;9033:137;;;;9184:1;9179:341;;;;9000:520;;9033:137;9117:4;9113:9;9102;9098:25;9093:3;9086:38;9153:6;9148:3;9144:16;9137:23;;9033:137;;9179:341;9246:38;9278:5;9246:38;:::i;:::-;9306:1;9320:154;9334:6;9331:1;9328:13;9320:154;;;9408:7;9402:14;9398:1;9393:3;9389:11;9382:35;9458:1;9449:7;9445:15;9434:26;;9356:4;9353:1;9349:12;9344:17;;9320:154;;;9503:6;9498:3;9494:16;9487:23;;9186:334;;9000:520;;8788:738;;;;;;:::o;9532:375::-;;9695:67;9759:2;9754:3;9695:67;:::i;:::-;9688:74;;9792:34;9788:1;9783:3;9779:11;9772:55;9858:13;9853:2;9848:3;9844:12;9837:35;9898:2;9893:3;9889:12;9882:19;;9678:229;;;:::o;9913:382::-;;10076:67;10140:2;10135:3;10076:67;:::i;:::-;10069:74;;10173:34;10169:1;10164:3;10160:11;10153:55;10239:20;10234:2;10229:3;10225:12;10218:42;10286:2;10281:3;10277:12;10270:19;;10059:236;;;:::o;10301:370::-;;10464:67;10528:2;10523:3;10464:67;:::i;:::-;10457:74;;10561:34;10557:1;10552:3;10548:11;10541:55;10627:8;10622:2;10617:3;10613:12;10606:30;10662:2;10657:3;10653:12;10646:19;;10447:224;;;:::o;10677:326::-;;10840:67;10904:2;10899:3;10840:67;:::i;:::-;10833:74;;10937:30;10933:1;10928:3;10924:11;10917:51;10994:2;10989:3;10985:12;10978:19;;10823:180;;;:::o;11009:368::-;;11172:67;11236:2;11231:3;11172:67;:::i;:::-;11165:74;;11269:34;11265:1;11260:3;11256:11;11249:55;11335:6;11330:2;11325:3;11321:12;11314:28;11368:2;11363:3;11359:12;11352:19;;11155:222;;;:::o;11383:323::-;;11546:67;11610:2;11605:3;11546:67;:::i;:::-;11539:74;;11643:27;11639:1;11634:3;11630:11;11623:48;11697:2;11692:3;11688:12;11681:19;;11529:177;;;:::o;11712:376::-;;11875:67;11939:2;11934:3;11875:67;:::i;:::-;11868:74;;11972:34;11968:1;11963:3;11959:11;11952:55;12038:14;12033:2;12028:3;12024:12;12017:36;12079:2;12074:3;12070:12;12063:19;;11858:230;;;:::o;12094:388::-;;12257:67;12321:2;12316:3;12257:67;:::i;:::-;12250:74;;12354:34;12350:1;12345:3;12341:11;12334:55;12420:26;12415:2;12410:3;12406:12;12399:48;12473:2;12468:3;12464:12;12457:19;;12240:242;;;:::o;12488:374::-;;12651:67;12715:2;12710:3;12651:67;:::i;:::-;12644:74;;12748:34;12744:1;12739:3;12735:11;12728:55;12814:12;12809:2;12804:3;12800:12;12793:34;12853:2;12848:3;12844:12;12837:19;;12634:228;;;:::o;12868:373::-;;13031:67;13095:2;13090:3;13031:67;:::i;:::-;13024:74;;13128:34;13124:1;13119:3;13115:11;13108:55;13194:11;13189:2;13184:3;13180:12;13173:33;13232:2;13227:3;13223:12;13216:19;;13014:227;;;:::o;13247:330::-;;13410:67;13474:2;13469:3;13410:67;:::i;:::-;13403:74;;13507:34;13503:1;13498:3;13494:11;13487:55;13568:2;13563:3;13559:12;13552:19;;13393:184;;;:::o;13583:376::-;;13746:67;13810:2;13805:3;13746:67;:::i;:::-;13739:74;;13843:34;13839:1;13834:3;13830:11;13823:55;13909:14;13904:2;13899:3;13895:12;13888:36;13950:2;13945:3;13941:12;13934:19;;13729:230;;;:::o;13965:330::-;;14128:67;14192:2;14187:3;14128:67;:::i;:::-;14121:74;;14225:34;14221:1;14216:3;14212:11;14205:55;14286:2;14281:3;14277:12;14270:19;;14111:184;;;:::o;14301:373::-;;14464:67;14528:2;14523:3;14464:67;:::i;:::-;14457:74;;14561:34;14557:1;14552:3;14548:11;14541:55;14627:11;14622:2;14617:3;14613:12;14606:33;14665:2;14660:3;14656:12;14649:19;;14447:227;;;:::o;14680:379::-;;14843:67;14907:2;14902:3;14843:67;:::i;:::-;14836:74;;14940:34;14936:1;14931:3;14927:11;14920:55;15006:17;15001:2;14996:3;14992:12;14985:39;15050:2;15045:3;15041:12;15034:19;;14826:233;;;:::o;15065:365::-;;15228:67;15292:2;15287:3;15228:67;:::i;:::-;15221:74;;15325:34;15321:1;15316:3;15312:11;15305:55;15391:3;15386:2;15381:3;15377:12;15370:25;15421:2;15416:3;15412:12;15405:19;;15211:219;;;:::o;15436:381::-;;15599:67;15663:2;15658:3;15599:67;:::i;:::-;15592:74;;15696:34;15692:1;15687:3;15683:11;15676:55;15762:19;15757:2;15752:3;15748:12;15741:41;15808:2;15803:3;15799:12;15792:19;;15582:235;;;:::o;15823:322::-;;15986:67;16050:2;16045:3;15986:67;:::i;:::-;15979:74;;16083:26;16079:1;16074:3;16070:11;16063:47;16136:2;16131:3;16127:12;16120:19;;15969:176;;;:::o;16151:376::-;;16314:67;16378:2;16373:3;16314:67;:::i;:::-;16307:74;;16411:34;16407:1;16402:3;16398:11;16391:55;16477:14;16472:2;16467:3;16463:12;16456:36;16518:2;16513:3;16509:12;16502:19;;16297:230;;;:::o;16533:108::-;16610:24;16628:5;16610:24;:::i;:::-;16605:3;16598:37;16588:53;;:::o;16647:118::-;16734:24;16752:5;16734:24;:::i;:::-;16729:3;16722:37;16712:53;;:::o;16771:589::-;;17018:95;17109:3;17100:6;17018:95;:::i;:::-;17011:102;;17130:95;17221:3;17212:6;17130:95;:::i;:::-;17123:102;;17242:92;17330:3;17321:6;17242:92;:::i;:::-;17235:99;;17351:3;17344:10;;17000:360;;;;;;:::o;17366:222::-;;17497:2;17486:9;17482:18;17474:26;;17510:71;17578:1;17567:9;17563:17;17554:6;17510:71;:::i;:::-;17464:124;;;;:::o;17594:640::-;;17827:3;17816:9;17812:19;17804:27;;17841:71;17909:1;17898:9;17894:17;17885:6;17841:71;:::i;:::-;17922:72;17990:2;17979:9;17975:18;17966:6;17922:72;:::i;:::-;18004;18072:2;18061:9;18057:18;18048:6;18004:72;:::i;:::-;18123:9;18117:4;18113:20;18108:2;18097:9;18093:18;18086:48;18151:76;18222:4;18213:6;18151:76;:::i;:::-;18143:84;;17794:440;;;;;;;:::o;18240:373::-;;18421:2;18410:9;18406:18;18398:26;;18470:9;18464:4;18460:20;18456:1;18445:9;18441:17;18434:47;18498:108;18601:4;18592:6;18498:108;:::i;:::-;18490:116;;18388:225;;;;:::o;18619:210::-;;18744:2;18733:9;18729:18;18721:26;;18757:65;18819:1;18808:9;18804:17;18795:6;18757:65;:::i;:::-;18711:118;;;;:::o;18835:313::-;;18986:2;18975:9;18971:18;18963:26;;19035:9;19029:4;19025:20;19021:1;19010:9;19006:17;18999:47;19063:78;19136:4;19127:6;19063:78;:::i;:::-;19055:86;;18953:195;;;;:::o;19154:419::-;;19358:2;19347:9;19343:18;19335:26;;19407:9;19401:4;19397:20;19393:1;19382:9;19378:17;19371:47;19435:131;19561:4;19435:131;:::i;:::-;19427:139;;19325:248;;;:::o;19579:419::-;;19783:2;19772:9;19768:18;19760:26;;19832:9;19826:4;19822:20;19818:1;19807:9;19803:17;19796:47;19860:131;19986:4;19860:131;:::i;:::-;19852:139;;19750:248;;;:::o;20004:419::-;;20208:2;20197:9;20193:18;20185:26;;20257:9;20251:4;20247:20;20243:1;20232:9;20228:17;20221:47;20285:131;20411:4;20285:131;:::i;:::-;20277:139;;20175:248;;;:::o;20429:419::-;;20633:2;20622:9;20618:18;20610:26;;20682:9;20676:4;20672:20;20668:1;20657:9;20653:17;20646:47;20710:131;20836:4;20710:131;:::i;:::-;20702:139;;20600:248;;;:::o;20854:419::-;;21058:2;21047:9;21043:18;21035:26;;21107:9;21101:4;21097:20;21093:1;21082:9;21078:17;21071:47;21135:131;21261:4;21135:131;:::i;:::-;21127:139;;21025:248;;;:::o;21279:419::-;;21483:2;21472:9;21468:18;21460:26;;21532:9;21526:4;21522:20;21518:1;21507:9;21503:17;21496:47;21560:131;21686:4;21560:131;:::i;:::-;21552:139;;21450:248;;;:::o;21704:419::-;;21908:2;21897:9;21893:18;21885:26;;21957:9;21951:4;21947:20;21943:1;21932:9;21928:17;21921:47;21985:131;22111:4;21985:131;:::i;:::-;21977:139;;21875:248;;;:::o;22129:419::-;;22333:2;22322:9;22318:18;22310:26;;22382:9;22376:4;22372:20;22368:1;22357:9;22353:17;22346:47;22410:131;22536:4;22410:131;:::i;:::-;22402:139;;22300:248;;;:::o;22554:419::-;;22758:2;22747:9;22743:18;22735:26;;22807:9;22801:4;22797:20;22793:1;22782:9;22778:17;22771:47;22835:131;22961:4;22835:131;:::i;:::-;22827:139;;22725:248;;;:::o;22979:419::-;;23183:2;23172:9;23168:18;23160:26;;23232:9;23226:4;23222:20;23218:1;23207:9;23203:17;23196:47;23260:131;23386:4;23260:131;:::i;:::-;23252:139;;23150:248;;;:::o;23404:419::-;;23608:2;23597:9;23593:18;23585:26;;23657:9;23651:4;23647:20;23643:1;23632:9;23628:17;23621:47;23685:131;23811:4;23685:131;:::i;:::-;23677:139;;23575:248;;;:::o;23829:419::-;;24033:2;24022:9;24018:18;24010:26;;24082:9;24076:4;24072:20;24068:1;24057:9;24053:17;24046:47;24110:131;24236:4;24110:131;:::i;:::-;24102:139;;24000:248;;;:::o;24254:419::-;;24458:2;24447:9;24443:18;24435:26;;24507:9;24501:4;24497:20;24493:1;24482:9;24478:17;24471:47;24535:131;24661:4;24535:131;:::i;:::-;24527:139;;24425:248;;;:::o;24679:419::-;;24883:2;24872:9;24868:18;24860:26;;24932:9;24926:4;24922:20;24918:1;24907:9;24903:17;24896:47;24960:131;25086:4;24960:131;:::i;:::-;24952:139;;24850:248;;;:::o;25104:419::-;;25308:2;25297:9;25293:18;25285:26;;25357:9;25351:4;25347:20;25343:1;25332:9;25328:17;25321:47;25385:131;25511:4;25385:131;:::i;:::-;25377:139;;25275:248;;;:::o;25529:419::-;;25733:2;25722:9;25718:18;25710:26;;25782:9;25776:4;25772:20;25768:1;25757:9;25753:17;25746:47;25810:131;25936:4;25810:131;:::i;:::-;25802:139;;25700:248;;;:::o;25954:419::-;;26158:2;26147:9;26143:18;26135:26;;26207:9;26201:4;26197:20;26193:1;26182:9;26178:17;26171:47;26235:131;26361:4;26235:131;:::i;:::-;26227:139;;26125:248;;;:::o;26379:419::-;;26583:2;26572:9;26568:18;26560:26;;26632:9;26626:4;26622:20;26618:1;26607:9;26603:17;26596:47;26660:131;26786:4;26660:131;:::i;:::-;26652:139;;26550:248;;;:::o;26804:419::-;;27008:2;26997:9;26993:18;26985:26;;27057:9;27051:4;27047:20;27043:1;27032:9;27028:17;27021:47;27085:131;27211:4;27085:131;:::i;:::-;27077:139;;26975:248;;;:::o;27229:222::-;;27360:2;27349:9;27345:18;27337:26;;27373:71;27441:1;27430:9;27426:17;27417:6;27373:71;:::i;:::-;27327:124;;;;:::o;27457:283::-;;27523:2;27517:9;27507:19;;27565:4;27557:6;27553:17;27672:6;27660:10;27657:22;27636:18;27624:10;27621:34;27618:62;27615:2;;;27683:18;;:::i;:::-;27615:2;27723:10;27719:2;27712:22;27497:243;;;;:::o;27746:331::-;;27897:18;27889:6;27886:30;27883:2;;;27919:18;;:::i;:::-;27883:2;28004:4;28000:9;27993:4;27985:6;27981:17;27977:33;27969:41;;28065:4;28059;28055:15;28047:23;;27812:265;;;:::o;28083:332::-;;28235:18;28227:6;28224:30;28221:2;;;28257:18;;:::i;:::-;28221:2;28342:4;28338:9;28331:4;28323:6;28319:17;28315:33;28307:41;;28403:4;28397;28393:15;28385:23;;28150:265;;;:::o;28421:132::-;;28511:3;28503:11;;28541:4;28536:3;28532:14;28524:22;;28493:60;;;:::o;28559:141::-;;28631:3;28623:11;;28654:3;28651:1;28644:14;28688:4;28685:1;28675:18;28667:26;;28613:87;;;:::o;28706:114::-;;28807:5;28801:12;28791:22;;28780:40;;;:::o;28826:98::-;;28911:5;28905:12;28895:22;;28884:40;;;:::o;28930:99::-;;29016:5;29010:12;29000:22;;28989:40;;;:::o;29035:113::-;;29137:4;29132:3;29128:14;29120:22;;29110:38;;;:::o;29154:184::-;;29287:6;29282:3;29275:19;29327:4;29322:3;29318:14;29303:29;;29265:73;;;;:::o;29344:168::-;;29461:6;29456:3;29449:19;29501:4;29496:3;29492:14;29477:29;;29439:73;;;;:::o;29518:169::-;;29636:6;29631:3;29624:19;29676:4;29671:3;29667:14;29652:29;;29614:73;;;;:::o;29693:148::-;;29832:3;29817:18;;29807:34;;;;:::o;29847:305::-;;29906:20;29924:1;29906:20;:::i;:::-;29901:25;;29940:20;29958:1;29940:20;:::i;:::-;29935:25;;30094:1;30026:66;30022:74;30019:1;30016:81;30013:2;;;30100:18;;:::i;:::-;30013:2;30144:1;30141;30137:9;30130:16;;29891:261;;;;:::o;30158:185::-;;30215:20;30233:1;30215:20;:::i;:::-;30210:25;;30249:20;30267:1;30249:20;:::i;:::-;30244:25;;30288:1;30278:2;;30293:18;;:::i;:::-;30278:2;30335:1;30332;30328:9;30323:14;;30200:143;;;;:::o;30349:348::-;;30412:20;30430:1;30412:20;:::i;:::-;30407:25;;30446:20;30464:1;30446:20;:::i;:::-;30441:25;;30634:1;30566:66;30562:74;30559:1;30556:81;30551:1;30544:9;30537:17;30533:105;30530:2;;;30641:18;;:::i;:::-;30530:2;30689:1;30686;30682:9;30671:20;;30397:300;;;;:::o;30703:191::-;;30763:20;30781:1;30763:20;:::i;:::-;30758:25;;30797:20;30815:1;30797:20;:::i;:::-;30792:25;;30836:1;30833;30830:8;30827:2;;;30841:18;;:::i;:::-;30827:2;30886:1;30883;30879:9;30871:17;;30748:146;;;;:::o;30900:96::-;;30966:24;30984:5;30966:24;:::i;:::-;30955:35;;30945:51;;;:::o;31002:90::-;;31079:5;31072:13;31065:21;31054:32;;31044:48;;;:::o;31098:149::-;;31174:66;31167:5;31163:78;31152:89;;31142:105;;;:::o;31253:126::-;;31330:42;31323:5;31319:54;31308:65;;31298:81;;;:::o;31385:77::-;;31451:5;31440:16;;31430:32;;;:::o;31468:154::-;31552:6;31547:3;31542;31529:30;31614:1;31605:6;31600:3;31596:16;31589:27;31519:103;;;:::o;31628:307::-;31696:1;31706:113;31720:6;31717:1;31714:13;31706:113;;;31805:1;31800:3;31796:11;31790:18;31786:1;31781:3;31777:11;31770:39;31742:2;31739:1;31735:10;31730:15;;31706:113;;;31837:6;31834:1;31831:13;31828:2;;;31917:1;31908:6;31903:3;31899:16;31892:27;31828:2;31677:258;;;;:::o;31941:320::-;;32022:1;32016:4;32012:12;32002:22;;32069:1;32063:4;32059:12;32090:18;32080:2;;32146:4;32138:6;32134:17;32124:27;;32080:2;32208;32200:6;32197:14;32177:18;32174:38;32171:2;;;32227:18;;:::i;:::-;32171:2;31992:269;;;;:::o;32267:233::-;;32329:24;32347:5;32329:24;:::i;:::-;32320:33;;32375:66;32368:5;32365:77;32362:2;;;32445:18;;:::i;:::-;32362:2;32492:1;32485:5;32481:13;32474:20;;32310:190;;;:::o;32506:176::-;;32555:20;32573:1;32555:20;:::i;:::-;32550:25;;32589:20;32607:1;32589:20;:::i;:::-;32584:25;;32628:1;32618:2;;32633:18;;:::i;:::-;32618:2;32674:1;32671;32667:9;32662:14;;32540:142;;;;:::o;32688:180::-;32736:77;32733:1;32726:88;32833:4;32830:1;32823:15;32857:4;32854:1;32847:15;32874:180;32922:77;32919:1;32912:88;33019:4;33016:1;33009:15;33043:4;33040:1;33033:15;33060:180;33108:77;33105:1;33098:88;33205:4;33202:1;33195:15;33229:4;33226:1;33219:15;33246:180;33294:77;33291:1;33284:88;33391:4;33388:1;33381:15;33415:4;33412:1;33405:15;33432:102;;33524:2;33520:7;33515:2;33508:5;33504:14;33500:28;33490:38;;33480:54;;;:::o;33540:122::-;33613:24;33631:5;33613:24;:::i;:::-;33606:5;33603:35;33593:2;;33652:1;33649;33642:12;33593:2;33583:79;:::o;33668:116::-;33738:21;33753:5;33738:21;:::i;:::-;33731:5;33728:32;33718:2;;33774:1;33771;33764:12;33718:2;33708:76;:::o;33790:120::-;33862:23;33879:5;33862:23;:::i;:::-;33855:5;33852:34;33842:2;;33900:1;33897;33890:12;33842:2;33832:78;:::o;33916:122::-;33989:24;34007:5;33989:24;:::i;:::-;33982:5;33979:35;33969:2;;34028:1;34025;34018:12;33969:2;33959:79;:::o

Swarm Source

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