ETH Price: $3,367.02 (-3.42%)

Token

Frankenapes (FRANKENAPE)
 

Overview

Max Total Supply

6,665 FRANKENAPE

Holders

560

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
lifeispainpeko.eth
Balance
10 FRANKENAPE
0xe1ae2073aca222fc02202b93b3c2395d94796213
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

6,666 aesthetically killer collectibles with references from crypto pop culture, and more.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Frankenapes

Compiler Version
v0.8.9+commit.e5eed63a

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-20
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/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/IERC721Receiver.sol

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/token/ERC721/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/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/utils/Context.sol

pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/utils/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/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/ERC721.sol

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/frankenapes.sol

pragma solidity ^0.8.0;



contract Frankenapes is ERC721Enumerable, Ownable {

    using Strings for uint256;

    string _baseTokenURI;
    uint256 private _maxMint = 20;
    uint256 private _price = 666 * 10**14;  // 0.0666 ETH per
    bool public _paused = true;
    uint public constant MAX_ENTRIES = 6666;

    constructor(string memory baseURI) ERC721("Frankenapes", "FRANKENAPE")  {
        setBaseURI(baseURI);

        // team gets the first 42 for giveaways
        mint(msg.sender, 42);
    }

    function mint(address _to, uint256 num) public payable {
        uint256 supply = totalSupply();

        if(msg.sender != owner()) {
          require(!_paused, "Sale Paused");
          require( num < (_maxMint+1),"You can max mint 20 Frankenapes at a time");
          require( msg.value >= _price * num,"Wrong amount of Ether sent");
        }

        require( supply + num < MAX_ENTRIES, "Exceeds maximum supply");

        for(uint256 i; i < num; i++){
          _safeMint( _to, supply + i );
        }
    }

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

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

    function getPrice() public view returns (uint256){
        if(msg.sender == owner()) {
            return 0;
        }
        return _price;
    }

    function setPrice(uint256 _newPrice) public onlyOwner() {
        _price = _newPrice;
    }

    function getMaxMint() public view returns (uint256){
        return _maxMint;
    }

    function setMaxMint(uint256 _newMaxMint) public onlyOwner() {
        _maxMint = _newMaxMint;
    }

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

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

    function pause(bool val) public onlyOwner {
        _paused = val;
    }

    function withdrawAll() public payable onlyOwner {
        require(payable(msg.sender).send(address(this).balance));
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"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":[],"name":"MAX_ENTRIES","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getMaxMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"num","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bool","name":"val","type":"bool"}],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxMint","type":"uint256"}],"name":"setMaxMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"walletOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"payable","type":"function"}]

