ETH Price: $3,341.17 (+2.49%)
Gas: 2 Gwei

Token

The Shark Cove (SHARK)
 

Overview

Max Total Supply

2,913 SHARK

Holders

872

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
r1ggs.eth
Balance
3 SHARK
0xf8ba02fcbe43cb3ea73d22b7a62dca1923bff06c
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

The Shark Cove contains 2,913 unique sharks residing on the Ethereum blockchain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SharkCove

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-08-13
*/

// Sources flattened with hardhat v2.5.0 https://hardhat.org

// File @openzeppelin/contracts/utils/introspection/[email protected]

// SPDX-License-Identifier: MIT

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/[email protected]



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/[email protected]



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/extensions/[email protected]



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/utils/[email protected]



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

    function _verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) private pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

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


// File @openzeppelin/contracts/utils/[email protected]



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/[email protected]



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/introspection/[email protected]



pragma solidity ^0.8.0;

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


// File @openzeppelin/contracts/token/ERC721/[email protected]



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(to).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/[email protected]



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/token/ERC721/extensions/[email protected]



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/[email protected]



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


// File @openzeppelin/contracts/utils/math/[email protected]



pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


// File @openzeppelin/contracts/finance/[email protected]



pragma solidity ^0.8.0;



/**
 * @title PaymentSplitter
 * @dev This contract allows to split Ether payments among a group of accounts. The sender does not need to be aware
 * that the Ether will be split in this way, since it is handled transparently by the contract.
 *
 * The split can be in equal parts or in any other arbitrary proportion. The way this is specified is by assigning each
 * account to a number of shares. Of all the Ether that this contract receives, each account will then be able to claim
 * an amount proportional to the percentage of total shares they were assigned.
 *
 * `PaymentSplitter` follows a _pull payment_ model. This means that payments are not automatically forwarded to the
 * accounts but kept in this contract, and the actual transfer is triggered as a separate step by calling the {release}
 * function.
 */
contract PaymentSplitter is Context {
    event PayeeAdded(address account, uint256 shares);
    event PaymentReleased(address to, uint256 amount);
    event PaymentReceived(address from, uint256 amount);

    uint256 private _totalShares;
    uint256 private _totalReleased;

    mapping(address => uint256) private _shares;
    mapping(address => uint256) private _released;
    address[] private _payees;

    /**
     * @dev Creates an instance of `PaymentSplitter` where each account in `payees` is assigned the number of shares at
     * the matching position in the `shares` array.
     *
     * All addresses in `payees` must be non-zero. Both arrays must have the same non-zero length, and there must be no
     * duplicates in `payees`.
     */
    constructor(address[] memory payees, uint256[] memory shares_) payable {
        require(payees.length == shares_.length, "PaymentSplitter: payees and shares length mismatch");
        require(payees.length > 0, "PaymentSplitter: no payees");

        for (uint256 i = 0; i < payees.length; i++) {
            _addPayee(payees[i], shares_[i]);
        }
    }

    /**
     * @dev The Ether received will be logged with {PaymentReceived} events. Note that these events are not fully
     * reliable: it's possible for a contract to receive Ether without triggering this function. This only affects the
     * reliability of the events, and not the actual splitting of Ether.
     *
     * To learn more about this see the Solidity documentation for
     * https://solidity.readthedocs.io/en/latest/contracts.html#fallback-function[fallback
     * functions].
     */
    receive() external payable virtual {
        emit PaymentReceived(_msgSender(), msg.value);
    }

    /**
     * @dev Getter for the total shares held by payees.
     */
    function totalShares() public view returns (uint256) {
        return _totalShares;
    }

    /**
     * @dev Getter for the total amount of Ether already released.
     */
    function totalReleased() public view returns (uint256) {
        return _totalReleased;
    }

    /**
     * @dev Getter for the amount of shares held by an account.
     */
    function shares(address account) public view returns (uint256) {
        return _shares[account];
    }

    /**
     * @dev Getter for the amount of Ether already released to a payee.
     */
    function released(address account) public view returns (uint256) {
        return _released[account];
    }

    /**
     * @dev Getter for the address of the payee number `index`.
     */
    function payee(uint256 index) public view returns (address) {
        return _payees[index];
    }

    /**
     * @dev Triggers a transfer to `account` of the amount of Ether they are owed, according to their percentage of the
     * total shares and their previous withdrawals.
     */
    function release(address payable account) public virtual {
        require(_shares[account] > 0, "PaymentSplitter: account has no shares");

        uint256 totalReceived = address(this).balance + _totalReleased;
        uint256 payment = (totalReceived * _shares[account]) / _totalShares - _released[account];

        require(payment != 0, "PaymentSplitter: account is not due payment");

        _released[account] = _released[account] + payment;
        _totalReleased = _totalReleased + payment;

        Address.sendValue(account, payment);
        emit PaymentReleased(account, payment);
    }

    /**
     * @dev Add a new payee to the contract.
     * @param account The address of the payee to add.
     * @param shares_ The number of shares owned by the payee.
     */
    function _addPayee(address account, uint256 shares_) private {
        require(account != address(0), "PaymentSplitter: account is the zero address");
        require(shares_ > 0, "PaymentSplitter: shares are 0");
        require(_shares[account] == 0, "PaymentSplitter: account already has shares");

        _payees.push(account);
        _shares[account] = shares_;
        _totalShares = _totalShares + shares_;
        emit PayeeAdded(account, shares_);
    }
}


// File contracts/SharkCove.sol


pragma solidity ^0.8.0;



contract SharkCove is ERC721Enumerable, Ownable, PaymentSplitter {

    using Strings for uint256;

    uint256 private _price = 0.05 ether;

    string public _baseTokenURI = '';

    string public SHARK_PROVENANCE = '';

    uint256 public MAX_TOKENS_PER_TRANSACTION = 20;

    uint256 public MAX_SUPPLY = 10000;

    uint256 public RESERVED_SUPPLY = 200;

    bool public _paused = true;

    string public LICENSE_TEXT = ""; // IT IS WHAT IT SAYS

    bool licenseLocked = false; // TEAM CAN'T EDIT THE LICENSE AFTER THIS GETS TRUE

    mapping(uint => string) private _owners;

    event licenseisLocked(string _licenseText);

    // Withdrawal addresses
    address t1 = 0x5a6F0489f0bfcD21889D26189C218a455612148F;
    address t2 = 0xda73C4DFa2F04B189A7f8EafB586501b4D0B73dC;

    address[] addressList = [t1, t2];
    uint256[] shareList = [60, 40];

    constructor()
    ERC721("The Shark Cove", "SHARK")
    PaymentSplitter(addressList, shareList)  {}

    function mint(uint256 count) public payable {
        uint256 supply = totalSupply();
        require( !_paused,                                      "Sale paused" );
        require( block.timestamp >= 1629151200,                 "Sale has not started yet" );
        require( count <= MAX_TOKENS_PER_TRANSACTION,           "You can mint a maximum of 20 SHARKs per transaction" );
        require( supply + count <= MAX_SUPPLY - RESERVED_SUPPLY,"Exceeds maximum SHARK supply" );
        require( msg.value >= _price * count,                   "Ether sent is not correct" );

        for(uint256 i; i < count; i++){
            _safeMint( msg.sender, supply + i );
        }
    }

    function airdrop(address wallet, uint256 count) public onlyOwner {
        require(count <= RESERVED_SUPPLY, "Exceeds maximum reserved SHARK supply");
        
        uint256 supply = totalSupply();
        
        for(uint256 i; i < count; i++){
            _safeMint(wallet, supply + i );
        }
        
        RESERVED_SUPPLY -= count;
    }

    // Just in case Eth does some crazy stuff
    function setPrice(uint256 _newPrice) public onlyOwner {
        _price = _newPrice;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function setBaseURI(string memory baseURI) public onlyOwner {
        _baseTokenURI = baseURI;
    }

    function getPrice() public view returns (uint256){
        return _price;
    }

    function flipSaleState() public onlyOwner {
        _paused = !_paused;
    }

    function setProvenanceHash(string memory provenanceHash) public onlyOwner {
        SHARK_PROVENANCE = provenanceHash;
    }
    
    // Returns the license for tokens
    function tokenLicense(uint _id) public view returns(string memory) {
        require(_id < totalSupply(), "Invalid ID");
        return LICENSE_TEXT;
    }
    
    // Locks the license to prevent further changes 
    function lockLicense() public onlyOwner {
        licenseLocked =  true;
        emit licenseisLocked(LICENSE_TEXT);
    }
    
    // Change the license
    function changeLicense(string memory _license) public onlyOwner {
        require(licenseLocked == false, "License already locked");
        LICENSE_TEXT = _license;
    }

    function walletOfOwner(address _owner) public view returns(uint256[] memory) {
        uint256 tokenCount = balanceOf(_owner);

        uint256[] memory tokensId = new uint256[](tokenCount);
        for(uint256 i; i < tokenCount; i++){
            tokensId[i] = tokenOfOwnerByIndex(_owner, i);
        }
        return tokensId;
    }
}

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":false,"internalType":"address","name":"account","type":"address"},{"indexed":false,"internalType":"uint256","name":"shares","type":"uint256"}],"name":"PayeeAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"from","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReceived","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"amount","type":"uint256"}],"name":"PaymentReleased","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_licenseText","type":"string"}],"name":"licenseisLocked","type":"event"},{"inputs":[],"name":"LICENSE_TEXT","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS_PER_TRANSACTION","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARK_PROVENANCE","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"wallet","type":"address"},{"internalType":"uint256","name":"count","type":"uint256"}],"name":"airdrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"string","name":"_license","type":"string"}],"name":"changeLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockLicense","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","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":"uint256","name":"index","type":"uint256"}],"name":"payee","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address payable","name":"account","type":"address"}],"name":"release","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"released","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"provenanceHash","type":"string"}],"name":"setProvenanceHash","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"shares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"uint256","name":"_id","type":"uint256"}],"name":"tokenLicense","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"totalReleased","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalShares","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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"},{"stateMutability":"payable","type":"receive"}]

