ETH Price: $3,408.40 (+2.85%)

Token

Lucky Foo Dogs (LFD)
 

Overview

Max Total Supply

2,000 LFD

Holders

655

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
fuckinjeet.eth
Balance
4 LFD
0x5C34E725CcA657F02C1D81fb16142F6F0067689b
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
LuckyFooDogs

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-01-23
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/Counters.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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

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


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^0.8.0;


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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Returns the address of the current owner.
     */
    function owner() public view virtual returns (address) {
        return _owner;
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

    /**
     * @dev Leaves the contract without owner. It will not be possible to call
     * `onlyOwner` functions anymore. Can only be called by the current owner.
     *
     * NOTE: Renouncing ownership will leave the contract without an owner,
     * thereby removing any functionality that is only available to the owner.
     */
    function renounceOwnership() public virtual onlyOwner {
        _transferOwnership(address(0));
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Can only be called by the current owner.
     */
    function transferOwnership(address newOwner) public virtual onlyOwner {
        require(newOwner != address(0), "Ownable: new owner is the zero address");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

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


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

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;

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

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


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

pragma solidity ^0.8.0;


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

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


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

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

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

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

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

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

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

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

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

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

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

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

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

// File: contracts/NFL.sol




pragma solidity >=0.7.0 <0.9.0;




contract LuckyFooDogs is ERC721, Ownable {
  using Strings for uint256;
  using Counters for Counters.Counter;

  Counters.Counter private supply;

  string public uriPrefix = "";
  string public uriSuffix = ".json";
  string public hiddenMetadataUri;
  
  uint256 public cost = 0.00 ether;
  uint256 public maxSupply = 2000;
  uint256 public maxMintAmountPerTx = 4;
  uint256 public nftPerAddressLimit = 4;

  bool public paused = false;
  bool public revealed = false;
  mapping(address => uint256) public addressMintedBalance;

  bool public presale = true; 
  mapping(address => bool) public whitelisted;
  uint256 public maxPresaleMintAmount = 2;

  constructor() ERC721("Lucky Foo Dogs", "LFD") {
    setHiddenMetadataUri("ipfs://QmVAyZwFtdZL9VVbx88dv3jNNUKsz6Ma9Rh3wPomNUkYt9/hidden.json");
  }

  modifier mintCompliance(uint256 _mintAmount) {
    require(_mintAmount > 0 && _mintAmount <= maxMintAmountPerTx, "Invalid mint amount!");
    require(supply.current() + _mintAmount <= maxSupply, "Max supply exceeded!");
    _;
  }

  function totalSupply() public view returns (uint256) {
    return supply.current();
  }

  function mint(uint256 _mintAmount) public payable mintCompliance(_mintAmount) {
    require(!paused, "The contract is paused!");
    require(msg.value >= cost * _mintAmount, "Insufficient funds!");
    //Check if user has N in wallet already
    uint256 ownerMintedCount = addressMintedBalance[msg.sender];
    require(ownerMintedCount + _mintAmount <= nftPerAddressLimit, "Buyer has already minted max tokens!");

    if (presale) { //Murf dont allow minting if presale is set and buyer is not in whitelisted map
        if ( !isInWhiteList(msg.sender))  {
            revert("Buyer is not in Whitelist for Pre-Sale");
        }
        // //BM check if already bought 
        if ( balanceOf(msg.sender)+_mintAmount > maxPresaleMintAmount)
            revert("Buyer has already pre-sale minted max tokens!");
    } 

    _mintLoop(msg.sender, _mintAmount);
  }
  
  function mintForAddress(uint256 _mintAmount, address _receiver) public mintCompliance(_mintAmount) onlyOwner {
    _mintLoop(_receiver, _mintAmount);
  }

  function walletOfOwner(address _owner)
    public
    view
    returns (uint256[] memory)
  {
    uint256 ownerTokenCount = balanceOf(_owner);
    uint256[] memory ownedTokenIds = new uint256[](ownerTokenCount);
    uint256 currentTokenId = 1;
    uint256 ownedTokenIndex = 0;

    while (ownedTokenIndex < ownerTokenCount && currentTokenId <= maxSupply) {
      address currentTokenOwner = ownerOf(currentTokenId);

      if (currentTokenOwner == _owner) {
        ownedTokenIds[ownedTokenIndex] = currentTokenId;

        ownedTokenIndex++;
      }

      currentTokenId++;
    }

    return ownedTokenIds;
  }

  function tokenURI(uint256 _tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(_tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    if (revealed == false) {
      return hiddenMetadataUri;
    }

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

  function setRevealed(bool _state) public onlyOwner {
    revealed = _state;
  }

  function setCost(uint256 _cost) public onlyOwner {
    cost = _cost;
  }

  function setMaxMintAmountPerTx(uint256 _maxMintAmountPerTx) public onlyOwner {
    maxMintAmountPerTx = _maxMintAmountPerTx;
  }

  function setHiddenMetadataUri(string memory _hiddenMetadataUri) public onlyOwner {
    hiddenMetadataUri = _hiddenMetadataUri;
  }

  function setUriPrefix(string memory _uriPrefix) public onlyOwner {
    uriPrefix = _uriPrefix;
  }

  function setUriSuffix(string memory _uriSuffix) public onlyOwner {
    uriSuffix = _uriSuffix;
  }

  function setPaused(bool _state) public onlyOwner {
    paused = _state;
  }

  function setNftPerAddressLimit(uint256 _limit) public onlyOwner {
    nftPerAddressLimit = _limit;
  }

  function withdraw() public onlyOwner {
    // This will pay HashLips 5% of the initial sale.
    // You can remove this if you want, or keep it in to support HashLips and his channel.
    // =============================================================================
    (bool hs, ) = payable(0x943590A42C27D08e3744202c4Ae5eD55c2dE240D).call{value: address(this).balance * 5 / 100}("");
    require(hs);
    // =============================================================================

    // This will transfer the remaining contract balance to the owner.
    // Do not remove this otherwise you will not be able to withdraw the funds.
    // =============================================================================
    (bool os, ) = payable(owner()).call{value: address(this).balance}("");
    require(os);
    // =============================================================================
  }

  function _mintLoop(address _receiver, uint256 _mintAmount) internal {
    for (uint256 i = 0; i < _mintAmount; i++) {
      supply.increment();
      _safeMint(_receiver, supply.current());
    }
    addressMintedBalance[_receiver] = addressMintedBalance[_receiver] + _mintAmount;
  }

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

  //Murf Whitelist Functions
  function setPresale(bool _state) public onlyOwner {
      presale = _state;
  }

  function setMaxPresaleMintAmount(uint256 _max) public onlyOwner {
      maxPresaleMintAmount = _max;
  }

  function addToWhiteList(address _addr) public onlyOwner {
      whitelisted[_addr] = true;
  }

  function addArrayToWhiteList(address[] memory _addrs) public onlyOwner {
      for (uint256 i=0;i< _addrs.length;i++)
          whitelisted[_addrs[i]] = true; 
  }

  function removeFromWhiteList(address _addr) public onlyOwner {
      whitelisted[_addr] = false;
  }

  function isInWhiteList(address _addr) private view returns (bool) {
      return whitelisted[_addr]  || _addr == owner();
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address[]","name":"_addrs","type":"address[]"}],"name":"addArrayToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"addToWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"addressMintedBalance","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"hiddenMetadataUri","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"maxMintAmountPerTx","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxPresaleMintAmount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintForAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nftPerAddressLimit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_addr","type":"address"}],"name":"removeFromWhiteList","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"revealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hiddenMetadataUri","type":"string"}],"name":"setHiddenMetadataUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxMintAmountPerTx","type":"uint256"}],"name":"setMaxMintAmountPerTx","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_max","type":"uint256"}],"name":"setMaxPresaleMintAmount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_limit","type":"uint256"}],"name":"setNftPerAddressLimit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setPresale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_state","type":"bool"}],"name":"setRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriPrefix","type":"string"}],"name":"setUriPrefix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uriSuffix","type":"string"}],"name":"setUriSuffix","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"uriPrefix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"uriSuffix","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelisted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405260405180602001604052806000815250600890805190602001906200002b92919062000386565b506040518060400160405280600581526020017f2e6a736f6e000000000000000000000000000000000000000000000000000000815250600990805190602001906200007992919062000386565b506000600b556107d0600c556004600d556004600e556000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055506001601160006101000a81548160ff0219169083151502179055506002601355348015620000f257600080fd5b506040518060400160405280600e81526020017f4c75636b7920466f6f20446f67730000000000000000000000000000000000008152506040518060400160405280600381526020017f4c4644000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200017792919062000386565b5080600190805190602001906200019092919062000386565b505050620001b3620001a7620001e360201b60201c565b620001eb60201b60201c565b620001dd604051806080016040528060418152602001620053ff60419139620002b160201b60201c565b6200051e565b600033905090565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002c1620001e360201b60201c565b73ffffffffffffffffffffffffffffffffffffffff16620002e76200035c60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff161462000340576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000337906200045d565b60405180910390fd5b80600a90805190602001906200035892919062000386565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b828054620003949062000490565b90600052602060002090601f016020900481019282620003b8576000855562000404565b82601f10620003d357805160ff191683800117855562000404565b8280016001018555821562000404579182015b8281111562000403578251825591602001919060010190620003e6565b5b50905062000413919062000417565b5090565b5b808211156200043257600081600090555060010162000418565b5090565b6000620004456020836200047f565b91506200045282620004f5565b602082019050919050565b60006020820190508181036000830152620004788162000436565b9050919050565b600082825260208201905092915050565b60006002820490506001821680620004a957607f821691505b60208210811415620004c057620004bf620004c6565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b614ed1806200052e6000396000f3fe6080604052600436106102885760003560e01c8063715018a61161015a578063c243c6c1116100c1578063d936547e1161007a578063d936547e14610995578063e0a80853146109d2578063e985e9c5146109fb578063efbd73f414610a38578063f2fde38b14610a61578063fdea8e0b14610a8a57610288565b8063c243c6c114610889578063c54e73e3146108b2578063c87b56dd146108db578063d0eb26b014610918578063d5abeb0114610941578063d76fd2201461096c57610288565b8063a0712d6811610113578063a0712d681461079c578063a22cb465146107b8578063a45ba8e7146107e1578063b071401b1461080c578063b88d4fde14610835578063ba7d2c761461085e57610288565b8063715018a6146106b05780637ec4a659146106c757806385480756146106f05780638da5cb5b1461071b57806394354fd01461074657806395d89b411461077157610288565b80633ccfd60b116101fe57806351830227116101b7578063518302271461058a5780635503a0e8146105b55780635c975abb146105e057806362b99ad41461060b5780636352211e1461063657806370a082311461067357610288565b80633ccfd60b1461049257806342842e0e146104a9578063438b6300146104d257806344a0d68a1461050f57806347ee0394146105385780634fdd43cb1461056157610288565b806313faede61161025057806313faede61461038457806316ba10e0146103af57806316c38b3c146103d857806318160ddd1461040157806318cae2691461042c57806323b872dd1461046957610288565b806301bf66481461028d57806301ffc9a7146102b657806306fdde03146102f3578063081812fc1461031e578063095ea7b31461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906136db565b610ab5565b005b3480156102c257600080fd5b506102dd60048036038101906102d89190613914565b610b8c565b6040516102ea919061400f565b60405180910390f35b3480156102ff57600080fd5b50610308610c6e565b604051610315919061402a565b60405180910390f35b34801561032a57600080fd5b50610345600480360381019061034091906139b7565b610d00565b6040516103529190613f86565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d919061385e565b610d85565b005b34801561039057600080fd5b50610399610e9d565b6040516103a6919061432c565b60405180910390f35b3480156103bb57600080fd5b506103d660048036038101906103d1919061396e565b610ea3565b005b3480156103e457600080fd5b506103ff60048036038101906103fa91906138e7565b610f39565b005b34801561040d57600080fd5b50610416610fd2565b604051610423919061432c565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e91906136db565b610fe3565b604051610460919061432c565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190613748565b610ffb565b005b34801561049e57600080fd5b506104a761105b565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190613748565b6111fa565b005b3480156104de57600080fd5b506104f960048036038101906104f491906136db565b61121a565b6040516105069190613fed565b60405180910390f35b34801561051b57600080fd5b50610536600480360381019061053191906139b7565b611325565b005b34801561054457600080fd5b5061055f600480360381019061055a91906136db565b6113ab565b005b34801561056d57600080fd5b506105886004803603810190610583919061396e565b611482565b005b34801561059657600080fd5b5061059f611518565b6040516105ac919061400f565b60405180910390f35b3480156105c157600080fd5b506105ca61152b565b6040516105d7919061402a565b60405180910390f35b3480156105ec57600080fd5b506105f56115b9565b604051610602919061400f565b60405180910390f35b34801561061757600080fd5b506106206115cc565b60405161062d919061402a565b60405180910390f35b34801561064257600080fd5b5061065d600480360381019061065891906139b7565b61165a565b60405161066a9190613f86565b60405180910390f35b34801561067f57600080fd5b5061069a600480360381019061069591906136db565b61170c565b6040516106a7919061432c565b60405180910390f35b3480156106bc57600080fd5b506106c56117c4565b005b3480156106d357600080fd5b506106ee60048036038101906106e9919061396e565b61184c565b005b3480156106fc57600080fd5b506107056118e2565b604051610712919061432c565b60405180910390f35b34801561072757600080fd5b506107306118e8565b60405161073d9190613f86565b60405180910390f35b34801561075257600080fd5b5061075b611912565b604051610768919061432c565b60405180910390f35b34801561077d57600080fd5b50610786611918565b604051610793919061402a565b60405180910390f35b6107b660048036038101906107b191906139b7565b6119aa565b005b3480156107c457600080fd5b506107df60048036038101906107da919061381e565b611c4e565b005b3480156107ed57600080fd5b506107f6611c64565b604051610803919061402a565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e91906139b7565b611cf2565b005b34801561084157600080fd5b5061085c6004803603810190610857919061379b565b611d78565b005b34801561086a57600080fd5b50610873611dda565b604051610880919061432c565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab919061389e565b611de0565b005b3480156108be57600080fd5b506108d960048036038101906108d491906138e7565b611ef1565b005b3480156108e757600080fd5b5061090260048036038101906108fd91906139b7565b611f8a565b60405161090f919061402a565b60405180910390f35b34801561092457600080fd5b5061093f600480360381019061093a91906139b7565b6120e3565b005b34801561094d57600080fd5b50610956612169565b604051610963919061432c565b60405180910390f35b34801561097857600080fd5b50610993600480360381019061098e91906139b7565b61216f565b005b3480156109a157600080fd5b506109bc60048036038101906109b791906136db565b6121f5565b6040516109c9919061400f565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f491906138e7565b612215565b005b348015610a0757600080fd5b50610a226004803603810190610a1d9190613708565b6122ae565b604051610a2f919061400f565b60405180910390f35b348015610a4457600080fd5b50610a5f6004803603810190610a5a91906139e4565b612342565b005b348015610a6d57600080fd5b50610a886004803603810190610a8391906136db565b612478565b005b348015610a9657600080fd5b50610a9f612570565b604051610aac919061400f565b60405180910390f35b610abd612583565b73ffffffffffffffffffffffffffffffffffffffff16610adb6118e8565b73ffffffffffffffffffffffffffffffffffffffff1614610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906141ec565b60405180910390fd5b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c5757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c675750610c668261258b565b5b9050919050565b606060008054610c7d90614661565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca990614661565b8015610cf65780601f10610ccb57610100808354040283529160200191610cf6565b820191906000526020600020905b815481529060010190602001808311610cd957829003601f168201915b5050505050905090565b6000610d0b826125f5565b610d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d41906141cc565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d908261165a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df89061426c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e20612583565b73ffffffffffffffffffffffffffffffffffffffff161480610e4f5750610e4e81610e49612583565b6122ae565b5b610e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e859061414c565b60405180910390fd5b610e988383612661565b505050565b600b5481565b610eab612583565b73ffffffffffffffffffffffffffffffffffffffff16610ec96118e8565b73ffffffffffffffffffffffffffffffffffffffff1614610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f16906141ec565b60405180910390fd5b8060099080519060200190610f35929190613451565b5050565b610f41612583565b73ffffffffffffffffffffffffffffffffffffffff16610f5f6118e8565b73ffffffffffffffffffffffffffffffffffffffff1614610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac906141ec565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000610fde600761271a565b905090565b60106020528060005260406000206000915090505481565b61100c611006612583565b82612728565b61104b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611042906142ac565b60405180910390fd5b611056838383612806565b505050565b611063612583565b73ffffffffffffffffffffffffffffffffffffffff166110816118e8565b73ffffffffffffffffffffffffffffffffffffffff16146110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce906141ec565b60405180910390fd5b600073943590a42c27d08e3744202c4ae5ed55c2de240d73ffffffffffffffffffffffffffffffffffffffff166064600547611113919061451d565b61111d91906144ec565b60405161112990613f71565b60006040518083038185875af1925050503d8060008114611166576040519150601f19603f3d011682016040523d82523d6000602084013e61116b565b606091505b505090508061117957600080fd5b60006111836118e8565b73ffffffffffffffffffffffffffffffffffffffff16476040516111a690613f71565b60006040518083038185875af1925050503d80600081146111e3576040519150601f19603f3d011682016040523d82523d6000602084013e6111e8565b606091505b50509050806111f657600080fd5b5050565b61121583838360405180602001604052806000815250611d78565b505050565b606060006112278361170c565b905060008167ffffffffffffffff811115611245576112446147fa565b5b6040519080825280602002602001820160405280156112735781602001602082028036833780820191505090505b50905060006001905060005b83811080156112905750600c548211155b156113195760006112a08361165a565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561130557828483815181106112ea576112e96147cb565b5b6020026020010181815250508180611301906146c4565b9250505b8280611310906146c4565b9350505061127f565b82945050505050919050565b61132d612583565b73ffffffffffffffffffffffffffffffffffffffff1661134b6118e8565b73ffffffffffffffffffffffffffffffffffffffff16146113a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611398906141ec565b60405180910390fd5b80600b8190555050565b6113b3612583565b73ffffffffffffffffffffffffffffffffffffffff166113d16118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141e906141ec565b60405180910390fd5b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61148a612583565b73ffffffffffffffffffffffffffffffffffffffff166114a86118e8565b73ffffffffffffffffffffffffffffffffffffffff16146114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f5906141ec565b60405180910390fd5b80600a9080519060200190611514929190613451565b5050565b600f60019054906101000a900460ff1681565b6009805461153890614661565b80601f016020809104026020016040519081016040528092919081815260200182805461156490614661565b80156115b15780601f10611586576101008083540402835291602001916115b1565b820191906000526020600020905b81548152906001019060200180831161159457829003601f168201915b505050505081565b600f60009054906101000a900460ff1681565b600880546115d990614661565b80601f016020809104026020016040519081016040528092919081815260200182805461160590614661565b80156116525780601f1061162757610100808354040283529160200191611652565b820191906000526020600020905b81548152906001019060200180831161163557829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fa9061418c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561177d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117749061416c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117cc612583565b73ffffffffffffffffffffffffffffffffffffffff166117ea6118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611840576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611837906141ec565b60405180910390fd5b61184a6000612a62565b565b611854612583565b73ffffffffffffffffffffffffffffffffffffffff166118726118e8565b73ffffffffffffffffffffffffffffffffffffffff16146118c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bf906141ec565b60405180910390fd5b80600890805190602001906118de929190613451565b5050565b60135481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b60606001805461192790614661565b80601f016020809104026020016040519081016040528092919081815260200182805461195390614661565b80156119a05780601f10611975576101008083540402835291602001916119a0565b820191906000526020600020905b81548152906001019060200180831161198357829003601f168201915b5050505050905090565b806000811180156119bd5750600d548111155b6119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f3906140cc565b60405180910390fd5b600c5481611a0a600761271a565b611a149190614496565b1115611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c9061428c565b60405180910390fd5b600f60009054906101000a900460ff1615611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c9061420c565b60405180910390fd5b81600b54611ab3919061451d565b341015611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec9061430c565b60405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600e548382611b489190614496565b1115611b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b809061404c565b60405180910390fd5b601160009054906101000a900460ff1615611c3f57611ba733612b28565b611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd906142ec565b60405180910390fd5b60135483611bf33361170c565b611bfd9190614496565b1115611c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c35906142cc565b60405180910390fd5b5b611c493384612bbb565b505050565b611c60611c59612583565b8383612c89565b5050565b600a8054611c7190614661565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9d90614661565b8015611cea5780601f10611cbf57610100808354040283529160200191611cea565b820191906000526020600020905b815481529060010190602001808311611ccd57829003601f168201915b505050505081565b611cfa612583565b73ffffffffffffffffffffffffffffffffffffffff16611d186118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d65906141ec565b60405180910390fd5b80600d8190555050565b611d89611d83612583565b83612728565b611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf906142ac565b60405180910390fd5b611dd484848484612df6565b50505050565b600e5481565b611de8612583565b73ffffffffffffffffffffffffffffffffffffffff16611e066118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e53906141ec565b60405180910390fd5b60005b8151811015611eed57600160126000848481518110611e8157611e806147cb565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611ee5906146c4565b915050611e5f565b5050565b611ef9612583565b73ffffffffffffffffffffffffffffffffffffffff16611f176118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f64906141ec565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b6060611f95826125f5565b611fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcb9061424c565b60405180910390fd5b60001515600f60019054906101000a900460ff161515141561208257600a8054611ffd90614661565b80601f016020809104026020016040519081016040528092919081815260200182805461202990614661565b80156120765780601f1061204b57610100808354040283529160200191612076565b820191906000526020600020905b81548152906001019060200180831161205957829003601f168201915b505050505090506120de565b600061208c612e52565b905060008151116120ac57604051806020016040528060008152506120da565b806120b684612ee4565b60096040516020016120ca93929190613f40565b6040516020818303038152906040525b9150505b919050565b6120eb612583565b73ffffffffffffffffffffffffffffffffffffffff166121096118e8565b73ffffffffffffffffffffffffffffffffffffffff161461215f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612156906141ec565b60405180910390fd5b80600e8190555050565b600c5481565b612177612583565b73ffffffffffffffffffffffffffffffffffffffff166121956118e8565b73ffffffffffffffffffffffffffffffffffffffff16146121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e2906141ec565b60405180910390fd5b8060138190555050565b60126020528060005260406000206000915054906101000a900460ff1681565b61221d612583565b73ffffffffffffffffffffffffffffffffffffffff1661223b6118e8565b73ffffffffffffffffffffffffffffffffffffffff1614612291576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612288906141ec565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b816000811180156123555750600d548111155b612394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238b906140cc565b60405180910390fd5b600c54816123a2600761271a565b6123ac9190614496565b11156123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e49061428c565b60405180910390fd5b6123f5612583565b73ffffffffffffffffffffffffffffffffffffffff166124136118e8565b73ffffffffffffffffffffffffffffffffffffffff1614612469576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612460906141ec565b60405180910390fd5b6124738284612bbb565b505050565b612480612583565b73ffffffffffffffffffffffffffffffffffffffff1661249e6118e8565b73ffffffffffffffffffffffffffffffffffffffff16146124f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124eb906141ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255b9061408c565b60405180910390fd5b61256d81612a62565b50565b601160009054906101000a900460ff1681565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126d48361165a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000612733826125f5565b612772576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127699061412c565b60405180910390fd5b600061277d8361165a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127ec57508373ffffffffffffffffffffffffffffffffffffffff166127d484610d00565b73ffffffffffffffffffffffffffffffffffffffff16145b806127fd57506127fc81856122ae565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128268261165a565b73ffffffffffffffffffffffffffffffffffffffff161461287c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128739061422c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e3906140ec565b60405180910390fd5b6128f7838383613045565b612902600082612661565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129529190614577565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129a99190614496565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612bb45750612b856118e8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b60005b81811015612bf657612bd0600761304a565b612be383612bde600761271a565b613060565b8080612bee906146c4565b915050612bbe565b5080601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c429190614496565b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cef9061410c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612de9919061400f565b60405180910390a3505050565b612e01848484612806565b612e0d8484848461307e565b612e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e439061406c565b60405180910390fd5b50505050565b606060088054612e6190614661565b80601f0160208091040260200160405190810160405280929190818152602001828054612e8d90614661565b8015612eda5780601f10612eaf57610100808354040283529160200191612eda565b820191906000526020600020905b815481529060010190602001808311612ebd57829003601f168201915b5050505050905090565b60606000821415612f2c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613040565b600082905060005b60008214612f5e578080612f47906146c4565b915050600a82612f5791906144ec565b9150612f34565b60008167ffffffffffffffff811115612f7a57612f796147fa565b5b6040519080825280601f01601f191660200182016040528015612fac5781602001600182028036833780820191505090505b5090505b6000851461303957600182612fc59190614577565b9150600a85612fd4919061470d565b6030612fe09190614496565b60f81b818381518110612ff657612ff56147cb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561303291906144ec565b9450612fb0565b8093505050505b919050565b505050565b6001816000016000828254019250508190555050565b61307a828260405180602001604052806000815250613215565b5050565b600061309f8473ffffffffffffffffffffffffffffffffffffffff16613270565b15613208578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130c8612583565b8786866040518563ffffffff1660e01b81526004016130ea9493929190613fa1565b602060405180830381600087803b15801561310457600080fd5b505af192505050801561313557506040513d601f19601f820116820180604052508101906131329190613941565b60015b6131b8573d8060008114613165576040519150601f19603f3d011682016040523d82523d6000602084013e61316a565b606091505b506000815114156131b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a79061406c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061320d565b600190505b949350505050565b61321f8383613283565b61322c600084848461307e565b61326b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132629061406c565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ea906141ac565b60405180910390fd5b6132fc816125f5565b1561333c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613333906140ac565b60405180910390fd5b61334860008383613045565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133989190614496565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461345d90614661565b90600052602060002090601f01602090048101928261347f57600085556134c6565b82601f1061349857805160ff19168380011785556134c6565b828001600101855582156134c6579182015b828111156134c55782518255916020019190600101906134aa565b5b5090506134d391906134d7565b5090565b5b808211156134f05760008160009055506001016134d8565b5090565b60006135076135028461436c565b614347565b9050808382526020820190508285602086028201111561352a5761352961482e565b5b60005b8581101561355a578161354088826135e8565b84526020840193506020830192505060018101905061352d565b5050509392505050565b600061357761357284614398565b614347565b90508281526020810184848401111561359357613592614833565b5b61359e84828561461f565b509392505050565b60006135b96135b4846143c9565b614347565b9050828152602081018484840111156135d5576135d4614833565b5b6135e084828561461f565b509392505050565b6000813590506135f781614e3f565b92915050565b600082601f83011261361257613611614829565b5b81356136228482602086016134f4565b91505092915050565b60008135905061363a81614e56565b92915050565b60008135905061364f81614e6d565b92915050565b60008151905061366481614e6d565b92915050565b600082601f83011261367f5761367e614829565b5b813561368f848260208601613564565b91505092915050565b600082601f8301126136ad576136ac614829565b5b81356136bd8482602086016135a6565b91505092915050565b6000813590506136d581614e84565b92915050565b6000602082840312156136f1576136f061483d565b5b60006136ff848285016135e8565b91505092915050565b6000806040838503121561371f5761371e61483d565b5b600061372d858286016135e8565b925050602061373e858286016135e8565b9150509250929050565b6000806000606084860312156137615761376061483d565b5b600061376f868287016135e8565b9350506020613780868287016135e8565b9250506040613791868287016136c6565b9150509250925092565b600080600080608085870312156137b5576137b461483d565b5b60006137c3878288016135e8565b94505060206137d4878288016135e8565b93505060406137e5878288016136c6565b925050606085013567ffffffffffffffff81111561380657613805614838565b5b6138128782880161366a565b91505092959194509250565b600080604083850312156138355761383461483d565b5b6000613843858286016135e8565b92505060206138548582860161362b565b9150509250929050565b600080604083850312156138755761387461483d565b5b6000613883858286016135e8565b9250506020613894858286016136c6565b9150509250929050565b6000602082840312156138b4576138b361483d565b5b600082013567ffffffffffffffff8111156138d2576138d1614838565b5b6138de848285016135fd565b91505092915050565b6000602082840312156138fd576138fc61483d565b5b600061390b8482850161362b565b91505092915050565b60006020828403121561392a5761392961483d565b5b600061393884828501613640565b91505092915050565b6000602082840312156139575761395661483d565b5b600061396584828501613655565b91505092915050565b6000602082840312156139845761398361483d565b5b600082013567ffffffffffffffff8111156139a2576139a1614838565b5b6139ae84828501613698565b91505092915050565b6000602082840312156139cd576139cc61483d565b5b60006139db848285016136c6565b91505092915050565b600080604083850312156139fb576139fa61483d565b5b6000613a09858286016136c6565b9250506020613a1a858286016135e8565b9150509250929050565b6000613a308383613f22565b60208301905092915050565b613a45816145ab565b82525050565b6000613a568261441f565b613a60818561444d565b9350613a6b836143fa565b8060005b83811015613a9c578151613a838882613a24565b9750613a8e83614440565b925050600181019050613a6f565b5085935050505092915050565b613ab2816145bd565b82525050565b6000613ac38261442a565b613acd818561445e565b9350613add81856020860161462e565b613ae681614842565b840191505092915050565b6000613afc82614435565b613b06818561447a565b9350613b1681856020860161462e565b613b1f81614842565b840191505092915050565b6000613b3582614435565b613b3f818561448b565b9350613b4f81856020860161462e565b80840191505092915050565b60008154613b6881614661565b613b72818661448b565b94506001821660008114613b8d5760018114613b9e57613bd1565b60ff19831686528186019350613bd1565b613ba78561440a565b60005b83811015613bc957815481890152600182019150602081019050613baa565b838801955050505b50505092915050565b6000613be760248361447a565b9150613bf282614853565b604082019050919050565b6000613c0a60328361447a565b9150613c15826148a2565b604082019050919050565b6000613c2d60268361447a565b9150613c38826148f1565b604082019050919050565b6000613c50601c8361447a565b9150613c5b82614940565b602082019050919050565b6000613c7360148361447a565b9150613c7e82614969565b602082019050919050565b6000613c9660248361447a565b9150613ca182614992565b604082019050919050565b6000613cb960198361447a565b9150613cc4826149e1565b602082019050919050565b6000613cdc602c8361447a565b9150613ce782614a0a565b604082019050919050565b6000613cff60388361447a565b9150613d0a82614a59565b604082019050919050565b6000613d22602a8361447a565b9150613d2d82614aa8565b604082019050919050565b6000613d4560298361447a565b9150613d5082614af7565b604082019050919050565b6000613d6860208361447a565b9150613d7382614b46565b602082019050919050565b6000613d8b602c8361447a565b9150613d9682614b6f565b604082019050919050565b6000613dae60208361447a565b9150613db982614bbe565b602082019050919050565b6000613dd160178361447a565b9150613ddc82614be7565b602082019050919050565b6000613df460298361447a565b9150613dff82614c10565b604082019050919050565b6000613e17602f8361447a565b9150613e2282614c5f565b604082019050919050565b6000613e3a60218361447a565b9150613e4582614cae565b604082019050919050565b6000613e5d60008361446f565b9150613e6882614cfd565b600082019050919050565b6000613e8060148361447a565b9150613e8b82614d00565b602082019050919050565b6000613ea360318361447a565b9150613eae82614d29565b604082019050919050565b6000613ec6602d8361447a565b9150613ed182614d78565b604082019050919050565b6000613ee960268361447a565b9150613ef482614dc7565b604082019050919050565b6000613f0c60138361447a565b9150613f1782614e16565b602082019050919050565b613f2b81614615565b82525050565b613f3a81614615565b82525050565b6000613f4c8286613b2a565b9150613f588285613b2a565b9150613f648284613b5b565b9150819050949350505050565b6000613f7c82613e50565b9150819050919050565b6000602082019050613f9b6000830184613a3c565b92915050565b6000608082019050613fb66000830187613a3c565b613fc36020830186613a3c565b613fd06040830185613f31565b8181036060830152613fe28184613ab8565b905095945050505050565b600060208201905081810360008301526140078184613a4b565b905092915050565b60006020820190506140246000830184613aa9565b92915050565b600060208201905081810360008301526140448184613af1565b905092915050565b6000602082019050818103600083015261406581613bda565b9050919050565b6000602082019050818103600083015261408581613bfd565b9050919050565b600060208201905081810360008301526140a581613c20565b9050919050565b600060208201905081810360008301526140c581613c43565b9050919050565b600060208201905081810360008301526140e581613c66565b9050919050565b6000602082019050818103600083015261410581613c89565b9050919050565b6000602082019050818103600083015261412581613cac565b9050919050565b6000602082019050818103600083015261414581613ccf565b9050919050565b6000602082019050818103600083015261416581613cf2565b9050919050565b6000602082019050818103600083015261418581613d15565b9050919050565b600060208201905081810360008301526141a581613d38565b9050919050565b600060208201905081810360008301526141c581613d5b565b9050919050565b600060208201905081810360008301526141e581613d7e565b9050919050565b6000602082019050818103600083015261420581613da1565b9050919050565b6000602082019050818103600083015261422581613dc4565b9050919050565b6000602082019050818103600083015261424581613de7565b9050919050565b6000602082019050818103600083015261426581613e0a565b9050919050565b6000602082019050818103600083015261428581613e2d565b9050919050565b600060208201905081810360008301526142a581613e73565b9050919050565b600060208201905081810360008301526142c581613e96565b9050919050565b600060208201905081810360008301526142e581613eb9565b9050919050565b6000602082019050818103600083015261430581613edc565b9050919050565b6000602082019050818103600083015261432581613eff565b9050919050565b60006020820190506143416000830184613f31565b92915050565b6000614351614362565b905061435d8282614693565b919050565b6000604051905090565b600067ffffffffffffffff821115614387576143866147fa565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156143b3576143b26147fa565b5b6143bc82614842565b9050602081019050919050565b600067ffffffffffffffff8211156143e4576143e36147fa565b5b6143ed82614842565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006144a182614615565b91506144ac83614615565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144e1576144e061473e565b5b828201905092915050565b60006144f782614615565b915061450283614615565b9250826145125761451161476d565b5b828204905092915050565b600061452882614615565b915061453383614615565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561456c5761456b61473e565b5b828202905092915050565b600061458282614615565b915061458d83614615565b9250828210156145a05761459f61473e565b5b828203905092915050565b60006145b6826145f5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561464c578082015181840152602081019050614631565b8381111561465b576000848401525b50505050565b6000600282049050600182168061467957607f821691505b6020821081141561468d5761468c61479c565b5b50919050565b61469c82614842565b810181811067ffffffffffffffff821117156146bb576146ba6147fa565b5b80604052505050565b60006146cf82614615565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147025761470161473e565b5b600182019050919050565b600061471882614615565b915061472383614615565b9250826147335761473261476d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f42757965722068617320616c7265616479206d696e746564206d617820746f6b60008201527f656e732100000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f42757965722068617320616c7265616479207072652d73616c65206d696e746560008201527f64206d617820746f6b656e732100000000000000000000000000000000000000602082015250565b7f4275796572206973206e6f7420696e2057686974656c69737420666f7220507260008201527f652d53616c650000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b614e48816145ab565b8114614e5357600080fd5b50565b614e5f816145bd565b8114614e6a57600080fd5b50565b614e76816145c9565b8114614e8157600080fd5b50565b614e8d81614615565b8114614e9857600080fd5b5056fea264697066735822122012a090fe9f2ebb83b50b632387043da10047b3b37b089535b01b80a62a27cb2764736f6c63430008070033697066733a2f2f516d5641795a774674645a4c395656627838386476336a4e4e554b737a364d613952683377506f6d4e556b5974392f68696464656e2e6a736f6e