60806040526014600c5566ec9c58de0a8000600d556001600e60006101000a81548160ff0219169083151502179055503480156200003c57600080fd5b5060405162005ac938038062005ac9833981810160405281019062000062919062001122565b6040518060400160405280600b81526020017f4672616e6b656e617065730000000000000000000000000000000000000000008152506040518060400160405280600a81526020017f4652414e4b454e415045000000000000000000000000000000000000000000008152508160009080519060200190620000e692919062000ed5565b508060019080519060200190620000ff92919062000ed5565b50505062000122620001166200014d60201b60201c565b6200015560201b60201c565b62000133816200021b60201b60201c565b6200014633602a620002c660201b60201c565b50620019d1565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6200022b6200014d60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1662000251620004b660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620002aa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002a190620011d4565b60405180910390fd5b80600b9080519060200190620002c292919062000ed5565b5050565b6000620002d8620004e060201b60201c565b9050620002ea620004b660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146200041b57600e60009054906101000a900460ff161562000370576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003679062001246565b60405180910390fd5b6001600c54620003819190620012a1565b8210620003c5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003bc9062001374565b60405180910390fd5b81600d54620003d5919062001396565b3410156200041a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004119062001447565b60405180910390fd5b5b611a0a82826200042c9190620012a1565b106200046f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200046690620014b9565b60405180910390fd5b60005b82811015620004b0576200049a8482846200048e9190620012a1565b620004ed60201b60201c565b8080620004a790620014db565b91505062000472565b50505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6000600880549050905090565b6200050f8282604051806020016040528060008152506200051360201b60201c565b5050565b6200052583836200058160201b60201c565b6200053a60008484846200076760201b60201c565b6200057c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000573906200159f565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415620005f4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620005eb9062001611565b60405180910390fd5b62000605816200092160201b60201c565b1562000648576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200063f9062001683565b60405180910390fd5b6200065c600083836200098d60201b60201c565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254620006ae9190620012a1565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620007958473ffffffffffffffffffffffffffffffffffffffff1662000ad460201b6200180c1760201c565b1562000914578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620007c76200014d60201b60201c565b8786866040518563ffffffff1660e01b8152600401620007eb949392919062001758565b602060405180830381600087803b1580156200080657600080fd5b505af19250505080156200083a57506040513d601f19601f8201168201806040525081019062000837919062001809565b60015b620008c3573d80600081146200086d576040519150601f19603f3d011682016040523d82523d6000602084013e62000872565b606091505b50600081511415620008bb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620008b2906200159f565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000919565b600190505b949350505050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b620009a583838362000ae760201b6200181f1760201c565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415620009f257620009ec8162000aec60201b60201c565b62000a3a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161462000a395762000a38838262000b3560201b60201c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000a875762000a818162000cb260201b60201c565b62000acf565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161462000ace5762000acd828262000d8e60201b60201c565b5b5b505050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600162000b4f8462000e1a60201b620010631760201c565b62000b5b91906200183b565b905060006007600084815260200190815260200160002054905081811462000c41576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b6000600160088054905062000cc891906200183b565b905060006009600084815260200190815260200160002054905060006008838154811062000cfb5762000cfa62001876565b5b90600052602060002001549050806008838154811062000d205762000d1f62001876565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548062000d725762000d71620018a5565b5b6001900381819060005260206000200160009055905550505050565b600062000da68362000e1a60201b620010631760201c565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141562000e8e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040162000e85906200194a565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b82805462000ee3906200199b565b90600052602060002090601f01602090048101928262000f07576000855562000f53565b82601f1062000f2257805160ff191683800117855562000f53565b8280016001018555821562000f53579182015b8281111562000f5257825182559160200191906001019062000f35565b5b50905062000f62919062000f66565b5090565b5b8082111562000f8157600081600090555060010162000f67565b5090565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b62000fee8262000fa3565b810181811067ffffffffffffffff8211171562001010576200100f62000fb4565b5b80604052505050565b60006200102562000f85565b905062001033828262000fe3565b919050565b600067ffffffffffffffff82111562001056576200105562000fb4565b5b620010618262000fa3565b9050602081019050919050565b60005b838110156200108e57808201518184015260208101905062001071565b838111156200109e576000848401525b50505050565b6000620010bb620010b58462001038565b62001019565b905082815260208101848484011115620010da57620010d962000f9e565b5b620010e78482856200106e565b509392505050565b600082601f83011262001107576200110662000f99565b5b815162001119848260208601620010a4565b91505092915050565b6000602082840312156200113b576200113a62000f8f565b5b600082015167ffffffffffffffff8111156200115c576200115b62000f94565b5b6200116a84828501620010ef565b91505092915050565b600082825260208201905092915050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000620011bc60208362001173565b9150620011c98262001184565b602082019050919050565b60006020820190508181036000830152620011ef81620011ad565b9050919050565b7f53616c6520506175736564000000000000000000000000000000000000000000600082015250565b60006200122e600b8362001173565b91506200123b82620011f6565b602082019050919050565b6000602082019050818103600083015262001261816200121f565b9050919050565b6000819050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000620012ae8262001268565b9150620012bb8362001268565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115620012f357620012f262001272565b5b828201905092915050565b7f596f752063616e206d6178206d696e74203230204672616e6b656e617065732060008201527f617420612074696d650000000000000000000000000000000000000000000000602082015250565b60006200135c60298362001173565b91506200136982620012fe565b604082019050919050565b600060208201905081810360008301526200138f816200134d565b9050919050565b6000620013a38262001268565b9150620013b08362001268565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615620013ec57620013eb62001272565b5b828202905092915050565b7f57726f6e6720616d6f756e74206f662045746865722073656e74000000000000600082015250565b60006200142f601a8362001173565b91506200143c82620013f7565b602082019050919050565b60006020820190508181036000830152620014628162001420565b9050919050565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b6000620014a160168362001173565b9150620014ae8262001469565b602082019050919050565b60006020820190508181036000830152620014d48162001492565b9050919050565b6000620014e88262001268565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156200151e576200151d62001272565b5b600182019050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006200158760328362001173565b9150620015948262001529565b604082019050919050565b60006020820190508181036000830152620015ba8162001578565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000620015f960208362001173565b91506200160682620015c1565b602082019050919050565b600060208201905081810360008301526200162c81620015ea565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006200166b601c8362001173565b9150620016788262001633565b602082019050919050565b600060208201905081810360008301526200169e816200165c565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620016d282620016a5565b9050919050565b620016e481620016c5565b82525050565b620016f58162001268565b82525050565b600081519050919050565b600082825260208201905092915050565b60006200172482620016fb565b62001730818562001706565b9350620017428185602086016200106e565b6200174d8162000fa3565b840191505092915050565b60006080820190506200176f6000830187620016d9565b6200177e6020830186620016d9565b6200178d6040830185620016ea565b8181036060830152620017a1818462001717565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b620017e381620017ac565b8114620017ef57600080fd5b50565b6000815190506200180381620017d8565b92915050565b60006020828403121562001822576200182162000f8f565b5b60006200183284828501620017f2565b91505092915050565b6000620018488262001268565b9150620018558362001268565b9250828210156200186b576200186a62001272565b5b828203905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b600062001932602a8362001173565b91506200193f82620018d4565b604082019050919050565b60006020820190508181036000830152620019658162001923565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620019b457607f821691505b60208210811415620019cb57620019ca6200196c565b5b50919050565b6140e880620019e16000396000f3fe6080604052600436106101cd5760003560e01c806355f804b3116100f757806391b7f5ed11610095578063b88d4fde11610064578063b88d4fde1461065a578063c87b56dd14610683578063e985e9c5146106c0578063f2fde38b146106fd576101cd565b806391b7f5ed146105b257806395d89b41146105db57806398d5fdca14610606578063a22cb46514610631576101cd565b8063715018a6116100d1578063715018a61461053b5780637d4cb96414610552578063853828b61461057d5780638da5cb5b14610587576101cd565b806355f804b3146104985780636352211e146104c157806370a08231146104fe576101cd565b80631f46452f1161016f57806342842e0e1161013e57806342842e0e146103cc578063438b6300146103f55780634f6ccce714610432578063547520fe1461046f576101cd565b80631f46452f1461031f57806323b872dd1461034a5780632f745c591461037357806340c10f19146103b0576101cd565b8063081812fc116101ab578063081812fc14610263578063095ea7b3146102a057806316c61ccc146102c957806318160ddd146102f4576101cd565b806301ffc9a7146101d257806302329a291461020f57806306fdde0314610238575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f491906129f3565b610726565b6040516102069190612a3b565b60405180910390f35b34801561021b57600080fd5b5061023660048036038101906102319190612a82565b6107a0565b005b34801561024457600080fd5b5061024d610839565b60405161025a9190612b48565b60405180910390f35b34801561026f57600080fd5b5061028a60048036038101906102859190612ba0565b6108cb565b6040516102979190612c0e565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c29190612c55565b610950565b005b3480156102d557600080fd5b506102de610a68565b6040516102eb9190612a3b565b60405180910390f35b34801561030057600080fd5b50610309610a7b565b6040516103169190612ca4565b60405180910390f35b34801561032b57600080fd5b50610334610a88565b6040516103419190612ca4565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190612cbf565b610a92565b005b34801561037f57600080fd5b5061039a60048036038101906103959190612c55565b610af2565b6040516103a79190612ca4565b60405180910390f35b6103ca60048036038101906103c59190612c55565b610b97565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190612cbf565b610d56565b005b34801561040157600080fd5b5061041c60048036038101906104179190612d12565b610d76565b6040516104299190612dfd565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190612ba0565b610e24565b6040516104669190612ca4565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190612ba0565b610e95565b005b3480156104a457600080fd5b506104bf60048036038101906104ba9190612f54565b610f1b565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190612ba0565b610fb1565b6040516104f59190612c0e565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190612d12565b611063565b6040516105329190612ca4565b60405180910390f35b34801561054757600080fd5b5061055061111b565b005b34801561055e57600080fd5b506105676111a3565b6040516105749190612ca4565b60405180910390f35b6105856111a9565b005b34801561059357600080fd5b5061059c611265565b6040516105a99190612c0e565b60405180910390f35b3480156105be57600080fd5b506105d960048036038101906105d49190612ba0565b61128f565b005b3480156105e757600080fd5b506105f0611315565b6040516105fd9190612b48565b60405180910390f35b34801561061257600080fd5b5061061b6113a7565b6040516106289190612ca4565b60405180910390f35b34801561063d57600080fd5b5061065860048036038101906106539190612f9d565b6113f6565b005b34801561066657600080fd5b50610681600480360381019061067c919061307e565b611577565b005b34801561068f57600080fd5b506106aa60048036038101906106a59190612ba0565b6115d9565b6040516106b79190612b48565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e29190613101565b611680565b6040516106f49190612a3b565b60405180910390f35b34801561070957600080fd5b50610724600480360381019061071f9190612d12565b611714565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610799575061079882611824565b5b9050919050565b6107a8611906565b73ffffffffffffffffffffffffffffffffffffffff166107c6611265565b73ffffffffffffffffffffffffffffffffffffffff161461081c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108139061318d565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b606060008054610848906131dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610874906131dc565b80156108c15780601f10610896576101008083540402835291602001916108c1565b820191906000526020600020905b8154815290600101906020018083116108a457829003601f168201915b5050505050905090565b60006108d68261190e565b610915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090c90613280565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095b82610fb1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c390613312565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109eb611906565b73ffffffffffffffffffffffffffffffffffffffff161480610a1a5750610a1981610a14611906565b611680565b5b610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a50906133a4565b60405180910390fd5b610a63838361197a565b505050565b600e60009054906101000a900460ff1681565b6000600880549050905090565b6000600c54905090565b610aa3610a9d611906565b82611a33565b610ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad990613436565b60405180910390fd5b610aed838383611b11565b505050565b6000610afd83611063565b8210610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b35906134c8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610ba1610a7b565b9050610bab611265565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cce57600e60009054906101000a900460ff1615610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2490613534565b60405180910390fd5b6001600c54610c3c9190613583565b8210610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c749061364b565b60405180910390fd5b81600d54610c8b919061366b565b341015610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc490613711565b60405180910390fd5b5b611a0a8282610cdd9190613583565b10610d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d149061377d565b60405180910390fd5b60005b82811015610d5057610d3d848284610d389190613583565b611d6d565b8080610d489061379d565b915050610d20565b50505050565b610d7183838360405180602001604052806000815250611577565b505050565b60606000610d8383611063565b905060008167ffffffffffffffff811115610da157610da0612e29565b5b604051908082528060200260200182016040528015610dcf5781602001602082028036833780820191505090505b50905060005b82811015610e1957610de78582610af2565b828281518110610dfa57610df96137e6565b5b6020026020010181815250508080610e119061379d565b915050610dd5565b508092505050919050565b6000610e2e610a7b565b8210610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6690613887565b60405180910390fd5b60088281548110610e8357610e826137e6565b5b90600052602060002001549050919050565b610e9d611906565b73ffffffffffffffffffffffffffffffffffffffff16610ebb611265565b73ffffffffffffffffffffffffffffffffffffffff1614610f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f089061318d565b60405180910390fd5b80600c8190555050565b610f23611906565b73ffffffffffffffffffffffffffffffffffffffff16610f41611265565b73ffffffffffffffffffffffffffffffffffffffff1614610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e9061318d565b60405180910390fd5b80600b9080519060200190610fad9291906128e4565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105190613919565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb906139ab565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611123611906565b73ffffffffffffffffffffffffffffffffffffffff16611141611265565b73ffffffffffffffffffffffffffffffffffffffff1614611197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118e9061318d565b60405180910390fd5b6111a16000611d8b565b565b611a0a81565b6111b1611906565b73ffffffffffffffffffffffffffffffffffffffff166111cf611265565b73ffffffffffffffffffffffffffffffffffffffff1614611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c9061318d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061126357600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611297611906565b73ffffffffffffffffffffffffffffffffffffffff166112b5611265565b73ffffffffffffffffffffffffffffffffffffffff161461130b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113029061318d565b60405180910390fd5b80600d8190555050565b606060018054611324906131dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611350906131dc565b801561139d5780601f106113725761010080835404028352916020019161139d565b820191906000526020600020905b81548152906001019060200180831161138057829003601f168201915b5050505050905090565b60006113b1611265565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156113ed57600090506113f3565b600d5490505b90565b6113fe611906565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561146c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146390613a17565b60405180910390fd5b8060056000611479611906565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611526611906565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161156b9190612a3b565b60405180910390a35050565b611588611582611906565b83611a33565b6115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be90613436565b60405180910390fd5b6115d384848484611e51565b50505050565b60606115e48261190e565b611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a90613aa9565b60405180910390fd5b600061162d611ead565b9050600081511161164d5760405180602001604052806000815250611678565b8061165784611f3f565b604051602001611668929190613b05565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61171c611906565b73ffffffffffffffffffffffffffffffffffffffff1661173a611265565b73ffffffffffffffffffffffffffffffffffffffff1614611790576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117879061318d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790613b9b565b60405180910390fd5b61180981611d8b565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118ef57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806118ff57506118fe826120a0565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119ed83610fb1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a3e8261190e565b611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7490613c2d565b60405180910390fd5b6000611a8883610fb1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611af757508373ffffffffffffffffffffffffffffffffffffffff16611adf846108cb565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b085750611b078185611680565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b3182610fb1565b73ffffffffffffffffffffffffffffffffffffffff1614611b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7e90613cbf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bee90613d51565b60405180910390fd5b611c0283838361210a565b611c0d60008261197a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c5d9190613d71565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb49190613583565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611d8782826040518060200160405280600081525061221e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e5c848484611b11565b611e6884848484612279565b611ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9e90613e17565b60405180910390fd5b50505050565b6060600b8054611ebc906131dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee8906131dc565b8015611f355780601f10611f0a57610100808354040283529160200191611f35565b820191906000526020600020905b815481529060010190602001808311611f1857829003601f168201915b5050505050905090565b60606000821415611f87576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061209b565b600082905060005b60008214611fb9578080611fa29061379d565b915050600a82611fb29190613e66565b9150611f8f565b60008167ffffffffffffffff811115611fd557611fd4612e29565b5b6040519080825280601f01601f1916602001820160405280156120075781602001600182028036833780820191505090505b5090505b60008514612094576001826120209190613d71565b9150600a8561202f9190613e97565b603061203b9190613583565b60f81b818381518110612051576120506137e6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561208d9190613e66565b945061200b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61211583838361181f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121585761215381612410565b612197565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612196576121958382612459565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121da576121d5816125c6565b612219565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612218576122178282612697565b5b5b505050565b6122288383612716565b6122356000848484612279565b612274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226b90613e17565b60405180910390fd5b505050565b600061229a8473ffffffffffffffffffffffffffffffffffffffff1661180c565b15612403578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122c3611906565b8786866040518563ffffffff1660e01b81526004016122e59493929190613f1d565b602060405180830381600087803b1580156122ff57600080fd5b505af192505050801561233057506040513d601f19601f8201168201806040525081019061232d9190613f7e565b60015b6123b3573d8060008114612360576040519150601f19603f3d011682016040523d82523d6000602084013e612365565b606091505b506000815114156123ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a290613e17565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612408565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161246684611063565b6124709190613d71565b9050600060076000848152602001908152602001600020549050818114612555576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125da9190613d71565b905060006009600084815260200190815260200160002054905060006008838154811061260a576126096137e6565b5b90600052602060002001549050806008838154811061262c5761262b6137e6565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061267b5761267a613fab565b5b6001900381819060005260206000200160009055905550505050565b60006126a283611063565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277d90614026565b60405180910390fd5b61278f8161190e565b156127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c690614092565b60405180910390fd5b6127db6000838361210a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461282b9190613583565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546128f0906131dc565b90600052602060002090601f0160209004810192826129125760008555612959565b82601f1061292b57805160ff1916838001178555612959565b82800160010185558215612959579182015b8281111561295857825182559160200191906001019061293d565b5b509050612966919061296a565b5090565b5b8082111561298357600081600090555060010161296b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129d08161299b565b81146129db57600080fd5b50565b6000813590506129ed816129c7565b92915050565b600060208284031215612a0957612a08612991565b5b6000612a17848285016129de565b91505092915050565b60008115159050919050565b612a3581612a20565b82525050565b6000602082019050612a506000830184612a2c565b92915050565b612a5f81612a20565b8114612a6a57600080fd5b50565b600081359050612a7c81612a56565b92915050565b600060208284031215612a9857612a97612991565b5b6000612aa684828501612a6d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ae9578082015181840152602081019050612ace565b83811115612af8576000848401525b50505050565b6000601f19601f8301169050919050565b6000612b1a82612aaf565b612b248185612aba565b9350612b34818560208601612acb565b612b3d81612afe565b840191505092915050565b60006020820190508181036000830152612b628184612b0f565b905092915050565b6000819050919050565b612b7d81612b6a565b8114612b8857600080fd5b50565b600081359050612b9a81612b74565b92915050565b600060208284031215612bb657612bb5612991565b5b6000612bc484828501612b8b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bf882612bcd565b9050919050565b612c0881612bed565b82525050565b6000602082019050612c236000830184612bff565b92915050565b612c3281612bed565b8114612c3d57600080fd5b50565b600081359050612c4f81612c29565b92915050565b60008060408385031215612c6c57612c6b612991565b5b6000612c7a85828601612c40565b9250506020612c8b85828601612b8b565b9150509250929050565b612c9e81612b6a565b82525050565b6000602082019050612cb96000830184612c95565b92915050565b600080600060608486031215612cd857612cd7612991565b5b6000612ce686828701612c40565b9350506020612cf786828701612c40565b9250506040612d0886828701612b8b565b9150509250925092565b600060208284031215612d2857612d27612991565b5b6000612d3684828501612c40565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612d7481612b6a565b82525050565b6000612d868383612d6b565b60208301905092915050565b6000602082019050919050565b6000612daa82612d3f565b612db48185612d4a565b9350612dbf83612d5b565b8060005b83811015612df0578151612dd78882612d7a565b9750612de283612d92565b925050600181019050612dc3565b5085935050505092915050565b60006020820190508181036000830152612e178184612d9f565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612e6182612afe565b810181811067ffffffffffffffff82111715612e8057612e7f612e29565b5b80604052505050565b6000612e93612987565b9050612e9f8282612e58565b919050565b600067ffffffffffffffff821115612ebf57612ebe612e29565b5b612ec882612afe565b9050602081019050919050565b82818337600083830152505050565b6000612ef7612ef284612ea4565b612e89565b905082815260208101848484011115612f1357612f12612e24565b5b612f1e848285612ed5565b509392505050565b600082601f830112612f3b57612f3a612e1f565b5b8135612f4b848260208601612ee4565b91505092915050565b600060208284031215612f6a57612f69612991565b5b600082013567ffffffffffffffff811115612f8857612f87612996565b5b612f9484828501612f26565b91505092915050565b60008060408385031215612fb457612fb3612991565b5b6000612fc285828601612c40565b9250506020612fd385828601612a6d565b9150509250929050565b600067ffffffffffffffff821115612ff857612ff7612e29565b5b61300182612afe565b9050602081019050919050565b600061302161301c84612fdd565b612e89565b90508281526020810184848401111561303d5761303c612e24565b5b613048848285612ed5565b509392505050565b600082601f83011261306557613064612e1f565b5b813561307584826020860161300e565b91505092915050565b6000806000806080858703121561309857613097612991565b5b60006130a687828801612c40565b94505060206130b787828801612c40565b93505060406130c887828801612b8b565b925050606085013567ffffffffffffffff8111156130e9576130e8612996565b5b6130f587828801613050565b91505092959194509250565b6000806040838503121561311857613117612991565b5b600061312685828601612c40565b925050602061313785828601612c40565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613177602083612aba565b915061318282613141565b602082019050919050565b600060208201905081810360008301526131a68161316a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131f457607f821691505b60208210811415613208576132076131ad565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061326a602c83612aba565b91506132758261320e565b604082019050919050565b600060208201905081810360008301526132998161325d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006132fc602183612aba565b9150613307826132a0565b604082019050919050565b6000602082019050818103600083015261332b816132ef565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061338e603883612aba565b915061339982613332565b604082019050919050565b600060208201905081810360008301526133bd81613381565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613420603183612aba565b915061342b826133c4565b604082019050919050565b6000602082019050818103600083015261344f81613413565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006134b2602b83612aba565b91506134bd82613456565b604082019050919050565b600060208201905081810360008301526134e1816134a5565b9050919050565b7f53616c6520506175736564000000000000000000000000000000000000000000600082015250565b600061351e600b83612aba565b9150613529826134e8565b602082019050919050565b6000602082019050818103600083015261354d81613511565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061358e82612b6a565b915061359983612b6a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135ce576135cd613554565b5b828201905092915050565b7f596f752063616e206d6178206d696e74203230204672616e6b656e617065732060008201527f617420612074696d650000000000000000000000000000000000000000000000602082015250565b6000613635602983612aba565b9150613640826135d9565b604082019050919050565b6000602082019050818103600083015261366481613628565b9050919050565b600061367682612b6a565b915061368183612b6a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136ba576136b9613554565b5b828202905092915050565b7f57726f6e6720616d6f756e74206f662045746865722073656e74000000000000600082015250565b60006136fb601a83612aba565b9150613706826136c5565b602082019050919050565b6000602082019050818103600083015261372a816136ee565b9050919050565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b6000613767601683612aba565b915061377282613731565b602082019050919050565b600060208201905081810360008301526137968161375a565b9050919050565b60006137a882612b6a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137db576137da613554565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613871602c83612aba565b915061387c82613815565b604082019050919050565b600060208201905081810360008301526138a081613864565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613903602983612aba565b915061390e826138a7565b604082019050919050565b60006020820190508181036000830152613932816138f6565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613995602a83612aba565b91506139a082613939565b604082019050919050565b600060208201905081810360008301526139c481613988565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613a01601983612aba565b9150613a0c826139cb565b602082019050919050565b60006020820190508181036000830152613a30816139f4565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613a93602f83612aba565b9150613a9e82613a37565b604082019050919050565b60006020820190508181036000830152613ac281613a86565b9050919050565b600081905092915050565b6000613adf82612aaf565b613ae98185613ac9565b9350613af9818560208601612acb565b80840191505092915050565b6000613b118285613ad4565b9150613b1d8284613ad4565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b85602683612aba565b9150613b9082613b29565b604082019050919050565b60006020820190508181036000830152613bb481613b78565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c17602c83612aba565b9150613c2282613bbb565b604082019050919050565b60006020820190508181036000830152613c4681613c0a565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000613ca9602983612aba565b9150613cb482613c4d565b604082019050919050565b60006020820190508181036000830152613cd881613c9c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d3b602483612aba565b9150613d4682613cdf565b604082019050919050565b60006020820190508181036000830152613d6a81613d2e565b9050919050565b6000613d7c82612b6a565b9150613d8783612b6a565b925082821015613d9a57613d99613554565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613e01603283612aba565b9150613e0c82613da5565b604082019050919050565b60006020820190508181036000830152613e3081613df4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e7182612b6a565b9150613e7c83612b6a565b925082613e8c57613e8b613e37565b5b828204905092915050565b6000613ea282612b6a565b9150613ead83612b6a565b925082613ebd57613ebc613e37565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000613eef82613ec8565b613ef98185613ed3565b9350613f09818560208601612acb565b613f1281612afe565b840191505092915050565b6000608082019050613f326000830187612bff565b613f3f6020830186612bff565b613f4c6040830185612c95565b8181036060830152613f5e8184613ee4565b905095945050505050565b600081519050613f78816129c7565b92915050565b600060208284031215613f9457613f93612991565b5b6000613fa284828501613f69565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614010602083612aba565b915061401b82613fda565b602082019050919050565b6000602082019050818103600083015261403f81614003565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061407c601c83612aba565b915061408782614046565b602082019050919050565b600060208201905081810360008301526140ab8161406f565b905091905056fea26469706673582212204f2f99840667beedf68da92aa3c0309b9642041528bb30e3115e2ddbec70fb6664736f6c6343000809003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101cd5760003560e01c806355f804b3116100f757806391b7f5ed11610095578063b88d4fde11610064578063b88d4fde1461065a578063c87b56dd14610683578063e985e9c5146106c0578063f2fde38b146106fd576101cd565b806391b7f5ed146105b257806395d89b41146105db57806398d5fdca14610606578063a22cb46514610631576101cd565b8063715018a6116100d1578063715018a61461053b5780637d4cb96414610552578063853828b61461057d5780638da5cb5b14610587576101cd565b806355f804b3146104985780636352211e146104c157806370a08231146104fe576101cd565b80631f46452f1161016f57806342842e0e1161013e57806342842e0e146103cc578063438b6300146103f55780634f6ccce714610432578063547520fe1461046f576101cd565b80631f46452f1461031f57806323b872dd1461034a5780632f745c591461037357806340c10f19146103b0576101cd565b8063081812fc116101ab578063081812fc14610263578063095ea7b3146102a057806316c61ccc146102c957806318160ddd146102f4576101cd565b806301ffc9a7146101d257806302329a291461020f57806306fdde0314610238575b600080fd5b3480156101de57600080fd5b506101f960048036038101906101f491906129f3565b610726565b6040516102069190612a3b565b60405180910390f35b34801561021b57600080fd5b5061023660048036038101906102319190612a82565b6107a0565b005b34801561024457600080fd5b5061024d610839565b60405161025a9190612b48565b60405180910390f35b34801561026f57600080fd5b5061028a60048036038101906102859190612ba0565b6108cb565b6040516102979190612c0e565b60405180910390f35b3480156102ac57600080fd5b506102c760048036038101906102c29190612c55565b610950565b005b3480156102d557600080fd5b506102de610a68565b6040516102eb9190612a3b565b60405180910390f35b34801561030057600080fd5b50610309610a7b565b6040516103169190612ca4565b60405180910390f35b34801561032b57600080fd5b50610334610a88565b6040516103419190612ca4565b60405180910390f35b34801561035657600080fd5b50610371600480360381019061036c9190612cbf565b610a92565b005b34801561037f57600080fd5b5061039a60048036038101906103959190612c55565b610af2565b6040516103a79190612ca4565b60405180910390f35b6103ca60048036038101906103c59190612c55565b610b97565b005b3480156103d857600080fd5b506103f360048036038101906103ee9190612cbf565b610d56565b005b34801561040157600080fd5b5061041c60048036038101906104179190612d12565b610d76565b6040516104299190612dfd565b60405180910390f35b34801561043e57600080fd5b5061045960048036038101906104549190612ba0565b610e24565b6040516104669190612ca4565b60405180910390f35b34801561047b57600080fd5b5061049660048036038101906104919190612ba0565b610e95565b005b3480156104a457600080fd5b506104bf60048036038101906104ba9190612f54565b610f1b565b005b3480156104cd57600080fd5b506104e860048036038101906104e39190612ba0565b610fb1565b6040516104f59190612c0e565b60405180910390f35b34801561050a57600080fd5b5061052560048036038101906105209190612d12565b611063565b6040516105329190612ca4565b60405180910390f35b34801561054757600080fd5b5061055061111b565b005b34801561055e57600080fd5b506105676111a3565b6040516105749190612ca4565b60405180910390f35b6105856111a9565b005b34801561059357600080fd5b5061059c611265565b6040516105a99190612c0e565b60405180910390f35b3480156105be57600080fd5b506105d960048036038101906105d49190612ba0565b61128f565b005b3480156105e757600080fd5b506105f0611315565b6040516105fd9190612b48565b60405180910390f35b34801561061257600080fd5b5061061b6113a7565b6040516106289190612ca4565b60405180910390f35b34801561063d57600080fd5b5061065860048036038101906106539190612f9d565b6113f6565b005b34801561066657600080fd5b50610681600480360381019061067c919061307e565b611577565b005b34801561068f57600080fd5b506106aa60048036038101906106a59190612ba0565b6115d9565b6040516106b79190612b48565b60405180910390f35b3480156106cc57600080fd5b506106e760048036038101906106e29190613101565b611680565b6040516106f49190612a3b565b60405180910390f35b34801561070957600080fd5b50610724600480360381019061071f9190612d12565b611714565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610799575061079882611824565b5b9050919050565b6107a8611906565b73ffffffffffffffffffffffffffffffffffffffff166107c6611265565b73ffffffffffffffffffffffffffffffffffffffff161461081c576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108139061318d565b60405180910390fd5b80600e60006101000a81548160ff02191690831515021790555050565b606060008054610848906131dc565b80601f0160208091040260200160405190810160405280929190818152602001828054610874906131dc565b80156108c15780601f10610896576101008083540402835291602001916108c1565b820191906000526020600020905b8154815290600101906020018083116108a457829003601f168201915b5050505050905090565b60006108d68261190e565b610915576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161090c90613280565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061095b82610fb1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c390613312565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109eb611906565b73ffffffffffffffffffffffffffffffffffffffff161480610a1a5750610a1981610a14611906565b611680565b5b610a59576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a50906133a4565b60405180910390fd5b610a63838361197a565b505050565b600e60009054906101000a900460ff1681565b6000600880549050905090565b6000600c54905090565b610aa3610a9d611906565b82611a33565b610ae2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ad990613436565b60405180910390fd5b610aed838383611b11565b505050565b6000610afd83611063565b8210610b3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b35906134c8565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6000610ba1610a7b565b9050610bab611265565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614610cce57600e60009054906101000a900460ff1615610c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2490613534565b60405180910390fd5b6001600c54610c3c9190613583565b8210610c7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c749061364b565b60405180910390fd5b81600d54610c8b919061366b565b341015610ccd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc490613711565b60405180910390fd5b5b611a0a8282610cdd9190613583565b10610d1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d149061377d565b60405180910390fd5b60005b82811015610d5057610d3d848284610d389190613583565b611d6d565b8080610d489061379d565b915050610d20565b50505050565b610d7183838360405180602001604052806000815250611577565b505050565b60606000610d8383611063565b905060008167ffffffffffffffff811115610da157610da0612e29565b5b604051908082528060200260200182016040528015610dcf5781602001602082028036833780820191505090505b50905060005b82811015610e1957610de78582610af2565b828281518110610dfa57610df96137e6565b5b6020026020010181815250508080610e119061379d565b915050610dd5565b508092505050919050565b6000610e2e610a7b565b8210610e6f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e6690613887565b60405180910390fd5b60088281548110610e8357610e826137e6565b5b90600052602060002001549050919050565b610e9d611906565b73ffffffffffffffffffffffffffffffffffffffff16610ebb611265565b73ffffffffffffffffffffffffffffffffffffffff1614610f11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f089061318d565b60405180910390fd5b80600c8190555050565b610f23611906565b73ffffffffffffffffffffffffffffffffffffffff16610f41611265565b73ffffffffffffffffffffffffffffffffffffffff1614610f97576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8e9061318d565b60405180910390fd5b80600b9080519060200190610fad9291906128e4565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16141561105a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161105190613919565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156110d4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110cb906139ab565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611123611906565b73ffffffffffffffffffffffffffffffffffffffff16611141611265565b73ffffffffffffffffffffffffffffffffffffffff1614611197576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118e9061318d565b60405180910390fd5b6111a16000611d8b565b565b611a0a81565b6111b1611906565b73ffffffffffffffffffffffffffffffffffffffff166111cf611265565b73ffffffffffffffffffffffffffffffffffffffff1614611225576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121c9061318d565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f1935050505061126357600080fd5b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b611297611906565b73ffffffffffffffffffffffffffffffffffffffff166112b5611265565b73ffffffffffffffffffffffffffffffffffffffff161461130b576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113029061318d565b60405180910390fd5b80600d8190555050565b606060018054611324906131dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611350906131dc565b801561139d5780601f106113725761010080835404028352916020019161139d565b820191906000526020600020905b81548152906001019060200180831161138057829003601f168201915b5050505050905090565b60006113b1611265565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156113ed57600090506113f3565b600d5490505b90565b6113fe611906565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561146c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161146390613a17565b60405180910390fd5b8060056000611479611906565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611526611906565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161156b9190612a3b565b60405180910390a35050565b611588611582611906565b83611a33565b6115c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115be90613436565b60405180910390fd5b6115d384848484611e51565b50505050565b60606115e48261190e565b611623576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161161a90613aa9565b60405180910390fd5b600061162d611ead565b9050600081511161164d5760405180602001604052806000815250611678565b8061165784611f3f565b604051602001611668929190613b05565b6040516020818303038152906040525b915050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61171c611906565b73ffffffffffffffffffffffffffffffffffffffff1661173a611265565b73ffffffffffffffffffffffffffffffffffffffff1614611790576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117879061318d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611800576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f790613b9b565b60405180910390fd5b61180981611d8b565b50565b600080823b905060008111915050919050565b505050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806118ef57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806118ff57506118fe826120a0565b5b9050919050565b600033905090565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166119ed83610fb1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611a3e8261190e565b611a7d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a7490613c2d565b60405180910390fd5b6000611a8883610fb1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611af757508373ffffffffffffffffffffffffffffffffffffffff16611adf846108cb565b73ffffffffffffffffffffffffffffffffffffffff16145b80611b085750611b078185611680565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611b3182610fb1565b73ffffffffffffffffffffffffffffffffffffffff1614611b87576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b7e90613cbf565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611bf7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611bee90613d51565b60405180910390fd5b611c0283838361210a565b611c0d60008261197a565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611c5d9190613d71565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611cb49190613583565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611d8782826040518060200160405280600081525061221e565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b611e5c848484611b11565b611e6884848484612279565b611ea7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e9e90613e17565b60405180910390fd5b50505050565b6060600b8054611ebc906131dc565b80601f0160208091040260200160405190810160405280929190818152602001828054611ee8906131dc565b8015611f355780601f10611f0a57610100808354040283529160200191611f35565b820191906000526020600020905b815481529060010190602001808311611f1857829003601f168201915b5050505050905090565b60606000821415611f87576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061209b565b600082905060005b60008214611fb9578080611fa29061379d565b915050600a82611fb29190613e66565b9150611f8f565b60008167ffffffffffffffff811115611fd557611fd4612e29565b5b6040519080825280601f01601f1916602001820160405280156120075781602001600182028036833780820191505090505b5090505b60008514612094576001826120209190613d71565b9150600a8561202f9190613e97565b603061203b9190613583565b60f81b818381518110612051576120506137e6565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561208d9190613e66565b945061200b565b8093505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b61211583838361181f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156121585761215381612410565b612197565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612196576121958382612459565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156121da576121d5816125c6565b612219565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612218576122178282612697565b5b5b505050565b6122288383612716565b6122356000848484612279565b612274576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226b90613e17565b60405180910390fd5b505050565b600061229a8473ffffffffffffffffffffffffffffffffffffffff1661180c565b15612403578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026122c3611906565b8786866040518563ffffffff1660e01b81526004016122e59493929190613f1d565b602060405180830381600087803b1580156122ff57600080fd5b505af192505050801561233057506040513d601f19601f8201168201806040525081019061232d9190613f7e565b60015b6123b3573d8060008114612360576040519150601f19603f3d011682016040523d82523d6000602084013e612365565b606091505b506000815114156123ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a290613e17565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612408565b600190505b949350505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b6000600161246684611063565b6124709190613d71565b9050600060076000848152602001908152602001600020549050818114612555576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506125da9190613d71565b905060006009600084815260200190815260200160002054905060006008838154811061260a576126096137e6565b5b90600052602060002001549050806008838154811061262c5761262b6137e6565b5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061267b5761267a613fab565b5b6001900381819060005260206000200160009055905550505050565b60006126a283611063565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612786576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277d90614026565b60405180910390fd5b61278f8161190e565b156127cf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127c690614092565b60405180910390fd5b6127db6000838361210a565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461282b9190613583565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546128f0906131dc565b90600052602060002090601f0160209004810192826129125760008555612959565b82601f1061292b57805160ff1916838001178555612959565b82800160010185558215612959579182015b8281111561295857825182559160200191906001019061293d565b5b509050612966919061296a565b5090565b5b8082111561298357600081600090555060010161296b565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6129d08161299b565b81146129db57600080fd5b50565b6000813590506129ed816129c7565b92915050565b600060208284031215612a0957612a08612991565b5b6000612a17848285016129de565b91505092915050565b60008115159050919050565b612a3581612a20565b82525050565b6000602082019050612a506000830184612a2c565b92915050565b612a5f81612a20565b8114612a6a57600080fd5b50565b600081359050612a7c81612a56565b92915050565b600060208284031215612a9857612a97612991565b5b6000612aa684828501612a6d565b91505092915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612ae9578082015181840152602081019050612ace565b83811115612af8576000848401525b50505050565b6000601f19601f8301169050919050565b6000612b1a82612aaf565b612b248185612aba565b9350612b34818560208601612acb565b612b3d81612afe565b840191505092915050565b60006020820190508181036000830152612b628184612b0f565b905092915050565b6000819050919050565b612b7d81612b6a565b8114612b8857600080fd5b50565b600081359050612b9a81612b74565b92915050565b600060208284031215612bb657612bb5612991565b5b6000612bc484828501612b8b565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612bf882612bcd565b9050919050565b612c0881612bed565b82525050565b6000602082019050612c236000830184612bff565b92915050565b612c3281612bed565b8114612c3d57600080fd5b50565b600081359050612c4f81612c29565b92915050565b60008060408385031215612c6c57612c6b612991565b5b6000612c7a85828601612c40565b9250506020612c8b85828601612b8b565b9150509250929050565b612c9e81612b6a565b82525050565b6000602082019050612cb96000830184612c95565b92915050565b600080600060608486031215612cd857612cd7612991565b5b6000612ce686828701612c40565b9350506020612cf786828701612c40565b9250506040612d0886828701612b8b565b9150509250925092565b600060208284031215612d2857612d27612991565b5b6000612d3684828501612c40565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b612d7481612b6a565b82525050565b6000612d868383612d6b565b60208301905092915050565b6000602082019050919050565b6000612daa82612d3f565b612db48185612d4a565b9350612dbf83612d5b565b8060005b83811015612df0578151612dd78882612d7a565b9750612de283612d92565b925050600181019050612dc3565b5085935050505092915050565b60006020820190508181036000830152612e178184612d9f565b905092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b612e6182612afe565b810181811067ffffffffffffffff82111715612e8057612e7f612e29565b5b80604052505050565b6000612e93612987565b9050612e9f8282612e58565b919050565b600067ffffffffffffffff821115612ebf57612ebe612e29565b5b612ec882612afe565b9050602081019050919050565b82818337600083830152505050565b6000612ef7612ef284612ea4565b612e89565b905082815260208101848484011115612f1357612f12612e24565b5b612f1e848285612ed5565b509392505050565b600082601f830112612f3b57612f3a612e1f565b5b8135612f4b848260208601612ee4565b91505092915050565b600060208284031215612f6a57612f69612991565b5b600082013567ffffffffffffffff811115612f8857612f87612996565b5b612f9484828501612f26565b91505092915050565b60008060408385031215612fb457612fb3612991565b5b6000612fc285828601612c40565b9250506020612fd385828601612a6d565b9150509250929050565b600067ffffffffffffffff821115612ff857612ff7612e29565b5b61300182612afe565b9050602081019050919050565b600061302161301c84612fdd565b612e89565b90508281526020810184848401111561303d5761303c612e24565b5b613048848285612ed5565b509392505050565b600082601f83011261306557613064612e1f565b5b813561307584826020860161300e565b91505092915050565b6000806000806080858703121561309857613097612991565b5b60006130a687828801612c40565b94505060206130b787828801612c40565b93505060406130c887828801612b8b565b925050606085013567ffffffffffffffff8111156130e9576130e8612996565b5b6130f587828801613050565b91505092959194509250565b6000806040838503121561311857613117612991565b5b600061312685828601612c40565b925050602061313785828601612c40565b9150509250929050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000613177602083612aba565b915061318282613141565b602082019050919050565b600060208201905081810360008301526131a68161316a565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806131f457607f821691505b60208210811415613208576132076131ad565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b600061326a602c83612aba565b91506132758261320e565b604082019050919050565b600060208201905081810360008301526132998161325d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006132fc602183612aba565b9150613307826132a0565b604082019050919050565b6000602082019050818103600083015261332b816132ef565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b600061338e603883612aba565b915061339982613332565b604082019050919050565b600060208201905081810360008301526133bd81613381565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000613420603183612aba565b915061342b826133c4565b604082019050919050565b6000602082019050818103600083015261344f81613413565b9050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b60006134b2602b83612aba565b91506134bd82613456565b604082019050919050565b600060208201905081810360008301526134e1816134a5565b9050919050565b7f53616c6520506175736564000000000000000000000000000000000000000000600082015250565b600061351e600b83612aba565b9150613529826134e8565b602082019050919050565b6000602082019050818103600083015261354d81613511565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600061358e82612b6a565b915061359983612b6a565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156135ce576135cd613554565b5b828201905092915050565b7f596f752063616e206d6178206d696e74203230204672616e6b656e617065732060008201527f617420612074696d650000000000000000000000000000000000000000000000602082015250565b6000613635602983612aba565b9150613640826135d9565b604082019050919050565b6000602082019050818103600083015261366481613628565b9050919050565b600061367682612b6a565b915061368183612b6a565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156136ba576136b9613554565b5b828202905092915050565b7f57726f6e6720616d6f756e74206f662045746865722073656e74000000000000600082015250565b60006136fb601a83612aba565b9150613706826136c5565b602082019050919050565b6000602082019050818103600083015261372a816136ee565b9050919050565b7f45786365656473206d6178696d756d20737570706c7900000000000000000000600082015250565b6000613767601683612aba565b915061377282613731565b602082019050919050565b600060208201905081810360008301526137968161375a565b9050919050565b60006137a882612b6a565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156137db576137da613554565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000613871602c83612aba565b915061387c82613815565b604082019050919050565b600060208201905081810360008301526138a081613864565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613903602983612aba565b915061390e826138a7565b604082019050919050565b60006020820190508181036000830152613932816138f6565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613995602a83612aba565b91506139a082613939565b604082019050919050565b600060208201905081810360008301526139c481613988565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613a01601983612aba565b9150613a0c826139cb565b602082019050919050565b60006020820190508181036000830152613a30816139f4565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000613a93602f83612aba565b9150613a9e82613a37565b604082019050919050565b60006020820190508181036000830152613ac281613a86565b9050919050565b600081905092915050565b6000613adf82612aaf565b613ae98185613ac9565b9350613af9818560208601612acb565b80840191505092915050565b6000613b118285613ad4565b9150613b1d8284613ad4565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000613b85602683612aba565b9150613b9082613b29565b604082019050919050565b60006020820190508181036000830152613bb481613b78565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613c17602c83612aba565b9150613c2282613bbb565b604082019050919050565b60006020820190508181036000830152613c4681613c0a565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000613ca9602983612aba565b9150613cb482613c4d565b604082019050919050565b60006020820190508181036000830152613cd881613c9c565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000613d3b602483612aba565b9150613d4682613cdf565b604082019050919050565b60006020820190508181036000830152613d6a81613d2e565b9050919050565b6000613d7c82612b6a565b9150613d8783612b6a565b925082821015613d9a57613d99613554565b5b828203905092915050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000613e01603283612aba565b9150613e0c82613da5565b604082019050919050565b60006020820190508181036000830152613e3081613df4565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613e7182612b6a565b9150613e7c83612b6a565b925082613e8c57613e8b613e37565b5b828204905092915050565b6000613ea282612b6a565b9150613ead83612b6a565b925082613ebd57613ebc613e37565b5b828206905092915050565b600081519050919050565b600082825260208201905092915050565b6000613eef82613ec8565b613ef98185613ed3565b9350613f09818560208601612acb565b613f1281612afe565b840191505092915050565b6000608082019050613f326000830187612bff565b613f3f6020830186612bff565b613f4c6040830185612c95565b8181036060830152613f5e8184613ee4565b905095945050505050565b600081519050613f78816129c7565b92915050565b600060208284031215613f9457613f93612991565b5b6000613fa284828501613f69565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614010602083612aba565b915061401b82613fda565b602082019050919050565b6000602082019050818103600083015261403f81614003565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b600061407c601c83612aba565b915061408782614046565b602082019050919050565b600060208201905081810360008301526140ab8161406f565b905091905056fea26469706673582212204f2f99840667beedf68da92aa3c0309b9642041528bb30e3115e2ddbec70fb6664736f6c63430008090033

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