608060405266b1a2bc2ec500006010556040518060200160405280600081525060119080519060200190620000369291906200086b565b5060405180602001604052806000815250601290805190602001906200005e9291906200086b565b50601460135561271060145560c86015556001601660006101000a81548160ff0219169083151502179055506040518060200160405280600081525060179080519060200190620000b19291906200086b565b506000601860006101000a81548160ff021916908315150217905550735a6f0489f0bfcd21889d26189c218a455612148f601a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073da73c4dfa2f04b189a7f8eafb586501b4d0b73dc601b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280601a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001601b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815250601c9060026200023a929190620008fc565b506040518060400160405280603c60ff168152602001602860ff16815250601d9060026200026a9291906200098b565b503480156200027857600080fd5b50601c805480602002602001604051908101604052809291908181526020018280548015620002fd57602002820191906000526020600020905b8160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019060010190808311620002b2575b5050505050601d8054806020026020016040519081016040528092919081815260200182805480156200035057602002820191906000526020600020905b8154815260200190600101908083116200033b575b50505050506040518060400160405280600e81526020017f54686520536861726b20436f76650000000000000000000000000000000000008152506040518060400160405280600581526020017f534841524b0000000000000000000000000000000000000000000000000000008152508160009080519060200190620003d99291906200086b565b508060019080519060200190620003f29291906200086b565b50505062000415620004096200056360201b60201c565b6200056b60201b60201c565b80518251146200045c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004539062000b35565b60405180910390fd5b6000825111620004a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200049a9062000b79565b60405180910390fd5b60005b82518110156200055a5762000544838281518110620004ee577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002602001015183838151811062000530577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516200063160201b60201c565b8080620005519062000c9f565b915050620004a6565b50505062000e8a565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620006a4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200069b9062000b13565b60405180910390fd5b60008111620006ea576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006e19062000b9b565b60405180910390fd5b6000600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054146200076f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007669062000b57565b60405180910390fd5b600f829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600b5462000826919062000bce565b600b819055507f40c340f65e17194d14ddddb073d3c9f888e3cb52b5aae0c6c7706b4fbc905fac82826040516200085f92919062000ae6565b60405180910390a15050565b828054620008799062000c69565b90600052602060002090601f0160209004810192826200089d5760008555620008e9565b82601f10620008b857805160ff1916838001178555620008e9565b82800160010185558215620008e9579182015b82811115620008e8578251825591602001919060010190620008cb565b5b509050620008f89190620009e2565b5090565b82805482825590600052602060002090810192821562000978579160200282015b82811115620009775782518260006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550916020019190600101906200091d565b5b509050620009879190620009e2565b5090565b828054828255906000526020600020908101928215620009cf579160200282015b82811115620009ce578251829060ff16905591602001919060010190620009ac565b5b509050620009de9190620009e2565b5090565b5b80821115620009fd576000816000905550600101620009e3565b5090565b62000a0c8162000c2b565b82525050565b600062000a21602c8362000bbd565b915062000a2e8262000d4b565b604082019050919050565b600062000a4860328362000bbd565b915062000a558262000d9a565b604082019050919050565b600062000a6f602b8362000bbd565b915062000a7c8262000de9565b604082019050919050565b600062000a96601a8362000bbd565b915062000aa38262000e38565b602082019050919050565b600062000abd601d8362000bbd565b915062000aca8262000e61565b602082019050919050565b62000ae08162000c5f565b82525050565b600060408201905062000afd600083018562000a01565b62000b0c602083018462000ad5565b9392505050565b6000602082019050818103600083015262000b2e8162000a12565b9050919050565b6000602082019050818103600083015262000b508162000a39565b9050919050565b6000602082019050818103600083015262000b728162000a60565b9050919050565b6000602082019050818103600083015262000b948162000a87565b9050919050565b6000602082019050818103600083015262000bb68162000aae565b9050919050565b600082825260208201905092915050565b600062000bdb8262000c5f565b915062000be88362000c5f565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111562000c205762000c1f62000ced565b5b828201905092915050565b600062000c388262000c3f565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b6000600282049050600182168062000c8257607f821691505b6020821081141562000c995762000c9862000d1c565b5b50919050565b600062000cac8262000c5f565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141562000ce25762000ce162000ced565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f5061796d656e7453706c69747465723a206163636f756e74206973207468652060008201527f7a65726f20616464726573730000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a2070617965657320616e64207368617260008201527f6573206c656e677468206d69736d617463680000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420616c726561647960008201527f2068617320736861726573000000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206e6f20706179656573000000000000600082015250565b7f5061796d656e7453706c69747465723a20736861726573206172652030000000600082015250565b6153738062000e9a6000396000f3fe6080604052600436106102605760003560e01c806370a0823111610144578063a22cb465116100b6578063ce7c2ac21161007a578063ce7c2ac214610936578063cfc86f7b14610973578063d9b137b21461099e578063e33b7de3146109db578063e985e9c514610a06578063f2fde38b14610a43576102a7565b8063a22cb46514610867578063b09904b514610890578063b88d4fde146108b9578063bf4702fc146108e2578063c87b56dd146108f9576102a7565b806391b7f5ed1161010857806391b7f5ed1461076457806395d89b411461078d5780639852595c146107b857806398d5fdca146107f55780639c3e72bd14610820578063a0712d681461084b576102a7565b806370a082311461067f578063715018a6146106bc5780638b83209b146106d35780638ba4cc3c146107105780638da5cb5b14610739576102a7565b806331a53e9a116101dd57806342842e0e116101a157806342842e0e1461054b578063438b6300146105745780634f6ccce7146105b15780634fce1de3146105ee57806355f804b3146106195780636352211e14610642576102a7565b806331a53e9a1461048857806332cb6b0c146104b357806334918dfd146104de5780633a98ef39146104f55780633cc520da14610520576102a7565b806316c61ccc1161022457806316c61ccc146103a357806318160ddd146103ce57806319165587146103f957806323b872dd146104225780632f745c591461044b576102a7565b806301ffc9a7146102ac57806306fdde03146102e9578063081812fc14610314578063095ea7b314610351578063109695231461037a576102a7565b366102a7577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061028e610a6c565b3460405161029d9291906141c2565b60405180910390a1005b600080fd5b3480156102b857600080fd5b506102d360048036038101906102ce9190613a1c565b610a74565b6040516102e0919061420d565b60405180910390f35b3480156102f557600080fd5b506102fe610aee565b60405161030b9190614228565b60405180910390f35b34801561032057600080fd5b5061033b60048036038101906103369190613aaf565b610b80565b6040516103489190614132565b60405180910390f35b34801561035d57600080fd5b50610378600480360381019061037391906139e0565b610c05565b005b34801561038657600080fd5b506103a1600480360381019061039c9190613a6e565b610d1d565b005b3480156103af57600080fd5b506103b8610db3565b6040516103c5919061420d565b60405180910390f35b3480156103da57600080fd5b506103e3610dc6565b6040516103f0919061462c565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190613875565b610dd3565b005b34801561042e57600080fd5b50610449600480360381019061044491906138da565b61103b565b005b34801561045757600080fd5b50610472600480360381019061046d91906139e0565b61109b565b60405161047f919061462c565b60405180910390f35b34801561049457600080fd5b5061049d611140565b6040516104aa919061462c565b60405180910390f35b3480156104bf57600080fd5b506104c8611146565b6040516104d5919061462c565b60405180910390f35b3480156104ea57600080fd5b506104f361114c565b005b34801561050157600080fd5b5061050a6111f4565b604051610517919061462c565b60405180910390f35b34801561052c57600080fd5b506105356111fe565b6040516105429190614228565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d91906138da565b61128c565b005b34801561058057600080fd5b5061059b6004803603810190610596919061384c565b6112ac565b6040516105a891906141eb565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190613aaf565b6113a6565b6040516105e5919061462c565b60405180910390f35b3480156105fa57600080fd5b5061060361143d565b604051610610919061462c565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b9190613a6e565b611443565b005b34801561064e57600080fd5b5061066960048036038101906106649190613aaf565b6114d9565b6040516106769190614132565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a1919061384c565b61158b565b6040516106b3919061462c565b60405180910390f35b3480156106c857600080fd5b506106d1611643565b005b3480156106df57600080fd5b506106fa60048036038101906106f59190613aaf565b6116cb565b6040516107079190614132565b60405180910390f35b34801561071c57600080fd5b50610737600480360381019061073291906139e0565b611739565b005b34801561074557600080fd5b5061074e611858565b60405161075b9190614132565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190613aaf565b611882565b005b34801561079957600080fd5b506107a2611908565b6040516107af9190614228565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da919061384c565b61199a565b6040516107ec919061462c565b60405180910390f35b34801561080157600080fd5b5061080a6119e3565b604051610817919061462c565b60405180910390f35b34801561082c57600080fd5b506108356119ed565b6040516108429190614228565b60405180910390f35b61086560048036038101906108609190613aaf565b611a7b565b005b34801561087357600080fd5b5061088e600480360381019061088991906139a4565b611c48565b005b34801561089c57600080fd5b506108b760048036038101906108b29190613a6e565b611dc9565b005b3480156108c557600080fd5b506108e060048036038101906108db9190613929565b611eb5565b005b3480156108ee57600080fd5b506108f7611f17565b005b34801561090557600080fd5b50610920600480360381019061091b9190613aaf565b611fe8565b60405161092d9190614228565b60405180910390f35b34801561094257600080fd5b5061095d6004803603810190610958919061384c565b61208f565b60405161096a919061462c565b60405180910390f35b34801561097f57600080fd5b506109886120d8565b6040516109959190614228565b60405180910390f35b3480156109aa57600080fd5b506109c560048036038101906109c09190613aaf565b612166565b6040516109d29190614228565b60405180910390f35b3480156109e757600080fd5b506109f0612243565b6040516109fd919061462c565b60405180910390f35b348015610a1257600080fd5b50610a2d6004803603810190610a28919061389e565b61224d565b604051610a3a919061420d565b60405180910390f35b348015610a4f57600080fd5b50610a6a6004803603810190610a65919061384c565b6122e1565b005b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae75750610ae6826123d9565b5b9050919050565b606060008054610afd9061497d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b299061497d565b8015610b765780601f10610b4b57610100808354040283529160200191610b76565b820191906000526020600020905b815481529060010190602001808311610b5957829003601f168201915b5050505050905090565b6000610b8b826124bb565b610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc19061450c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c10826114d9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c789061458c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ca0610a6c565b73ffffffffffffffffffffffffffffffffffffffff161480610ccf5750610cce81610cc9610a6c565b61224d565b5b610d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d059061446c565b60405180910390fd5b610d188383612527565b505050565b610d25610a6c565b73ffffffffffffffffffffffffffffffffffffffff16610d43611858565b73ffffffffffffffffffffffffffffffffffffffff1614610d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d909061452c565b60405180910390fd5b8060129080519060200190610daf92919061365b565b5050565b601660009054906101000a900460ff1681565b6000600880549050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c9061434c565b60405180910390fd5b6000600c5447610e65919061476a565b90506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b54600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610ef791906147f1565b610f0191906147c0565b610f0b919061484b565b90506000811415610f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f489061442c565b60405180910390fd5b80600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f9c919061476a565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c54610fed919061476a565b600c81905550610ffd83826125e0565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056838260405161102e92919061414d565b60405180910390a1505050565b61104c611046610a6c565b826126d4565b61108b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611082906145ec565b60405180910390fd5b6110968383836127b2565b505050565b60006110a68361158b565b82106110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de906142cc565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60155481565b60145481565b611154610a6c565b73ffffffffffffffffffffffffffffffffffffffff16611172611858565b73ffffffffffffffffffffffffffffffffffffffff16146111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bf9061452c565b60405180910390fd5b601660009054906101000a900460ff1615601660006101000a81548160ff021916908315150217905550565b6000600b54905090565b6012805461120b9061497d565b80601f01602080910402602001604051908101604052809291908181526020018280546112379061497d565b80156112845780601f1061125957610100808354040283529160200191611284565b820191906000526020600020905b81548152906001019060200180831161126757829003601f168201915b505050505081565b6112a783838360405180602001604052806000815250611eb5565b505050565b606060006112b98361158b565b905060008167ffffffffffffffff8111156112fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561132b5781602001602082028036833780820191505090505b50905060005b8281101561139b57611343858261109b565b82828151811061137c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611393906149e0565b915050611331565b508092505050919050565b60006113b0610dc6565b82106113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e89061460c565b60405180910390fd5b6008828154811061142b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b60135481565b61144b610a6c565b73ffffffffffffffffffffffffffffffffffffffff16611469611858565b73ffffffffffffffffffffffffffffffffffffffff16146114bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b69061452c565b60405180910390fd5b80601190805190602001906114d592919061365b565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579906144ac565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f39061448c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61164b610a6c565b73ffffffffffffffffffffffffffffffffffffffff16611669611858565b73ffffffffffffffffffffffffffffffffffffffff16146116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b69061452c565b60405180910390fd5b6116c96000612a0e565b565b6000600f8281548110611707577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611741610a6c565b73ffffffffffffffffffffffffffffffffffffffff1661175f611858565b73ffffffffffffffffffffffffffffffffffffffff16146117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac9061452c565b60405180910390fd5b6015548111156117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f1906142ac565b60405180910390fd5b6000611804610dc6565b905060005b8281101561183957611826848284611821919061476a565b612ad4565b8080611831906149e0565b915050611809565b50816015600082825461184c919061484b565b92505081905550505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61188a610a6c565b73ffffffffffffffffffffffffffffffffffffffff166118a8611858565b73ffffffffffffffffffffffffffffffffffffffff16146118fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f59061452c565b60405180910390fd5b8060108190555050565b6060600180546119179061497d565b80601f01602080910402602001604051908101604052809291908181526020018280546119439061497d565b80156119905780601f1061196557610100808354040283529160200191611990565b820191906000526020600020905b81548152906001019060200180831161197357829003601f168201915b5050505050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000601054905090565b601780546119fa9061497d565b80601f0160208091040260200160405190810160405280929190818152602001828054611a269061497d565b8015611a735780601f10611a4857610100808354040283529160200191611a73565b820191906000526020600020905b815481529060010190602001808311611a5657829003601f168201915b505050505081565b6000611a85610dc6565b9050601660009054906101000a900460ff1615611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace9061426c565b60405180910390fd5b63611adfe0421015611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b159061428c565b60405180910390fd5b601354821115611b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5a9061444c565b60405180910390fd5b601554601454611b73919061484b565b8282611b7f919061476a565b1115611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb79061436c565b60405180910390fd5b81601054611bce91906147f1565b341015611c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c07906145ac565b60405180910390fd5b60005b82811015611c4357611c30338284611c2b919061476a565b612ad4565b8080611c3b906149e0565b915050611c13565b505050565b611c50610a6c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb5906143ac565b60405180910390fd5b8060056000611ccb610a6c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d78610a6c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dbd919061420d565b60405180910390a35050565b611dd1610a6c565b73ffffffffffffffffffffffffffffffffffffffff16611def611858565b73ffffffffffffffffffffffffffffffffffffffff1614611e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3c9061452c565b60405180910390fd5b60001515601860009054906101000a900460ff16151514611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e92906145cc565b60405180910390fd5b8060179080519060200190611eb192919061365b565b5050565b611ec6611ec0610a6c565b836126d4565b611f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efc906145ec565b60405180910390fd5b611f1184848484612af2565b50505050565b611f1f610a6c565b73ffffffffffffffffffffffffffffffffffffffff16611f3d611858565b73ffffffffffffffffffffffffffffffffffffffff1614611f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8a9061452c565b60405180910390fd5b6001601860006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b06017604051611fde919061424a565b60405180910390a1565b6060611ff3826124bb565b612032576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120299061456c565b60405180910390fd5b600061203c612b4e565b9050600081511161205c5760405180602001604052806000815250612087565b8061206684612be0565b6040516020016120779291906140f9565b6040516020818303038152906040525b915050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601180546120e59061497d565b80601f01602080910402602001604051908101604052809291908181526020018280546121119061497d565b801561215e5780601f106121335761010080835404028352916020019161215e565b820191906000526020600020905b81548152906001019060200180831161214157829003601f168201915b505050505081565b6060612170610dc6565b82106121b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a8906144cc565b60405180910390fd5b601780546121be9061497d565b80601f01602080910402602001604051908101604052809291908181526020018280546121ea9061497d565b80156122375780601f1061220c57610100808354040283529160200191612237565b820191906000526020600020905b81548152906001019060200180831161221a57829003601f168201915b50505050509050919050565b6000600c54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e9610a6c565b73ffffffffffffffffffffffffffffffffffffffff16612307611858565b73ffffffffffffffffffffffffffffffffffffffff161461235d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123549061452c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c49061430c565b60405180910390fd5b6123d681612a0e565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124a457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124b457506124b382612d8d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661259a836114d9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261a906143ec565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516126499061411d565b60006040518083038185875af1925050503d8060008114612686576040519150601f19603f3d011682016040523d82523d6000602084013e61268b565b606091505b50509050806126cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c6906143cc565b60405180910390fd5b505050565b60006126df826124bb565b61271e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127159061440c565b60405180910390fd5b6000612729836114d9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061279857508373ffffffffffffffffffffffffffffffffffffffff1661278084610b80565b73ffffffffffffffffffffffffffffffffffffffff16145b806127a957506127a8818561224d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127d2826114d9565b73ffffffffffffffffffffffffffffffffffffffff1614612828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281f9061454c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288f9061438c565b60405180910390fd5b6128a3838383612df7565b6128ae600082612527565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128fe919061484b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612955919061476a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612aee828260405180602001604052806000815250612f0b565b5050565b612afd8484846127b2565b612b0984848484612f66565b612b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3f906142ec565b60405180910390fd5b50505050565b606060118054612b5d9061497d565b80601f0160208091040260200160405190810160405280929190818152602001828054612b899061497d565b8015612bd65780601f10612bab57610100808354040283529160200191612bd6565b820191906000526020600020905b815481529060010190602001808311612bb957829003601f168201915b5050505050905090565b60606000821415612c28576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d88565b600082905060005b60008214612c5a578080612c43906149e0565b915050600a82612c5391906147c0565b9150612c30565b60008167ffffffffffffffff811115612c9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612cce5781602001600182028036833780820191505090505b5090505b60008514612d8157600182612ce7919061484b565b9150600a85612cf69190614a29565b6030612d02919061476a565b60f81b818381518110612d3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d7a91906147c0565b9450612cd2565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612e028383836130fd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e4557612e4081613102565b612e84565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e8357612e82838261314b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ec757612ec2816132b8565b612f06565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f0557612f0482826133fb565b5b5b505050565b612f15838361347a565b612f226000848484612f66565b612f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f58906142ec565b60405180910390fd5b505050565b6000612f878473ffffffffffffffffffffffffffffffffffffffff16613648565b156130f0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fb0610a6c565b8786866040518563ffffffff1660e01b8152600401612fd29493929190614176565b602060405180830381600087803b158015612fec57600080fd5b505af192505050801561301d57506040513d601f19601f8201168201806040525081019061301a9190613a45565b60015b6130a0573d806000811461304d576040519150601f19603f3d011682016040523d82523d6000602084013e613052565b606091505b50600081511415613098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308f906142ec565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130f5565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131588461158b565b613162919061484b565b9050600060076000848152602001908152602001600020549050818114613247576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506132cc919061484b565b9050600060096000848152602001908152602001600020549050600060088381548110613322577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061336a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006134068361158b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134e1906144ec565b60405180910390fd5b6134f3816124bb565b15613533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352a9061432c565b60405180910390fd5b61353f60008383612df7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461358f919061476a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546136679061497d565b90600052602060002090601f01602090048101928261368957600085556136d0565b82601f106136a257805160ff19168380011785556136d0565b828001600101855582156136d0579182015b828111156136cf5782518255916020019190600101906136b4565b5b5090506136dd91906136e1565b5090565b5b808211156136fa5760008160009055506001016136e2565b5090565b600061371161370c8461466c565b614647565b90508281526020810184848401111561372957600080fd5b61373484828561493b565b509392505050565b600061374f61374a8461469d565b614647565b90508281526020810184848401111561376757600080fd5b61377284828561493b565b509392505050565b600081359050613789816152ca565b92915050565b60008135905061379e816152e1565b92915050565b6000813590506137b3816152f8565b92915050565b6000813590506137c88161530f565b92915050565b6000815190506137dd8161530f565b92915050565b600082601f8301126137f457600080fd5b81356138048482602086016136fe565b91505092915050565b600082601f83011261381e57600080fd5b813561382e84826020860161373c565b91505092915050565b60008135905061384681615326565b92915050565b60006020828403121561385e57600080fd5b600061386c8482850161377a565b91505092915050565b60006020828403121561388757600080fd5b60006138958482850161378f565b91505092915050565b600080604083850312156138b157600080fd5b60006138bf8582860161377a565b92505060206138d08582860161377a565b9150509250929050565b6000806000606084860312156138ef57600080fd5b60006138fd8682870161377a565b935050602061390e8682870161377a565b925050604061391f86828701613837565b9150509250925092565b6000806000806080858703121561393f57600080fd5b600061394d8782880161377a565b945050602061395e8782880161377a565b935050604061396f87828801613837565b925050606085013567ffffffffffffffff81111561398c57600080fd5b613998878288016137e3565b91505092959194509250565b600080604083850312156139b757600080fd5b60006139c58582860161377a565b92505060206139d6858286016137a4565b9150509250929050565b600080604083850312156139f357600080fd5b6000613a018582860161377a565b9250506020613a1285828601613837565b9150509250929050565b600060208284031215613a2e57600080fd5b6000613a3c848285016137b9565b91505092915050565b600060208284031215613a5757600080fd5b6000613a65848285016137ce565b91505092915050565b600060208284031215613a8057600080fd5b600082013567ffffffffffffffff811115613a9a57600080fd5b613aa68482850161380d565b91505092915050565b600060208284031215613ac157600080fd5b6000613acf84828501613837565b91505092915050565b6000613ae483836140db565b60208301905092915050565b613af981614905565b82525050565b613b088161487f565b82525050565b6000613b19826146f3565b613b238185614721565b9350613b2e836146ce565b8060005b83811015613b5f578151613b468882613ad8565b9750613b5183614714565b925050600181019050613b32565b5085935050505092915050565b613b75816148a3565b82525050565b6000613b86826146fe565b613b908185614732565b9350613ba081856020860161494a565b613ba981614b16565b840191505092915050565b6000613bbf82614709565b613bc9818561474e565b9350613bd981856020860161494a565b613be281614b16565b840191505092915050565b6000613bf882614709565b613c02818561475f565b9350613c1281856020860161494a565b80840191505092915050565b60008154613c2b8161497d565b613c35818661474e565b94506001821660008114613c505760018114613c6257613c95565b60ff1983168652602086019350613c95565b613c6b856146de565b60005b83811015613c8d57815481890152600182019150602081019050613c6e565b808801955050505b50505092915050565b6000613cab600b8361474e565b9150613cb682614b27565b602082019050919050565b6000613cce60188361474e565b9150613cd982614b50565b602082019050919050565b6000613cf160258361474e565b9150613cfc82614b79565b604082019050919050565b6000613d14602b8361474e565b9150613d1f82614bc8565b604082019050919050565b6000613d3760328361474e565b9150613d4282614c17565b604082019050919050565b6000613d5a60268361474e565b9150613d6582614c66565b604082019050919050565b6000613d7d601c8361474e565b9150613d8882614cb5565b602082019050919050565b6000613da060268361474e565b9150613dab82614cde565b604082019050919050565b6000613dc3601c8361474e565b9150613dce82614d2d565b602082019050919050565b6000613de660248361474e565b9150613df182614d56565b604082019050919050565b6000613e0960198361474e565b9150613e1482614da5565b602082019050919050565b6000613e2c603a8361474e565b9150613e3782614dce565b604082019050919050565b6000613e4f601d8361474e565b9150613e5a82614e1d565b602082019050919050565b6000613e72602c8361474e565b9150613e7d82614e46565b604082019050919050565b6000613e95602b8361474e565b9150613ea082614e95565b604082019050919050565b6000613eb860338361474e565b9150613ec382614ee4565b604082019050919050565b6000613edb60388361474e565b9150613ee682614f33565b604082019050919050565b6000613efe602a8361474e565b9150613f0982614f82565b604082019050919050565b6000613f2160298361474e565b9150613f2c82614fd1565b604082019050919050565b6000613f44600a8361474e565b9150613f4f82615020565b602082019050919050565b6000613f6760208361474e565b9150613f7282615049565b602082019050919050565b6000613f8a602c8361474e565b9150613f9582615072565b604082019050919050565b6000613fad60208361474e565b9150613fb8826150c1565b602082019050919050565b6000613fd060298361474e565b9150613fdb826150ea565b604082019050919050565b6000613ff3602f8361474e565b9150613ffe82615139565b604082019050919050565b600061401660218361474e565b915061402182615188565b604082019050919050565b600061403960198361474e565b9150614044826151d7565b602082019050919050565b600061405c60168361474e565b915061406782615200565b602082019050919050565b600061407f600083614743565b915061408a82615229565b600082019050919050565b60006140a260318361474e565b91506140ad8261522c565b604082019050919050565b60006140c5602c8361474e565b91506140d08261527b565b604082019050919050565b6140e4816148fb565b82525050565b6140f3816148fb565b82525050565b60006141058285613bed565b91506141118284613bed565b91508190509392505050565b600061412882614072565b9150819050919050565b60006020820190506141476000830184613aff565b92915050565b60006040820190506141626000830185613af0565b61416f60208301846140ea565b9392505050565b600060808201905061418b6000830187613aff565b6141986020830186613aff565b6141a560408301856140ea565b81810360608301526141b78184613b7b565b905095945050505050565b60006040820190506141d76000830185613aff565b6141e460208301846140ea565b9392505050565b600060208201905081810360008301526142058184613b0e565b905092915050565b60006020820190506142226000830184613b6c565b92915050565b600060208201905081810360008301526142428184613bb4565b905092915050565b600060208201905081810360008301526142648184613c1e565b905092915050565b6000602082019050818103600083015261428581613c9e565b9050919050565b600060208201905081810360008301526142a581613cc1565b9050919050565b600060208201905081810360008301526142c581613ce4565b9050919050565b600060208201905081810360008301526142e581613d07565b9050919050565b6000602082019050818103600083015261430581613d2a565b9050919050565b6000602082019050818103600083015261432581613d4d565b9050919050565b6000602082019050818103600083015261434581613d70565b9050919050565b6000602082019050818103600083015261436581613d93565b9050919050565b6000602082019050818103600083015261438581613db6565b9050919050565b600060208201905081810360008301526143a581613dd9565b9050919050565b600060208201905081810360008301526143c581613dfc565b9050919050565b600060208201905081810360008301526143e581613e1f565b9050919050565b6000602082019050818103600083015261440581613e42565b9050919050565b6000602082019050818103600083015261442581613e65565b9050919050565b6000602082019050818103600083015261444581613e88565b9050919050565b6000602082019050818103600083015261446581613eab565b9050919050565b6000602082019050818103600083015261448581613ece565b9050919050565b600060208201905081810360008301526144a581613ef1565b9050919050565b600060208201905081810360008301526144c581613f14565b9050919050565b600060208201905081810360008301526144e581613f37565b9050919050565b6000602082019050818103600083015261450581613f5a565b9050919050565b6000602082019050818103600083015261452581613f7d565b9050919050565b6000602082019050818103600083015261454581613fa0565b9050919050565b6000602082019050818103600083015261456581613fc3565b9050919050565b6000602082019050818103600083015261458581613fe6565b9050919050565b600060208201905081810360008301526145a581614009565b9050919050565b600060208201905081810360008301526145c58161402c565b9050919050565b600060208201905081810360008301526145e58161404f565b9050919050565b6000602082019050818103600083015261460581614095565b9050919050565b60006020820190508181036000830152614625816140b8565b9050919050565b600060208201905061464160008301846140ea565b92915050565b6000614651614662565b905061465d82826149af565b919050565b6000604051905090565b600067ffffffffffffffff82111561468757614686614ae7565b5b61469082614b16565b9050602081019050919050565b600067ffffffffffffffff8211156146b8576146b7614ae7565b5b6146c182614b16565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614775826148fb565b9150614780836148fb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147b5576147b4614a5a565b5b828201905092915050565b60006147cb826148fb565b91506147d6836148fb565b9250826147e6576147e5614a89565b5b828204905092915050565b60006147fc826148fb565b9150614807836148fb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148405761483f614a5a565b5b828202905092915050565b6000614856826148fb565b9150614861836148fb565b92508282101561487457614873614a5a565b5b828203905092915050565b600061488a826148db565b9050919050565b600061489c826148db565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061491082614917565b9050919050565b600061492282614929565b9050919050565b6000614934826148db565b9050919050565b82818337600083830152505050565b60005b8381101561496857808201518184015260208101905061494d565b83811115614977576000848401525b50505050565b6000600282049050600182168061499557607f821691505b602082108114156149a9576149a8614ab8565b5b50919050565b6149b882614b16565b810181811067ffffffffffffffff821117156149d7576149d6614ae7565b5b80604052505050565b60006149eb826148fb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a1e57614a1d614a5a565b5b600182019050919050565b6000614a34826148fb565b9150614a3f836148fb565b925082614a4f57614a4e614a89565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f53616c6520706175736564000000000000000000000000000000000000000000600082015250565b7f53616c6520686173206e6f742073746172746564207965740000000000000000600082015250565b7f45786365656473206d6178696d756d20726573657276656420534841524b207360008201527f7570706c79000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20534841524b20737570706c7900000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f596f752063616e206d696e742061206d6178696d756d206f662032302053484160008201527f524b7320706572207472616e73616374696f6e00000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420494400000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4c6963656e736520616c7265616479206c6f636b656400000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6152d38161487f565b81146152de57600080fd5b50565b6152ea81614891565b81146152f557600080fd5b50565b615301816148a3565b811461530c57600080fd5b50565b615318816148af565b811461532357600080fd5b50565b61532f816148fb565b811461533a57600080fd5b5056fea2646970667358221220066bfb15e789425d7f24f4f0a87f1cfe65c8e9f39b8bb1afde76f07e6299d60064736f6c63430008040033