Deployed Bytecode

0x6080604052600436106102885760003560e01c8063715018a61161015a578063c243c6c1116100c1578063d936547e1161007a578063d936547e14610995578063e0a80853146109d2578063e985e9c5146109fb578063efbd73f414610a38578063f2fde38b14610a61578063fdea8e0b14610a8a57610288565b8063c243c6c114610889578063c54e73e3146108b2578063c87b56dd146108db578063d0eb26b014610918578063d5abeb0114610941578063d76fd2201461096c57610288565b8063a0712d6811610113578063a0712d681461079c578063a22cb465146107b8578063a45ba8e7146107e1578063b071401b1461080c578063b88d4fde14610835578063ba7d2c761461085e57610288565b8063715018a6146106b05780637ec4a659146106c757806385480756146106f05780638da5cb5b1461071b57806394354fd01461074657806395d89b411461077157610288565b80633ccfd60b116101fe57806351830227116101b7578063518302271461058a5780635503a0e8146105b55780635c975abb146105e057806362b99ad41461060b5780636352211e1461063657806370a082311461067357610288565b80633ccfd60b1461049257806342842e0e146104a9578063438b6300146104d257806344a0d68a1461050f57806347ee0394146105385780634fdd43cb1461056157610288565b806313faede61161025057806313faede61461038457806316ba10e0146103af57806316c38b3c146103d857806318160ddd1461040157806318cae2691461042c57806323b872dd1461046957610288565b806301bf66481461028d57806301ffc9a7146102b657806306fdde03146102f3578063081812fc1461031e578063095ea7b31461035b575b600080fd5b34801561029957600080fd5b506102b460048036038101906102af91906136db565b610ab5565b005b3480156102c257600080fd5b506102dd60048036038101906102d89190613914565b610b8c565b6040516102ea919061400f565b60405180910390f35b3480156102ff57600080fd5b50610308610c6e565b604051610315919061402a565b60405180910390f35b34801561032a57600080fd5b50610345600480360381019061034091906139b7565b610d00565b6040516103529190613f86565b60405180910390f35b34801561036757600080fd5b50610382600480360381019061037d919061385e565b610d85565b005b34801561039057600080fd5b50610399610e9d565b6040516103a6919061432c565b60405180910390f35b3480156103bb57600080fd5b506103d660048036038101906103d1919061396e565b610ea3565b005b3480156103e457600080fd5b506103ff60048036038101906103fa91906138e7565b610f39565b005b34801561040d57600080fd5b50610416610fd2565b604051610423919061432c565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e91906136db565b610fe3565b604051610460919061432c565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190613748565b610ffb565b005b34801561049e57600080fd5b506104a761105b565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190613748565b6111fa565b005b3480156104de57600080fd5b506104f960048036038101906104f491906136db565b61121a565b6040516105069190613fed565b60405180910390f35b34801561051b57600080fd5b50610536600480360381019061053191906139b7565b611325565b005b34801561054457600080fd5b5061055f600480360381019061055a91906136db565b6113ab565b005b34801561056d57600080fd5b506105886004803603810190610583919061396e565b611482565b005b34801561059657600080fd5b5061059f611518565b6040516105ac919061400f565b60405180910390f35b3480156105c157600080fd5b506105ca61152b565b6040516105d7919061402a565b60405180910390f35b3480156105ec57600080fd5b506105f56115b9565b604051610602919061400f565b60405180910390f35b34801561061757600080fd5b506106206115cc565b60405161062d919061402a565b60405180910390f35b34801561064257600080fd5b5061065d600480360381019061065891906139b7565b61165a565b60405161066a9190613f86565b60405180910390f35b34801561067f57600080fd5b5061069a600480360381019061069591906136db565b61170c565b6040516106a7919061432c565b60405180910390f35b3480156106bc57600080fd5b506106c56117c4565b005b3480156106d357600080fd5b506106ee60048036038101906106e9919061396e565b61184c565b005b3480156106fc57600080fd5b506107056118e2565b604051610712919061432c565b60405180910390f35b34801561072757600080fd5b506107306118e8565b60405161073d9190613f86565b60405180910390f35b34801561075257600080fd5b5061075b611912565b604051610768919061432c565b60405180910390f35b34801561077d57600080fd5b50610786611918565b604051610793919061402a565b60405180910390f35b6107b660048036038101906107b191906139b7565b6119aa565b005b3480156107c457600080fd5b506107df60048036038101906107da919061381e565b611c4e565b005b3480156107ed57600080fd5b506107f6611c64565b604051610803919061402a565b60405180910390f35b34801561081857600080fd5b50610833600480360381019061082e91906139b7565b611cf2565b005b34801561084157600080fd5b5061085c6004803603810190610857919061379b565b611d78565b005b34801561086a57600080fd5b50610873611dda565b604051610880919061432c565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab919061389e565b611de0565b005b3480156108be57600080fd5b506108d960048036038101906108d491906138e7565b611ef1565b005b3480156108e757600080fd5b5061090260048036038101906108fd91906139b7565b611f8a565b60405161090f919061402a565b60405180910390f35b34801561092457600080fd5b5061093f600480360381019061093a91906139b7565b6120e3565b005b34801561094d57600080fd5b50610956612169565b604051610963919061432c565b60405180910390f35b34801561097857600080fd5b50610993600480360381019061098e91906139b7565b61216f565b005b3480156109a157600080fd5b506109bc60048036038101906109b791906136db565b6121f5565b6040516109c9919061400f565b60405180910390f35b3480156109de57600080fd5b506109f960048036038101906109f491906138e7565b612215565b005b348015610a0757600080fd5b50610a226004803603810190610a1d9190613708565b6122ae565b604051610a2f919061400f565b60405180910390f35b348015610a4457600080fd5b50610a5f6004803603810190610a5a91906139e4565b612342565b005b348015610a6d57600080fd5b50610a886004803603810190610a8391906136db565b612478565b005b348015610a9657600080fd5b50610a9f612570565b604051610aac919061400f565b60405180910390f35b610abd612583565b73ffffffffffffffffffffffffffffffffffffffff16610adb6118e8565b73ffffffffffffffffffffffffffffffffffffffff1614610b31576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b28906141ec565b60405180910390fd5b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610c5757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610c675750610c668261258b565b5b9050919050565b606060008054610c7d90614661565b80601f0160208091040260200160405190810160405280929190818152602001828054610ca990614661565b8015610cf65780601f10610ccb57610100808354040283529160200191610cf6565b820191906000526020600020905b815481529060010190602001808311610cd957829003601f168201915b5050505050905090565b6000610d0b826125f5565b610d4a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d41906141cc565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610d908261165a565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610e01576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df89061426c565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610e20612583565b73ffffffffffffffffffffffffffffffffffffffff161480610e4f5750610e4e81610e49612583565b6122ae565b5b610e8e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e859061414c565b60405180910390fd5b610e988383612661565b505050565b600b5481565b610eab612583565b73ffffffffffffffffffffffffffffffffffffffff16610ec96118e8565b73ffffffffffffffffffffffffffffffffffffffff1614610f1f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f16906141ec565b60405180910390fd5b8060099080519060200190610f35929190613451565b5050565b610f41612583565b73ffffffffffffffffffffffffffffffffffffffff16610f5f6118e8565b73ffffffffffffffffffffffffffffffffffffffff1614610fb5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fac906141ec565b60405180910390fd5b80600f60006101000a81548160ff02191690831515021790555050565b6000610fde600761271a565b905090565b60106020528060005260406000206000915090505481565b61100c611006612583565b82612728565b61104b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611042906142ac565b60405180910390fd5b611056838383612806565b505050565b611063612583565b73ffffffffffffffffffffffffffffffffffffffff166110816118e8565b73ffffffffffffffffffffffffffffffffffffffff16146110d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110ce906141ec565b60405180910390fd5b600073943590a42c27d08e3744202c4ae5ed55c2de240d73ffffffffffffffffffffffffffffffffffffffff166064600547611113919061451d565b61111d91906144ec565b60405161112990613f71565b60006040518083038185875af1925050503d8060008114611166576040519150601f19603f3d011682016040523d82523d6000602084013e61116b565b606091505b505090508061117957600080fd5b60006111836118e8565b73ffffffffffffffffffffffffffffffffffffffff16476040516111a690613f71565b60006040518083038185875af1925050503d80600081146111e3576040519150601f19603f3d011682016040523d82523d6000602084013e6111e8565b606091505b50509050806111f657600080fd5b5050565b61121583838360405180602001604052806000815250611d78565b505050565b606060006112278361170c565b905060008167ffffffffffffffff811115611245576112446147fa565b5b6040519080825280602002602001820160405280156112735781602001602082028036833780820191505090505b50905060006001905060005b83811080156112905750600c548211155b156113195760006112a08361165a565b90508673ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561130557828483815181106112ea576112e96147cb565b5b6020026020010181815250508180611301906146c4565b9250505b8280611310906146c4565b9350505061127f565b82945050505050919050565b61132d612583565b73ffffffffffffffffffffffffffffffffffffffff1661134b6118e8565b73ffffffffffffffffffffffffffffffffffffffff16146113a1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611398906141ec565b60405180910390fd5b80600b8190555050565b6113b3612583565b73ffffffffffffffffffffffffffffffffffffffff166113d16118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611427576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161141e906141ec565b60405180910390fd5b6001601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b61148a612583565b73ffffffffffffffffffffffffffffffffffffffff166114a86118e8565b73ffffffffffffffffffffffffffffffffffffffff16146114fe576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114f5906141ec565b60405180910390fd5b80600a9080519060200190611514929190613451565b5050565b600f60019054906101000a900460ff1681565b6009805461153890614661565b80601f016020809104026020016040519081016040528092919081815260200182805461156490614661565b80156115b15780601f10611586576101008083540402835291602001916115b1565b820191906000526020600020905b81548152906001019060200180831161159457829003601f168201915b505050505081565b600f60009054906101000a900460ff1681565b600880546115d990614661565b80601f016020809104026020016040519081016040528092919081815260200182805461160590614661565b80156116525780601f1061162757610100808354040283529160200191611652565b820191906000526020600020905b81548152906001019060200180831161163557829003601f168201915b505050505081565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611703576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116fa9061418c565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561177d576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117749061416c565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6117cc612583565b73ffffffffffffffffffffffffffffffffffffffff166117ea6118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611840576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611837906141ec565b60405180910390fd5b61184a6000612a62565b565b611854612583565b73ffffffffffffffffffffffffffffffffffffffff166118726118e8565b73ffffffffffffffffffffffffffffffffffffffff16146118c8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118bf906141ec565b60405180910390fd5b80600890805190602001906118de929190613451565b5050565b60135481565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600d5481565b60606001805461192790614661565b80601f016020809104026020016040519081016040528092919081815260200182805461195390614661565b80156119a05780601f10611975576101008083540402835291602001916119a0565b820191906000526020600020905b81548152906001019060200180831161198357829003601f168201915b5050505050905090565b806000811180156119bd5750600d548111155b6119fc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119f3906140cc565b60405180910390fd5b600c5481611a0a600761271a565b611a149190614496565b1115611a55576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4c9061428c565b60405180910390fd5b600f60009054906101000a900460ff1615611aa5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9c9061420c565b60405180910390fd5b81600b54611ab3919061451d565b341015611af5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aec9061430c565b60405180910390fd5b6000601060003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050600e548382611b489190614496565b1115611b89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b809061404c565b60405180910390fd5b601160009054906101000a900460ff1615611c3f57611ba733612b28565b611be6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bdd906142ec565b60405180910390fd5b60135483611bf33361170c565b611bfd9190614496565b1115611c3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c35906142cc565b60405180910390fd5b5b611c493384612bbb565b505050565b611c60611c59612583565b8383612c89565b5050565b600a8054611c7190614661565b80601f0160208091040260200160405190810160405280929190818152602001828054611c9d90614661565b8015611cea5780601f10611cbf57610100808354040283529160200191611cea565b820191906000526020600020905b815481529060010190602001808311611ccd57829003601f168201915b505050505081565b611cfa612583565b73ffffffffffffffffffffffffffffffffffffffff16611d186118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611d6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d65906141ec565b60405180910390fd5b80600d8190555050565b611d89611d83612583565b83612728565b611dc8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbf906142ac565b60405180910390fd5b611dd484848484612df6565b50505050565b600e5481565b611de8612583565b73ffffffffffffffffffffffffffffffffffffffff16611e066118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611e5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e53906141ec565b60405180910390fd5b60005b8151811015611eed57600160126000848481518110611e8157611e806147cb565b5b602002602001015173ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611ee5906146c4565b915050611e5f565b5050565b611ef9612583565b73ffffffffffffffffffffffffffffffffffffffff16611f176118e8565b73ffffffffffffffffffffffffffffffffffffffff1614611f6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f64906141ec565b60405180910390fd5b80601160006101000a81548160ff02191690831515021790555050565b6060611f95826125f5565b611fd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fcb9061424c565b60405180910390fd5b60001515600f60019054906101000a900460ff161515141561208257600a8054611ffd90614661565b80601f016020809104026020016040519081016040528092919081815260200182805461202990614661565b80156120765780601f1061204b57610100808354040283529160200191612076565b820191906000526020600020905b81548152906001019060200180831161205957829003601f168201915b505050505090506120de565b600061208c612e52565b905060008151116120ac57604051806020016040528060008152506120da565b806120b684612ee4565b60096040516020016120ca93929190613f40565b6040516020818303038152906040525b9150505b919050565b6120eb612583565b73ffffffffffffffffffffffffffffffffffffffff166121096118e8565b73ffffffffffffffffffffffffffffffffffffffff161461215f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612156906141ec565b60405180910390fd5b80600e8190555050565b600c5481565b612177612583565b73ffffffffffffffffffffffffffffffffffffffff166121956118e8565b73ffffffffffffffffffffffffffffffffffffffff16146121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e2906141ec565b60405180910390fd5b8060138190555050565b60126020528060005260406000206000915054906101000a900460ff1681565b61221d612583565b73ffffffffffffffffffffffffffffffffffffffff1661223b6118e8565b73ffffffffffffffffffffffffffffffffffffffff1614612291576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612288906141ec565b60405180910390fd5b80600f60016101000a81548160ff02191690831515021790555050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b816000811180156123555750600d548111155b612394576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161238b906140cc565b60405180910390fd5b600c54816123a2600761271a565b6123ac9190614496565b11156123ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123e49061428c565b60405180910390fd5b6123f5612583565b73ffffffffffffffffffffffffffffffffffffffff166124136118e8565b73ffffffffffffffffffffffffffffffffffffffff1614612469576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612460906141ec565b60405180910390fd5b6124738284612bbb565b505050565b612480612583565b73ffffffffffffffffffffffffffffffffffffffff1661249e6118e8565b73ffffffffffffffffffffffffffffffffffffffff16146124f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124eb906141ec565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415612564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255b9061408c565b60405180910390fd5b61256d81612a62565b50565b601160009054906101000a900460ff1681565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166126d48361165a565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600081600001549050919050565b6000612733826125f5565b612772576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127699061412c565b60405180910390fd5b600061277d8361165a565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614806127ec57508373ffffffffffffffffffffffffffffffffffffffff166127d484610d00565b73ffffffffffffffffffffffffffffffffffffffff16145b806127fd57506127fc81856122ae565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166128268261165a565b73ffffffffffffffffffffffffffffffffffffffff161461287c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128739061422c565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156128ec576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128e3906140ec565b60405180910390fd5b6128f7838383613045565b612902600082612661565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129529190614577565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546129a99190614496565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000601260008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff1680612bb45750612b856118e8565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16145b9050919050565b60005b81811015612bf657612bd0600761304a565b612be383612bde600761271a565b613060565b8080612bee906146c4565b915050612bbe565b5080601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054612c429190614496565b601060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055505050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612cf8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cef9061410c565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612de9919061400f565b60405180910390a3505050565b612e01848484612806565b612e0d8484848461307e565b612e4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e439061406c565b60405180910390fd5b50505050565b606060088054612e6190614661565b80601f0160208091040260200160405190810160405280929190818152602001828054612e8d90614661565b8015612eda5780601f10612eaf57610100808354040283529160200191612eda565b820191906000526020600020905b815481529060010190602001808311612ebd57829003601f168201915b5050505050905090565b60606000821415612f2c576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613040565b600082905060005b60008214612f5e578080612f47906146c4565b915050600a82612f5791906144ec565b9150612f34565b60008167ffffffffffffffff811115612f7a57612f796147fa565b5b6040519080825280601f01601f191660200182016040528015612fac5781602001600182028036833780820191505090505b5090505b6000851461303957600182612fc59190614577565b9150600a85612fd4919061470d565b6030612fe09190614496565b60f81b818381518110612ff657612ff56147cb565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561303291906144ec565b9450612fb0565b8093505050505b919050565b505050565b6001816000016000828254019250508190555050565b61307a828260405180602001604052806000815250613215565b5050565b600061309f8473ffffffffffffffffffffffffffffffffffffffff16613270565b15613208578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026130c8612583565b8786866040518563ffffffff1660e01b81526004016130ea9493929190613fa1565b602060405180830381600087803b15801561310457600080fd5b505af192505050801561313557506040513d601f19601f820116820180604052508101906131329190613941565b60015b6131b8573d8060008114613165576040519150601f19603f3d011682016040523d82523d6000602084013e61316a565b606091505b506000815114156131b0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016131a79061406c565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061320d565b600190505b949350505050565b61321f8383613283565b61322c600084848461307e565b61326b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132629061406c565b60405180910390fd5b505050565b600080823b905060008111915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156132f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ea906141ac565b60405180910390fd5b6132fc816125f5565b1561333c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613333906140ac565b60405180910390fd5b61334860008383613045565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546133989190614496565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b82805461345d90614661565b90600052602060002090601f01602090048101928261347f57600085556134c6565b82601f1061349857805160ff19168380011785556134c6565b828001600101855582156134c6579182015b828111156134c55782518255916020019190600101906134aa565b5b5090506134d391906134d7565b5090565b5b808211156134f05760008160009055506001016134d8565b5090565b60006135076135028461436c565b614347565b9050808382526020820190508285602086028201111561352a5761352961482e565b5b60005b8581101561355a578161354088826135e8565b84526020840193506020830192505060018101905061352d565b5050509392505050565b600061357761357284614398565b614347565b90508281526020810184848401111561359357613592614833565b5b61359e84828561461f565b509392505050565b60006135b96135b4846143c9565b614347565b9050828152602081018484840111156135d5576135d4614833565b5b6135e084828561461f565b509392505050565b6000813590506135f781614e3f565b92915050565b600082601f83011261361257613611614829565b5b81356136228482602086016134f4565b91505092915050565b60008135905061363a81614e56565b92915050565b60008135905061364f81614e6d565b92915050565b60008151905061366481614e6d565b92915050565b600082601f83011261367f5761367e614829565b5b813561368f848260208601613564565b91505092915050565b600082601f8301126136ad576136ac614829565b5b81356136bd8482602086016135a6565b91505092915050565b6000813590506136d581614e84565b92915050565b6000602082840312156136f1576136f061483d565b5b60006136ff848285016135e8565b91505092915050565b6000806040838503121561371f5761371e61483d565b5b600061372d858286016135e8565b925050602061373e858286016135e8565b9150509250929050565b6000806000606084860312156137615761376061483d565b5b600061376f868287016135e8565b9350506020613780868287016135e8565b9250506040613791868287016136c6565b9150509250925092565b600080600080608085870312156137b5576137b461483d565b5b60006137c3878288016135e8565b94505060206137d4878288016135e8565b93505060406137e5878288016136c6565b925050606085013567ffffffffffffffff81111561380657613805614838565b5b6138128782880161366a565b91505092959194509250565b600080604083850312156138355761383461483d565b5b6000613843858286016135e8565b92505060206138548582860161362b565b9150509250929050565b600080604083850312156138755761387461483d565b5b6000613883858286016135e8565b9250506020613894858286016136c6565b9150509250929050565b6000602082840312156138b4576138b361483d565b5b600082013567ffffffffffffffff8111156138d2576138d1614838565b5b6138de848285016135fd565b91505092915050565b6000602082840312156138fd576138fc61483d565b5b600061390b8482850161362b565b91505092915050565b60006020828403121561392a5761392961483d565b5b600061393884828501613640565b91505092915050565b6000602082840312156139575761395661483d565b5b600061396584828501613655565b91505092915050565b6000602082840312156139845761398361483d565b5b600082013567ffffffffffffffff8111156139a2576139a1614838565b5b6139ae84828501613698565b91505092915050565b6000602082840312156139cd576139cc61483d565b5b60006139db848285016136c6565b91505092915050565b600080604083850312156139fb576139fa61483d565b5b6000613a09858286016136c6565b9250506020613a1a858286016135e8565b9150509250929050565b6000613a308383613f22565b60208301905092915050565b613a45816145ab565b82525050565b6000613a568261441f565b613a60818561444d565b9350613a6b836143fa565b8060005b83811015613a9c578151613a838882613a24565b9750613a8e83614440565b925050600181019050613a6f565b5085935050505092915050565b613ab2816145bd565b82525050565b6000613ac38261442a565b613acd818561445e565b9350613add81856020860161462e565b613ae681614842565b840191505092915050565b6000613afc82614435565b613b06818561447a565b9350613b1681856020860161462e565b613b1f81614842565b840191505092915050565b6000613b3582614435565b613b3f818561448b565b9350613b4f81856020860161462e565b80840191505092915050565b60008154613b6881614661565b613b72818661448b565b94506001821660008114613b8d5760018114613b9e57613bd1565b60ff19831686528186019350613bd1565b613ba78561440a565b60005b83811015613bc957815481890152600182019150602081019050613baa565b838801955050505b50505092915050565b6000613be760248361447a565b9150613bf282614853565b604082019050919050565b6000613c0a60328361447a565b9150613c15826148a2565b604082019050919050565b6000613c2d60268361447a565b9150613c38826148f1565b604082019050919050565b6000613c50601c8361447a565b9150613c5b82614940565b602082019050919050565b6000613c7360148361447a565b9150613c7e82614969565b602082019050919050565b6000613c9660248361447a565b9150613ca182614992565b604082019050919050565b6000613cb960198361447a565b9150613cc4826149e1565b602082019050919050565b6000613cdc602c8361447a565b9150613ce782614a0a565b604082019050919050565b6000613cff60388361447a565b9150613d0a82614a59565b604082019050919050565b6000613d22602a8361447a565b9150613d2d82614aa8565b604082019050919050565b6000613d4560298361447a565b9150613d5082614af7565b604082019050919050565b6000613d6860208361447a565b9150613d7382614b46565b602082019050919050565b6000613d8b602c8361447a565b9150613d9682614b6f565b604082019050919050565b6000613dae60208361447a565b9150613db982614bbe565b602082019050919050565b6000613dd160178361447a565b9150613ddc82614be7565b602082019050919050565b6000613df460298361447a565b9150613dff82614c10565b604082019050919050565b6000613e17602f8361447a565b9150613e2282614c5f565b604082019050919050565b6000613e3a60218361447a565b9150613e4582614cae565b604082019050919050565b6000613e5d60008361446f565b9150613e6882614cfd565b600082019050919050565b6000613e8060148361447a565b9150613e8b82614d00565b602082019050919050565b6000613ea360318361447a565b9150613eae82614d29565b604082019050919050565b6000613ec6602d8361447a565b9150613ed182614d78565b604082019050919050565b6000613ee960268361447a565b9150613ef482614dc7565b604082019050919050565b6000613f0c60138361447a565b9150613f1782614e16565b602082019050919050565b613f2b81614615565b82525050565b613f3a81614615565b82525050565b6000613f4c8286613b2a565b9150613f588285613b2a565b9150613f648284613b5b565b9150819050949350505050565b6000613f7c82613e50565b9150819050919050565b6000602082019050613f9b6000830184613a3c565b92915050565b6000608082019050613fb66000830187613a3c565b613fc36020830186613a3c565b613fd06040830185613f31565b8181036060830152613fe28184613ab8565b905095945050505050565b600060208201905081810360008301526140078184613a4b565b905092915050565b60006020820190506140246000830184613aa9565b92915050565b600060208201905081810360008301526140448184613af1565b905092915050565b6000602082019050818103600083015261406581613bda565b9050919050565b6000602082019050818103600083015261408581613bfd565b9050919050565b600060208201905081810360008301526140a581613c20565b9050919050565b600060208201905081810360008301526140c581613c43565b9050919050565b600060208201905081810360008301526140e581613c66565b9050919050565b6000602082019050818103600083015261410581613c89565b9050919050565b6000602082019050818103600083015261412581613cac565b9050919050565b6000602082019050818103600083015261414581613ccf565b9050919050565b6000602082019050818103600083015261416581613cf2565b9050919050565b6000602082019050818103600083015261418581613d15565b9050919050565b600060208201905081810360008301526141a581613d38565b9050919050565b600060208201905081810360008301526141c581613d5b565b9050919050565b600060208201905081810360008301526141e581613d7e565b9050919050565b6000602082019050818103600083015261420581613da1565b9050919050565b6000602082019050818103600083015261422581613dc4565b9050919050565b6000602082019050818103600083015261424581613de7565b9050919050565b6000602082019050818103600083015261426581613e0a565b9050919050565b6000602082019050818103600083015261428581613e2d565b9050919050565b600060208201905081810360008301526142a581613e73565b9050919050565b600060208201905081810360008301526142c581613e96565b9050919050565b600060208201905081810360008301526142e581613eb9565b9050919050565b6000602082019050818103600083015261430581613edc565b9050919050565b6000602082019050818103600083015261432581613eff565b9050919050565b60006020820190506143416000830184613f31565b92915050565b6000614351614362565b905061435d8282614693565b919050565b6000604051905090565b600067ffffffffffffffff821115614387576143866147fa565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156143b3576143b26147fa565b5b6143bc82614842565b9050602081019050919050565b600067ffffffffffffffff8211156143e4576143e36147fa565b5b6143ed82614842565b9050602081019050919050565b6000819050602082019050919050565b60008190508160005260206000209050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b60006144a182614615565b91506144ac83614615565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156144e1576144e061473e565b5b828201905092915050565b60006144f782614615565b915061450283614615565b9250826145125761451161476d565b5b828204905092915050565b600061452882614615565b915061453383614615565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561456c5761456b61473e565b5b828202905092915050565b600061458282614615565b915061458d83614615565b9250828210156145a05761459f61473e565b5b828203905092915050565b60006145b6826145f5565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561464c578082015181840152602081019050614631565b8381111561465b576000848401525b50505050565b6000600282049050600182168061467957607f821691505b6020821081141561468d5761468c61479c565b5b50919050565b61469c82614842565b810181811067ffffffffffffffff821117156146bb576146ba6147fa565b5b80604052505050565b60006146cf82614615565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147025761470161473e565b5b600182019050919050565b600061471882614615565b915061472383614615565b9250826147335761473261476d565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f42757965722068617320616c7265616479206d696e746564206d617820746f6b60008201527f656e732100000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f496e76616c6964206d696e7420616d6f756e7421000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f54686520636f6e74726163742069732070617573656421000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f4d617820737570706c7920657863656564656421000000000000000000000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f42757965722068617320616c7265616479207072652d73616c65206d696e746560008201527f64206d617820746f6b656e732100000000000000000000000000000000000000602082015250565b7f4275796572206973206e6f7420696e2057686974656c69737420666f7220507260008201527f652d53616c650000000000000000000000000000000000000000000000000000602082015250565b7f496e73756666696369656e742066756e64732100000000000000000000000000600082015250565b614e48816145ab565b8114614e5357600080fd5b50565b614e5f816145bd565b8114614e6a57600080fd5b50565b614e76816145c9565b8114614e8157600080fd5b50565b614e8d81614615565b8114614e9857600080fd5b5056fea264697066735822122012a090fe9f2ebb83b50b632387043da10047b3b37b089535b01b80a62a27cb2764736f6c63430008070033