00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : baseURI (string):

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

43171:2290:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34680:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45253:74;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21589:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23148:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22671:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43390:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35320:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44819:85;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24038:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34988:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43671:529;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24448:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44208:342;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35510:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44912:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45143:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21283:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21013:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42473:94;;;;;;;;;;;;;:::i;:::-;;43423:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45335:123;;;:::i;:::-;;41822:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44718:93;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21758:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44558:152;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23441:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24704:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21933:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23807:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42722:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34680:224;34782:4;34821:35;34806:50;;;:11;:50;;;;:90;;;;34860:36;34884:11;34860:23;:36::i;:::-;34806:90;34799:97;;34680:224;;;:::o;45253:74::-;42053:12;:10;:12::i;:::-;42042:23;;:7;:5;:7::i;:::-;:23;;;42034:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45316:3:::1;45306:7;;:13;;;;;;;;;;;;;;;;;;45253:74:::0;:::o;21589:100::-;21643:13;21676:5;21669:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21589:100;:::o;23148:221::-;23224:7;23252:16;23260:7;23252;:16::i;:::-;23244:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23337:15;:24;23353:7;23337:24;;;;;;;;;;;;;;;;;;;;;23330:31;;23148:221;;;:::o;22671:411::-;22752:13;22768:23;22783:7;22768:14;:23::i;:::-;22752:39;;22816:5;22810:11;;:2;:11;;;;22802:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22910:5;22894:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22919:37;22936:5;22943:12;:10;:12::i;:::-;22919:16;:37::i;:::-;22894:62;22872:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23053:21;23062:2;23066:7;23053:8;:21::i;:::-;22741:341;22671:411;;:::o;43390:26::-;;;;;;;;;;;;;:::o;35320:113::-;35381:7;35408:10;:17;;;;35401:24;;35320:113;:::o;44819:85::-;44862:7;44888:8;;44881:15;;44819:85;:::o;24038:339::-;24233:41;24252:12;:10;:12::i;:::-;24266:7;24233:18;:41::i;:::-;24225:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24341:28;24351:4;24357:2;24361:7;24341:9;:28::i;:::-;24038:339;;;:::o;34988:256::-;35085:7;35121:23;35138:5;35121:16;:23::i;:::-;35113:5;:31;35105:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35210:12;:19;35223:5;35210:19;;;;;;;;;;;;;;;:26;35230:5;35210:26;;;;;;;;;;;;35203:33;;34988:256;;;;:::o;43671:529::-;43737:14;43754:13;:11;:13::i;:::-;43737:30;;43797:7;:5;:7::i;:::-;43783:21;;:10;:21;;;43780:245;;43828:7;;;;;;;;;;;43827:8;43819:32;;;;;;;;;;;;:::i;:::-;;;;;;;;;43889:1;43880:8;;:10;;;;:::i;:::-;43873:3;:18;43864:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;43980:3;43971:6;;:12;;;;:::i;:::-;43958:9;:25;;43949:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;43780:245;43458:4;44055:3;44046:6;:12;;;;:::i;:::-;:26;44037:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;44116:9;44112:81;44131:3;44127:1;:7;44112:81;;;44153:28;44164:3;44178:1;44169:6;:10;;;;:::i;:::-;44153:9;:28::i;:::-;44136:3;;;;;:::i;:::-;;;;44112:81;;;;43726:474;43671:529;;:::o;24448:185::-;24586:39;24603:4;24609:2;24613:7;24586:39;;;;;;;;;;;;:16;:39::i;:::-;24448:185;;;:::o;44208:342::-;44267:16;44296:18;44317:17;44327:6;44317:9;:17::i;:::-;44296:38;;44347:25;44389:10;44375:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44347:53;;44415:9;44411:106;44430:10;44426:1;:14;44411:106;;;44475:30;44495:6;44503:1;44475:19;:30::i;:::-;44461:8;44470:1;44461:11;;;;;;;;:::i;:::-;;;;;;;:44;;;;;44442:3;;;;;:::i;:::-;;;;44411:106;;;;44534:8;44527:15;;;;44208:342;;;:::o;35510:233::-;35585:7;35621:30;:28;:30::i;:::-;35613:5;:38;35605:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35718:10;35729:5;35718:17;;;;;;;;:::i;:::-;;;;;;;;;;35711:24;;35510:233;;;:::o;44912:101::-;42053:12;:10;:12::i;:::-;42042:23;;:7;:5;:7::i;:::-;:23;;;42034:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44994:11:::1;44983:8;:22;;;;44912:101:::0;:::o;45143:102::-;42053:12;:10;:12::i;:::-;42042:23;;:7;:5;:7::i;:::-;:23;;;42034:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45230:7:::1;45214:13;:23;;;;;;;;;;;;:::i;:::-;;45143:102:::0;:::o;21283:239::-;21355:7;21375:13;21391:7;:16;21399:7;21391:16;;;;;;;;;;;;;;;;;;;;;21375:32;;21443:1;21426:19;;:5;:19;;;;21418:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21509:5;21502:12;;;21283:239;;;:::o;21013:208::-;21085:7;21130:1;21113:19;;:5;:19;;;;21105:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21197:9;:16;21207:5;21197:16;;;;;;;;;;;;;;;;21190:23;;21013:208;;;:::o;42473:94::-;42053:12;:10;:12::i;:::-;42042:23;;:7;:5;:7::i;:::-;:23;;;42034:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42538:21:::1;42556:1;42538:9;:21::i;:::-;42473:94::o:0;43423:39::-;43458:4;43423:39;:::o;45335:123::-;42053:12;:10;:12::i;:::-;42042:23;;:7;:5;:7::i;:::-;:23;;;42034:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;45410:10:::1;45402:24;;:47;45427:21;45402:47;;;;;;;;;;;;;;;;;;;;;;;45394:56;;;::::0;::::1;;45335:123::o:0;41822:87::-;41868:7;41895:6;;;;;;;;;;;41888:13;;41822:87;:::o;44718:93::-;42053:12;:10;:12::i;:::-;42042:23;;:7;:5;:7::i;:::-;:23;;;42034:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44794:9:::1;44785:6;:18;;;;44718:93:::0;:::o;21758:104::-;21814:13;21847:7;21840:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21758:104;:::o;44558:152::-;44599:7;44635;:5;:7::i;:::-;44621:21;;:10;:21;;;44618:61;;;44666:1;44659:8;;;;44618:61;44696:6;;44689:13;;44558:152;;:::o;23441:295::-;23556:12;:10;:12::i;:::-;23544:24;;:8;:24;;;;23536:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23656:8;23611:18;:32;23630:12;:10;:12::i;:::-;23611:32;;;;;;;;;;;;;;;:42;23644:8;23611:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23709:8;23680:48;;23695:12;:10;:12::i;:::-;23680:48;;;23719:8;23680:48;;;;;;:::i;:::-;;;;;;;;23441:295;;:::o;24704:328::-;24879:41;24898:12;:10;:12::i;:::-;24912:7;24879:18;:41::i;:::-;24871:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24985:39;24999:4;25005:2;25009:7;25018:5;24985:13;:39::i;:::-;24704:328;;;;:::o;21933:334::-;22006:13;22040:16;22048:7;22040;:16::i;:::-;22032:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22121:21;22145:10;:8;:10::i;:::-;22121:34;;22197:1;22179:7;22173:21;:25;:86;;;;;;;;;;;;;;;;;22225:7;22234:18;:7;:16;:18::i;:::-;22208:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22173:86;22166:93;;;21933:334;;;:::o;23807:164::-;23904:4;23928:18;:25;23947:5;23928:25;;;;;;;;;;;;;;;:35;23954:8;23928:35;;;;;;;;;;;;;;;;;;;;;;;;;23921:42;;23807:164;;;;:::o;42722:192::-;42053:12;:10;:12::i;:::-;42042:23;;:7;:5;:7::i;:::-;:23;;;42034:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42831:1:::1;42811:22;;:8;:22;;;;42803:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42887:19;42897:8;42887:9;:19::i;:::-;42722:192:::0;:::o;8126:387::-;8186:4;8394:12;8461:7;8449:20;8441:28;;8504:1;8497:4;:8;8490:15;;;8126:387;;;:::o;32634:126::-;;;;:::o;20644:305::-;20746:4;20798:25;20783:40;;;:11;:40;;;;:105;;;;20855:33;20840:48;;;:11;:48;;;;20783:105;:158;;;;20905:36;20929:11;20905:23;:36::i;:::-;20783:158;20763:178;;20644:305;;;:::o;16078:98::-;16131:7;16158:10;16151:17;;16078:98;:::o;26542:127::-;26607:4;26659:1;26631:30;;:7;:16;26639:7;26631:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26624:37;;26542:127;;;:::o;30524:174::-;30626:2;30599:15;:24;30615:7;30599:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30682:7;30678:2;30644:46;;30653:23;30668:7;30653:14;:23::i;:::-;30644:46;;;;;;;;;;;;30524:174;;:::o;26836:348::-;26929:4;26954:16;26962:7;26954;:16::i;:::-;26946:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27030:13;27046:23;27061:7;27046:14;:23::i;:::-;27030:39;;27099:5;27088:16;;:7;:16;;;:51;;;;27132:7;27108:31;;:20;27120:7;27108:11;:20::i;:::-;:31;;;27088:51;:87;;;;27143:32;27160:5;27167:7;27143:16;:32::i;:::-;27088:87;27080:96;;;26836:348;;;;:::o;29828:578::-;29987:4;29960:31;;:23;29975:7;29960:14;:23::i;:::-;:31;;;29952:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30070:1;30056:16;;:2;:16;;;;30048:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30126:39;30147:4;30153:2;30157:7;30126:20;:39::i;:::-;30230:29;30247:1;30251:7;30230:8;:29::i;:::-;30291:1;30272:9;:15;30282:4;30272:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30320:1;30303:9;:13;30313:2;30303:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30351:2;30332:7;:16;30340:7;30332:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30390:7;30386:2;30371:27;;30380:4;30371:27;;;;;;;;;;;;29828:578;;;:::o;27526:110::-;27602:26;27612:2;27616:7;27602:26;;;;;;;;;;;;:9;:26::i;:::-;27526:110;;:::o;42922:173::-;42978:16;42997:6;;;;;;;;;;;42978:25;;43023:8;43014:6;;:17;;;;;;;;;;;;;;;;;;43078:8;43047:40;;43068:8;43047:40;;;;;;;;;;;;42967:128;42922:173;:::o;25914:315::-;26071:28;26081:4;26087:2;26091:7;26071:9;:28::i;:::-;26118:48;26141:4;26147:2;26151:7;26160:5;26118:22;:48::i;:::-;26110:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25914:315;;;;:::o;45021:114::-;45081:13;45114;45107:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45021:114;:::o;16599:723::-;16655:13;16885:1;16876:5;:10;16872:53;;;16903:10;;;;;;;;;;;;;;;;;;;;;16872:53;16935:12;16950:5;16935:20;;16966:14;16991:78;17006:1;16998:4;:9;16991:78;;17024:8;;;;;:::i;:::-;;;;17055:2;17047:10;;;;;:::i;:::-;;;16991:78;;;17079:19;17111:6;17101:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17079:39;;17129:154;17145:1;17136:5;:10;17129:154;;17173:1;17163:11;;;;;:::i;:::-;;;17240:2;17232:5;:10;;;;:::i;:::-;17219:2;:24;;;;:::i;:::-;17206:39;;17189:6;17196;17189:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17269:2;17260:11;;;;;:::i;:::-;;;17129:154;;;17307:6;17293:21;;;;;16599:723;;;;:::o;19152:157::-;19237:4;19276:25;19261:40;;;:11;:40;;;;19254:47;;19152:157;;;:::o;36356:589::-;36500:45;36527:4;36533:2;36537:7;36500:26;:45::i;:::-;36578:1;36562:18;;:4;:18;;;36558:187;;;36597:40;36629:7;36597:31;:40::i;:::-;36558:187;;;36667:2;36659:10;;:4;:10;;;36655:90;;36686:47;36719:4;36725:7;36686:32;:47::i;:::-;36655:90;36558:187;36773:1;36759:16;;:2;:16;;;36755:183;;;36792:45;36829:7;36792:36;:45::i;:::-;36755:183;;;36865:4;36859:10;;:2;:10;;;36855:83;;36886:40;36914:2;36918:7;36886:27;:40::i;:::-;36855:83;36755:183;36356:589;;;:::o;27863:321::-;27993:18;27999:2;28003:7;27993:5;:18::i;:::-;28044:54;28075:1;28079:2;28083:7;28092:5;28044:22;:54::i;:::-;28022:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27863:321;;;:::o;31263:799::-;31418:4;31439:15;:2;:13;;;:15::i;:::-;31435:620;;;31491:2;31475:36;;;31512:12;:10;:12::i;:::-;31526:4;31532:7;31541:5;31475:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31471:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31734:1;31717:6;:13;:18;31713:272;;;31760:60;;;;;;;;;;:::i;:::-;;;;;;;;31713:272;31935:6;31929:13;31920:6;31916:2;31912:15;31905:38;31471:529;31608:41;;;31598:51;;;:6;:51;;;;31591:58;;;;;31435:620;32039:4;32032:11;;31263:799;;;;;;;:::o;37668:164::-;37772:10;:17;;;;37745:15;:24;37761:7;37745:24;;;;;;;;;;;:44;;;;37800:10;37816:7;37800:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37668:164;:::o;38459:988::-;38725:22;38775:1;38750:22;38767:4;38750:16;:22::i;:::-;:26;;;;:::i;:::-;38725:51;;38787:18;38808:17;:26;38826:7;38808:26;;;;;;;;;;;;38787:47;;38955:14;38941:10;:28;38937:328;;38986:19;39008:12;:18;39021:4;39008:18;;;;;;;;;;;;;;;:34;39027:14;39008:34;;;;;;;;;;;;38986:56;;39092:11;39059:12;:18;39072:4;39059:18;;;;;;;;;;;;;;;:30;39078:10;39059:30;;;;;;;;;;;:44;;;;39209:10;39176:17;:30;39194:11;39176:30;;;;;;;;;;;:43;;;;38971:294;38937:328;39361:17;:26;39379:7;39361:26;;;;;;;;;;;39354:33;;;39405:12;:18;39418:4;39405:18;;;;;;;;;;;;;;;:34;39424:14;39405:34;;;;;;;;;;;39398:41;;;38540:907;;38459:988;;:::o;39742:1079::-;39995:22;40040:1;40020:10;:17;;;;:21;;;;:::i;:::-;39995:46;;40052:18;40073:15;:24;40089:7;40073:24;;;;;;;;;;;;40052:45;;40424:19;40446:10;40457:14;40446:26;;;;;;;;:::i;:::-;;;;;;;;;;40424:48;;40510:11;40485:10;40496;40485:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;40621:10;40590:15;:28;40606:11;40590:28;;;;;;;;;;;:41;;;;40762:15;:24;40778:7;40762:24;;;;;;;;;;;40755:31;;;40797:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;39813:1008;;;39742:1079;:::o;37246:221::-;37331:14;37348:20;37365:2;37348:16;:20::i;:::-;37331:37;;37406:7;37379:12;:16;37392:2;37379:16;;;;;;;;;;;;;;;:24;37396:6;37379:24;;;;;;;;;;;:34;;;;37453:6;37424:17;:26;37442:7;37424:26;;;;;;;;;;;:35;;;;37320:147;37246:221;;:::o;28520:382::-;28614:1;28600:16;;:2;:16;;;;28592:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28673:16;28681:7;28673;:16::i;:::-;28672:17;28664:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28735:45;28764:1;28768:2;28772:7;28735:20;:45::i;:::-;28810:1;28793:9;:13;28803:2;28793:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28841:2;28822:7;:16;28830:7;28822:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28886:7;28882:2;28861:33;;28878:1;28861:33;;;;;;;;;;;;28520:382;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:116::-;1588:21;1603:5;1588:21;:::i;:::-;1581:5;1578:32;1568:60;;1624:1;1621;1614:12;1568:60;1518:116;:::o;1640:133::-;1683:5;1721:6;1708:20;1699:29;;1737:30;1761:5;1737:30;:::i;:::-;1640:133;;;;:::o;1779:323::-;1835:6;1884:2;1872:9;1863:7;1859:23;1855:32;1852:119;;;1890:79;;:::i;:::-;1852:119;2010:1;2035:50;2077:7;2068:6;2057:9;2053:22;2035:50;:::i;:::-;2025:60;;1981:114;1779:323;;;;:::o;2108:99::-;2160:6;2194:5;2188:12;2178:22;;2108:99;;;:::o;2213:169::-;2297:11;2331:6;2326:3;2319:19;2371:4;2366:3;2362:14;2347:29;;2213:169;;;;:::o;2388:307::-;2456:1;2466:113;2480:6;2477:1;2474:13;2466:113;;;2565:1;2560:3;2556:11;2550:18;2546:1;2541:3;2537:11;2530:39;2502:2;2499:1;2495:10;2490:15;;2466:113;;;2597:6;2594:1;2591:13;2588:101;;;2677:1;2668:6;2663:3;2659:16;2652:27;2588:101;2437:258;2388:307;;;:::o;2701:102::-;2742:6;2793:2;2789:7;2784:2;2777:5;2773:14;2769:28;2759:38;;2701:102;;;:::o;2809:364::-;2897:3;2925:39;2958:5;2925:39;:::i;:::-;2980:71;3044:6;3039:3;2980:71;:::i;:::-;2973:78;;3060:52;3105:6;3100:3;3093:4;3086:5;3082:16;3060:52;:::i;:::-;3137:29;3159:6;3137:29;:::i;:::-;3132:3;3128:39;3121:46;;2901:272;2809:364;;;;:::o;3179:313::-;3292:4;3330:2;3319:9;3315:18;3307:26;;3379:9;3373:4;3369:20;3365:1;3354:9;3350:17;3343:47;3407:78;3480:4;3471:6;3407:78;:::i;:::-;3399:86;;3179:313;;;;:::o;3498:77::-;3535:7;3564:5;3553:16;;3498:77;;;:::o;3581:122::-;3654:24;3672:5;3654:24;:::i;:::-;3647:5;3644:35;3634:63;;3693:1;3690;3683:12;3634:63;3581:122;:::o;3709:139::-;3755:5;3793:6;3780:20;3771:29;;3809:33;3836:5;3809:33;:::i;:::-;3709:139;;;;:::o;3854:329::-;3913:6;3962:2;3950:9;3941:7;3937:23;3933:32;3930:119;;;3968:79;;:::i;:::-;3930:119;4088:1;4113:53;4158:7;4149:6;4138:9;4134:22;4113:53;:::i;:::-;4103:63;;4059:117;3854:329;;;;:::o;4189:126::-;4226:7;4266:42;4259:5;4255:54;4244:65;;4189:126;;;:::o;4321:96::-;4358:7;4387:24;4405:5;4387:24;:::i;:::-;4376:35;;4321:96;;;:::o;4423:118::-;4510:24;4528:5;4510:24;:::i;:::-;4505:3;4498:37;4423:118;;:::o;4547:222::-;4640:4;4678:2;4667:9;4663:18;4655:26;;4691:71;4759:1;4748:9;4744:17;4735:6;4691:71;:::i;:::-;4547:222;;;;:::o;4775:122::-;4848:24;4866:5;4848:24;:::i;:::-;4841:5;4838:35;4828:63;;4887:1;4884;4877:12;4828:63;4775:122;:::o;4903:139::-;4949:5;4987:6;4974:20;4965:29;;5003:33;5030:5;5003:33;:::i;:::-;4903:139;;;;:::o;5048:474::-;5116:6;5124;5173:2;5161:9;5152:7;5148:23;5144:32;5141:119;;;5179:79;;:::i;:::-;5141:119;5299:1;5324:53;5369:7;5360:6;5349:9;5345:22;5324:53;:::i;:::-;5314:63;;5270:117;5426:2;5452:53;5497:7;5488:6;5477:9;5473:22;5452:53;:::i;:::-;5442:63;;5397:118;5048:474;;;;;:::o;5528:118::-;5615:24;5633:5;5615:24;:::i;:::-;5610:3;5603:37;5528:118;;:::o;5652:222::-;5745:4;5783:2;5772:9;5768:18;5760:26;;5796:71;5864:1;5853:9;5849:17;5840:6;5796:71;:::i;:::-;5652:222;;;;:::o;5880:619::-;5957:6;5965;5973;6022:2;6010:9;6001:7;5997:23;5993:32;5990:119;;;6028:79;;:::i;:::-;5990:119;6148:1;6173:53;6218:7;6209:6;6198:9;6194:22;6173:53;:::i;:::-;6163:63;;6119:117;6275:2;6301:53;6346:7;6337:6;6326:9;6322:22;6301:53;:::i;:::-;6291:63;;6246:118;6403:2;6429:53;6474:7;6465:6;6454:9;6450:22;6429:53;:::i;:::-;6419:63;;6374:118;5880:619;;;;;:::o;6505:329::-;6564:6;6613:2;6601:9;6592:7;6588:23;6584:32;6581:119;;;6619:79;;:::i;:::-;6581:119;6739:1;6764:53;6809:7;6800:6;6789:9;6785:22;6764:53;:::i;:::-;6754:63;;6710:117;6505:329;;;;:::o;6840:114::-;6907:6;6941:5;6935:12;6925:22;;6840:114;;;:::o;6960:184::-;7059:11;7093:6;7088:3;7081:19;7133:4;7128:3;7124:14;7109:29;;6960:184;;;;:::o;7150:132::-;7217:4;7240:3;7232:11;;7270:4;7265:3;7261:14;7253:22;;7150:132;;;:::o;7288:108::-;7365:24;7383:5;7365:24;:::i;:::-;7360:3;7353:37;7288:108;;:::o;7402:179::-;7471:10;7492:46;7534:3;7526:6;7492:46;:::i;:::-;7570:4;7565:3;7561:14;7547:28;;7402:179;;;;:::o;7587:113::-;7657:4;7689;7684:3;7680:14;7672:22;;7587:113;;;:::o;7736:732::-;7855:3;7884:54;7932:5;7884:54;:::i;:::-;7954:86;8033:6;8028:3;7954:86;:::i;:::-;7947:93;;8064:56;8114:5;8064:56;:::i;:::-;8143:7;8174:1;8159:284;8184:6;8181:1;8178:13;8159:284;;;8260:6;8254:13;8287:63;8346:3;8331:13;8287:63;:::i;:::-;8280:70;;8373:60;8426:6;8373:60;:::i;:::-;8363:70;;8219:224;8206:1;8203;8199:9;8194:14;;8159:284;;;8163:14;8459:3;8452:10;;7860:608;;;7736:732;;;;:::o;8474:373::-;8617:4;8655:2;8644:9;8640:18;8632:26;;8704:9;8698:4;8694:20;8690:1;8679:9;8675:17;8668:47;8732:108;8835:4;8826:6;8732:108;:::i;:::-;8724:116;;8474:373;;;;:::o;8853:117::-;8962:1;8959;8952:12;8976:117;9085:1;9082;9075:12;9099:180;9147:77;9144:1;9137:88;9244:4;9241:1;9234:15;9268:4;9265:1;9258:15;9285:281;9368:27;9390:4;9368:27;:::i;:::-;9360:6;9356:40;9498:6;9486:10;9483:22;9462:18;9450:10;9447:34;9444:62;9441:88;;;9509:18;;:::i;:::-;9441:88;9549:10;9545:2;9538:22;9328:238;9285:281;;:::o;9572:129::-;9606:6;9633:20;;:::i;:::-;9623:30;;9662:33;9690:4;9682:6;9662:33;:::i;:::-;9572:129;;;:::o;9707:308::-;9769:4;9859:18;9851:6;9848:30;9845:56;;;9881:18;;:::i;:::-;9845:56;9919:29;9941:6;9919:29;:::i;:::-;9911:37;;10003:4;9997;9993:15;9985:23;;9707:308;;;:::o;10021:154::-;10105:6;10100:3;10095;10082:30;10167:1;10158:6;10153:3;10149:16;10142:27;10021:154;;;:::o;10181:412::-;10259:5;10284:66;10300:49;10342:6;10300:49;:::i;:::-;10284:66;:::i;:::-;10275:75;;10373:6;10366:5;10359:21;10411:4;10404:5;10400:16;10449:3;10440:6;10435:3;10431:16;10428:25;10425:112;;;10456:79;;:::i;:::-;10425:112;10546:41;10580:6;10575:3;10570;10546:41;:::i;:::-;10265:328;10181:412;;;;;:::o;10613:340::-;10669:5;10718:3;10711:4;10703:6;10699:17;10695:27;10685:122;;10726:79;;:::i;:::-;10685:122;10843:6;10830:20;10868:79;10943:3;10935:6;10928:4;10920:6;10916:17;10868:79;:::i;:::-;10859:88;;10675:278;10613:340;;;;:::o;10959:509::-;11028:6;11077:2;11065:9;11056:7;11052:23;11048:32;11045:119;;;11083:79;;:::i;:::-;11045:119;11231:1;11220:9;11216:17;11203:31;11261:18;11253:6;11250:30;11247:117;;;11283:79;;:::i;:::-;11247:117;11388:63;11443:7;11434:6;11423:9;11419:22;11388:63;:::i;:::-;11378:73;;11174:287;10959:509;;;;:::o;11474:468::-;11539:6;11547;11596:2;11584:9;11575:7;11571:23;11567:32;11564:119;;;11602:79;;:::i;:::-;11564:119;11722:1;11747:53;11792:7;11783:6;11772:9;11768:22;11747:53;:::i;:::-;11737:63;;11693:117;11849:2;11875:50;11917:7;11908:6;11897:9;11893:22;11875:50;:::i;:::-;11865:60;;11820:115;11474:468;;;;;:::o;11948:307::-;12009:4;12099:18;12091:6;12088:30;12085:56;;;12121:18;;:::i;:::-;12085:56;12159:29;12181:6;12159:29;:::i;:::-;12151:37;;12243:4;12237;12233:15;12225:23;;11948:307;;;:::o;12261:410::-;12338:5;12363:65;12379:48;12420:6;12379:48;:::i;:::-;12363:65;:::i;:::-;12354:74;;12451:6;12444:5;12437:21;12489:4;12482:5;12478:16;12527:3;12518:6;12513:3;12509:16;12506:25;12503:112;;;12534:79;;:::i;:::-;12503:112;12624:41;12658:6;12653:3;12648;12624:41;:::i;:::-;12344:327;12261:410;;;;;:::o;12690:338::-;12745:5;12794:3;12787:4;12779:6;12775:17;12771:27;12761:122;;12802:79;;:::i;:::-;12761:122;12919:6;12906:20;12944:78;13018:3;13010:6;13003:4;12995:6;12991:17;12944:78;:::i;:::-;12935:87;;12751:277;12690:338;;;;:::o;13034:943::-;13129:6;13137;13145;13153;13202:3;13190:9;13181:7;13177:23;13173:33;13170:120;;;13209:79;;:::i;:::-;13170:120;13329:1;13354:53;13399:7;13390:6;13379:9;13375:22;13354:53;:::i;:::-;13344:63;;13300:117;13456:2;13482:53;13527:7;13518:6;13507:9;13503:22;13482:53;:::i;:::-;13472:63;;13427:118;13584:2;13610:53;13655:7;13646:6;13635:9;13631:22;13610:53;:::i;:::-;13600:63;;13555:118;13740:2;13729:9;13725:18;13712:32;13771:18;13763:6;13760:30;13757:117;;;13793:79;;:::i;:::-;13757:117;13898:62;13952:7;13943:6;13932:9;13928:22;13898:62;:::i;:::-;13888:72;;13683:287;13034:943;;;;;;;:::o;13983:474::-;14051:6;14059;14108:2;14096:9;14087:7;14083:23;14079:32;14076:119;;;14114:79;;:::i;:::-;14076:119;14234:1;14259:53;14304:7;14295:6;14284:9;14280:22;14259:53;:::i;:::-;14249:63;;14205:117;14361:2;14387:53;14432:7;14423:6;14412:9;14408:22;14387:53;:::i;:::-;14377:63;;14332:118;13983:474;;;;;:::o;14463:182::-;14603:34;14599:1;14591:6;14587:14;14580:58;14463:182;:::o;14651:366::-;14793:3;14814:67;14878:2;14873:3;14814:67;:::i;:::-;14807:74;;14890:93;14979:3;14890:93;:::i;:::-;15008:2;15003:3;14999:12;14992:19;;14651:366;;;:::o;15023:419::-;15189:4;15227:2;15216:9;15212:18;15204:26;;15276:9;15270:4;15266:20;15262:1;15251:9;15247:17;15240:47;15304:131;15430:4;15304:131;:::i;:::-;15296:139;;15023:419;;;:::o;15448:180::-;15496:77;15493:1;15486:88;15593:4;15590:1;15583:15;15617:4;15614:1;15607:15;15634:320;15678:6;15715:1;15709:4;15705:12;15695:22;;15762:1;15756:4;15752:12;15783:18;15773:81;;15839:4;15831:6;15827:17;15817:27;;15773:81;15901:2;15893:6;15890:14;15870:18;15867:38;15864:84;;;15920:18;;:::i;:::-;15864:84;15685:269;15634:320;;;:::o;15960:231::-;16100:34;16096:1;16088:6;16084:14;16077:58;16169:14;16164:2;16156:6;16152:15;16145:39;15960:231;:::o;16197:366::-;16339:3;16360:67;16424:2;16419:3;16360:67;:::i;:::-;16353:74;;16436:93;16525:3;16436:93;:::i;:::-;16554:2;16549:3;16545:12;16538:19;;16197:366;;;:::o;16569:419::-;16735:4;16773:2;16762:9;16758:18;16750:26;;16822:9;16816:4;16812:20;16808:1;16797:9;16793:17;16786:47;16850:131;16976:4;16850:131;:::i;:::-;16842:139;;16569:419;;;:::o;16994:220::-;17134:34;17130:1;17122:6;17118:14;17111:58;17203:3;17198:2;17190:6;17186:15;17179:28;16994:220;:::o;17220:366::-;17362:3;17383:67;17447:2;17442:3;17383:67;:::i;:::-;17376:74;;17459:93;17548:3;17459:93;:::i;:::-;17577:2;17572:3;17568:12;17561:19;;17220:366;;;:::o;17592:419::-;17758:4;17796:2;17785:9;17781:18;17773:26;;17845:9;17839:4;17835:20;17831:1;17820:9;17816:17;17809:47;17873:131;17999:4;17873:131;:::i;:::-;17865:139;;17592:419;;;:::o;18017:243::-;18157:34;18153:1;18145:6;18141:14;18134:58;18226:26;18221:2;18213:6;18209:15;18202:51;18017:243;:::o;18266:366::-;18408:3;18429:67;18493:2;18488:3;18429:67;:::i;:::-;18422:74;;18505:93;18594:3;18505:93;:::i;:::-;18623:2;18618:3;18614:12;18607:19;;18266:366;;;:::o;18638:419::-;18804:4;18842:2;18831:9;18827:18;18819:26;;18891:9;18885:4;18881:20;18877:1;18866:9;18862:17;18855:47;18919:131;19045:4;18919:131;:::i;:::-;18911:139;;18638:419;;;:::o;19063:236::-;19203:34;19199:1;19191:6;19187:14;19180:58;19272:19;19267:2;19259:6;19255:15;19248:44;19063:236;:::o;19305:366::-;19447:3;19468:67;19532:2;19527:3;19468:67;:::i;:::-;19461:74;;19544:93;19633:3;19544:93;:::i;:::-;19662:2;19657:3;19653:12;19646:19;;19305:366;;;:::o;19677:419::-;19843:4;19881:2;19870:9;19866:18;19858:26;;19930:9;19924:4;19920:20;19916:1;19905:9;19901:17;19894:47;19958:131;20084:4;19958:131;:::i;:::-;19950:139;;19677:419;;;:::o;20102:230::-;20242:34;20238:1;20230:6;20226:14;20219:58;20311:13;20306:2;20298:6;20294:15;20287:38;20102:230;:::o;20338:366::-;20480:3;20501:67;20565:2;20560:3;20501:67;:::i;:::-;20494:74;;20577:93;20666:3;20577:93;:::i;:::-;20695:2;20690:3;20686:12;20679:19;;20338:366;;;:::o;20710:419::-;20876:4;20914:2;20903:9;20899:18;20891:26;;20963:9;20957:4;20953:20;20949:1;20938:9;20934:17;20927:47;20991:131;21117:4;20991:131;:::i;:::-;20983:139;;20710:419;;;:::o;21135:161::-;21275:13;21271:1;21263:6;21259:14;21252:37;21135:161;:::o;21302:366::-;21444:3;21465:67;21529:2;21524:3;21465:67;:::i;:::-;21458:74;;21541:93;21630:3;21541:93;:::i;:::-;21659:2;21654:3;21650:12;21643:19;;21302:366;;;:::o;21674:419::-;21840:4;21878:2;21867:9;21863:18;21855:26;;21927:9;21921:4;21917:20;21913:1;21902:9;21898:17;21891:47;21955:131;22081:4;21955:131;:::i;:::-;21947:139;;21674:419;;;:::o;22099:180::-;22147:77;22144:1;22137:88;22244:4;22241:1;22234:15;22268:4;22265:1;22258:15;22285:305;22325:3;22344:20;22362:1;22344:20;:::i;:::-;22339:25;;22378:20;22396:1;22378:20;:::i;:::-;22373:25;;22532:1;22464:66;22460:74;22457:1;22454:81;22451:107;;;22538:18;;:::i;:::-;22451:107;22582:1;22579;22575:9;22568:16;;22285:305;;;;:::o;22596:228::-;22736:34;22732:1;22724:6;22720:14;22713:58;22805:11;22800:2;22792:6;22788:15;22781:36;22596:228;:::o;22830:366::-;22972:3;22993:67;23057:2;23052:3;22993:67;:::i;:::-;22986:74;;23069:93;23158:3;23069:93;:::i;:::-;23187:2;23182:3;23178:12;23171:19;;22830:366;;;:::o;23202:419::-;23368:4;23406:2;23395:9;23391:18;23383:26;;23455:9;23449:4;23445:20;23441:1;23430:9;23426:17;23419:47;23483:131;23609:4;23483:131;:::i;:::-;23475:139;;23202:419;;;:::o;23627:348::-;23667:7;23690:20;23708:1;23690:20;:::i;:::-;23685:25;;23724:20;23742:1;23724:20;:::i;:::-;23719:25;;23912:1;23844:66;23840:74;23837:1;23834:81;23829:1;23822:9;23815:17;23811:105;23808:131;;;23919:18;;:::i;:::-;23808:131;23967:1;23964;23960:9;23949:20;;23627:348;;;;:::o;23981:176::-;24121:28;24117:1;24109:6;24105:14;24098:52;23981:176;:::o;24163:366::-;24305:3;24326:67;24390:2;24385:3;24326:67;:::i;:::-;24319:74;;24402:93;24491:3;24402:93;:::i;:::-;24520:2;24515:3;24511:12;24504:19;;24163:366;;;:::o;24535:419::-;24701:4;24739:2;24728:9;24724:18;24716:26;;24788:9;24782:4;24778:20;24774:1;24763:9;24759:17;24752:47;24816:131;24942:4;24816:131;:::i;:::-;24808:139;;24535:419;;;:::o;24960:172::-;25100:24;25096:1;25088:6;25084:14;25077:48;24960:172;:::o;25138:366::-;25280:3;25301:67;25365:2;25360:3;25301:67;:::i;:::-;25294:74;;25377:93;25466:3;25377:93;:::i;:::-;25495:2;25490:3;25486:12;25479:19;;25138:366;;;:::o;25510:419::-;25676:4;25714:2;25703:9;25699:18;25691:26;;25763:9;25757:4;25753:20;25749:1;25738:9;25734:17;25727:47;25791:131;25917:4;25791:131;:::i;:::-;25783:139;;25510:419;;;:::o;25935:233::-;25974:3;25997:24;26015:5;25997:24;:::i;:::-;25988:33;;26043:66;26036:5;26033:77;26030:103;;;26113:18;;:::i;:::-;26030:103;26160:1;26153:5;26149:13;26142:20;;25935:233;;;:::o;26174:180::-;26222:77;26219:1;26212:88;26319:4;26316:1;26309:15;26343:4;26340:1;26333:15;26360:231;26500:34;26496:1;26488:6;26484:14;26477:58;26569:14;26564:2;26556:6;26552:15;26545:39;26360:231;:::o;26597:366::-;26739:3;26760:67;26824:2;26819:3;26760:67;:::i;:::-;26753:74;;26836:93;26925:3;26836:93;:::i;:::-;26954:2;26949:3;26945:12;26938:19;;26597:366;;;:::o;26969:419::-;27135:4;27173:2;27162:9;27158:18;27150:26;;27222:9;27216:4;27212:20;27208:1;27197:9;27193:17;27186:47;27250:131;27376:4;27250:131;:::i;:::-;27242:139;;26969:419;;;:::o;27394:228::-;27534:34;27530:1;27522:6;27518:14;27511:58;27603:11;27598:2;27590:6;27586:15;27579:36;27394:228;:::o;27628:366::-;27770:3;27791:67;27855:2;27850:3;27791:67;:::i;:::-;27784:74;;27867:93;27956:3;27867:93;:::i;:::-;27985:2;27980:3;27976:12;27969:19;;27628:366;;;:::o;28000:419::-;28166:4;28204:2;28193:9;28189:18;28181:26;;28253:9;28247:4;28243:20;28239:1;28228:9;28224:17;28217:47;28281:131;28407:4;28281:131;:::i;:::-;28273:139;;28000:419;;;:::o;28425:229::-;28565:34;28561:1;28553:6;28549:14;28542:58;28634:12;28629:2;28621:6;28617:15;28610:37;28425:229;:::o;28660:366::-;28802:3;28823:67;28887:2;28882:3;28823:67;:::i;:::-;28816:74;;28899:93;28988:3;28899:93;:::i;:::-;29017:2;29012:3;29008:12;29001:19;;28660:366;;;:::o;29032:419::-;29198:4;29236:2;29225:9;29221:18;29213:26;;29285:9;29279:4;29275:20;29271:1;29260:9;29256:17;29249:47;29313:131;29439:4;29313:131;:::i;:::-;29305:139;;29032:419;;;:::o;29457:175::-;29597:27;29593:1;29585:6;29581:14;29574:51;29457:175;:::o;29638:366::-;29780:3;29801:67;29865:2;29860:3;29801:67;:::i;:::-;29794:74;;29877:93;29966:3;29877:93;:::i;:::-;29995:2;29990:3;29986:12;29979:19;;29638:366;;;:::o;30010:419::-;30176:4;30214:2;30203:9;30199:18;30191:26;;30263:9;30257:4;30253:20;30249:1;30238:9;30234:17;30227:47;30291:131;30417:4;30291:131;:::i;:::-;30283:139;;30010:419;;;:::o;30435:234::-;30575:34;30571:1;30563:6;30559:14;30552:58;30644:17;30639:2;30631:6;30627:15;30620:42;30435:234;:::o;30675:366::-;30817:3;30838:67;30902:2;30897:3;30838:67;:::i;:::-;30831:74;;30914:93;31003:3;30914:93;:::i;:::-;31032:2;31027:3;31023:12;31016:19;;30675:366;;;:::o;31047:419::-;31213:4;31251:2;31240:9;31236:18;31228:26;;31300:9;31294:4;31290:20;31286:1;31275:9;31271:17;31264:47;31328:131;31454:4;31328:131;:::i;:::-;31320:139;;31047:419;;;:::o;31472:148::-;31574:11;31611:3;31596:18;;31472:148;;;;:::o;31626:377::-;31732:3;31760:39;31793:5;31760:39;:::i;:::-;31815:89;31897:6;31892:3;31815:89;:::i;:::-;31808:96;;31913:52;31958:6;31953:3;31946:4;31939:5;31935:16;31913:52;:::i;:::-;31990:6;31985:3;31981:16;31974:23;;31736:267;31626:377;;;;:::o;32009:435::-;32189:3;32211:95;32302:3;32293:6;32211:95;:::i;:::-;32204:102;;32323:95;32414:3;32405:6;32323:95;:::i;:::-;32316:102;;32435:3;32428:10;;32009:435;;;;;:::o;32450:225::-;32590:34;32586:1;32578:6;32574:14;32567:58;32659:8;32654:2;32646:6;32642:15;32635:33;32450:225;:::o;32681:366::-;32823:3;32844:67;32908:2;32903:3;32844:67;:::i;:::-;32837:74;;32920:93;33009:3;32920:93;:::i;:::-;33038:2;33033:3;33029:12;33022:19;;32681:366;;;:::o;33053:419::-;33219:4;33257:2;33246:9;33242:18;33234:26;;33306:9;33300:4;33296:20;33292:1;33281:9;33277:17;33270:47;33334:131;33460:4;33334:131;:::i;:::-;33326:139;;33053:419;;;:::o;33478:231::-;33618:34;33614:1;33606:6;33602:14;33595:58;33687:14;33682:2;33674:6;33670:15;33663:39;33478:231;:::o;33715:366::-;33857:3;33878:67;33942:2;33937:3;33878:67;:::i;:::-;33871:74;;33954:93;34043:3;33954:93;:::i;:::-;34072:2;34067:3;34063:12;34056:19;;33715:366;;;:::o;34087:419::-;34253:4;34291:2;34280:9;34276:18;34268:26;;34340:9;34334:4;34330:20;34326:1;34315:9;34311:17;34304:47;34368:131;34494:4;34368:131;:::i;:::-;34360:139;;34087:419;;;:::o;34512:228::-;34652:34;34648:1;34640:6;34636:14;34629:58;34721:11;34716:2;34708:6;34704:15;34697:36;34512:228;:::o;34746:366::-;34888:3;34909:67;34973:2;34968:3;34909:67;:::i;:::-;34902:74;;34985:93;35074:3;34985:93;:::i;:::-;35103:2;35098:3;35094:12;35087:19;;34746:366;;;:::o;35118:419::-;35284:4;35322:2;35311:9;35307:18;35299:26;;35371:9;35365:4;35361:20;35357:1;35346:9;35342:17;35335:47;35399:131;35525:4;35399:131;:::i;:::-;35391:139;;35118:419;;;:::o;35543:223::-;35683:34;35679:1;35671:6;35667:14;35660:58;35752:6;35747:2;35739:6;35735:15;35728:31;35543:223;:::o;35772:366::-;35914:3;35935:67;35999:2;35994:3;35935:67;:::i;:::-;35928:74;;36011:93;36100:3;36011:93;:::i;:::-;36129:2;36124:3;36120:12;36113:19;;35772:366;;;:::o;36144:419::-;36310:4;36348:2;36337:9;36333:18;36325:26;;36397:9;36391:4;36387:20;36383:1;36372:9;36368:17;36361:47;36425:131;36551:4;36425:131;:::i;:::-;36417:139;;36144:419;;;:::o;36569:191::-;36609:4;36629:20;36647:1;36629:20;:::i;:::-;36624:25;;36663:20;36681:1;36663:20;:::i;:::-;36658:25;;36702:1;36699;36696:8;36693:34;;;36707:18;;:::i;:::-;36693:34;36752:1;36749;36745:9;36737:17;;36569:191;;;;:::o;36766:237::-;36906:34;36902:1;36894:6;36890:14;36883:58;36975:20;36970:2;36962:6;36958:15;36951:45;36766:237;:::o;37009:366::-;37151:3;37172:67;37236:2;37231:3;37172:67;:::i;:::-;37165:74;;37248:93;37337:3;37248:93;:::i;:::-;37366:2;37361:3;37357:12;37350:19;;37009:366;;;:::o;37381:419::-;37547:4;37585:2;37574:9;37570:18;37562:26;;37634:9;37628:4;37624:20;37620:1;37609:9;37605:17;37598:47;37662:131;37788:4;37662:131;:::i;:::-;37654:139;;37381:419;;;:::o;37806:180::-;37854:77;37851:1;37844:88;37951:4;37948:1;37941:15;37975:4;37972:1;37965:15;37992:185;38032:1;38049:20;38067:1;38049:20;:::i;:::-;38044:25;;38083:20;38101:1;38083:20;:::i;:::-;38078:25;;38122:1;38112:35;;38127:18;;:::i;:::-;38112:35;38169:1;38166;38162:9;38157:14;;37992:185;;;;:::o;38183:176::-;38215:1;38232:20;38250:1;38232:20;:::i;:::-;38227:25;;38266:20;38284:1;38266:20;:::i;:::-;38261:25;;38305:1;38295:35;;38310:18;;:::i;:::-;38295:35;38351:1;38348;38344:9;38339:14;;38183:176;;;;:::o;38365:98::-;38416:6;38450:5;38444:12;38434:22;;38365:98;;;:::o;38469:168::-;38552:11;38586:6;38581:3;38574:19;38626:4;38621:3;38617:14;38602:29;;38469:168;;;;:::o;38643:360::-;38729:3;38757:38;38789:5;38757:38;:::i;:::-;38811:70;38874:6;38869:3;38811:70;:::i;:::-;38804:77;;38890:52;38935:6;38930:3;38923:4;38916:5;38912:16;38890:52;:::i;:::-;38967:29;38989:6;38967:29;:::i;:::-;38962:3;38958:39;38951:46;;38733:270;38643:360;;;;:::o;39009:640::-;39204:4;39242:3;39231:9;39227:19;39219:27;;39256:71;39324:1;39313:9;39309:17;39300:6;39256:71;:::i;:::-;39337:72;39405:2;39394:9;39390:18;39381:6;39337:72;:::i;:::-;39419;39487:2;39476:9;39472:18;39463:6;39419:72;:::i;:::-;39538:9;39532:4;39528:20;39523:2;39512:9;39508:18;39501:48;39566:76;39637:4;39628:6;39566:76;:::i;:::-;39558:84;;39009:640;;;;;;;:::o;39655:141::-;39711:5;39742:6;39736:13;39727:22;;39758:32;39784:5;39758:32;:::i;:::-;39655:141;;;;:::o;39802:349::-;39871:6;39920:2;39908:9;39899:7;39895:23;39891:32;39888:119;;;39926:79;;:::i;:::-;39888:119;40046:1;40071:63;40126:7;40117:6;40106:9;40102:22;40071:63;:::i;:::-;40061:73;;40017:127;39802:349;;;;:::o;40157:180::-;40205:77;40202:1;40195:88;40302:4;40299:1;40292:15;40326:4;40323:1;40316:15;40343:182;40483:34;40479:1;40471:6;40467:14;40460:58;40343:182;:::o;40531:366::-;40673:3;40694:67;40758:2;40753:3;40694:67;:::i;:::-;40687:74;;40770:93;40859:3;40770:93;:::i;:::-;40888:2;40883:3;40879:12;40872:19;;40531:366;;;:::o;40903:419::-;41069:4;41107:2;41096:9;41092:18;41084:26;;41156:9;41150:4;41146:20;41142:1;41131:9;41127:17;41120:47;41184:131;41310:4;41184:131;:::i;:::-;41176:139;;40903:419;;;:::o;41328:178::-;41468:30;41464:1;41456:6;41452:14;41445:54;41328:178;:::o;41512:366::-;41654:3;41675:67;41739:2;41734:3;41675:67;:::i;:::-;41668:74;;41751:93;41840:3;41751:93;:::i;:::-;41869:2;41864:3;41860:12;41853:19;;41512:366;;;:::o;41884:419::-;42050:4;42088:2;42077:9;42073:18;42065:26;;42137:9;42131:4;42127:20;42123:1;42112:9;42108:17;42101:47;42165:131;42291:4;42165:131;:::i;:::-;42157:139;;41884:419;;;:::o

Swarm Source

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