Deployed Bytecode

0x6080604052600436106102605760003560e01c806370a0823111610144578063a22cb465116100b6578063ce7c2ac21161007a578063ce7c2ac214610936578063cfc86f7b14610973578063d9b137b21461099e578063e33b7de3146109db578063e985e9c514610a06578063f2fde38b14610a43576102a7565b8063a22cb46514610867578063b09904b514610890578063b88d4fde146108b9578063bf4702fc146108e2578063c87b56dd146108f9576102a7565b806391b7f5ed1161010857806391b7f5ed1461076457806395d89b411461078d5780639852595c146107b857806398d5fdca146107f55780639c3e72bd14610820578063a0712d681461084b576102a7565b806370a082311461067f578063715018a6146106bc5780638b83209b146106d35780638ba4cc3c146107105780638da5cb5b14610739576102a7565b806331a53e9a116101dd57806342842e0e116101a157806342842e0e1461054b578063438b6300146105745780634f6ccce7146105b15780634fce1de3146105ee57806355f804b3146106195780636352211e14610642576102a7565b806331a53e9a1461048857806332cb6b0c146104b357806334918dfd146104de5780633a98ef39146104f55780633cc520da14610520576102a7565b806316c61ccc1161022457806316c61ccc146103a357806318160ddd146103ce57806319165587146103f957806323b872dd146104225780632f745c591461044b576102a7565b806301ffc9a7146102ac57806306fdde03146102e9578063081812fc14610314578063095ea7b314610351578063109695231461037a576102a7565b366102a7577f6ef95f06320e7a25a04a175ca677b7052bdd97131872c2192525a629f51be77061028e610a6c565b3460405161029d9291906141c2565b60405180910390a1005b600080fd5b3480156102b857600080fd5b506102d360048036038101906102ce9190613a1c565b610a74565b6040516102e0919061420d565b60405180910390f35b3480156102f557600080fd5b506102fe610aee565b60405161030b9190614228565b60405180910390f35b34801561032057600080fd5b5061033b60048036038101906103369190613aaf565b610b80565b6040516103489190614132565b60405180910390f35b34801561035d57600080fd5b50610378600480360381019061037391906139e0565b610c05565b005b34801561038657600080fd5b506103a1600480360381019061039c9190613a6e565b610d1d565b005b3480156103af57600080fd5b506103b8610db3565b6040516103c5919061420d565b60405180910390f35b3480156103da57600080fd5b506103e3610dc6565b6040516103f0919061462c565b60405180910390f35b34801561040557600080fd5b50610420600480360381019061041b9190613875565b610dd3565b005b34801561042e57600080fd5b50610449600480360381019061044491906138da565b61103b565b005b34801561045757600080fd5b50610472600480360381019061046d91906139e0565b61109b565b60405161047f919061462c565b60405180910390f35b34801561049457600080fd5b5061049d611140565b6040516104aa919061462c565b60405180910390f35b3480156104bf57600080fd5b506104c8611146565b6040516104d5919061462c565b60405180910390f35b3480156104ea57600080fd5b506104f361114c565b005b34801561050157600080fd5b5061050a6111f4565b604051610517919061462c565b60405180910390f35b34801561052c57600080fd5b506105356111fe565b6040516105429190614228565b60405180910390f35b34801561055757600080fd5b50610572600480360381019061056d91906138da565b61128c565b005b34801561058057600080fd5b5061059b6004803603810190610596919061384c565b6112ac565b6040516105a891906141eb565b60405180910390f35b3480156105bd57600080fd5b506105d860048036038101906105d39190613aaf565b6113a6565b6040516105e5919061462c565b60405180910390f35b3480156105fa57600080fd5b5061060361143d565b604051610610919061462c565b60405180910390f35b34801561062557600080fd5b50610640600480360381019061063b9190613a6e565b611443565b005b34801561064e57600080fd5b5061066960048036038101906106649190613aaf565b6114d9565b6040516106769190614132565b60405180910390f35b34801561068b57600080fd5b506106a660048036038101906106a1919061384c565b61158b565b6040516106b3919061462c565b60405180910390f35b3480156106c857600080fd5b506106d1611643565b005b3480156106df57600080fd5b506106fa60048036038101906106f59190613aaf565b6116cb565b6040516107079190614132565b60405180910390f35b34801561071c57600080fd5b50610737600480360381019061073291906139e0565b611739565b005b34801561074557600080fd5b5061074e611858565b60405161075b9190614132565b60405180910390f35b34801561077057600080fd5b5061078b60048036038101906107869190613aaf565b611882565b005b34801561079957600080fd5b506107a2611908565b6040516107af9190614228565b60405180910390f35b3480156107c457600080fd5b506107df60048036038101906107da919061384c565b61199a565b6040516107ec919061462c565b60405180910390f35b34801561080157600080fd5b5061080a6119e3565b604051610817919061462c565b60405180910390f35b34801561082c57600080fd5b506108356119ed565b6040516108429190614228565b60405180910390f35b61086560048036038101906108609190613aaf565b611a7b565b005b34801561087357600080fd5b5061088e600480360381019061088991906139a4565b611c48565b005b34801561089c57600080fd5b506108b760048036038101906108b29190613a6e565b611dc9565b005b3480156108c557600080fd5b506108e060048036038101906108db9190613929565b611eb5565b005b3480156108ee57600080fd5b506108f7611f17565b005b34801561090557600080fd5b50610920600480360381019061091b9190613aaf565b611fe8565b60405161092d9190614228565b60405180910390f35b34801561094257600080fd5b5061095d6004803603810190610958919061384c565b61208f565b60405161096a919061462c565b60405180910390f35b34801561097f57600080fd5b506109886120d8565b6040516109959190614228565b60405180910390f35b3480156109aa57600080fd5b506109c560048036038101906109c09190613aaf565b612166565b6040516109d29190614228565b60405180910390f35b3480156109e757600080fd5b506109f0612243565b6040516109fd919061462c565b60405180910390f35b348015610a1257600080fd5b50610a2d6004803603810190610a28919061389e565b61224d565b604051610a3a919061420d565b60405180910390f35b348015610a4f57600080fd5b50610a6a6004803603810190610a65919061384c565b6122e1565b005b600033905090565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ae75750610ae6826123d9565b5b9050919050565b606060008054610afd9061497d565b80601f0160208091040260200160405190810160405280929190818152602001828054610b299061497d565b8015610b765780601f10610b4b57610100808354040283529160200191610b76565b820191906000526020600020905b815481529060010190602001808311610b5957829003601f168201915b5050505050905090565b6000610b8b826124bb565b610bca576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bc19061450c565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c10826114d9565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610c81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c789061458c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610ca0610a6c565b73ffffffffffffffffffffffffffffffffffffffff161480610ccf5750610cce81610cc9610a6c565b61224d565b5b610d0e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d059061446c565b60405180910390fd5b610d188383612527565b505050565b610d25610a6c565b73ffffffffffffffffffffffffffffffffffffffff16610d43611858565b73ffffffffffffffffffffffffffffffffffffffff1614610d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d909061452c565b60405180910390fd5b8060129080519060200190610daf92919061365b565b5050565b601660009054906101000a900460ff1681565b6000600880549050905090565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411610e55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4c9061434c565b60405180910390fd5b6000600c5447610e65919061476a565b90506000600e60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054600b54600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205484610ef791906147f1565b610f0191906147c0565b610f0b919061484b565b90506000811415610f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f489061442c565b60405180910390fd5b80600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054610f9c919061476a565b600e60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000208190555080600c54610fed919061476a565b600c81905550610ffd83826125e0565b7fdf20fd1e76bc69d672e4814fafb2c449bba3a5369d8359adf9e05e6fde87b056838260405161102e92919061414d565b60405180910390a1505050565b61104c611046610a6c565b826126d4565b61108b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611082906145ec565b60405180910390fd5b6110968383836127b2565b505050565b60006110a68361158b565b82106110e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110de906142cc565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60155481565b60145481565b611154610a6c565b73ffffffffffffffffffffffffffffffffffffffff16611172611858565b73ffffffffffffffffffffffffffffffffffffffff16146111c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111bf9061452c565b60405180910390fd5b601660009054906101000a900460ff1615601660006101000a81548160ff021916908315150217905550565b6000600b54905090565b6012805461120b9061497d565b80601f01602080910402602001604051908101604052809291908181526020018280546112379061497d565b80156112845780601f1061125957610100808354040283529160200191611284565b820191906000526020600020905b81548152906001019060200180831161126757829003601f168201915b505050505081565b6112a783838360405180602001604052806000815250611eb5565b505050565b606060006112b98361158b565b905060008167ffffffffffffffff8111156112fd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561132b5781602001602082028036833780820191505090505b50905060005b8281101561139b57611343858261109b565b82828151811061137c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611393906149e0565b915050611331565b508092505050919050565b60006113b0610dc6565b82106113f1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113e89061460c565b60405180910390fd5b6008828154811061142b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b60135481565b61144b610a6c565b73ffffffffffffffffffffffffffffffffffffffff16611469611858565b73ffffffffffffffffffffffffffffffffffffffff16146114bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114b69061452c565b60405180910390fd5b80601190805190602001906114d592919061365b565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611582576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611579906144ac565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156115fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115f39061448c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61164b610a6c565b73ffffffffffffffffffffffffffffffffffffffff16611669611858565b73ffffffffffffffffffffffffffffffffffffffff16146116bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116b69061452c565b60405180910390fd5b6116c96000612a0e565b565b6000600f8281548110611707577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611741610a6c565b73ffffffffffffffffffffffffffffffffffffffff1661175f611858565b73ffffffffffffffffffffffffffffffffffffffff16146117b5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117ac9061452c565b60405180910390fd5b6015548111156117fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f1906142ac565b60405180910390fd5b6000611804610dc6565b905060005b8281101561183957611826848284611821919061476a565b612ad4565b8080611831906149e0565b915050611809565b50816015600082825461184c919061484b565b92505081905550505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b61188a610a6c565b73ffffffffffffffffffffffffffffffffffffffff166118a8611858565b73ffffffffffffffffffffffffffffffffffffffff16146118fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118f59061452c565b60405180910390fd5b8060108190555050565b6060600180546119179061497d565b80601f01602080910402602001604051908101604052809291908181526020018280546119439061497d565b80156119905780601f1061196557610100808354040283529160200191611990565b820191906000526020600020905b81548152906001019060200180831161197357829003601f168201915b5050505050905090565b6000600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6000601054905090565b601780546119fa9061497d565b80601f0160208091040260200160405190810160405280929190818152602001828054611a269061497d565b8015611a735780601f10611a4857610100808354040283529160200191611a73565b820191906000526020600020905b815481529060010190602001808311611a5657829003601f168201915b505050505081565b6000611a85610dc6565b9050601660009054906101000a900460ff1615611ad7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ace9061426c565b60405180910390fd5b63611adfe0421015611b1e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b159061428c565b60405180910390fd5b601354821115611b63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b5a9061444c565b60405180910390fd5b601554601454611b73919061484b565b8282611b7f919061476a565b1115611bc0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bb79061436c565b60405180910390fd5b81601054611bce91906147f1565b341015611c10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c07906145ac565b60405180910390fd5b60005b82811015611c4357611c30338284611c2b919061476a565b612ad4565b8080611c3b906149e0565b915050611c13565b505050565b611c50610a6c565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cbe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb5906143ac565b60405180910390fd5b8060056000611ccb610a6c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611d78610a6c565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611dbd919061420d565b60405180910390a35050565b611dd1610a6c565b73ffffffffffffffffffffffffffffffffffffffff16611def611858565b73ffffffffffffffffffffffffffffffffffffffff1614611e45576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3c9061452c565b60405180910390fd5b60001515601860009054906101000a900460ff16151514611e9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e92906145cc565b60405180910390fd5b8060179080519060200190611eb192919061365b565b5050565b611ec6611ec0610a6c565b836126d4565b611f05576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611efc906145ec565b60405180910390fd5b611f1184848484612af2565b50505050565b611f1f610a6c565b73ffffffffffffffffffffffffffffffffffffffff16611f3d611858565b73ffffffffffffffffffffffffffffffffffffffff1614611f93576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f8a9061452c565b60405180910390fd5b6001601860006101000a81548160ff0219169083151502179055507f92423ccd40e13759d50d24569dcbaccb20ade47247f3cf3e3951a9f29d2048b06017604051611fde919061424a565b60405180910390a1565b6060611ff3826124bb565b612032576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120299061456c565b60405180910390fd5b600061203c612b4e565b9050600081511161205c5760405180602001604052806000815250612087565b8061206684612be0565b6040516020016120779291906140f9565b6040516020818303038152906040525b915050919050565b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b601180546120e59061497d565b80601f01602080910402602001604051908101604052809291908181526020018280546121119061497d565b801561215e5780601f106121335761010080835404028352916020019161215e565b820191906000526020600020905b81548152906001019060200180831161214157829003601f168201915b505050505081565b6060612170610dc6565b82106121b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121a8906144cc565b60405180910390fd5b601780546121be9061497d565b80601f01602080910402602001604051908101604052809291908181526020018280546121ea9061497d565b80156122375780601f1061220c57610100808354040283529160200191612237565b820191906000526020600020905b81548152906001019060200180831161221a57829003601f168201915b50505050509050919050565b6000600c54905090565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6122e9610a6c565b73ffffffffffffffffffffffffffffffffffffffff16612307611858565b73ffffffffffffffffffffffffffffffffffffffff161461235d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123549061452c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156123cd576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c49061430c565b60405180910390fd5b6123d681612a0e565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806124a457507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806124b457506124b382612d8d565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661259a836114d9565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b80471015612623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261a906143ec565b60405180910390fd5b60008273ffffffffffffffffffffffffffffffffffffffff16826040516126499061411d565b60006040518083038185875af1925050503d8060008114612686576040519150601f19603f3d011682016040523d82523d6000602084013e61268b565b606091505b50509050806126cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126c6906143cc565b60405180910390fd5b505050565b60006126df826124bb565b61271e576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127159061440c565b60405180910390fd5b6000612729836114d9565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061279857508373ffffffffffffffffffffffffffffffffffffffff1661278084610b80565b73ffffffffffffffffffffffffffffffffffffffff16145b806127a957506127a8818561224d565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166127d2826114d9565b73ffffffffffffffffffffffffffffffffffffffff1614612828576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161281f9061454c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288f9061438c565b60405180910390fd5b6128a3838383612df7565b6128ae600082612527565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546128fe919061484b565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612955919061476a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b612aee828260405180602001604052806000815250612f0b565b5050565b612afd8484846127b2565b612b0984848484612f66565b612b48576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b3f906142ec565b60405180910390fd5b50505050565b606060118054612b5d9061497d565b80601f0160208091040260200160405190810160405280929190818152602001828054612b899061497d565b8015612bd65780601f10612bab57610100808354040283529160200191612bd6565b820191906000526020600020905b815481529060010190602001808311612bb957829003601f168201915b5050505050905090565b60606000821415612c28576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612d88565b600082905060005b60008214612c5a578080612c43906149e0565b915050600a82612c5391906147c0565b9150612c30565b60008167ffffffffffffffff811115612c9c577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612cce5781602001600182028036833780820191505090505b5090505b60008514612d8157600182612ce7919061484b565b9150600a85612cf69190614a29565b6030612d02919061476a565b60f81b818381518110612d3e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612d7a91906147c0565b9450612cd2565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612e028383836130fd565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612e4557612e4081613102565b612e84565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e8357612e82838261314b565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612ec757612ec2816132b8565b612f06565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612f0557612f0482826133fb565b5b5b505050565b612f15838361347a565b612f226000848484612f66565b612f61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f58906142ec565b60405180910390fd5b505050565b6000612f878473ffffffffffffffffffffffffffffffffffffffff16613648565b156130f0578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612fb0610a6c565b8786866040518563ffffffff1660e01b8152600401612fd29493929190614176565b602060405180830381600087803b158015612fec57600080fd5b505af192505050801561301d57506040513d601f19601f8201168201806040525081019061301a9190613a45565b60015b6130a0573d806000811461304d576040519150601f19603f3d011682016040523d82523d6000602084013e613052565b606091505b50600081511415613098576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161308f906142ec565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506130f5565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131588461158b565b613162919061484b565b9050600060076000848152602001908152602001600020549050818114613247576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506132cc919061484b565b9050600060096000848152602001908152602001600020549050600060088381548110613322577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050806008838154811061336a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550816009600083815260200190815260200160002081905550600960008581526020019081526020016000206000905560088054806133df577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006134068361158b565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156134ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134e1906144ec565b60405180910390fd5b6134f3816124bb565b15613533576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161352a9061432c565b60405180910390fd5b61353f60008383612df7565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461358f919061476a565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b8280546136679061497d565b90600052602060002090601f01602090048101928261368957600085556136d0565b82601f106136a257805160ff19168380011785556136d0565b828001600101855582156136d0579182015b828111156136cf5782518255916020019190600101906136b4565b5b5090506136dd91906136e1565b5090565b5b808211156136fa5760008160009055506001016136e2565b5090565b600061371161370c8461466c565b614647565b90508281526020810184848401111561372957600080fd5b61373484828561493b565b509392505050565b600061374f61374a8461469d565b614647565b90508281526020810184848401111561376757600080fd5b61377284828561493b565b509392505050565b600081359050613789816152ca565b92915050565b60008135905061379e816152e1565b92915050565b6000813590506137b3816152f8565b92915050565b6000813590506137c88161530f565b92915050565b6000815190506137dd8161530f565b92915050565b600082601f8301126137f457600080fd5b81356138048482602086016136fe565b91505092915050565b600082601f83011261381e57600080fd5b813561382e84826020860161373c565b91505092915050565b60008135905061384681615326565b92915050565b60006020828403121561385e57600080fd5b600061386c8482850161377a565b91505092915050565b60006020828403121561388757600080fd5b60006138958482850161378f565b91505092915050565b600080604083850312156138b157600080fd5b60006138bf8582860161377a565b92505060206138d08582860161377a565b9150509250929050565b6000806000606084860312156138ef57600080fd5b60006138fd8682870161377a565b935050602061390e8682870161377a565b925050604061391f86828701613837565b9150509250925092565b6000806000806080858703121561393f57600080fd5b600061394d8782880161377a565b945050602061395e8782880161377a565b935050604061396f87828801613837565b925050606085013567ffffffffffffffff81111561398c57600080fd5b613998878288016137e3565b91505092959194509250565b600080604083850312156139b757600080fd5b60006139c58582860161377a565b92505060206139d6858286016137a4565b9150509250929050565b600080604083850312156139f357600080fd5b6000613a018582860161377a565b9250506020613a1285828601613837565b9150509250929050565b600060208284031215613a2e57600080fd5b6000613a3c848285016137b9565b91505092915050565b600060208284031215613a5757600080fd5b6000613a65848285016137ce565b91505092915050565b600060208284031215613a8057600080fd5b600082013567ffffffffffffffff811115613a9a57600080fd5b613aa68482850161380d565b91505092915050565b600060208284031215613ac157600080fd5b6000613acf84828501613837565b91505092915050565b6000613ae483836140db565b60208301905092915050565b613af981614905565b82525050565b613b088161487f565b82525050565b6000613b19826146f3565b613b238185614721565b9350613b2e836146ce565b8060005b83811015613b5f578151613b468882613ad8565b9750613b5183614714565b925050600181019050613b32565b5085935050505092915050565b613b75816148a3565b82525050565b6000613b86826146fe565b613b908185614732565b9350613ba081856020860161494a565b613ba981614b16565b840191505092915050565b6000613bbf82614709565b613bc9818561474e565b9350613bd981856020860161494a565b613be281614b16565b840191505092915050565b6000613bf882614709565b613c02818561475f565b9350613c1281856020860161494a565b80840191505092915050565b60008154613c2b8161497d565b613c35818661474e565b94506001821660008114613c505760018114613c6257613c95565b60ff1983168652602086019350613c95565b613c6b856146de565b60005b83811015613c8d57815481890152600182019150602081019050613c6e565b808801955050505b50505092915050565b6000613cab600b8361474e565b9150613cb682614b27565b602082019050919050565b6000613cce60188361474e565b9150613cd982614b50565b602082019050919050565b6000613cf160258361474e565b9150613cfc82614b79565b604082019050919050565b6000613d14602b8361474e565b9150613d1f82614bc8565b604082019050919050565b6000613d3760328361474e565b9150613d4282614c17565b604082019050919050565b6000613d5a60268361474e565b9150613d6582614c66565b604082019050919050565b6000613d7d601c8361474e565b9150613d8882614cb5565b602082019050919050565b6000613da060268361474e565b9150613dab82614cde565b604082019050919050565b6000613dc3601c8361474e565b9150613dce82614d2d565b602082019050919050565b6000613de660248361474e565b9150613df182614d56565b604082019050919050565b6000613e0960198361474e565b9150613e1482614da5565b602082019050919050565b6000613e2c603a8361474e565b9150613e3782614dce565b604082019050919050565b6000613e4f601d8361474e565b9150613e5a82614e1d565b602082019050919050565b6000613e72602c8361474e565b9150613e7d82614e46565b604082019050919050565b6000613e95602b8361474e565b9150613ea082614e95565b604082019050919050565b6000613eb860338361474e565b9150613ec382614ee4565b604082019050919050565b6000613edb60388361474e565b9150613ee682614f33565b604082019050919050565b6000613efe602a8361474e565b9150613f0982614f82565b604082019050919050565b6000613f2160298361474e565b9150613f2c82614fd1565b604082019050919050565b6000613f44600a8361474e565b9150613f4f82615020565b602082019050919050565b6000613f6760208361474e565b9150613f7282615049565b602082019050919050565b6000613f8a602c8361474e565b9150613f9582615072565b604082019050919050565b6000613fad60208361474e565b9150613fb8826150c1565b602082019050919050565b6000613fd060298361474e565b9150613fdb826150ea565b604082019050919050565b6000613ff3602f8361474e565b9150613ffe82615139565b604082019050919050565b600061401660218361474e565b915061402182615188565b604082019050919050565b600061403960198361474e565b9150614044826151d7565b602082019050919050565b600061405c60168361474e565b915061406782615200565b602082019050919050565b600061407f600083614743565b915061408a82615229565b600082019050919050565b60006140a260318361474e565b91506140ad8261522c565b604082019050919050565b60006140c5602c8361474e565b91506140d08261527b565b604082019050919050565b6140e4816148fb565b82525050565b6140f3816148fb565b82525050565b60006141058285613bed565b91506141118284613bed565b91508190509392505050565b600061412882614072565b9150819050919050565b60006020820190506141476000830184613aff565b92915050565b60006040820190506141626000830185613af0565b61416f60208301846140ea565b9392505050565b600060808201905061418b6000830187613aff565b6141986020830186613aff565b6141a560408301856140ea565b81810360608301526141b78184613b7b565b905095945050505050565b60006040820190506141d76000830185613aff565b6141e460208301846140ea565b9392505050565b600060208201905081810360008301526142058184613b0e565b905092915050565b60006020820190506142226000830184613b6c565b92915050565b600060208201905081810360008301526142428184613bb4565b905092915050565b600060208201905081810360008301526142648184613c1e565b905092915050565b6000602082019050818103600083015261428581613c9e565b9050919050565b600060208201905081810360008301526142a581613cc1565b9050919050565b600060208201905081810360008301526142c581613ce4565b9050919050565b600060208201905081810360008301526142e581613d07565b9050919050565b6000602082019050818103600083015261430581613d2a565b9050919050565b6000602082019050818103600083015261432581613d4d565b9050919050565b6000602082019050818103600083015261434581613d70565b9050919050565b6000602082019050818103600083015261436581613d93565b9050919050565b6000602082019050818103600083015261438581613db6565b9050919050565b600060208201905081810360008301526143a581613dd9565b9050919050565b600060208201905081810360008301526143c581613dfc565b9050919050565b600060208201905081810360008301526143e581613e1f565b9050919050565b6000602082019050818103600083015261440581613e42565b9050919050565b6000602082019050818103600083015261442581613e65565b9050919050565b6000602082019050818103600083015261444581613e88565b9050919050565b6000602082019050818103600083015261446581613eab565b9050919050565b6000602082019050818103600083015261448581613ece565b9050919050565b600060208201905081810360008301526144a581613ef1565b9050919050565b600060208201905081810360008301526144c581613f14565b9050919050565b600060208201905081810360008301526144e581613f37565b9050919050565b6000602082019050818103600083015261450581613f5a565b9050919050565b6000602082019050818103600083015261452581613f7d565b9050919050565b6000602082019050818103600083015261454581613fa0565b9050919050565b6000602082019050818103600083015261456581613fc3565b9050919050565b6000602082019050818103600083015261458581613fe6565b9050919050565b600060208201905081810360008301526145a581614009565b9050919050565b600060208201905081810360008301526145c58161402c565b9050919050565b600060208201905081810360008301526145e58161404f565b9050919050565b6000602082019050818103600083015261460581614095565b9050919050565b60006020820190508181036000830152614625816140b8565b9050919050565b600060208201905061464160008301846140ea565b92915050565b6000614651614662565b905061465d82826149af565b919050565b6000604051905090565b600067ffffffffffffffff82111561468757614686614ae7565b5b61469082614b16565b9050602081019050919050565b600067ffffffffffffffff8211156146b8576146b7614ae7565b5b6146c182614b16565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b6000614775826148fb565b9150614780836148fb565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156147b5576147b4614a5a565b5b828201905092915050565b60006147cb826148fb565b91506147d6836148fb565b9250826147e6576147e5614a89565b5b828204905092915050565b60006147fc826148fb565b9150614807836148fb565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156148405761483f614a5a565b5b828202905092915050565b6000614856826148fb565b9150614861836148fb565b92508282101561487457614873614a5a565b5b828203905092915050565b600061488a826148db565b9050919050565b600061489c826148db565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600061491082614917565b9050919050565b600061492282614929565b9050919050565b6000614934826148db565b9050919050565b82818337600083830152505050565b60005b8381101561496857808201518184015260208101905061494d565b83811115614977576000848401525b50505050565b6000600282049050600182168061499557607f821691505b602082108114156149a9576149a8614ab8565b5b50919050565b6149b882614b16565b810181811067ffffffffffffffff821117156149d7576149d6614ae7565b5b80604052505050565b60006149eb826148fb565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614a1e57614a1d614a5a565b5b600182019050919050565b6000614a34826148fb565b9150614a3f836148fb565b925082614a4f57614a4e614a89565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f53616c6520706175736564000000000000000000000000000000000000000000600082015250565b7f53616c6520686173206e6f742073746172746564207965740000000000000000600082015250565b7f45786365656473206d6178696d756d20726573657276656420534841524b207360008201527f7570706c79000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f5061796d656e7453706c69747465723a206163636f756e7420686173206e6f2060008201527f7368617265730000000000000000000000000000000000000000000000000000602082015250565b7f45786365656473206d6178696d756d20534841524b20737570706c7900000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260008201527f6563697069656e74206d61792068617665207265766572746564000000000000602082015250565b7f416464726573733a20696e73756666696369656e742062616c616e6365000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f5061796d656e7453706c69747465723a206163636f756e74206973206e6f742060008201527f647565207061796d656e74000000000000000000000000000000000000000000602082015250565b7f596f752063616e206d696e742061206d6178696d756d206f662032302053484160008201527f524b7320706572207472616e73616374696f6e00000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f496e76616c696420494400000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722073656e74206973206e6f7420636f727265637400000000000000600082015250565b7f4c6963656e736520616c7265616479206c6f636b656400000000000000000000600082015250565b50565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6152d38161487f565b81146152de57600080fd5b50565b6152ea81614891565b81146152f557600080fd5b50565b615301816148a3565b811461530c57600080fd5b50565b615318816148af565b811461532357600080fd5b50565b61532f816148fb565b811461533a57600080fd5b5056fea2646970667358221220066bfb15e789425d7f24f4f0a87f1cfe65c8e9f39b8bb1afde76f07e6299d60064736f6c63430008040033