Deployed Bytecode Sourcemap

37757:6277:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43796:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;25240:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26185:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27744:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27267:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38024:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41660:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41766:77;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38829:89;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38247:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28494:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41959:922;;;;;;;;;;;;;:::i;:::-;;28904:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39972:635;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41200:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43522:96;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;41416:132;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38214:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37946:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38183:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37913:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25879:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25609:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6228:103;;;;;;;;;;;;;:::i;:::-;;41554:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38389:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5577:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38097:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26354:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38924:879;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28037:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37984:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41280:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;29160:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38139:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43624:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43323:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40613:494;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41849:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38061:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43410:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38341:43;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41113:81;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28263:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39811:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;6486:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38309:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43796:102;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43887:5:::1;43866:11;:18;43878:5;43866:18;;;;;;;;;;;;;;;;:26;;;;;;;;;;;;;;;;;;43796:102:::0;:::o;25240:305::-;25342:4;25394:25;25379:40;;;:11;:40;;;;:105;;;;25451:33;25436:48;;;:11;:48;;;;25379:105;:158;;;;25501:36;25525:11;25501:23;:36::i;:::-;25379:158;25359:178;;25240:305;;;:::o;26185:100::-;26239:13;26272:5;26265:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26185:100;:::o;27744:221::-;27820:7;27848:16;27856:7;27848;:16::i;:::-;27840:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27933:15;:24;27949:7;27933:24;;;;;;;;;;;;;;;;;;;;;27926:31;;27744:221;;;:::o;27267:411::-;27348:13;27364:23;27379:7;27364:14;:23::i;:::-;27348:39;;27412:5;27406:11;;:2;:11;;;;27398:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;27506:5;27490:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;27515:37;27532:5;27539:12;:10;:12::i;:::-;27515:16;:37::i;:::-;27490:62;27468:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;27649:21;27658:2;27662:7;27649:8;:21::i;:::-;27337:341;27267:411;;:::o;38024:32::-;;;;:::o;41660:100::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41744:10:::1;41732:9;:22;;;;;;;;;;;;:::i;:::-;;41660:100:::0;:::o;41766:77::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41831:6:::1;41822;;:15;;;;;;;;;;;;;;;;;;41766:77:::0;:::o;38829:89::-;38873:7;38896:16;:6;:14;:16::i;:::-;38889:23;;38829:89;:::o;38247:55::-;;;;;;;;;;;;;;;;;:::o;28494:339::-;28689:41;28708:12;:10;:12::i;:::-;28722:7;28689:18;:41::i;:::-;28681:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28797:28;28807:4;28813:2;28817:7;28797:9;:28::i;:::-;28494:339;;;:::o;41959:922::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42237:7:::1;42258:42;42250:56;;42342:3;42338:1;42314:21;:25;;;;:::i;:::-;:31;;;;:::i;:::-;42250:100;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42236:114;;;42365:2;42357:11;;;::::0;::::1;;42703:7;42724;:5;:7::i;:::-;42716:21;;42745;42716:55;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42702:69;;;42786:2;42778:11;;;::::0;::::1;;41996:885;;41959:922::o:0;28904:185::-;29042:39;29059:4;29065:2;29069:7;29042:39;;;;;;;;;;;;:16;:39::i;:::-;28904:185;;;:::o;39972:635::-;40047:16;40075:23;40101:17;40111:6;40101:9;:17::i;:::-;40075:43;;40125:30;40172:15;40158:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40125:63;;40195:22;40220:1;40195:26;;40228:23;40264:309;40289:15;40271;:33;:64;;;;;40326:9;;40308:14;:27;;40271:64;40264:309;;;40346:25;40374:23;40382:14;40374:7;:23::i;:::-;40346:51;;40433:6;40412:27;;:17;:27;;;40408:131;;;40485:14;40452:13;40466:15;40452:30;;;;;;;;:::i;:::-;;;;;;;:47;;;;;40512:17;;;;;:::i;:::-;;;;40408:131;40549:16;;;;;:::i;:::-;;;;40337:236;40264:309;;;40588:13;40581:20;;;;;;39972:635;;;:::o;41200:74::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41263:5:::1;41256:4;:12;;;;41200:74:::0;:::o;43522:96::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43608:4:::1;43587:11;:18;43599:5;43587:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;43522:96:::0;:::o;41416:132::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41524:18:::1;41504:17;:38;;;;;;;;;;;;:::i;:::-;;41416:132:::0;:::o;38214:28::-;;;;;;;;;;;;;:::o;37946:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;38183:26::-;;;;;;;;;;;;;:::o;37913:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;25879:239::-;25951:7;25971:13;25987:7;:16;25995:7;25987:16;;;;;;;;;;;;;;;;;;;;;25971:32;;26039:1;26022:19;;:5;:19;;;;26014:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26105:5;26098:12;;;25879:239;;;:::o;25609:208::-;25681:7;25726:1;25709:19;;:5;:19;;;;25701:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25793:9;:16;25803:5;25793:16;;;;;;;;;;;;;;;;25786:23;;25609:208;;;:::o;6228:103::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6293:30:::1;6320:1;6293:18;:30::i;:::-;6228:103::o:0;41554:100::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41638:10:::1;41626:9;:22;;;;;;;;;;;;:::i;:::-;;41554:100:::0;:::o;38389:39::-;;;;:::o;5577:87::-;5623:7;5650:6;;;;;;;;;;;5643:13;;5577:87;:::o;38097:37::-;;;;:::o;26354:104::-;26410:13;26443:7;26436:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;26354:104;:::o;38924:879::-;38989:11;38663:1;38649:11;:15;:52;;;;;38683:18;;38668:11;:33;;38649:52;38641:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38775:9;;38760:11;38741:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;38733:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;39018:6:::1;;;;;;;;;;;39017:7;39009:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;39087:11;39080:4;;:18;;;;:::i;:::-;39067:9;:31;;39059:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;39174:24;39201:20;:32;39222:10;39201:32;;;;;;;;;;;;;;;;39174:59;;39282:18;;39267:11;39248:16;:30;;;;:::i;:::-;:52;;39240:101;;;;;;;;;;;;:::i;:::-;;;;;;;;;39354:7;;;;;;;;;;;39350:404;;;39460:25;39474:10;39460:13;:25::i;:::-;39454:109;;39503:48;;;;;;;;;;:::i;:::-;;;;;;;;39454:109;39656:20;;39642:11;39620:21;39630:10;39620:9;:21::i;:::-;:33;;;;:::i;:::-;:56;39615:131;;;39691:55;;;;;;;;;;:::i;:::-;;;;;;;;39615:131;39350:404;39763:34;39773:10;39785:11;39763:9;:34::i;:::-;39002:801;38924:879:::0;;:::o;28037:155::-;28132:52;28151:12;:10;:12::i;:::-;28165:8;28175;28132:18;:52::i;:::-;28037:155;;:::o;37984:31::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;41280:130::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41385:19:::1;41364:18;:40;;;;41280:130:::0;:::o;29160:328::-;29335:41;29354:12;:10;:12::i;:::-;29368:7;29335:18;:41::i;:::-;29327:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;29441:39;29455:4;29461:2;29465:7;29474:5;29441:13;:39::i;:::-;29160:328;;;;:::o;38139:37::-;;;;:::o;43624:166::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43709:9:::1;43704:79;43724:6;:13;43721:1;:16;43704:79;;;43779:4;43754:11;:22;43766:6;43773:1;43766:9;;;;;;;;:::i;:::-;;;;;;;;43754:22;;;;;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;43738:3;;;;;:::i;:::-;;;;43704:79;;;;43624:166:::0;:::o;43323:81::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43392:6:::1;43382:7;;:16;;;;;;;;;;;;;;;;;;43323:81:::0;:::o;40613:494::-;40712:13;40753:17;40761:8;40753:7;:17::i;:::-;40737:98;;;;;;;;;;;;:::i;:::-;;;;;;;;;40860:5;40848:17;;:8;;;;;;;;;;;:17;;;40844:64;;;40883:17;40876:24;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;40844:64;40916:28;40947:10;:8;:10::i;:::-;40916:41;;41002:1;40977:14;40971:28;:32;:130;;;;;;;;;;;;;;;;;41039:14;41055:19;:8;:17;:19::i;:::-;41076:9;41022:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;40971:130;40964:137;;;40613:494;;;;:::o;41849:104::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41941:6:::1;41920:18;:27;;;;41849:104:::0;:::o;38061:31::-;;;;:::o;43410:106::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43506:4:::1;43483:20;:27;;;;43410:106:::0;:::o;38341:43::-;;;;;;;;;;;;;;;;;;;;;;:::o;41113:81::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;41182:6:::1;41171:8;;:17;;;;;;;;;;;;;;;;;;41113:81:::0;:::o;28263:164::-;28360:4;28384:18;:25;28403:5;28384:25;;;;;;;;;;;;;;;:35;28410:8;28384:35;;;;;;;;;;;;;;;;;;;;;;;;;28377:42;;28263:164;;;;:::o;39811:155::-;39897:11;38663:1;38649:11;:15;:52;;;;;38683:18;;38668:11;:33;;38649:52;38641:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;38775:9;;38760:11;38741:16;:6;:14;:16::i;:::-;:30;;;;:::i;:::-;:43;;38733:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;5808:12:::1;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;39927:33:::2;39937:9;39948:11;39927:9;:33::i;:::-;39811:155:::0;;;:::o;6486:201::-;5808:12;:10;:12::i;:::-;5797:23;;:7;:5;:7::i;:::-;:23;;;5789:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;6595:1:::1;6575:22;;:8;:22;;;;6567:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;6651:28;6670:8;6651:18;:28::i;:::-;6486:201:::0;:::o;38309:26::-;;;;;;;;;;;;;:::o;4301:98::-;4354:7;4381:10;4374:17;;4301:98;:::o;18009:157::-;18094:4;18133:25;18118:40;;;:11;:40;;;;18111:47;;18009:157;;;:::o;30998:127::-;31063:4;31115:1;31087:30;;:7;:16;31095:7;31087:16;;;;;;;;;;;;;;;;;;;;;:30;;;;31080:37;;30998:127;;;:::o;34980:174::-;35082:2;35055:15;:24;35071:7;35055:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;35138:7;35134:2;35100:46;;35109:23;35124:7;35109:14;:23::i;:::-;35100:46;;;;;;;;;;;;34980:174;;:::o;905:114::-;970:7;997;:14;;;990:21;;905:114;;;:::o;31292:348::-;31385:4;31410:16;31418:7;31410;:16::i;:::-;31402:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;31486:13;31502:23;31517:7;31502:14;:23::i;:::-;31486:39;;31555:5;31544:16;;:7;:16;;;:51;;;;31588:7;31564:31;;:20;31576:7;31564:11;:20::i;:::-;:31;;;31544:51;:87;;;;31599:32;31616:5;31623:7;31599:16;:32::i;:::-;31544:87;31536:96;;;31292:348;;;;:::o;34284:578::-;34443:4;34416:31;;:23;34431:7;34416:14;:23::i;:::-;:31;;;34408:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34526:1;34512:16;;:2;:16;;;;34504:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34582:39;34603:4;34609:2;34613:7;34582:20;:39::i;:::-;34686:29;34703:1;34707:7;34686:8;:29::i;:::-;34747:1;34728:9;:15;34738:4;34728:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34776:1;34759:9;:13;34769:2;34759:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34807:2;34788:7;:16;34796:7;34788:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34846:7;34842:2;34827:27;;34836:4;34827:27;;;;;;;;;;;;34284:578;;;:::o;6847:191::-;6921:16;6940:6;;;;;;;;;;;6921:25;;6966:8;6957:6;;:17;;;;;;;;;;;;;;;;;;7021:8;6990:40;;7011:8;6990:40;;;;;;;;;;;;6910:128;6847:191;:::o;43904:127::-;43964:4;43986:11;:18;43998:5;43986:18;;;;;;;;;;;;;;;;;;;;;;;;;:39;;;;44018:7;:5;:7::i;:::-;44009:16;;:5;:16;;;43986:39;43979:46;;43904:127;;;:::o;42887:290::-;42967:9;42962:124;42986:11;42982:1;:15;42962:124;;;43013:18;:6;:16;:18::i;:::-;43040:38;43050:9;43061:16;:6;:14;:16::i;:::-;43040:9;:38::i;:::-;42999:3;;;;;:::i;:::-;;;;42962:124;;;;43160:11;43126:20;:31;43147:9;43126:31;;;;;;;;;;;;;;;;:45;;;;:::i;:::-;43092:20;:31;43113:9;43092:31;;;;;;;;;;;;;;;:79;;;;42887:290;;:::o;35296:315::-;35451:8;35442:17;;:5;:17;;;;35434:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;35538:8;35500:18;:25;35519:5;35500:25;;;;;;;;;;;;;;;:35;35526:8;35500:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;35584:8;35562:41;;35577:5;35562:41;;;35594:8;35562:41;;;;;;:::i;:::-;;;;;;;;35296:315;;;:::o;30370:::-;30527:28;30537:4;30543:2;30547:7;30527:9;:28::i;:::-;30574:48;30597:4;30603:2;30607:7;30616:5;30574:22;:48::i;:::-;30566:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;30370:315;;;;:::o;43183:104::-;43243:13;43272:9;43265:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43183:104;:::o;1863:723::-;1919:13;2149:1;2140:5;:10;2136:53;;;2167:10;;;;;;;;;;;;;;;;;;;;;2136:53;2199:12;2214:5;2199:20;;2230:14;2255:78;2270:1;2262:4;:9;2255:78;;2288:8;;;;;:::i;:::-;;;;2319:2;2311:10;;;;;:::i;:::-;;;2255:78;;;2343:19;2375:6;2365:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2343:39;;2393:154;2409:1;2400:5;:10;2393:154;;2437:1;2427:11;;;;;:::i;:::-;;;2504:2;2496:5;:10;;;;:::i;:::-;2483:2;:24;;;;:::i;:::-;2470:39;;2453:6;2460;2453:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;2533:2;2524:11;;;;;:::i;:::-;;;2393:154;;;2571:6;2557:21;;;;;1863:723;;;;:::o;37547:126::-;;;;:::o;1027:127::-;1134:1;1116:7;:14;;;:19;;;;;;;;;;;1027:127;:::o;31982:110::-;32058:26;32068:2;32072:7;32058:26;;;;;;;;;;;;:9;:26::i;:::-;31982:110;;:::o;36176:799::-;36331:4;36352:15;:2;:13;;;:15::i;:::-;36348:620;;;36404:2;36388:36;;;36425:12;:10;:12::i;:::-;36439:4;36445:7;36454:5;36388:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;36384:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36647:1;36630:6;:13;:18;36626:272;;;36673:60;;;;;;;;;;:::i;:::-;;;;;;;;36626:272;36848:6;36842:13;36833:6;36829:2;36825:15;36818:38;36384:529;36521:41;;;36511:51;;;:6;:51;;;;36504:58;;;;;36348:620;36952:4;36945:11;;36176:799;;;;;;;:::o;32319:321::-;32449:18;32455:2;32459:7;32449:5;:18::i;:::-;32500:54;32531:1;32535:2;32539:7;32548:5;32500:22;:54::i;:::-;32478:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;32319:321;;;:::o;7865:387::-;7925:4;8133:12;8200:7;8188:20;8180:28;;8243:1;8236:4;:8;8229:15;;;7865:387;;;:::o;32976:382::-;33070:1;33056:16;;:2;:16;;;;33048:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;33129:16;33137:7;33129;:16::i;:::-;33128:17;33120:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;33191:45;33220:1;33224:2;33228:7;33191:20;:45::i;:::-;33266:1;33249:9;:13;33259:2;33249:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;33297:2;33278:7;:16;33286:7;33278:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;33342:7;33338:2;33317:33;;33334:1;33317:33;;;;;;;;;;;;32976:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;752:410::-;829:5;854:65;870:48;911:6;870:48;:::i;:::-;854:65;:::i;:::-;845:74;;942:6;935:5;928:21;980:4;973:5;969:16;1018:3;1009:6;1004:3;1000:16;997:25;994:112;;;1025:79;;:::i;:::-;994:112;1115:41;1149:6;1144:3;1139;1115:41;:::i;:::-;835:327;752:410;;;;;:::o;1168:412::-;1246:5;1271:66;1287:49;1329:6;1287:49;:::i;:::-;1271:66;:::i;:::-;1262:75;;1360:6;1353:5;1346:21;1398:4;1391:5;1387:16;1436:3;1427:6;1422:3;1418:16;1415:25;1412:112;;;1443:79;;:::i;:::-;1412:112;1533:41;1567:6;1562:3;1557;1533:41;:::i;:::-;1252:328;1168:412;;;;;:::o;1586:139::-;1632:5;1670:6;1657:20;1648:29;;1686:33;1713:5;1686:33;:::i;:::-;1586:139;;;;:::o;1748:370::-;1819:5;1868:3;1861:4;1853:6;1849:17;1845:27;1835:122;;1876:79;;:::i;:::-;1835:122;1993:6;1980:20;2018:94;2108:3;2100:6;2093:4;2085:6;2081:17;2018:94;:::i;:::-;2009:103;;1825:293;1748:370;;;;:::o;2124:133::-;2167:5;2205:6;2192:20;2183:29;;2221:30;2245:5;2221:30;:::i;:::-;2124:133;;;;:::o;2263:137::-;2308:5;2346:6;2333:20;2324:29;;2362:32;2388:5;2362:32;:::i;:::-;2263:137;;;;:::o;2406:141::-;2462:5;2493:6;2487:13;2478:22;;2509:32;2535:5;2509:32;:::i;:::-;2406:141;;;;:::o;2566:338::-;2621:5;2670:3;2663:4;2655:6;2651:17;2647:27;2637:122;;2678:79;;:::i;:::-;2637:122;2795:6;2782:20;2820:78;2894:3;2886:6;2879:4;2871:6;2867:17;2820:78;:::i;:::-;2811:87;;2627:277;2566:338;;;;:::o;2924:340::-;2980:5;3029:3;3022:4;3014:6;3010:17;3006:27;2996:122;;3037:79;;:::i;:::-;2996:122;3154:6;3141:20;3179:79;3254:3;3246:6;3239:4;3231:6;3227:17;3179:79;:::i;:::-;3170:88;;2986:278;2924:340;;;;:::o;3270:139::-;3316:5;3354:6;3341:20;3332:29;;3370:33;3397:5;3370:33;:::i;:::-;3270:139;;;;:::o;3415:329::-;3474:6;3523:2;3511:9;3502:7;3498:23;3494:32;3491:119;;;3529:79;;:::i;:::-;3491:119;3649:1;3674:53;3719:7;3710:6;3699:9;3695:22;3674:53;:::i;:::-;3664:63;;3620:117;3415:329;;;;:::o;3750:474::-;3818:6;3826;3875:2;3863:9;3854:7;3850:23;3846:32;3843:119;;;3881:79;;:::i;:::-;3843:119;4001:1;4026:53;4071:7;4062:6;4051:9;4047:22;4026:53;:::i;:::-;4016:63;;3972:117;4128:2;4154:53;4199:7;4190:6;4179:9;4175:22;4154:53;:::i;:::-;4144:63;;4099:118;3750:474;;;;;:::o;4230:619::-;4307:6;4315;4323;4372:2;4360:9;4351:7;4347:23;4343:32;4340:119;;;4378:79;;:::i;:::-;4340:119;4498:1;4523:53;4568:7;4559:6;4548:9;4544:22;4523:53;:::i;:::-;4513:63;;4469:117;4625:2;4651:53;4696:7;4687:6;4676:9;4672:22;4651:53;:::i;:::-;4641:63;;4596:118;4753:2;4779:53;4824:7;4815:6;4804:9;4800:22;4779:53;:::i;:::-;4769:63;;4724:118;4230:619;;;;;:::o;4855:943::-;4950:6;4958;4966;4974;5023:3;5011:9;5002:7;4998:23;4994:33;4991:120;;;5030:79;;:::i;:::-;4991:120;5150:1;5175:53;5220:7;5211:6;5200:9;5196:22;5175:53;:::i;:::-;5165:63;;5121:117;5277:2;5303:53;5348:7;5339:6;5328:9;5324:22;5303:53;:::i;:::-;5293:63;;5248:118;5405:2;5431:53;5476:7;5467:6;5456:9;5452:22;5431:53;:::i;:::-;5421:63;;5376:118;5561:2;5550:9;5546:18;5533:32;5592:18;5584:6;5581:30;5578:117;;;5614:79;;:::i;:::-;5578:117;5719:62;5773:7;5764:6;5753:9;5749:22;5719:62;:::i;:::-;5709:72;;5504:287;4855:943;;;;;;;:::o;5804:468::-;5869:6;5877;5926:2;5914:9;5905:7;5901:23;5897:32;5894:119;;;5932:79;;:::i;:::-;5894:119;6052:1;6077:53;6122:7;6113:6;6102:9;6098:22;6077:53;:::i;:::-;6067:63;;6023:117;6179:2;6205:50;6247:7;6238:6;6227:9;6223:22;6205:50;:::i;:::-;6195:60;;6150:115;5804:468;;;;;:::o;6278:474::-;6346:6;6354;6403:2;6391:9;6382:7;6378:23;6374:32;6371:119;;;6409:79;;:::i;:::-;6371:119;6529:1;6554:53;6599:7;6590:6;6579:9;6575:22;6554:53;:::i;:::-;6544:63;;6500:117;6656:2;6682:53;6727:7;6718:6;6707:9;6703:22;6682:53;:::i;:::-;6672:63;;6627:118;6278:474;;;;;:::o;6758:539::-;6842:6;6891:2;6879:9;6870:7;6866:23;6862:32;6859:119;;;6897:79;;:::i;:::-;6859:119;7045:1;7034:9;7030:17;7017:31;7075:18;7067:6;7064:30;7061:117;;;7097:79;;:::i;:::-;7061:117;7202:78;7272:7;7263:6;7252:9;7248:22;7202:78;:::i;:::-;7192:88;;6988:302;6758:539;;;;:::o;7303:323::-;7359:6;7408:2;7396:9;7387:7;7383:23;7379:32;7376:119;;;7414:79;;:::i;:::-;7376:119;7534:1;7559:50;7601:7;7592:6;7581:9;7577:22;7559:50;:::i;:::-;7549:60;;7505:114;7303:323;;;;:::o;7632:327::-;7690:6;7739:2;7727:9;7718:7;7714:23;7710:32;7707:119;;;7745:79;;:::i;:::-;7707:119;7865:1;7890:52;7934:7;7925:6;7914:9;7910:22;7890:52;:::i;:::-;7880:62;;7836:116;7632:327;;;;:::o;7965:349::-;8034:6;8083:2;8071:9;8062:7;8058:23;8054:32;8051:119;;;8089:79;;:::i;:::-;8051:119;8209:1;8234:63;8289:7;8280:6;8269:9;8265:22;8234:63;:::i;:::-;8224:73;;8180:127;7965:349;;;;:::o;8320:509::-;8389:6;8438:2;8426:9;8417:7;8413:23;8409:32;8406:119;;;8444:79;;:::i;:::-;8406:119;8592:1;8581:9;8577:17;8564:31;8622:18;8614:6;8611:30;8608:117;;;8644:79;;:::i;:::-;8608:117;8749:63;8804:7;8795:6;8784:9;8780:22;8749:63;:::i;:::-;8739:73;;8535:287;8320:509;;;;:::o;8835:329::-;8894:6;8943:2;8931:9;8922:7;8918:23;8914:32;8911:119;;;8949:79;;:::i;:::-;8911:119;9069:1;9094:53;9139:7;9130:6;9119:9;9115:22;9094:53;:::i;:::-;9084:63;;9040:117;8835:329;;;;:::o;9170:474::-;9238:6;9246;9295:2;9283:9;9274:7;9270:23;9266:32;9263:119;;;9301:79;;:::i;:::-;9263:119;9421:1;9446:53;9491:7;9482:6;9471:9;9467:22;9446:53;:::i;:::-;9436:63;;9392:117;9548:2;9574:53;9619:7;9610:6;9599:9;9595:22;9574:53;:::i;:::-;9564:63;;9519:118;9170:474;;;;;:::o;9650:179::-;9719:10;9740:46;9782:3;9774:6;9740:46;:::i;:::-;9818:4;9813:3;9809:14;9795:28;;9650:179;;;;:::o;9835:118::-;9922:24;9940:5;9922:24;:::i;:::-;9917:3;9910:37;9835:118;;:::o;9989:732::-;10108:3;10137:54;10185:5;10137:54;:::i;:::-;10207:86;10286:6;10281:3;10207:86;:::i;:::-;10200:93;;10317:56;10367:5;10317:56;:::i;:::-;10396:7;10427:1;10412:284;10437:6;10434:1;10431:13;10412:284;;;10513:6;10507:13;10540:63;10599:3;10584:13;10540:63;:::i;:::-;10533:70;;10626:60;10679:6;10626:60;:::i;:::-;10616:70;;10472:224;10459:1;10456;10452:9;10447:14;;10412:284;;;10416:14;10712:3;10705:10;;10113:608;;;9989:732;;;;:::o;10727:109::-;10808:21;10823:5;10808:21;:::i;:::-;10803:3;10796:34;10727:109;;:::o;10842:360::-;10928:3;10956:38;10988:5;10956:38;:::i;:::-;11010:70;11073:6;11068:3;11010:70;:::i;:::-;11003:77;;11089:52;11134:6;11129:3;11122:4;11115:5;11111:16;11089:52;:::i;:::-;11166:29;11188:6;11166:29;:::i;:::-;11161:3;11157:39;11150:46;;10932:270;10842:360;;;;:::o;11208:364::-;11296:3;11324:39;11357:5;11324:39;:::i;:::-;11379:71;11443:6;11438:3;11379:71;:::i;:::-;11372:78;;11459:52;11504:6;11499:3;11492:4;11485:5;11481:16;11459:52;:::i;:::-;11536:29;11558:6;11536:29;:::i;:::-;11531:3;11527:39;11520:46;;11300:272;11208:364;;;;:::o;11578:377::-;11684:3;11712:39;11745:5;11712:39;:::i;:::-;11767:89;11849:6;11844:3;11767:89;:::i;:::-;11760:96;;11865:52;11910:6;11905:3;11898:4;11891:5;11887:16;11865:52;:::i;:::-;11942:6;11937:3;11933:16;11926:23;;11688:267;11578:377;;;;:::o;11985:845::-;12088:3;12125:5;12119:12;12154:36;12180:9;12154:36;:::i;:::-;12206:89;12288:6;12283:3;12206:89;:::i;:::-;12199:96;;12326:1;12315:9;12311:17;12342:1;12337:137;;;;12488:1;12483:341;;;;12304:520;;12337:137;12421:4;12417:9;12406;12402:25;12397:3;12390:38;12457:6;12452:3;12448:16;12441:23;;12337:137;;12483:341;12550:38;12582:5;12550:38;:::i;:::-;12610:1;12624:154;12638:6;12635:1;12632:13;12624:154;;;12712:7;12706:14;12702:1;12697:3;12693:11;12686:35;12762:1;12753:7;12749:15;12738:26;;12660:4;12657:1;12653:12;12648:17;;12624:154;;;12807:6;12802:3;12798:16;12791:23;;12490:334;;12304:520;;12092:738;;11985:845;;;;:::o;12836:366::-;12978:3;12999:67;13063:2;13058:3;12999:67;:::i;:::-;12992:74;;13075:93;13164:3;13075:93;:::i;:::-;13193:2;13188:3;13184:12;13177:19;;12836:366;;;:::o;13208:::-;13350:3;13371:67;13435:2;13430:3;13371:67;:::i;:::-;13364:74;;13447:93;13536:3;13447:93;:::i;:::-;13565:2;13560:3;13556:12;13549:19;;13208:366;;;:::o;13580:::-;13722:3;13743:67;13807:2;13802:3;13743:67;:::i;:::-;13736:74;;13819:93;13908:3;13819:93;:::i;:::-;13937:2;13932:3;13928:12;13921:19;;13580:366;;;:::o;13952:::-;14094:3;14115:67;14179:2;14174:3;14115:67;:::i;:::-;14108:74;;14191:93;14280:3;14191:93;:::i;:::-;14309:2;14304:3;14300:12;14293:19;;13952:366;;;:::o;14324:::-;14466:3;14487:67;14551:2;14546:3;14487:67;:::i;:::-;14480:74;;14563:93;14652:3;14563:93;:::i;:::-;14681:2;14676:3;14672:12;14665:19;;14324:366;;;:::o;14696:::-;14838:3;14859:67;14923:2;14918:3;14859:67;:::i;:::-;14852:74;;14935:93;15024:3;14935:93;:::i;:::-;15053:2;15048:3;15044:12;15037:19;;14696:366;;;:::o;15068:::-;15210:3;15231:67;15295:2;15290:3;15231:67;:::i;:::-;15224:74;;15307:93;15396:3;15307:93;:::i;:::-;15425:2;15420:3;15416:12;15409:19;;15068:366;;;:::o;15440:::-;15582:3;15603:67;15667:2;15662:3;15603:67;:::i;:::-;15596:74;;15679:93;15768:3;15679:93;:::i;:::-;15797:2;15792:3;15788:12;15781:19;;15440:366;;;:::o;15812:::-;15954:3;15975:67;16039:2;16034:3;15975:67;:::i;:::-;15968:74;;16051:93;16140:3;16051:93;:::i;:::-;16169:2;16164:3;16160:12;16153:19;;15812:366;;;:::o;16184:::-;16326:3;16347:67;16411:2;16406:3;16347:67;:::i;:::-;16340:74;;16423:93;16512:3;16423:93;:::i;:::-;16541:2;16536:3;16532:12;16525:19;;16184:366;;;:::o;16556:::-;16698:3;16719:67;16783:2;16778:3;16719:67;:::i;:::-;16712:74;;16795:93;16884:3;16795:93;:::i;:::-;16913:2;16908:3;16904:12;16897:19;;16556:366;;;:::o;16928:::-;17070:3;17091:67;17155:2;17150:3;17091:67;:::i;:::-;17084:74;;17167:93;17256:3;17167:93;:::i;:::-;17285:2;17280:3;17276:12;17269:19;;16928:366;;;:::o;17300:::-;17442:3;17463:67;17527:2;17522:3;17463:67;:::i;:::-;17456:74;;17539:93;17628:3;17539:93;:::i;:::-;17657:2;17652:3;17648:12;17641:19;;17300:366;;;:::o;17672:::-;17814:3;17835:67;17899:2;17894:3;17835:67;:::i;:::-;17828:74;;17911:93;18000:3;17911:93;:::i;:::-;18029:2;18024:3;18020:12;18013:19;;17672:366;;;:::o;18044:::-;18186:3;18207:67;18271:2;18266:3;18207:67;:::i;:::-;18200:74;;18283:93;18372:3;18283:93;:::i;:::-;18401:2;18396:3;18392:12;18385:19;;18044:366;;;:::o;18416:::-;18558:3;18579:67;18643:2;18638:3;18579:67;:::i;:::-;18572:74;;18655:93;18744:3;18655:93;:::i;:::-;18773:2;18768:3;18764:12;18757:19;;18416:366;;;:::o;18788:::-;18930:3;18951:67;19015:2;19010:3;18951:67;:::i;:::-;18944:74;;19027:93;19116:3;19027:93;:::i;:::-;19145:2;19140:3;19136:12;19129:19;;18788:366;;;:::o;19160:::-;19302:3;19323:67;19387:2;19382:3;19323:67;:::i;:::-;19316:74;;19399:93;19488:3;19399:93;:::i;:::-;19517:2;19512:3;19508:12;19501:19;;19160:366;;;:::o;19532:398::-;19691:3;19712:83;19793:1;19788:3;19712:83;:::i;:::-;19705:90;;19804:93;19893:3;19804:93;:::i;:::-;19922:1;19917:3;19913:11;19906:18;;19532:398;;;:::o;19936:366::-;20078:3;20099:67;20163:2;20158:3;20099:67;:::i;:::-;20092:74;;20175:93;20264:3;20175:93;:::i;:::-;20293:2;20288:3;20284:12;20277:19;;19936:366;;;:::o;20308:::-;20450:3;20471:67;20535:2;20530:3;20471:67;:::i;:::-;20464:74;;20547:93;20636:3;20547:93;:::i;:::-;20665:2;20660:3;20656:12;20649:19;;20308:366;;;:::o;20680:::-;20822:3;20843:67;20907:2;20902:3;20843:67;:::i;:::-;20836:74;;20919:93;21008:3;20919:93;:::i;:::-;21037:2;21032:3;21028:12;21021:19;;20680:366;;;:::o;21052:::-;21194:3;21215:67;21279:2;21274:3;21215:67;:::i;:::-;21208:74;;21291:93;21380:3;21291:93;:::i;:::-;21409:2;21404:3;21400:12;21393:19;;21052:366;;;:::o;21424:::-;21566:3;21587:67;21651:2;21646:3;21587:67;:::i;:::-;21580:74;;21663:93;21752:3;21663:93;:::i;:::-;21781:2;21776:3;21772:12;21765:19;;21424:366;;;:::o;21796:108::-;21873:24;21891:5;21873:24;:::i;:::-;21868:3;21861:37;21796:108;;:::o;21910:118::-;21997:24;22015:5;21997:24;:::i;:::-;21992:3;21985:37;21910:118;;:::o;22034:589::-;22259:3;22281:95;22372:3;22363:6;22281:95;:::i;:::-;22274:102;;22393:95;22484:3;22475:6;22393:95;:::i;:::-;22386:102;;22505:92;22593:3;22584:6;22505:92;:::i;:::-;22498:99;;22614:3;22607:10;;22034:589;;;;;;:::o;22629:379::-;22813:3;22835:147;22978:3;22835:147;:::i;:::-;22828:154;;22999:3;22992:10;;22629:379;;;:::o;23014:222::-;23107:4;23145:2;23134:9;23130:18;23122:26;;23158:71;23226:1;23215:9;23211:17;23202:6;23158:71;:::i;:::-;23014:222;;;;:::o;23242:640::-;23437:4;23475:3;23464:9;23460:19;23452:27;;23489:71;23557:1;23546:9;23542:17;23533:6;23489:71;:::i;:::-;23570:72;23638:2;23627:9;23623:18;23614:6;23570:72;:::i;:::-;23652;23720:2;23709:9;23705:18;23696:6;23652:72;:::i;:::-;23771:9;23765:4;23761:20;23756:2;23745:9;23741:18;23734:48;23799:76;23870:4;23861:6;23799:76;:::i;:::-;23791:84;;23242:640;;;;;;;:::o;23888:373::-;24031:4;24069:2;24058:9;24054:18;24046:26;;24118:9;24112:4;24108:20;24104:1;24093:9;24089:17;24082:47;24146:108;24249:4;24240:6;24146:108;:::i;:::-;24138:116;;23888:373;;;;:::o;24267:210::-;24354:4;24392:2;24381:9;24377:18;24369:26;;24405:65;24467:1;24456:9;24452:17;24443:6;24405:65;:::i;:::-;24267:210;;;;:::o;24483:313::-;24596:4;24634:2;24623:9;24619:18;24611:26;;24683:9;24677:4;24673:20;24669:1;24658:9;24654:17;24647:47;24711:78;24784:4;24775:6;24711:78;:::i;:::-;24703:86;;24483:313;;;;:::o;24802:419::-;24968:4;25006:2;24995:9;24991:18;24983:26;;25055:9;25049:4;25045:20;25041:1;25030:9;25026:17;25019:47;25083:131;25209:4;25083:131;:::i;:::-;25075:139;;24802:419;;;:::o;25227:::-;25393:4;25431:2;25420:9;25416:18;25408:26;;25480:9;25474:4;25470:20;25466:1;25455:9;25451:17;25444:47;25508:131;25634:4;25508:131;:::i;:::-;25500:139;;25227:419;;;:::o;25652:::-;25818:4;25856:2;25845:9;25841:18;25833:26;;25905:9;25899:4;25895:20;25891:1;25880:9;25876:17;25869:47;25933:131;26059:4;25933:131;:::i;:::-;25925:139;;25652:419;;;:::o;26077:::-;26243:4;26281:2;26270:9;26266:18;26258:26;;26330:9;26324:4;26320:20;26316:1;26305:9;26301:17;26294:47;26358:131;26484:4;26358:131;:::i;:::-;26350:139;;26077:419;;;:::o;26502:::-;26668:4;26706:2;26695:9;26691:18;26683:26;;26755:9;26749:4;26745:20;26741:1;26730:9;26726:17;26719:47;26783:131;26909:4;26783:131;:::i;:::-;26775:139;;26502:419;;;:::o;26927:::-;27093:4;27131:2;27120:9;27116:18;27108:26;;27180:9;27174:4;27170:20;27166:1;27155:9;27151:17;27144:47;27208:131;27334:4;27208:131;:::i;:::-;27200:139;;26927:419;;;:::o;27352:::-;27518:4;27556:2;27545:9;27541:18;27533:26;;27605:9;27599:4;27595:20;27591:1;27580:9;27576:17;27569:47;27633:131;27759:4;27633:131;:::i;:::-;27625:139;;27352:419;;;:::o;27777:::-;27943:4;27981:2;27970:9;27966:18;27958:26;;28030:9;28024:4;28020:20;28016:1;28005:9;28001:17;27994:47;28058:131;28184:4;28058:131;:::i;:::-;28050:139;;27777:419;;;:::o;28202:::-;28368:4;28406:2;28395:9;28391:18;28383:26;;28455:9;28449:4;28445:20;28441:1;28430:9;28426:17;28419:47;28483:131;28609:4;28483:131;:::i;:::-;28475:139;;28202:419;;;:::o;28627:::-;28793:4;28831:2;28820:9;28816:18;28808:26;;28880:9;28874:4;28870:20;28866:1;28855:9;28851:17;28844:47;28908:131;29034:4;28908:131;:::i;:::-;28900:139;;28627:419;;;:::o;29052:::-;29218:4;29256:2;29245:9;29241:18;29233:26;;29305:9;29299:4;29295:20;29291:1;29280:9;29276:17;29269:47;29333:131;29459:4;29333:131;:::i;:::-;29325:139;;29052:419;;;:::o;29477:::-;29643:4;29681:2;29670:9;29666:18;29658:26;;29730:9;29724:4;29720:20;29716:1;29705:9;29701:17;29694:47;29758:131;29884:4;29758:131;:::i;:::-;29750:139;;29477:419;;;:::o;29902:::-;30068:4;30106:2;30095:9;30091:18;30083:26;;30155:9;30149:4;30145:20;30141:1;30130:9;30126:17;30119:47;30183:131;30309:4;30183:131;:::i;:::-;30175:139;;29902:419;;;:::o;30327:::-;30493:4;30531:2;30520:9;30516:18;30508:26;;30580:9;30574:4;30570:20;30566:1;30555:9;30551:17;30544:47;30608:131;30734:4;30608:131;:::i;:::-;30600:139;;30327:419;;;:::o;30752:::-;30918:4;30956:2;30945:9;30941:18;30933:26;;31005:9;30999:4;30995:20;30991:1;30980:9;30976:17;30969:47;31033:131;31159:4;31033:131;:::i;:::-;31025:139;;30752:419;;;:::o;31177:::-;31343:4;31381:2;31370:9;31366:18;31358:26;;31430:9;31424:4;31420:20;31416:1;31405:9;31401:17;31394:47;31458:131;31584:4;31458:131;:::i;:::-;31450:139;;31177:419;;;:::o;31602:::-;31768:4;31806:2;31795:9;31791:18;31783:26;;31855:9;31849:4;31845:20;31841:1;31830:9;31826:17;31819:47;31883:131;32009:4;31883:131;:::i;:::-;31875:139;;31602:419;;;:::o;32027:::-;32193:4;32231:2;32220:9;32216:18;32208:26;;32280:9;32274:4;32270:20;32266:1;32255:9;32251:17;32244:47;32308:131;32434:4;32308:131;:::i;:::-;32300:139;;32027:419;;;:::o;32452:::-;32618:4;32656:2;32645:9;32641:18;32633:26;;32705:9;32699:4;32695:20;32691:1;32680:9;32676:17;32669:47;32733:131;32859:4;32733:131;:::i;:::-;32725:139;;32452:419;;;:::o;32877:::-;33043:4;33081:2;33070:9;33066:18;33058:26;;33130:9;33124:4;33120:20;33116:1;33105:9;33101:17;33094:47;33158:131;33284:4;33158:131;:::i;:::-;33150:139;;32877:419;;;:::o;33302:::-;33468:4;33506:2;33495:9;33491:18;33483:26;;33555:9;33549:4;33545:20;33541:1;33530:9;33526:17;33519:47;33583:131;33709:4;33583:131;:::i;:::-;33575:139;;33302:419;;;:::o;33727:::-;33893:4;33931:2;33920:9;33916:18;33908:26;;33980:9;33974:4;33970:20;33966:1;33955:9;33951:17;33944:47;34008:131;34134:4;34008:131;:::i;:::-;34000:139;;33727:419;;;:::o;34152:::-;34318:4;34356:2;34345:9;34341:18;34333:26;;34405:9;34399:4;34395:20;34391:1;34380:9;34376:17;34369:47;34433:131;34559:4;34433:131;:::i;:::-;34425:139;;34152:419;;;:::o;34577:222::-;34670:4;34708:2;34697:9;34693:18;34685:26;;34721:71;34789:1;34778:9;34774:17;34765:6;34721:71;:::i;:::-;34577:222;;;;:::o;34805:129::-;34839:6;34866:20;;:::i;:::-;34856:30;;34895:33;34923:4;34915:6;34895:33;:::i;:::-;34805:129;;;:::o;34940:75::-;34973:6;35006:2;35000:9;34990:19;;34940:75;:::o;35021:311::-;35098:4;35188:18;35180:6;35177:30;35174:56;;;35210:18;;:::i;:::-;35174:56;35260:4;35252:6;35248:17;35240:25;;35320:4;35314;35310:15;35302:23;;35021:311;;;:::o;35338:307::-;35399:4;35489:18;35481:6;35478:30;35475:56;;;35511:18;;:::i;:::-;35475:56;35549:29;35571:6;35549:29;:::i;:::-;35541:37;;35633:4;35627;35623:15;35615:23;;35338:307;;;:::o;35651:308::-;35713:4;35803:18;35795:6;35792:30;35789:56;;;35825:18;;:::i;:::-;35789:56;35863:29;35885:6;35863:29;:::i;:::-;35855:37;;35947:4;35941;35937:15;35929:23;;35651:308;;;:::o;35965:132::-;36032:4;36055:3;36047:11;;36085:4;36080:3;36076:14;36068:22;;35965:132;;;:::o;36103:141::-;36152:4;36175:3;36167:11;;36198:3;36195:1;36188:14;36232:4;36229:1;36219:18;36211:26;;36103:141;;;:::o;36250:114::-;36317:6;36351:5;36345:12;36335:22;;36250:114;;;:::o;36370:98::-;36421:6;36455:5;36449:12;36439:22;;36370:98;;;:::o;36474:99::-;36526:6;36560:5;36554:12;36544:22;;36474:99;;;:::o;36579:113::-;36649:4;36681;36676:3;36672:14;36664:22;;36579:113;;;:::o;36698:184::-;36797:11;36831:6;36826:3;36819:19;36871:4;36866:3;36862:14;36847:29;;36698:184;;;;:::o;36888:168::-;36971:11;37005:6;37000:3;36993:19;37045:4;37040:3;37036:14;37021:29;;36888:168;;;;:::o;37062:147::-;37163:11;37200:3;37185:18;;37062:147;;;;:::o;37215:169::-;37299:11;37333:6;37328:3;37321:19;37373:4;37368:3;37364:14;37349:29;;37215:169;;;;:::o;37390:148::-;37492:11;37529:3;37514:18;;37390:148;;;;:::o;37544:305::-;37584:3;37603:20;37621:1;37603:20;:::i;:::-;37598:25;;37637:20;37655:1;37637:20;:::i;:::-;37632:25;;37791:1;37723:66;37719:74;37716:1;37713:81;37710:107;;;37797:18;;:::i;:::-;37710:107;37841:1;37838;37834:9;37827:16;;37544:305;;;;:::o;37855:185::-;37895:1;37912:20;37930:1;37912:20;:::i;:::-;37907:25;;37946:20;37964:1;37946:20;:::i;:::-;37941:25;;37985:1;37975:35;;37990:18;;:::i;:::-;37975:35;38032:1;38029;38025:9;38020:14;;37855:185;;;;:::o;38046:348::-;38086:7;38109:20;38127:1;38109:20;:::i;:::-;38104:25;;38143:20;38161:1;38143:20;:::i;:::-;38138:25;;38331:1;38263:66;38259:74;38256:1;38253:81;38248:1;38241:9;38234:17;38230:105;38227:131;;;38338:18;;:::i;:::-;38227:131;38386:1;38383;38379:9;38368:20;;38046:348;;;;:::o;38400:191::-;38440:4;38460:20;38478:1;38460:20;:::i;:::-;38455:25;;38494:20;38512:1;38494:20;:::i;:::-;38489:25;;38533:1;38530;38527:8;38524:34;;;38538:18;;:::i;:::-;38524:34;38583:1;38580;38576:9;38568:17;;38400:191;;;;:::o;38597:96::-;38634:7;38663:24;38681:5;38663:24;:::i;:::-;38652:35;;38597:96;;;:::o;38699:90::-;38733:7;38776:5;38769:13;38762:21;38751:32;;38699:90;;;:::o;38795:149::-;38831:7;38871:66;38864:5;38860:78;38849:89;;38795:149;;;:::o;38950:126::-;38987:7;39027:42;39020:5;39016:54;39005:65;;38950:126;;;:::o;39082:77::-;39119:7;39148:5;39137:16;;39082:77;;;:::o;39165:154::-;39249:6;39244:3;39239;39226:30;39311:1;39302:6;39297:3;39293:16;39286:27;39165:154;;;:::o;39325:307::-;39393:1;39403:113;39417:6;39414:1;39411:13;39403:113;;;39502:1;39497:3;39493:11;39487:18;39483:1;39478:3;39474:11;39467:39;39439:2;39436:1;39432:10;39427:15;;39403:113;;;39534:6;39531:1;39528:13;39525:101;;;39614:1;39605:6;39600:3;39596:16;39589:27;39525:101;39374:258;39325:307;;;:::o;39638:320::-;39682:6;39719:1;39713:4;39709:12;39699:22;;39766:1;39760:4;39756:12;39787:18;39777:81;;39843:4;39835:6;39831:17;39821:27;;39777:81;39905:2;39897:6;39894:14;39874:18;39871:38;39868:84;;;39924:18;;:::i;:::-;39868:84;39689:269;39638:320;;;:::o;39964:281::-;40047:27;40069:4;40047:27;:::i;:::-;40039:6;40035:40;40177:6;40165:10;40162:22;40141:18;40129:10;40126:34;40123:62;40120:88;;;40188:18;;:::i;:::-;40120:88;40228:10;40224:2;40217:22;40007:238;39964:281;;:::o;40251:233::-;40290:3;40313:24;40331:5;40313:24;:::i;:::-;40304:33;;40359:66;40352:5;40349:77;40346:103;;;40429:18;;:::i;:::-;40346:103;40476:1;40469:5;40465:13;40458:20;;40251:233;;;:::o;40490:176::-;40522:1;40539:20;40557:1;40539:20;:::i;:::-;40534:25;;40573:20;40591:1;40573:20;:::i;:::-;40568:25;;40612:1;40602:35;;40617:18;;:::i;:::-;40602:35;40658:1;40655;40651:9;40646:14;;40490:176;;;;:::o;40672:180::-;40720:77;40717:1;40710:88;40817:4;40814:1;40807:15;40841:4;40838:1;40831:15;40858:180;40906:77;40903:1;40896:88;41003:4;41000:1;40993:15;41027:4;41024:1;41017:15;41044:180;41092:77;41089:1;41082:88;41189:4;41186:1;41179:15;41213:4;41210:1;41203:15;41230:180;41278:77;41275:1;41268:88;41375:4;41372:1;41365:15;41399:4;41396:1;41389:15;41416:180;41464:77;41461:1;41454:88;41561:4;41558:1;41551:15;41585:4;41582:1;41575:15;41602:117;41711:1;41708;41701:12;41725:117;41834:1;41831;41824:12;41848:117;41957:1;41954;41947:12;41971:117;42080:1;42077;42070:12;42094:117;42203:1;42200;42193:12;42217:102;42258:6;42309:2;42305:7;42300:2;42293:5;42289:14;42285:28;42275:38;;42217:102;;;:::o;42325:223::-;42465:34;42461:1;42453:6;42449:14;42442:58;42534:6;42529:2;42521:6;42517:15;42510:31;42325:223;:::o;42554:237::-;42694:34;42690:1;42682:6;42678:14;42671:58;42763:20;42758:2;42750:6;42746:15;42739:45;42554:237;:::o;42797:225::-;42937:34;42933:1;42925:6;42921:14;42914:58;43006:8;43001:2;42993:6;42989:15;42982:33;42797:225;:::o;43028:178::-;43168:30;43164:1;43156:6;43152:14;43145:54;43028:178;:::o;43212:170::-;43352:22;43348:1;43340:6;43336:14;43329:46;43212:170;:::o;43388:223::-;43528:34;43524:1;43516:6;43512:14;43505:58;43597:6;43592:2;43584:6;43580:15;43573:31;43388:223;:::o;43617:175::-;43757:27;43753:1;43745:6;43741:14;43734:51;43617:175;:::o;43798:231::-;43938:34;43934:1;43926:6;43922:14;43915:58;44007:14;44002:2;43994:6;43990:15;43983:39;43798:231;:::o;44035:243::-;44175:34;44171:1;44163:6;44159:14;44152:58;44244:26;44239:2;44231:6;44227:15;44220:51;44035:243;:::o;44284:229::-;44424:34;44420:1;44412:6;44408:14;44401:58;44493:12;44488:2;44480:6;44476:15;44469:37;44284:229;:::o;44519:228::-;44659:34;44655:1;44647:6;44643:14;44636:58;44728:11;44723:2;44715:6;44711:15;44704:36;44519:228;:::o;44753:182::-;44893:34;44889:1;44881:6;44877:14;44870:58;44753:182;:::o;44941:231::-;45081:34;45077:1;45069:6;45065:14;45058:58;45150:14;45145:2;45137:6;45133:15;45126:39;44941:231;:::o;45178:182::-;45318:34;45314:1;45306:6;45302:14;45295:58;45178:182;:::o;45366:173::-;45506:25;45502:1;45494:6;45490:14;45483:49;45366:173;:::o;45545:228::-;45685:34;45681:1;45673:6;45669:14;45662:58;45754:11;45749:2;45741:6;45737:15;45730:36;45545:228;:::o;45779:234::-;45919:34;45915:1;45907:6;45903:14;45896:58;45988:17;45983:2;45975:6;45971:15;45964:42;45779:234;:::o;46019:220::-;46159:34;46155:1;46147:6;46143:14;46136:58;46228:3;46223:2;46215:6;46211:15;46204:28;46019:220;:::o;46245:114::-;;:::o;46365:170::-;46505:22;46501:1;46493:6;46489:14;46482:46;46365:170;:::o;46541:236::-;46681:34;46677:1;46669:6;46665:14;46658:58;46750:19;46745:2;46737:6;46733:15;46726:44;46541:236;:::o;46783:232::-;46923:34;46919:1;46911:6;46907:14;46900:58;46992:15;46987:2;46979:6;46975:15;46968:40;46783:232;:::o;47021:225::-;47161:34;47157:1;47149:6;47145:14;47138:58;47230:8;47225:2;47217:6;47213:15;47206:33;47021:225;:::o;47252:169::-;47392:21;47388:1;47380:6;47376:14;47369:45;47252:169;:::o;47427:122::-;47500:24;47518:5;47500:24;:::i;:::-;47493:5;47490:35;47480:63;;47539:1;47536;47529:12;47480:63;47427:122;:::o;47555:116::-;47625:21;47640:5;47625:21;:::i;:::-;47618:5;47615:32;47605:60;;47661:1;47658;47651:12;47605:60;47555:116;:::o;47677:120::-;47749:23;47766:5;47749:23;:::i;:::-;47742:5;47739:34;47729:62;;47787:1;47784;47777:12;47729:62;47677:120;:::o;47803:122::-;47876:24;47894:5;47876:24;:::i;:::-;47869:5;47866:35;47856:63;;47915:1;47912;47905:12;47856:63;47803:122;:::o

Swarm Source

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