Deployed Bytecode Sourcemap

55263:3718:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52702:40;52718:12;:10;:12::i;:::-;52732:9;52702:40;;;;;;;:::i;:::-;;;;;;;;55263:3718;;;;;34644:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21529:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23088:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22611:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57889:126;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55642:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35284:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53908:613;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23978:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34952:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55597:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55555:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57802:79;;;;;;;;;;;;;:::i;:::-;;52833:91;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55456:35;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24388:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58636:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35474:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55500:46;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57603:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21223:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20953:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42447:94;;;;;;;;;;;;;:::i;:::-;;53608:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56966:361;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41796:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57382:91;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21698:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53408:109;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57713:81;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55677:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56267:691;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23381:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58454:174;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24644:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58290:125;;;;;;;;;;;;;:::i;:::-;;21873:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53204:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55415:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58066:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53018:95;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23747:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42696:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15986:98;16039:7;16066:10;16059:17;;15986:98;:::o;34644:224::-;34746:4;34785:35;34770:50;;;:11;:50;;;;:90;;;;34824:36;34848:11;34824:23;:36::i;:::-;34770:90;34763:97;;34644:224;;;:::o;21529:100::-;21583:13;21616:5;21609:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21529:100;:::o;23088:221::-;23164:7;23192:16;23200:7;23192;:16::i;:::-;23184:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23277:15;:24;23293:7;23277:24;;;;;;;;;;;;;;;;;;;;;23270:31;;23088:221;;;:::o;22611:411::-;22692:13;22708:23;22723:7;22708:14;:23::i;:::-;22692:39;;22756:5;22750:11;;:2;:11;;;;22742:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22850:5;22834:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22859:37;22876:5;22883:12;:10;:12::i;:::-;22859:16;:37::i;:::-;22834:62;22812:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;22993:21;23002:2;23006:7;22993:8;:21::i;:::-;22611:411;;;:::o;57889:126::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57993:14:::1;57974:16;:33;;;;;;;;;;;;:::i;:::-;;57889:126:::0;:::o;55642:26::-;;;;;;;;;;;;;:::o;35284:113::-;35345:7;35372:10;:17;;;;35365:24;;35284:113;:::o;53908:613::-;54003:1;53984:7;:16;53992:7;53984:16;;;;;;;;;;;;;;;;:20;53976:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;54060:21;54108:14;;54084:21;:38;;;;:::i;:::-;54060:62;;54133:15;54203:9;:18;54213:7;54203:18;;;;;;;;;;;;;;;;54188:12;;54168:7;:16;54176:7;54168:16;;;;;;;;;;;;;;;;54152:13;:32;;;;:::i;:::-;54151:49;;;;:::i;:::-;:70;;;;:::i;:::-;54133:88;;54253:1;54242:7;:12;;54234:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54357:7;54336:9;:18;54346:7;54336:18;;;;;;;;;;;;;;;;:28;;;;:::i;:::-;54315:9;:18;54325:7;54315:18;;;;;;;;;;;;;;;:49;;;;54409:7;54392:14;;:24;;;;:::i;:::-;54375:14;:41;;;;54429:35;54447:7;54456;54429:17;:35::i;:::-;54480:33;54496:7;54505;54480:33;;;;;;;:::i;:::-;;;;;;;;53908:613;;;:::o;23978:339::-;24173:41;24192:12;:10;:12::i;:::-;24206:7;24173:18;:41::i;:::-;24165:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24281:28;24291:4;24297:2;24301:7;24281:9;:28::i;:::-;23978:339;;;:::o;34952:256::-;35049:7;35085:23;35102:5;35085:16;:23::i;:::-;35077:5;:31;35069:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35174:12;:19;35187:5;35174:19;;;;;;;;;;;;;;;:26;35194:5;35174:26;;;;;;;;;;;;35167:33;;34952:256;;;;:::o;55597:36::-;;;;:::o;55555:33::-;;;;:::o;57802:79::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57866:7:::1;;;;;;;;;;;57865:8;57855:7;;:18;;;;;;;;;;;;;;;;;;57802:79::o:0;52833:91::-;52877:7;52904:12;;52897:19;;52833:91;:::o;55456:35::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;24388:185::-;24526:39;24543:4;24549:2;24553:7;24526:39;;;;;;;;;;;;:16;:39::i;:::-;24388:185;;;:::o;58636:342::-;58695:16;58724:18;58745:17;58755:6;58745:9;:17::i;:::-;58724:38;;58775:25;58817:10;58803:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58775:53;;58843:9;58839:106;58858:10;58854:1;:14;58839:106;;;58903:30;58923:6;58931:1;58903:19;:30::i;:::-;58889:8;58898:1;58889:11;;;;;;;;;;;;;;;;;;;;;:44;;;;;58870:3;;;;;:::i;:::-;;;;58839:106;;;;58962:8;58955:15;;;;58636:342;;;:::o;35474:233::-;35549:7;35585:30;:28;:30::i;:::-;35577:5;:38;35569:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35682:10;35693:5;35682:17;;;;;;;;;;;;;;;;;;;;;;;;35675:24;;35474:233;;;:::o;55500:46::-;;;;:::o;57603:102::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57690:7:::1;57674:13;:23;;;;;;;;;;;;:::i;:::-;;57603:102:::0;:::o;21223:239::-;21295:7;21315:13;21331:7;:16;21339:7;21331:16;;;;;;;;;;;;;;;;;;;;;21315:32;;21383:1;21366:19;;:5;:19;;;;21358:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21449:5;21442:12;;;21223:239;;;:::o;20953:208::-;21025:7;21070:1;21053:19;;:5;:19;;;;21045:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21137:9;:16;21147:5;21137:16;;;;;;;;;;;;;;;;21130:23;;20953:208;;;:::o;42447:94::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42512:21:::1;42530:1;42512:9;:21::i;:::-;42447:94::o:0;53608:100::-;53659:7;53686;53694:5;53686:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53679:21;;53608:100;;;:::o;56966:361::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57059:15:::1;;57050:5;:24;;57042:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;57137:14;57154:13;:11;:13::i;:::-;57137:30;;57192:9;57188:87;57207:5;57203:1;:9;57188:87;;;57233:30;57243:6;57260:1;57251:6;:10;;;;:::i;:::-;57233:9;:30::i;:::-;57214:3;;;;;:::i;:::-;;;;57188:87;;;;57314:5;57295:15;;:24;;;;;;;:::i;:::-;;;;;;;;42087:1;56966:361:::0;;:::o;41796:87::-;41842:7;41869:6;;;;;;;;;;;41862:13;;41796:87;:::o;57382:91::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;57456:9:::1;57447:6;:18;;;;57382:91:::0;:::o;21698:104::-;21754:13;21787:7;21780:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21698:104;:::o;53408:109::-;53464:7;53491:9;:18;53501:7;53491:18;;;;;;;;;;;;;;;;53484:25;;53408:109;;;:::o;57713:81::-;57754:7;57780:6;;57773:13;;57713:81;:::o;55677:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56267:691::-;56322:14;56339:13;:11;:13::i;:::-;56322:30;;56373:7;;;;;;;;;;;56372:8;56363:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56473:10;56454:15;:29;;56445:84;;;;;;;;;;;;:::i;:::-;;;;;;;;;56558:26;;56549:5;:35;;56540:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;56702:15;;56689:10;;:28;;;;:::i;:::-;56680:5;56671:6;:14;;;;:::i;:::-;:46;;56662:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;56792:5;56783:6;;:14;;;;:::i;:::-;56770:9;:27;;56761:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;56863:9;56859:92;56878:5;56874:1;:9;56859:92;;;56904:35;56915:10;56936:1;56927:6;:10;;;;:::i;:::-;56904:9;:35::i;:::-;56885:3;;;;;:::i;:::-;;;;56859:92;;;;56267:691;;:::o;23381:295::-;23496:12;:10;:12::i;:::-;23484:24;;:8;:24;;;;23476:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23596:8;23551:18;:32;23570:12;:10;:12::i;:::-;23551:32;;;;;;;;;;;;;;;:42;23584:8;23551:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23649:8;23620:48;;23635:12;:10;:12::i;:::-;23620:48;;;23659:8;23620:48;;;;;;:::i;:::-;;;;;;;;23381:295;;:::o;58454:174::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58554:5:::1;58537:22;;:13;;;;;;;;;;;:22;;;58529:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;58612:8;58597:12;:23;;;;;;;;;;;;:::i;:::-;;58454:174:::0;:::o;24644:328::-;24819:41;24838:12;:10;:12::i;:::-;24852:7;24819:18;:41::i;:::-;24811:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24925:39;24939:4;24945:2;24949:7;24958:5;24925:13;:39::i;:::-;24644:328;;;;:::o;58290:125::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58358:4:::1;58341:13;;:21;;;;;;;;;;;;;;;;;;58378:29;58394:12;58378:29;;;;;;:::i;:::-;;;;;;;;58290:125::o:0;21873:334::-;21946:13;21980:16;21988:7;21980;:16::i;:::-;21972:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22061:21;22085:10;:8;:10::i;:::-;22061:34;;22137:1;22119:7;22113:21;:25;:86;;;;;;;;;;;;;;;;;22165:7;22174:18;:7;:16;:18::i;:::-;22148:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22113:86;22106:93;;;21873:334;;;:::o;53204:105::-;53258:7;53285;:16;53293:7;53285:16;;;;;;;;;;;;;;;;53278:23;;53204:105;;;:::o;55415:32::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;58066:158::-;58118:13;58158;:11;:13::i;:::-;58152:3;:19;58144:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;58204:12;58197:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58066:158;;;:::o;53018:95::-;53064:7;53091:14;;53084:21;;53018:95;:::o;23747:164::-;23844:4;23868:18;:25;23887:5;23868:25;;;;;;;;;;;;;;;:35;23894:8;23868:35;;;;;;;;;;;;;;;;;;;;;;;;;23861:42;;23747:164;;;;:::o;42696:192::-;42027:12;:10;:12::i;:::-;42016:23;;:7;:5;:7::i;:::-;:23;;;42008:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42805:1:::1;42785:22;;:8;:22;;;;42777:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42861:19;42871:8;42861:9;:19::i;:::-;42696:192:::0;:::o;20584:305::-;20686:4;20738:25;20723:40;;;:11;:40;;;;:105;;;;20795:33;20780:48;;;:11;:48;;;;20723:105;:158;;;;20845:36;20869:11;20845:23;:36::i;:::-;20723:158;20703:178;;20584:305;;;:::o;26482:127::-;26547:4;26599:1;26571:30;;:7;:16;26579:7;26571:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26564:37;;26482:127;;;:::o;30464:174::-;30566:2;30539:15;:24;30555:7;30539:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30622:7;30618:2;30584:46;;30593:23;30608:7;30593:14;:23::i;:::-;30584:46;;;;;;;;;;;;30464:174;;:::o;9562:317::-;9677:6;9652:21;:31;;9644:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;9731:12;9749:9;:14;;9771:6;9749:33;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9730:52;;;9801:7;9793:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;9562:317;;;:::o;26776:348::-;26869:4;26894:16;26902:7;26894;:16::i;:::-;26886:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26970:13;26986:23;27001:7;26986:14;:23::i;:::-;26970:39;;27039:5;27028:16;;:7;:16;;;:51;;;;27072:7;27048:31;;:20;27060:7;27048:11;:20::i;:::-;:31;;;27028:51;:87;;;;27083:32;27100:5;27107:7;27083:16;:32::i;:::-;27028:87;27020:96;;;26776:348;;;;:::o;29768:578::-;29927:4;29900:31;;:23;29915:7;29900:14;:23::i;:::-;:31;;;29892:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30010:1;29996:16;;:2;:16;;;;29988:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30066:39;30087:4;30093:2;30097:7;30066:20;:39::i;:::-;30170:29;30187:1;30191:7;30170:8;:29::i;:::-;30231:1;30212:9;:15;30222:4;30212:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30260:1;30243:9;:13;30253:2;30243:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30291:2;30272:7;:16;30280:7;30272:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30330:7;30326:2;30311:27;;30320:4;30311:27;;;;;;;;;;;;29768:578;;;:::o;42896:173::-;42952:16;42971:6;;;;;;;;;;;42952:25;;42997:8;42988:6;;:17;;;;;;;;;;;;;;;;;;43052:8;43021:40;;43042:8;43021:40;;;;;;;;;;;;42896:173;;:::o;27466:110::-;27542:26;27552:2;27556:7;27542:26;;;;;;;;;;;;:9;:26::i;:::-;27466:110;;:::o;25854:315::-;26011:28;26021:4;26027:2;26031:7;26011:9;:28::i;:::-;26058:48;26081:4;26087:2;26091:7;26100:5;26058:22;:48::i;:::-;26050:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25854:315;;;;:::o;57481:114::-;57541:13;57574;57567:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57481:114;:::o;16519:723::-;16575:13;16805:1;16796:5;:10;16792:53;;;16823:10;;;;;;;;;;;;;;;;;;;;;16792:53;16855:12;16870:5;16855:20;;16886:14;16911:78;16926:1;16918:4;:9;16911:78;;16944:8;;;;;:::i;:::-;;;;16975:2;16967:10;;;;;:::i;:::-;;;16911:78;;;16999:19;17031:6;17021:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;16999:39;;17049:154;17065:1;17056:5;:10;17049:154;;17093:1;17083:11;;;;;:::i;:::-;;;17160:2;17152:5;:10;;;;:::i;:::-;17139:2;:24;;;;:::i;:::-;17126:39;;17109:6;17116;17109:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17189:2;17180:11;;;;;:::i;:::-;;;17049:154;;;17227:6;17213:21;;;;;16519:723;;;;:::o;19082:157::-;19167:4;19206:25;19191:40;;;:11;:40;;;;19184:47;;19082:157;;;:::o;36320:589::-;36464:45;36491:4;36497:2;36501:7;36464:26;:45::i;:::-;36542:1;36526:18;;:4;:18;;;36522:187;;;36561:40;36593:7;36561:31;:40::i;:::-;36522:187;;;36631:2;36623:10;;:4;:10;;;36619:90;;36650:47;36683:4;36689:7;36650:32;:47::i;:::-;36619:90;36522:187;36737:1;36723:16;;:2;:16;;;36719:183;;;36756:45;36793:7;36756:36;:45::i;:::-;36719:183;;;36829:4;36823:10;;:2;:10;;;36819:83;;36850:40;36878:2;36882:7;36850:27;:40::i;:::-;36819:83;36719:183;36320:589;;;:::o;27803:321::-;27933:18;27939:2;27943:7;27933:5;:18::i;:::-;27984:54;28015:1;28019:2;28023:7;28032:5;27984:22;:54::i;:::-;27962:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27803:321;;;:::o;31203:803::-;31358:4;31379:15;:2;:13;;;:15::i;:::-;31375:624;;;31431:2;31415:36;;;31452:12;:10;:12::i;:::-;31466:4;31472:7;31481:5;31415:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31411:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31678:1;31661:6;:13;:18;31657:272;;;31704:60;;;;;;;;;;:::i;:::-;;;;;;;;31657:272;31879:6;31873:13;31864:6;31860:2;31856:15;31849:38;31411:533;31548:45;;;31538:55;;;:6;:55;;;;31531:62;;;;;31375:624;31983:4;31976:11;;31203:803;;;;;;;:::o;32578:126::-;;;;:::o;37632:164::-;37736:10;:17;;;;37709:15;:24;37725:7;37709:24;;;;;;;;;;;:44;;;;37764:10;37780:7;37764:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37632:164;:::o;38423:988::-;38689:22;38739:1;38714:22;38731:4;38714:16;:22::i;:::-;:26;;;;:::i;:::-;38689:51;;38751:18;38772:17;:26;38790:7;38772:26;;;;;;;;;;;;38751:47;;38919:14;38905:10;:28;38901:328;;38950:19;38972:12;:18;38985:4;38972:18;;;;;;;;;;;;;;;:34;38991:14;38972:34;;;;;;;;;;;;38950:56;;39056:11;39023:12;:18;39036:4;39023:18;;;;;;;;;;;;;;;:30;39042:10;39023:30;;;;;;;;;;;:44;;;;39173:10;39140:17;:30;39158:11;39140:30;;;;;;;;;;;:43;;;;38901:328;;39325:17;:26;39343:7;39325:26;;;;;;;;;;;39318:33;;;39369:12;:18;39382:4;39369:18;;;;;;;;;;;;;;;:34;39388:14;39369:34;;;;;;;;;;;39362:41;;;38423:988;;;;:::o;39706:1079::-;39959:22;40004:1;39984:10;:17;;;;:21;;;;:::i;:::-;39959:46;;40016:18;40037:15;:24;40053:7;40037:24;;;;;;;;;;;;40016:45;;40388:19;40410:10;40421:14;40410:26;;;;;;;;;;;;;;;;;;;;;;;;40388:48;;40474:11;40449:10;40460;40449:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40585:10;40554:15;:28;40570:11;40554:28;;;;;;;;;;;:41;;;;40726:15;:24;40742:7;40726:24;;;;;;;;;;;40719:31;;;40761:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39706:1079;;;;:::o;37210:221::-;37295:14;37312:20;37329:2;37312:16;:20::i;:::-;37295:37;;37370:7;37343:12;:16;37356:2;37343:16;;;;;;;;;;;;;;;:24;37360:6;37343:24;;;;;;;;;;;:34;;;;37417:6;37388:17;:26;37406:7;37388:26;;;;;;;;;;;:35;;;;37210:221;;;:::o;28460:382::-;28554:1;28540:16;;:2;:16;;;;28532:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28613:16;28621:7;28613;:16::i;:::-;28612:17;28604:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28675:45;28704:1;28708:2;28712:7;28675:20;:45::i;:::-;28750:1;28733:9;:13;28743:2;28733:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28781:2;28762:7;:16;28770:7;28762:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28826:7;28822:2;28801:33;;28818:1;28801:33;;;;;;;;;;;;28460:382;;:::o;8240:387::-;8300:4;8508:12;8575:7;8563:20;8555:28;;8618:1;8611:4;:8;8604:15;;;8240:387;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;852:155::-;906:5;944:6;931:20;922:29;;960:41;995:5;960:41;:::i;:::-;912:95;;;;:::o;1013:133::-;1056:5;1094:6;1081:20;1072:29;;1110:30;1134:5;1110:30;:::i;:::-;1062:84;;;;:::o;1152:137::-;1197:5;1235:6;1222:20;1213:29;;1251:32;1277:5;1251:32;:::i;:::-;1203:86;;;;:::o;1295:141::-;1351:5;1382:6;1376:13;1367:22;;1398:32;1424:5;1398:32;:::i;:::-;1357:79;;;;:::o;1455:271::-;1510:5;1559:3;1552:4;1544:6;1540:17;1536:27;1526:2;;1577:1;1574;1567:12;1526:2;1617:6;1604:20;1642:78;1716:3;1708:6;1701:4;1693:6;1689:17;1642:78;:::i;:::-;1633:87;;1516:210;;;;;:::o;1746:273::-;1802:5;1851:3;1844:4;1836:6;1832:17;1828:27;1818:2;;1869:1;1866;1859:12;1818:2;1909:6;1896:20;1934:79;2009:3;2001:6;1994:4;1986:6;1982:17;1934:79;:::i;:::-;1925:88;;1808:211;;;;;:::o;2025:139::-;2071:5;2109:6;2096:20;2087:29;;2125:33;2152:5;2125:33;:::i;:::-;2077:87;;;;:::o;2170:262::-;2229:6;2278:2;2266:9;2257:7;2253:23;2249:32;2246:2;;;2294:1;2291;2284:12;2246:2;2337:1;2362:53;2407:7;2398:6;2387:9;2383:22;2362:53;:::i;:::-;2352:63;;2308:117;2236:196;;;;:::o;2438:278::-;2505:6;2554:2;2542:9;2533:7;2529:23;2525:32;2522:2;;;2570:1;2567;2560:12;2522:2;2613:1;2638:61;2691:7;2682:6;2671:9;2667:22;2638:61;:::i;:::-;2628:71;;2584:125;2512:204;;;;:::o;2722:407::-;2790:6;2798;2847:2;2835:9;2826:7;2822:23;2818:32;2815:2;;;2863:1;2860;2853:12;2815:2;2906:1;2931:53;2976:7;2967:6;2956:9;2952:22;2931:53;:::i;:::-;2921:63;;2877:117;3033:2;3059:53;3104:7;3095:6;3084:9;3080:22;3059:53;:::i;:::-;3049:63;;3004:118;2805:324;;;;;:::o;3135:552::-;3212:6;3220;3228;3277:2;3265:9;3256:7;3252:23;3248:32;3245:2;;;3293:1;3290;3283:12;3245:2;3336:1;3361:53;3406:7;3397:6;3386:9;3382:22;3361:53;:::i;:::-;3351:63;;3307:117;3463:2;3489:53;3534:7;3525:6;3514:9;3510:22;3489:53;:::i;:::-;3479:63;;3434:118;3591:2;3617:53;3662:7;3653:6;3642:9;3638:22;3617:53;:::i;:::-;3607:63;;3562:118;3235:452;;;;;:::o;3693:809::-;3788:6;3796;3804;3812;3861:3;3849:9;3840:7;3836:23;3832:33;3829:2;;;3878:1;3875;3868:12;3829:2;3921:1;3946:53;3991:7;3982:6;3971:9;3967:22;3946:53;:::i;:::-;3936:63;;3892:117;4048:2;4074:53;4119:7;4110:6;4099:9;4095:22;4074:53;:::i;:::-;4064:63;;4019:118;4176:2;4202:53;4247:7;4238:6;4227:9;4223:22;4202:53;:::i;:::-;4192:63;;4147:118;4332:2;4321:9;4317:18;4304:32;4363:18;4355:6;4352:30;4349:2;;;4395:1;4392;4385:12;4349:2;4423:62;4477:7;4468:6;4457:9;4453:22;4423:62;:::i;:::-;4413:72;;4275:220;3819:683;;;;;;;:::o;4508:401::-;4573:6;4581;4630:2;4618:9;4609:7;4605:23;4601:32;4598:2;;;4646:1;4643;4636:12;4598:2;4689:1;4714:53;4759:7;4750:6;4739:9;4735:22;4714:53;:::i;:::-;4704:63;;4660:117;4816:2;4842:50;4884:7;4875:6;4864:9;4860:22;4842:50;:::i;:::-;4832:60;;4787:115;4588:321;;;;;:::o;4915:407::-;4983:6;4991;5040:2;5028:9;5019:7;5015:23;5011:32;5008:2;;;5056:1;5053;5046:12;5008:2;5099:1;5124:53;5169:7;5160:6;5149:9;5145:22;5124:53;:::i;:::-;5114:63;;5070:117;5226:2;5252:53;5297:7;5288:6;5277:9;5273:22;5252:53;:::i;:::-;5242:63;;5197:118;4998:324;;;;;:::o;5328:260::-;5386:6;5435:2;5423:9;5414:7;5410:23;5406:32;5403:2;;;5451:1;5448;5441:12;5403:2;5494:1;5519:52;5563:7;5554:6;5543:9;5539:22;5519:52;:::i;:::-;5509:62;;5465:116;5393:195;;;;:::o;5594:282::-;5663:6;5712:2;5700:9;5691:7;5687:23;5683:32;5680:2;;;5728:1;5725;5718:12;5680:2;5771:1;5796:63;5851:7;5842:6;5831:9;5827:22;5796:63;:::i;:::-;5786:73;;5742:127;5670:206;;;;:::o;5882:375::-;5951:6;6000:2;5988:9;5979:7;5975:23;5971:32;5968:2;;;6016:1;6013;6006:12;5968:2;6087:1;6076:9;6072:17;6059:31;6117:18;6109:6;6106:30;6103:2;;;6149:1;6146;6139:12;6103:2;6177:63;6232:7;6223:6;6212:9;6208:22;6177:63;:::i;:::-;6167:73;;6030:220;5958:299;;;;:::o;6263:262::-;6322:6;6371:2;6359:9;6350:7;6346:23;6342:32;6339:2;;;6387:1;6384;6377:12;6339:2;6430:1;6455:53;6500:7;6491:6;6480:9;6476:22;6455:53;:::i;:::-;6445:63;;6401:117;6329:196;;;;:::o;6531:179::-;6600:10;6621:46;6663:3;6655:6;6621:46;:::i;:::-;6699:4;6694:3;6690:14;6676:28;;6611:99;;;;:::o;6716:147::-;6811:45;6850:5;6811:45;:::i;:::-;6806:3;6799:58;6789:74;;:::o;6869:118::-;6956:24;6974:5;6956:24;:::i;:::-;6951:3;6944:37;6934:53;;:::o;7023:732::-;7142:3;7171:54;7219:5;7171:54;:::i;:::-;7241:86;7320:6;7315:3;7241:86;:::i;:::-;7234:93;;7351:56;7401:5;7351:56;:::i;:::-;7430:7;7461:1;7446:284;7471:6;7468:1;7465:13;7446:284;;;7547:6;7541:13;7574:63;7633:3;7618:13;7574:63;:::i;:::-;7567:70;;7660:60;7713:6;7660:60;:::i;:::-;7650:70;;7506:224;7493:1;7490;7486:9;7481:14;;7446:284;;;7450:14;7746:3;7739:10;;7147:608;;;;;;;:::o;7761:109::-;7842:21;7857:5;7842:21;:::i;:::-;7837:3;7830:34;7820:50;;:::o;7876:360::-;7962:3;7990:38;8022:5;7990:38;:::i;:::-;8044:70;8107:6;8102:3;8044:70;:::i;:::-;8037:77;;8123:52;8168:6;8163:3;8156:4;8149:5;8145:16;8123:52;:::i;:::-;8200:29;8222:6;8200:29;:::i;:::-;8195:3;8191:39;8184:46;;7966:270;;;;;:::o;8242:364::-;8330:3;8358:39;8391:5;8358:39;:::i;:::-;8413:71;8477:6;8472:3;8413:71;:::i;:::-;8406:78;;8493:52;8538:6;8533:3;8526:4;8519:5;8515:16;8493:52;:::i;:::-;8570:29;8592:6;8570:29;:::i;:::-;8565:3;8561:39;8554:46;;8334:272;;;;;:::o;8612:377::-;8718:3;8746:39;8779:5;8746:39;:::i;:::-;8801:89;8883:6;8878:3;8801:89;:::i;:::-;8794:96;;8899:52;8944:6;8939:3;8932:4;8925:5;8921:16;8899:52;:::i;:::-;8976:6;8971:3;8967:16;8960:23;;8722:267;;;;;:::o;9019:802::-;9104:3;9141:5;9135:12;9170:36;9196:9;9170:36;:::i;:::-;9222:71;9286:6;9281:3;9222:71;:::i;:::-;9215:78;;9324:1;9313:9;9309:17;9340:1;9335:135;;;;9484:1;9479:336;;;;9302:513;;9335:135;9419:4;9415:9;9404;9400:25;9395:3;9388:38;9455:4;9450:3;9446:14;9439:21;;9335:135;;9479:336;9546:38;9578:5;9546:38;:::i;:::-;9606:1;9620:154;9634:6;9631:1;9628:13;9620:154;;;9708:7;9702:14;9698:1;9693:3;9689:11;9682:35;9758:1;9749:7;9745:15;9734:26;;9656:4;9653:1;9649:12;9644:17;;9620:154;;;9803:1;9798:3;9794:11;9787:18;;9486:329;;9302:513;;9108:713;;;;;;:::o;9827:366::-;9969:3;9990:67;10054:2;10049:3;9990:67;:::i;:::-;9983:74;;10066:93;10155:3;10066:93;:::i;:::-;10184:2;10179:3;10175:12;10168:19;;9973:220;;;:::o;10199:366::-;10341:3;10362:67;10426:2;10421:3;10362:67;:::i;:::-;10355:74;;10438:93;10527:3;10438:93;:::i;:::-;10556:2;10551:3;10547:12;10540:19;;10345:220;;;:::o;10571:366::-;10713:3;10734:67;10798:2;10793:3;10734:67;:::i;:::-;10727:74;;10810:93;10899:3;10810:93;:::i;:::-;10928:2;10923:3;10919:12;10912:19;;10717:220;;;:::o;10943:366::-;11085:3;11106:67;11170:2;11165:3;11106:67;:::i;:::-;11099:74;;11182:93;11271:3;11182:93;:::i;:::-;11300:2;11295:3;11291:12;11284:19;;11089:220;;;:::o;11315:366::-;11457:3;11478:67;11542:2;11537:3;11478:67;:::i;:::-;11471:74;;11554:93;11643:3;11554:93;:::i;:::-;11672:2;11667:3;11663:12;11656:19;;11461:220;;;:::o;11687:366::-;11829:3;11850:67;11914:2;11909:3;11850:67;:::i;:::-;11843:74;;11926:93;12015:3;11926:93;:::i;:::-;12044:2;12039:3;12035:12;12028:19;;11833:220;;;:::o;12059:366::-;12201:3;12222:67;12286:2;12281:3;12222:67;:::i;:::-;12215:74;;12298:93;12387:3;12298:93;:::i;:::-;12416:2;12411:3;12407:12;12400:19;;12205:220;;;:::o;12431:366::-;12573:3;12594:67;12658:2;12653:3;12594:67;:::i;:::-;12587:74;;12670:93;12759:3;12670:93;:::i;:::-;12788:2;12783:3;12779:12;12772:19;;12577:220;;;:::o;12803:366::-;12945:3;12966:67;13030:2;13025:3;12966:67;:::i;:::-;12959:74;;13042:93;13131:3;13042:93;:::i;:::-;13160:2;13155:3;13151:12;13144:19;;12949:220;;;:::o;13175:366::-;13317:3;13338:67;13402:2;13397:3;13338:67;:::i;:::-;13331:74;;13414:93;13503:3;13414:93;:::i;:::-;13532:2;13527:3;13523:12;13516:19;;13321:220;;;:::o;13547:366::-;13689:3;13710:67;13774:2;13769:3;13710:67;:::i;:::-;13703:74;;13786:93;13875:3;13786:93;:::i;:::-;13904:2;13899:3;13895:12;13888:19;;13693:220;;;:::o;13919:366::-;14061:3;14082:67;14146:2;14141:3;14082:67;:::i;:::-;14075:74;;14158:93;14247:3;14158:93;:::i;:::-;14276:2;14271:3;14267:12;14260:19;;14065:220;;;:::o;14291:366::-;14433:3;14454:67;14518:2;14513:3;14454:67;:::i;:::-;14447:74;;14530:93;14619:3;14530:93;:::i;:::-;14648:2;14643:3;14639:12;14632:19;;14437:220;;;:::o;14663:366::-;14805:3;14826:67;14890:2;14885:3;14826:67;:::i;:::-;14819:74;;14902:93;14991:3;14902:93;:::i;:::-;15020:2;15015:3;15011:12;15004:19;;14809:220;;;:::o;15035:366::-;15177:3;15198:67;15262:2;15257:3;15198:67;:::i;:::-;15191:74;;15274:93;15363:3;15274:93;:::i;:::-;15392:2;15387:3;15383:12;15376:19;;15181:220;;;:::o;15407:366::-;15549:3;15570:67;15634:2;15629:3;15570:67;:::i;:::-;15563:74;;15646:93;15735:3;15646:93;:::i;:::-;15764:2;15759:3;15755:12;15748:19;;15553:220;;;:::o;15779:366::-;15921:3;15942:67;16006:2;16001:3;15942:67;:::i;:::-;15935:74;;16018:93;16107:3;16018:93;:::i;:::-;16136:2;16131:3;16127:12;16120:19;;15925:220;;;:::o;16151:366::-;16293:3;16314:67;16378:2;16373:3;16314:67;:::i;:::-;16307:74;;16390:93;16479:3;16390:93;:::i;:::-;16508:2;16503:3;16499:12;16492:19;;16297:220;;;:::o;16523:366::-;16665:3;16686:67;16750:2;16745:3;16686:67;:::i;:::-;16679:74;;16762:93;16851:3;16762:93;:::i;:::-;16880:2;16875:3;16871:12;16864:19;;16669:220;;;:::o;16895:366::-;17037:3;17058:67;17122:2;17117:3;17058:67;:::i;:::-;17051:74;;17134:93;17223:3;17134:93;:::i;:::-;17252:2;17247:3;17243:12;17236:19;;17041:220;;;:::o;17267:366::-;17409:3;17430:67;17494:2;17489:3;17430:67;:::i;:::-;17423:74;;17506:93;17595:3;17506:93;:::i;:::-;17624:2;17619:3;17615:12;17608:19;;17413:220;;;:::o;17639:366::-;17781:3;17802:67;17866:2;17861:3;17802:67;:::i;:::-;17795:74;;17878:93;17967:3;17878:93;:::i;:::-;17996:2;17991:3;17987:12;17980:19;;17785:220;;;:::o;18011:366::-;18153:3;18174:67;18238:2;18233:3;18174:67;:::i;:::-;18167:74;;18250:93;18339:3;18250:93;:::i;:::-;18368:2;18363:3;18359:12;18352:19;;18157:220;;;:::o;18383:366::-;18525:3;18546:67;18610:2;18605:3;18546:67;:::i;:::-;18539:74;;18622:93;18711:3;18622:93;:::i;:::-;18740:2;18735:3;18731:12;18724:19;;18529:220;;;:::o;18755:366::-;18897:3;18918:67;18982:2;18977:3;18918:67;:::i;:::-;18911:74;;18994:93;19083:3;18994:93;:::i;:::-;19112:2;19107:3;19103:12;19096:19;;18901:220;;;:::o;19127:366::-;19269:3;19290:67;19354:2;19349:3;19290:67;:::i;:::-;19283:74;;19366:93;19455:3;19366:93;:::i;:::-;19484:2;19479:3;19475:12;19468:19;;19273:220;;;:::o;19499:366::-;19641:3;19662:67;19726:2;19721:3;19662:67;:::i;:::-;19655:74;;19738:93;19827:3;19738:93;:::i;:::-;19856:2;19851:3;19847:12;19840:19;;19645:220;;;:::o;19871:366::-;20013:3;20034:67;20098:2;20093:3;20034:67;:::i;:::-;20027:74;;20110:93;20199:3;20110:93;:::i;:::-;20228:2;20223:3;20219:12;20212:19;;20017:220;;;:::o;20243:398::-;20402:3;20423:83;20504:1;20499:3;20423:83;:::i;:::-;20416:90;;20515:93;20604:3;20515:93;:::i;:::-;20633:1;20628:3;20624:11;20617:18;;20406:235;;;:::o;20647:366::-;20789:3;20810:67;20874:2;20869:3;20810:67;:::i;:::-;20803:74;;20886:93;20975:3;20886:93;:::i;:::-;21004:2;20999:3;20995:12;20988:19;;20793:220;;;:::o;21019:366::-;21161:3;21182:67;21246:2;21241:3;21182:67;:::i;:::-;21175:74;;21258:93;21347:3;21258:93;:::i;:::-;21376:2;21371:3;21367:12;21360:19;;21165:220;;;:::o;21391:108::-;21468:24;21486:5;21468:24;:::i;:::-;21463:3;21456:37;21446:53;;:::o;21505:118::-;21592:24;21610:5;21592:24;:::i;:::-;21587:3;21580:37;21570:53;;:::o;21629:435::-;21809:3;21831:95;21922:3;21913:6;21831:95;:::i;:::-;21824:102;;21943:95;22034:3;22025:6;21943:95;:::i;:::-;21936:102;;22055:3;22048:10;;21813:251;;;;;:::o;22070:379::-;22254:3;22276:147;22419:3;22276:147;:::i;:::-;22269:154;;22440:3;22433:10;;22258:191;;;:::o;22455:222::-;22548:4;22586:2;22575:9;22571:18;22563:26;;22599:71;22667:1;22656:9;22652:17;22643:6;22599:71;:::i;:::-;22553:124;;;;:::o;22683:348::-;22812:4;22850:2;22839:9;22835:18;22827:26;;22863:79;22939:1;22928:9;22924:17;22915:6;22863:79;:::i;:::-;22952:72;23020:2;23009:9;23005:18;22996:6;22952:72;:::i;:::-;22817:214;;;;;:::o;23037:640::-;23232:4;23270:3;23259:9;23255:19;23247:27;;23284:71;23352:1;23341:9;23337:17;23328:6;23284:71;:::i;:::-;23365:72;23433:2;23422:9;23418:18;23409:6;23365:72;:::i;:::-;23447;23515:2;23504:9;23500:18;23491:6;23447:72;:::i;:::-;23566:9;23560:4;23556:20;23551:2;23540:9;23536:18;23529:48;23594:76;23665:4;23656:6;23594:76;:::i;:::-;23586:84;;23237:440;;;;;;;:::o;23683:332::-;23804:4;23842:2;23831:9;23827:18;23819:26;;23855:71;23923:1;23912:9;23908:17;23899:6;23855:71;:::i;:::-;23936:72;24004:2;23993:9;23989:18;23980:6;23936:72;:::i;:::-;23809:206;;;;;:::o;24021:373::-;24164:4;24202:2;24191:9;24187:18;24179:26;;24251:9;24245:4;24241:20;24237:1;24226:9;24222:17;24215:47;24279:108;24382:4;24373:6;24279:108;:::i;:::-;24271:116;;24169:225;;;;:::o;24400:210::-;24487:4;24525:2;24514:9;24510:18;24502:26;;24538:65;24600:1;24589:9;24585:17;24576:6;24538:65;:::i;:::-;24492:118;;;;:::o;24616:313::-;24729:4;24767:2;24756:9;24752:18;24744:26;;24816:9;24810:4;24806:20;24802:1;24791:9;24787:17;24780:47;24844:78;24917:4;24908:6;24844:78;:::i;:::-;24836:86;;24734:195;;;;:::o;24935:307::-;25045:4;25083:2;25072:9;25068:18;25060:26;;25132:9;25126:4;25122:20;25118:1;25107:9;25103:17;25096:47;25160:75;25230:4;25221:6;25160:75;:::i;:::-;25152:83;;25050:192;;;;:::o;25248:419::-;25414:4;25452:2;25441:9;25437:18;25429:26;;25501:9;25495:4;25491:20;25487:1;25476:9;25472:17;25465:47;25529:131;25655:4;25529:131;:::i;:::-;25521:139;;25419:248;;;:::o;25673:419::-;25839:4;25877:2;25866:9;25862:18;25854:26;;25926:9;25920:4;25916:20;25912:1;25901:9;25897:17;25890:47;25954:131;26080:4;25954:131;:::i;:::-;25946:139;;25844:248;;;:::o;26098:419::-;26264:4;26302:2;26291:9;26287:18;26279:26;;26351:9;26345:4;26341:20;26337:1;26326:9;26322:17;26315:47;26379:131;26505:4;26379:131;:::i;:::-;26371:139;;26269:248;;;:::o;26523:419::-;26689:4;26727:2;26716:9;26712:18;26704:26;;26776:9;26770:4;26766:20;26762:1;26751:9;26747:17;26740:47;26804:131;26930:4;26804:131;:::i;:::-;26796:139;;26694:248;;;:::o;26948:419::-;27114:4;27152:2;27141:9;27137:18;27129:26;;27201:9;27195:4;27191:20;27187:1;27176:9;27172:17;27165:47;27229:131;27355:4;27229:131;:::i;:::-;27221:139;;27119:248;;;:::o;27373:419::-;27539:4;27577:2;27566:9;27562:18;27554:26;;27626:9;27620:4;27616:20;27612:1;27601:9;27597:17;27590:47;27654:131;27780:4;27654:131;:::i;:::-;27646:139;;27544:248;;;:::o;27798:419::-;27964:4;28002:2;27991:9;27987:18;27979:26;;28051:9;28045:4;28041:20;28037:1;28026:9;28022:17;28015:47;28079:131;28205:4;28079:131;:::i;:::-;28071:139;;27969:248;;;:::o;28223:419::-;28389:4;28427:2;28416:9;28412:18;28404:26;;28476:9;28470:4;28466:20;28462:1;28451:9;28447:17;28440:47;28504:131;28630:4;28504:131;:::i;:::-;28496:139;;28394:248;;;:::o;28648:419::-;28814:4;28852:2;28841:9;28837:18;28829:26;;28901:9;28895:4;28891:20;28887:1;28876:9;28872:17;28865:47;28929:131;29055:4;28929:131;:::i;:::-;28921:139;;28819:248;;;:::o;29073:419::-;29239:4;29277:2;29266:9;29262:18;29254:26;;29326:9;29320:4;29316:20;29312:1;29301:9;29297:17;29290:47;29354:131;29480:4;29354:131;:::i;:::-;29346:139;;29244:248;;;:::o;29498:419::-;29664:4;29702:2;29691:9;29687:18;29679:26;;29751:9;29745:4;29741:20;29737:1;29726:9;29722:17;29715:47;29779:131;29905:4;29779:131;:::i;:::-;29771:139;;29669:248;;;:::o;29923:419::-;30089:4;30127:2;30116:9;30112:18;30104:26;;30176:9;30170:4;30166:20;30162:1;30151:9;30147:17;30140:47;30204:131;30330:4;30204:131;:::i;:::-;30196:139;;30094:248;;;:::o;30348:419::-;30514:4;30552:2;30541:9;30537:18;30529:26;;30601:9;30595:4;30591:20;30587:1;30576:9;30572:17;30565:47;30629:131;30755:4;30629:131;:::i;:::-;30621:139;;30519:248;;;:::o;30773:419::-;30939:4;30977:2;30966:9;30962:18;30954:26;;31026:9;31020:4;31016:20;31012:1;31001:9;30997:17;30990:47;31054:131;31180:4;31054:131;:::i;:::-;31046:139;;30944:248;;;:::o;31198:419::-;31364:4;31402:2;31391:9;31387:18;31379:26;;31451:9;31445:4;31441:20;31437:1;31426:9;31422:17;31415:47;31479:131;31605:4;31479:131;:::i;:::-;31471:139;;31369:248;;;:::o;31623:419::-;31789:4;31827:2;31816:9;31812:18;31804:26;;31876:9;31870:4;31866:20;31862:1;31851:9;31847:17;31840:47;31904:131;32030:4;31904:131;:::i;:::-;31896:139;;31794:248;;;:::o;32048:419::-;32214:4;32252:2;32241:9;32237:18;32229:26;;32301:9;32295:4;32291:20;32287:1;32276:9;32272:17;32265:47;32329:131;32455:4;32329:131;:::i;:::-;32321:139;;32219:248;;;:::o;32473:419::-;32639:4;32677:2;32666:9;32662:18;32654:26;;32726:9;32720:4;32716:20;32712:1;32701:9;32697:17;32690:47;32754:131;32880:4;32754:131;:::i;:::-;32746:139;;32644:248;;;:::o;32898:419::-;33064:4;33102:2;33091:9;33087:18;33079:26;;33151:9;33145:4;33141:20;33137:1;33126:9;33122:17;33115:47;33179:131;33305:4;33179:131;:::i;:::-;33171:139;;33069:248;;;:::o;33323:419::-;33489:4;33527:2;33516:9;33512:18;33504:26;;33576:9;33570:4;33566:20;33562:1;33551:9;33547:17;33540:47;33604:131;33730:4;33604:131;:::i;:::-;33596:139;;33494:248;;;:::o;33748:419::-;33914:4;33952:2;33941:9;33937:18;33929:26;;34001:9;33995:4;33991:20;33987:1;33976:9;33972:17;33965:47;34029:131;34155:4;34029:131;:::i;:::-;34021:139;;33919:248;;;:::o;34173:419::-;34339:4;34377:2;34366:9;34362:18;34354:26;;34426:9;34420:4;34416:20;34412:1;34401:9;34397:17;34390:47;34454:131;34580:4;34454:131;:::i;:::-;34446:139;;34344:248;;;:::o;34598:419::-;34764:4;34802:2;34791:9;34787:18;34779:26;;34851:9;34845:4;34841:20;34837:1;34826:9;34822:17;34815:47;34879:131;35005:4;34879:131;:::i;:::-;34871:139;;34769:248;;;:::o;35023:419::-;35189:4;35227:2;35216:9;35212:18;35204:26;;35276:9;35270:4;35266:20;35262:1;35251:9;35247:17;35240:47;35304:131;35430:4;35304:131;:::i;:::-;35296:139;;35194:248;;;:::o;35448:419::-;35614:4;35652:2;35641:9;35637:18;35629:26;;35701:9;35695:4;35691:20;35687:1;35676:9;35672:17;35665:47;35729:131;35855:4;35729:131;:::i;:::-;35721:139;;35619:248;;;:::o;35873:419::-;36039:4;36077:2;36066:9;36062:18;36054:26;;36126:9;36120:4;36116:20;36112:1;36101:9;36097:17;36090:47;36154:131;36280:4;36154:131;:::i;:::-;36146:139;;36044:248;;;:::o;36298:419::-;36464:4;36502:2;36491:9;36487:18;36479:26;;36551:9;36545:4;36541:20;36537:1;36526:9;36522:17;36515:47;36579:131;36705:4;36579:131;:::i;:::-;36571:139;;36469:248;;;:::o;36723:419::-;36889:4;36927:2;36916:9;36912:18;36904:26;;36976:9;36970:4;36966:20;36962:1;36951:9;36947:17;36940:47;37004:131;37130:4;37004:131;:::i;:::-;36996:139;;36894:248;;;:::o;37148:419::-;37314:4;37352:2;37341:9;37337:18;37329:26;;37401:9;37395:4;37391:20;37387:1;37376:9;37372:17;37365:47;37429:131;37555:4;37429:131;:::i;:::-;37421:139;;37319:248;;;:::o;37573:419::-;37739:4;37777:2;37766:9;37762:18;37754:26;;37826:9;37820:4;37816:20;37812:1;37801:9;37797:17;37790:47;37854:131;37980:4;37854:131;:::i;:::-;37846:139;;37744:248;;;:::o;37998:222::-;38091:4;38129:2;38118:9;38114:18;38106:26;;38142:71;38210:1;38199:9;38195:17;38186:6;38142:71;:::i;:::-;38096:124;;;;:::o;38226:129::-;38260:6;38287:20;;:::i;:::-;38277:30;;38316:33;38344:4;38336:6;38316:33;:::i;:::-;38267:88;;;:::o;38361:75::-;38394:6;38427:2;38421:9;38411:19;;38401:35;:::o;38442:307::-;38503:4;38593:18;38585:6;38582:30;38579:2;;;38615:18;;:::i;:::-;38579:2;38653:29;38675:6;38653:29;:::i;:::-;38645:37;;38737:4;38731;38727:15;38719:23;;38508:241;;;:::o;38755:308::-;38817:4;38907:18;38899:6;38896:30;38893:2;;;38929:18;;:::i;:::-;38893:2;38967:29;38989:6;38967:29;:::i;:::-;38959:37;;39051:4;39045;39041:15;39033:23;;38822:241;;;:::o;39069:132::-;39136:4;39159:3;39151:11;;39189:4;39184:3;39180:14;39172:22;;39141:60;;;:::o;39207:141::-;39256:4;39279:3;39271:11;;39302:3;39299:1;39292:14;39336:4;39333:1;39323:18;39315:26;;39261:87;;;:::o;39354:114::-;39421:6;39455:5;39449:12;39439:22;;39428:40;;;:::o;39474:98::-;39525:6;39559:5;39553:12;39543:22;;39532:40;;;:::o;39578:99::-;39630:6;39664:5;39658:12;39648:22;;39637:40;;;:::o;39683:113::-;39753:4;39785;39780:3;39776:14;39768:22;;39758:38;;;:::o;39802:184::-;39901:11;39935:6;39930:3;39923:19;39975:4;39970:3;39966:14;39951:29;;39913:73;;;;:::o;39992:168::-;40075:11;40109:6;40104:3;40097:19;40149:4;40144:3;40140:14;40125:29;;40087:73;;;;:::o;40166:147::-;40267:11;40304:3;40289:18;;40279:34;;;;:::o;40319:169::-;40403:11;40437:6;40432:3;40425:19;40477:4;40472:3;40468:14;40453:29;;40415:73;;;;:::o;40494:148::-;40596:11;40633:3;40618:18;;40608:34;;;;:::o;40648:305::-;40688:3;40707:20;40725:1;40707:20;:::i;:::-;40702:25;;40741:20;40759:1;40741:20;:::i;:::-;40736:25;;40895:1;40827:66;40823:74;40820:1;40817:81;40814:2;;;40901:18;;:::i;:::-;40814:2;40945:1;40942;40938:9;40931:16;;40692:261;;;;:::o;40959:185::-;40999:1;41016:20;41034:1;41016:20;:::i;:::-;41011:25;;41050:20;41068:1;41050:20;:::i;:::-;41045:25;;41089:1;41079:2;;41094:18;;:::i;:::-;41079:2;41136:1;41133;41129:9;41124:14;;41001:143;;;;:::o;41150:348::-;41190:7;41213:20;41231:1;41213:20;:::i;:::-;41208:25;;41247:20;41265:1;41247:20;:::i;:::-;41242:25;;41435:1;41367:66;41363:74;41360:1;41357:81;41352:1;41345:9;41338:17;41334:105;41331:2;;;41442:18;;:::i;:::-;41331:2;41490:1;41487;41483:9;41472:20;;41198:300;;;;:::o;41504:191::-;41544:4;41564:20;41582:1;41564:20;:::i;:::-;41559:25;;41598:20;41616:1;41598:20;:::i;:::-;41593:25;;41637:1;41634;41631:8;41628:2;;;41642:18;;:::i;:::-;41628:2;41687:1;41684;41680:9;41672:17;;41549:146;;;;:::o;41701:96::-;41738:7;41767:24;41785:5;41767:24;:::i;:::-;41756:35;;41746:51;;;:::o;41803:104::-;41848:7;41877:24;41895:5;41877:24;:::i;:::-;41866:35;;41856:51;;;:::o;41913:90::-;41947:7;41990:5;41983:13;41976:21;41965:32;;41955:48;;;:::o;42009:149::-;42045:7;42085:66;42078:5;42074:78;42063:89;;42053:105;;;:::o;42164:126::-;42201:7;42241:42;42234:5;42230:54;42219:65;;42209:81;;;:::o;42296:77::-;42333:7;42362:5;42351:16;;42341:32;;;:::o;42379:134::-;42437:9;42470:37;42501:5;42470:37;:::i;:::-;42457:50;;42447:66;;;:::o;42519:126::-;42569:9;42602:37;42633:5;42602:37;:::i;:::-;42589:50;;42579:66;;;:::o;42651:113::-;42701:9;42734:24;42752:5;42734:24;:::i;:::-;42721:37;;42711:53;;;:::o;42770:154::-;42854:6;42849:3;42844;42831:30;42916:1;42907:6;42902:3;42898:16;42891:27;42821:103;;;:::o;42930:307::-;42998:1;43008:113;43022:6;43019:1;43016:13;43008:113;;;43107:1;43102:3;43098:11;43092:18;43088:1;43083:3;43079:11;43072:39;43044:2;43041:1;43037:10;43032:15;;43008:113;;;43139:6;43136:1;43133:13;43130:2;;;43219:1;43210:6;43205:3;43201:16;43194:27;43130:2;42979:258;;;;:::o;43243:320::-;43287:6;43324:1;43318:4;43314:12;43304:22;;43371:1;43365:4;43361:12;43392:18;43382:2;;43448:4;43440:6;43436:17;43426:27;;43382:2;43510;43502:6;43499:14;43479:18;43476:38;43473:2;;;43529:18;;:::i;:::-;43473:2;43294:269;;;;:::o;43569:281::-;43652:27;43674:4;43652:27;:::i;:::-;43644:6;43640:40;43782:6;43770:10;43767:22;43746:18;43734:10;43731:34;43728:62;43725:2;;;43793:18;;:::i;:::-;43725:2;43833:10;43829:2;43822:22;43612:238;;;:::o;43856:233::-;43895:3;43918:24;43936:5;43918:24;:::i;:::-;43909:33;;43964:66;43957:5;43954:77;43951:2;;;44034:18;;:::i;:::-;43951:2;44081:1;44074:5;44070:13;44063:20;;43899:190;;;:::o;44095:176::-;44127:1;44144:20;44162:1;44144:20;:::i;:::-;44139:25;;44178:20;44196:1;44178:20;:::i;:::-;44173:25;;44217:1;44207:2;;44222:18;;:::i;:::-;44207:2;44263:1;44260;44256:9;44251:14;;44129:142;;;;:::o;44277:180::-;44325:77;44322:1;44315:88;44422:4;44419:1;44412:15;44446:4;44443:1;44436:15;44463:180;44511:77;44508:1;44501:88;44608:4;44605:1;44598:15;44632:4;44629:1;44622:15;44649:180;44697:77;44694:1;44687:88;44794:4;44791:1;44784:15;44818:4;44815:1;44808:15;44835:180;44883:77;44880:1;44873:88;44980:4;44977:1;44970:15;45004:4;45001:1;44994:15;45021:102;45062:6;45113:2;45109:7;45104:2;45097:5;45093:14;45089:28;45079:38;;45069:54;;;:::o;45129:161::-;45269:13;45265:1;45257:6;45253:14;45246:37;45235:55;:::o;45296:174::-;45436:26;45432:1;45424:6;45420:14;45413:50;45402:68;:::o;45476:224::-;45616:34;45612:1;45604:6;45600:14;45593:58;45685:7;45680:2;45672:6;45668:15;45661:32;45582:118;:::o;45706:230::-;45846:34;45842:1;45834:6;45830:14;45823:58;45915:13;45910:2;45902:6;45898:15;45891:38;45812:124;:::o;45942:237::-;46082:34;46078:1;46070:6;46066:14;46059:58;46151:20;46146:2;46138:6;46134:15;46127:45;46048:131;:::o;46185:225::-;46325:34;46321:1;46313:6;46309:14;46302:58;46394:8;46389:2;46381:6;46377:15;46370:33;46291:119;:::o;46416:178::-;46556:30;46552:1;46544:6;46540:14;46533:54;46522:72;:::o;46600:225::-;46740:34;46736:1;46728:6;46724:14;46717:58;46809:8;46804:2;46796:6;46792:15;46785:33;46706:119;:::o;46831:178::-;46971:30;46967:1;46959:6;46955:14;46948:54;46937:72;:::o;47015:223::-;47155:34;47151:1;47143:6;47139:14;47132:58;47224:6;47219:2;47211:6;47207:15;47200:31;47121:117;:::o;47244:175::-;47384:27;47380:1;47372:6;47368:14;47361:51;47350:69;:::o;47425:245::-;47565:34;47561:1;47553:6;47549:14;47542:58;47634:28;47629:2;47621:6;47617:15;47610:53;47531:139;:::o;47676:179::-;47816:31;47812:1;47804:6;47800:14;47793:55;47782:73;:::o;47861:231::-;48001:34;47997:1;47989:6;47985:14;47978:58;48070:14;48065:2;48057:6;48053:15;48046:39;47967:125;:::o;48098:230::-;48238:34;48234:1;48226:6;48222:14;48215:58;48307:13;48302:2;48294:6;48290:15;48283:38;48204:124;:::o;48334:238::-;48474:34;48470:1;48462:6;48458:14;48451:58;48543:21;48538:2;48530:6;48526:15;48519:46;48440:132;:::o;48578:243::-;48718:34;48714:1;48706:6;48702:14;48695:58;48787:26;48782:2;48774:6;48770:15;48763:51;48684:137;:::o;48827:229::-;48967:34;48963:1;48955:6;48951:14;48944:58;49036:12;49031:2;49023:6;49019:15;49012:37;48933:123;:::o;49062:228::-;49202:34;49198:1;49190:6;49186:14;49179:58;49271:11;49266:2;49258:6;49254:15;49247:36;49168:122;:::o;49296:160::-;49436:12;49432:1;49424:6;49420:14;49413:36;49402:54;:::o;49462:182::-;49602:34;49598:1;49590:6;49586:14;49579:58;49568:76;:::o;49650:231::-;49790:34;49786:1;49778:6;49774:14;49767:58;49859:14;49854:2;49846:6;49842:15;49835:39;49756:125;:::o;49887:182::-;50027:34;50023:1;50015:6;50011:14;50004:58;49993:76;:::o;50075:228::-;50215:34;50211:1;50203:6;50199:14;50192:58;50284:11;50279:2;50271:6;50267:15;50260:36;50181:122;:::o;50309:234::-;50449:34;50445:1;50437:6;50433:14;50426:58;50518:17;50513:2;50505:6;50501:15;50494:42;50415:128;:::o;50549:220::-;50689:34;50685:1;50677:6;50673:14;50666:58;50758:3;50753:2;50745:6;50741:15;50734:28;50655:114;:::o;50775:175::-;50915:27;50911:1;50903:6;50899:14;50892:51;50881:69;:::o;50956:172::-;51096:24;51092:1;51084:6;51080:14;51073:48;51062:66;:::o;51134:114::-;51240:8;:::o;51254:236::-;51394:34;51390:1;51382:6;51378:14;51371:58;51463:19;51458:2;51450:6;51446:15;51439:44;51360:130;:::o;51496:231::-;51636:34;51632:1;51624:6;51620:14;51613:58;51705:14;51700:2;51692:6;51688:15;51681:39;51602:125;:::o;51733:122::-;51806:24;51824:5;51806:24;:::i;:::-;51799:5;51796:35;51786:2;;51845:1;51842;51835:12;51786:2;51776:79;:::o;51861:138::-;51942:32;51968:5;51942:32;:::i;:::-;51935:5;51932:43;51922:2;;51989:1;51986;51979:12;51922:2;51912:87;:::o;52005:116::-;52075:21;52090:5;52075:21;:::i;:::-;52068:5;52065:32;52055:2;;52111:1;52108;52101:12;52055:2;52045:76;:::o;52127:120::-;52199:23;52216:5;52199:23;:::i;:::-;52192:5;52189:34;52179:2;;52237:1;52234;52227:12;52179:2;52169:78;:::o;52253:122::-;52326:24;52344:5;52326:24;:::i;:::-;52319:5;52316:35;52306:2;;52365:1;52362;52355:12;52306:2;52296:79;:::o

Swarm Source

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