ETH Price: $3,223.59 (-3.93%)

Token

Solon NFTs (AOE)
 

Overview

Max Total Supply

2,089 AOE

Holders

643

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
nonfungiblenerd.eth
Balance
1 AOE
0xa8DC00721252533D88B0455dd0B4aCd631Af1F10
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Solon is a new type of automated market maker (a platform like UniSwap) that allows for the creation of the world's first network of decentralized hedge funds. Solon is also a decentralized marketplace with rent-able and fractional NFTs. Solon's ecosystem also includes the w...

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
SolonNFTs

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity =0.8.4;




contract SolonNFTs is ERC721("Solon NFTs", "AOE"), ERC721Enumerable, Ownable {
    uint public constant maxSupply = 2187;

    mapping(uint => string) nameOf;
    string public baseURI = "solon.finance/metadata/";
    mapping(address => uint) public amountMinted;
    mapping(address => bool) public whitelist;
    mapping(address => bool) public earlyAdopterWhitelist;
    bool public whitelistDisabled = false;
    uint public limit = 4;

    function rename(uint tokenId, string memory name) external payable {
        require(msg.value >= 1e15, "You sent the incorrect amount of ETH");
        nameOf[tokenId] = name;
    }

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

    function updateWhitelist(address[] calldata addresses) external onlyOwner {
        for (uint i = 0; i < addresses.length; i++) {
            whitelist[addresses[i]] = true;
        }
    }

    function updateEarlyAdopterWhitelist(address[] calldata addresses) external onlyOwner {
        for (uint i = 0; i < addresses.length; i++) {
            earlyAdopterWhitelist[addresses[i]] = true;
        }
    }

    function disableWhitelist() external onlyOwner {
        whitelistDisabled = true;
    }

    function setLimit(uint newLimit) external onlyOwner {
        limit = newLimit;
    }

    function withdraw() external onlyOwner {
        uint balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }

    function mint(uint number) external payable {
        if (msg.sender == owner()) {
            require(totalSupply() + number <= maxSupply, "Not enough NFTs left to mint that amount");
        } else {
            require(totalSupply() + number <= maxSupply - 151, "Not enough NFTs left to mint that amount");
        }
        if (!whitelistDisabled) {
            require(whitelist[msg.sender] || earlyAdopterWhitelist[msg.sender]);
            if (earlyAdopterWhitelist[msg.sender]) {
                require(amountMinted[msg.sender] + number <= limit + 1, "Mint limit exceeded");
            } else {
                require(amountMinted[msg.sender] + number <= limit, "Mint limit exceeded");
            }
        }

        uint cost = 0;
        for(uint i = 0; i < number; i++) {
            cost += (60e15 + 10e15 * amountMinted[msg.sender]);
            _safeMint(msg.sender, totalSupply());
            amountMinted[msg.sender] += 1;
        }

        require(msg.value >= cost, "You sent the incorrect amount of ETH");
    }

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

    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
    }

    function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable) returns (bool) {
        return super.supportsInterface(interfaceId);
    }
}

Contract Security Audit

Contract ABI

[{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"amountMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"disableWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"earlyAdopterWhitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"limit","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"number","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"name","type":"string"}],"name":"rename","outputs":[],"stateMutability":"payable","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":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newLimit","type":"uint256"}],"name":"setLimit","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":"addresses","type":"address[]"}],"name":"updateEarlyAdopterWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addresses","type":"address[]"}],"name":"updateWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"whitelistDisabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280601781526020017f736f6c6f6e2e66696e616e63652f6d657461646174612f000000000000000000815250600c90805190602001906200005192919062000214565b506000601060006101000a81548160ff02191690831515021790555060046011553480156200007f57600080fd5b506040518060400160405280600a81526020017f536f6c6f6e204e465473000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f414f45000000000000000000000000000000000000000000000000000000000081525081600090805190602001906200010492919062000214565b5080600190805190602001906200011d92919062000214565b50505062000140620001346200014660201b60201c565b6200014e60201b60201c565b62000329565b600033905090565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200022290620002c4565b90600052602060002090601f01602090048101928262000246576000855562000292565b82601f106200026157805160ff191683800117855562000292565b8280016001018555821562000292579182015b828111156200029157825182559160200191906001019062000274565b5b509050620002a19190620002a5565b5090565b5b80821115620002c0576000816000905550600101620002a6565b5090565b60006002820490506001821680620002dd57607f821691505b60208210811415620002f457620002f3620002fa565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6146e180620003396000396000f3fe6080604052600436106101f95760003560e01c80636352211e1161010d578063a22cb465116100a0578063d5abeb011161006f578063d5abeb011461073b578063d6b0f48414610766578063e985e9c51461077d578063f18ff65b146107ba578063f2fde38b146107e3576101f9565b8063a22cb46514610681578063a4d66daf146106aa578063b88d4fde146106d5578063c87b56dd146106fe576101f9565b80638da5cb5b116100dc5780638da5cb5b146105d257806395d89b41146105fd5780639b19251a14610628578063a0712d6814610665576101f9565b80636352211e146105165780636c0360eb1461055357806370a082311461057e578063715018a6146105bb576101f9565b80632f745c591161019057806342842e0e1161015f57806342842e0e1461040d578063438a67e7146104365780634e4ddb8e146104735780634f6ccce7146104b057806355f804b3146104ed576101f9565b80632f745c591461037457806335377214146103b15780633ccfd60b146103da5780633ec2d836146103f1576101f9565b806318160ddd116101cc57806318160ddd146102cc5780631c8e8568146102f757806323b872dd1461032257806327ea6f2b1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613411565b61080c565b604051610232919061395b565b60405180910390f35b34801561024757600080fd5b5061025061081e565b60405161025d9190613976565b60405180910390f35b34801561027257600080fd5b5061028d600480360381019061028891906134a4565b6108b0565b60405161029a91906138f4565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190613390565b610935565b005b3480156102d857600080fd5b506102e1610a4d565b6040516102ee9190613c38565b60405180910390f35b34801561030357600080fd5b5061030c610a5a565b604051610319919061395b565b60405180910390f35b34801561032e57600080fd5b506103496004803603810190610344919061328a565b610a6d565b005b34801561035757600080fd5b50610372600480360381019061036d91906134a4565b610acd565b005b34801561038057600080fd5b5061039b60048036038101906103969190613390565b610b53565b6040516103a89190613c38565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d391906133cc565b610bf8565b005b3480156103e657600080fd5b506103ef610d3f565b005b61040b600480360381019061040691906134cd565b610e0a565b005b34801561041957600080fd5b50610434600480360381019061042f919061328a565b610e80565b005b34801561044257600080fd5b5061045d60048036038101906104589190613225565b610ea0565b60405161046a9190613c38565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190613225565b610eb8565b6040516104a7919061395b565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d291906134a4565b610ed8565b6040516104e49190613c38565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190613463565b610f6f565b005b34801561052257600080fd5b5061053d600480360381019061053891906134a4565b611005565b60405161054a91906138f4565b60405180910390f35b34801561055f57600080fd5b506105686110b7565b6040516105759190613976565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190613225565b611145565b6040516105b29190613c38565b60405180910390f35b3480156105c757600080fd5b506105d06111fd565b005b3480156105de57600080fd5b506105e7611285565b6040516105f491906138f4565b60405180910390f35b34801561060957600080fd5b506106126112af565b60405161061f9190613976565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a9190613225565b611341565b60405161065c919061395b565b60405180910390f35b61067f600480360381019061067a91906134a4565b611361565b005b34801561068d57600080fd5b506106a860048036038101906106a39190613354565b6117dd565b005b3480156106b657600080fd5b506106bf61195e565b6040516106cc9190613c38565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f791906132d9565b611964565b005b34801561070a57600080fd5b50610725600480360381019061072091906134a4565b6119c6565b6040516107329190613976565b60405180910390f35b34801561074757600080fd5b50610750611a6d565b60405161075d9190613c38565b60405180910390f35b34801561077257600080fd5b5061077b611a73565b005b34801561078957600080fd5b506107a4600480360381019061079f919061324e565b611b0c565b6040516107b1919061395b565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc91906133cc565b611ba0565b005b3480156107ef57600080fd5b5061080a60048036038101906108059190613225565b611ce7565b005b600061081782611ddf565b9050919050565b60606000805461082d90613ee8565b80601f016020809104026020016040519081016040528092919081815260200182805461085990613ee8565b80156108a65780601f1061087b576101008083540402835291602001916108a6565b820191906000526020600020905b81548152906001019060200180831161088957829003601f168201915b5050505050905090565b60006108bb82611e59565b6108fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f190613af8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094082611005565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a890613b78565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109d0611ec5565b73ffffffffffffffffffffffffffffffffffffffff1614806109ff57506109fe816109f9611ec5565b611b0c565b5b610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590613a78565b60405180910390fd5b610a488383611ecd565b505050565b6000600880549050905090565b601060009054906101000a900460ff1681565b610a7e610a78611ec5565b82611f86565b610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab490613bb8565b60405180910390fd5b610ac8838383612064565b505050565b610ad5611ec5565b73ffffffffffffffffffffffffffffffffffffffff16610af3611285565b73ffffffffffffffffffffffffffffffffffffffff1614610b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4090613b18565b60405180910390fd5b8060118190555050565b6000610b5e83611145565b8210610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9690613998565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c00611ec5565b73ffffffffffffffffffffffffffffffffffffffff16610c1e611285565b73ffffffffffffffffffffffffffffffffffffffff1614610c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6b90613b18565b60405180910390fd5b60005b82829050811015610d3a576001600e6000858585818110610cc1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610cd69190613225565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610d3290613f4b565b915050610c77565b505050565b610d47611ec5565b73ffffffffffffffffffffffffffffffffffffffff16610d65611285565b73ffffffffffffffffffffffffffffffffffffffff1614610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db290613b18565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e06573d6000803e3d6000fd5b5050565b66038d7ea4c68000341015610e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4b90613b98565b60405180910390fd5b80600b60008481526020019081526020016000209080519060200190610e7b929190612fff565b505050565b610e9b83838360405180602001604052806000815250611964565b505050565b600d6020528060005260406000206000915090505481565b600f6020528060005260406000206000915054906101000a900460ff1681565b6000610ee2610a4d565b8210610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a90613bd8565b60405180910390fd5b60088281548110610f5d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f77611ec5565b73ffffffffffffffffffffffffffffffffffffffff16610f95611285565b73ffffffffffffffffffffffffffffffffffffffff1614610feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe290613b18565b60405180910390fd5b80600c9080519060200190611001929190612fff565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590613ab8565b60405180910390fd5b80915050919050565b600c80546110c490613ee8565b80601f01602080910402602001604051908101604052809291908181526020018280546110f090613ee8565b801561113d5780601f106111125761010080835404028352916020019161113d565b820191906000526020600020905b81548152906001019060200180831161112057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad90613a98565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611205611ec5565b73ffffffffffffffffffffffffffffffffffffffff16611223611285565b73ffffffffffffffffffffffffffffffffffffffff1614611279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127090613b18565b60405180910390fd5b61128360006122c0565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112be90613ee8565b80601f01602080910402602001604051908101604052809291908181526020018280546112ea90613ee8565b80156113375780601f1061130c57610100808354040283529160200191611337565b820191906000526020600020905b81548152906001019060200180831161131a57829003601f168201915b5050505050905090565b600e6020528060005260406000206000915054906101000a900460ff1681565b611369611285565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156113f85761088b816113a8610a4d565b6113b29190613d1d565b11156113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea90613c18565b60405180910390fd5b61145c565b609761088b6114079190613dfe565b81611410610a4d565b61141a9190613d1d565b111561145b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145290613c18565b60405180910390fd5b5b601060009054906101000a900460ff1661169d57600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806115115750600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61151a57600080fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561160c57600160115461157b9190613d1d565b81600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115c69190613d1d565b1115611607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fe90613bf8565b60405180910390fd5b61169c565b60115481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461165a9190613d1d565b111561169b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169290613bf8565b60405180910390fd5b5b5b6000805b8281101561179557600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054662386f26fc100006116fb9190613da4565b66d529ae9e86000061170d9190613d1d565b826117189190613d1d565b915061172b33611726610a4d565b612386565b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461177b9190613d1d565b92505081905550808061178d90613f4b565b9150506116a1565b50803410156117d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d090613b98565b60405180910390fd5b5050565b6117e5611ec5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184a90613a38565b60405180910390fd5b8060056000611860611ec5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661190d611ec5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611952919061395b565b60405180910390a35050565b60115481565b61197561196f611ec5565b83611f86565b6119b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ab90613bb8565b60405180910390fd5b6119c0848484846123a4565b50505050565b60606119d182611e59565b611a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0790613b58565b60405180910390fd5b6000611a1a612400565b90506000815111611a3a5760405180602001604052806000815250611a65565b80611a4484612492565b604051602001611a559291906138d0565b6040516020818303038152906040525b915050919050565b61088b81565b611a7b611ec5565b73ffffffffffffffffffffffffffffffffffffffff16611a99611285565b73ffffffffffffffffffffffffffffffffffffffff1614611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae690613b18565b60405180910390fd5b6001601060006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ba8611ec5565b73ffffffffffffffffffffffffffffffffffffffff16611bc6611285565b73ffffffffffffffffffffffffffffffffffffffff1614611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1390613b18565b60405180910390fd5b60005b82829050811015611ce2576001600f6000858585818110611c69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611c7e9190613225565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611cda90613f4b565b915050611c1f565b505050565b611cef611ec5565b73ffffffffffffffffffffffffffffffffffffffff16611d0d611285565b73ffffffffffffffffffffffffffffffffffffffff1614611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a90613b18565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dca906139d8565b60405180910390fd5b611ddc816122c0565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e525750611e518261263f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f4083611005565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f9182611e59565b611fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc790613a58565b60405180910390fd5b6000611fdb83611005565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061204a57508373ffffffffffffffffffffffffffffffffffffffff16612032846108b0565b73ffffffffffffffffffffffffffffffffffffffff16145b8061205b575061205a8185611b0c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661208482611005565b73ffffffffffffffffffffffffffffffffffffffff16146120da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d190613b38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561214a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214190613a18565b60405180910390fd5b612155838383612721565b612160600082611ecd565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121b09190613dfe565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122079190613d1d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123a0828260405180602001604052806000815250612731565b5050565b6123af848484612064565b6123bb8484848461278c565b6123fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f1906139b8565b60405180910390fd5b50505050565b6060600c805461240f90613ee8565b80601f016020809104026020016040519081016040528092919081815260200182805461243b90613ee8565b80156124885780601f1061245d57610100808354040283529160200191612488565b820191906000526020600020905b81548152906001019060200180831161246b57829003601f168201915b5050505050905090565b606060008214156124da576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061263a565b600082905060005b6000821461250c5780806124f590613f4b565b915050600a826125059190613d73565b91506124e2565b60008167ffffffffffffffff81111561254e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125805781602001600182028036833780820191505090505b5090505b60008514612633576001826125999190613dfe565b9150600a856125a89190613f94565b60306125b49190613d1d565b60f81b8183815181106125f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561262c9190613d73565b9450612584565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061270a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061271a575061271982612923565b5b9050919050565b61272c83838361298d565b505050565b61273b8383612aa1565b612748600084848461278c565b612787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277e906139b8565b60405180910390fd5b505050565b60006127ad8473ffffffffffffffffffffffffffffffffffffffff16612c6f565b15612916578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127d6611ec5565b8786866040518563ffffffff1660e01b81526004016127f8949392919061390f565b602060405180830381600087803b15801561281257600080fd5b505af192505050801561284357506040513d601f19601f82011682018060405250810190612840919061343a565b60015b6128c6573d8060008114612873576040519150601f19603f3d011682016040523d82523d6000602084013e612878565b606091505b506000815114156128be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b5906139b8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061291b565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612998838383612c82565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129db576129d681612c87565b612a1a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a1957612a188382612cd0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a5d57612a5881612e3d565b612a9c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a9b57612a9a8282612f80565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0890613ad8565b60405180910390fd5b612b1a81611e59565b15612b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b51906139f8565b60405180910390fd5b612b6660008383612721565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bb69190613d1d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612cdd84611145565b612ce79190613dfe565b9050600060076000848152602001908152602001600020549050818114612dcc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e519190613dfe565b9050600060096000848152602001908152602001600020549050600060088381548110612ea7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612eef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f64577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612f8b83611145565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461300b90613ee8565b90600052602060002090601f01602090048101928261302d5760008555613074565b82601f1061304657805160ff1916838001178555613074565b82800160010185558215613074579182015b82811115613073578251825591602001919060010190613058565b5b5090506130819190613085565b5090565b5b8082111561309e576000816000905550600101613086565b5090565b60006130b56130b084613c78565b613c53565b9050828152602081018484840111156130cd57600080fd5b6130d8848285613ea6565b509392505050565b60006130f36130ee84613ca9565b613c53565b90508281526020810184848401111561310b57600080fd5b613116848285613ea6565b509392505050565b60008135905061312d8161464f565b92915050565b60008083601f84011261314557600080fd5b8235905067ffffffffffffffff81111561315e57600080fd5b60208301915083602082028301111561317657600080fd5b9250929050565b60008135905061318c81614666565b92915050565b6000813590506131a18161467d565b92915050565b6000815190506131b68161467d565b92915050565b600082601f8301126131cd57600080fd5b81356131dd8482602086016130a2565b91505092915050565b600082601f8301126131f757600080fd5b81356132078482602086016130e0565b91505092915050565b60008135905061321f81614694565b92915050565b60006020828403121561323757600080fd5b60006132458482850161311e565b91505092915050565b6000806040838503121561326157600080fd5b600061326f8582860161311e565b92505060206132808582860161311e565b9150509250929050565b60008060006060848603121561329f57600080fd5b60006132ad8682870161311e565b93505060206132be8682870161311e565b92505060406132cf86828701613210565b9150509250925092565b600080600080608085870312156132ef57600080fd5b60006132fd8782880161311e565b945050602061330e8782880161311e565b935050604061331f87828801613210565b925050606085013567ffffffffffffffff81111561333c57600080fd5b613348878288016131bc565b91505092959194509250565b6000806040838503121561336757600080fd5b60006133758582860161311e565b92505060206133868582860161317d565b9150509250929050565b600080604083850312156133a357600080fd5b60006133b18582860161311e565b92505060206133c285828601613210565b9150509250929050565b600080602083850312156133df57600080fd5b600083013567ffffffffffffffff8111156133f957600080fd5b61340585828601613133565b92509250509250929050565b60006020828403121561342357600080fd5b600061343184828501613192565b91505092915050565b60006020828403121561344c57600080fd5b600061345a848285016131a7565b91505092915050565b60006020828403121561347557600080fd5b600082013567ffffffffffffffff81111561348f57600080fd5b61349b848285016131e6565b91505092915050565b6000602082840312156134b657600080fd5b60006134c484828501613210565b91505092915050565b600080604083850312156134e057600080fd5b60006134ee85828601613210565b925050602083013567ffffffffffffffff81111561350b57600080fd5b613517858286016131e6565b9150509250929050565b61352a81613e32565b82525050565b61353981613e44565b82525050565b600061354a82613cda565b6135548185613cf0565b9350613564818560208601613eb5565b61356d81614081565b840191505092915050565b600061358382613ce5565b61358d8185613d01565b935061359d818560208601613eb5565b6135a681614081565b840191505092915050565b60006135bc82613ce5565b6135c68185613d12565b93506135d6818560208601613eb5565b80840191505092915050565b60006135ef602b83613d01565b91506135fa82614092565b604082019050919050565b6000613612603283613d01565b915061361d826140e1565b604082019050919050565b6000613635602683613d01565b915061364082614130565b604082019050919050565b6000613658601c83613d01565b91506136638261417f565b602082019050919050565b600061367b602483613d01565b9150613686826141a8565b604082019050919050565b600061369e601983613d01565b91506136a9826141f7565b602082019050919050565b60006136c1602c83613d01565b91506136cc82614220565b604082019050919050565b60006136e4603883613d01565b91506136ef8261426f565b604082019050919050565b6000613707602a83613d01565b9150613712826142be565b604082019050919050565b600061372a602983613d01565b91506137358261430d565b604082019050919050565b600061374d602083613d01565b91506137588261435c565b602082019050919050565b6000613770602c83613d01565b915061377b82614385565b604082019050919050565b6000613793602083613d01565b915061379e826143d4565b602082019050919050565b60006137b6602983613d01565b91506137c1826143fd565b604082019050919050565b60006137d9602f83613d01565b91506137e48261444c565b604082019050919050565b60006137fc602183613d01565b91506138078261449b565b604082019050919050565b600061381f602483613d01565b915061382a826144ea565b604082019050919050565b6000613842603183613d01565b915061384d82614539565b604082019050919050565b6000613865602c83613d01565b915061387082614588565b604082019050919050565b6000613888601383613d01565b9150613893826145d7565b602082019050919050565b60006138ab602883613d01565b91506138b682614600565b604082019050919050565b6138ca81613e9c565b82525050565b60006138dc82856135b1565b91506138e882846135b1565b91508190509392505050565b60006020820190506139096000830184613521565b92915050565b60006080820190506139246000830187613521565b6139316020830186613521565b61393e60408301856138c1565b8181036060830152613950818461353f565b905095945050505050565b60006020820190506139706000830184613530565b92915050565b600060208201905081810360008301526139908184613578565b905092915050565b600060208201905081810360008301526139b1816135e2565b9050919050565b600060208201905081810360008301526139d181613605565b9050919050565b600060208201905081810360008301526139f181613628565b9050919050565b60006020820190508181036000830152613a118161364b565b9050919050565b60006020820190508181036000830152613a318161366e565b9050919050565b60006020820190508181036000830152613a5181613691565b9050919050565b60006020820190508181036000830152613a71816136b4565b9050919050565b60006020820190508181036000830152613a91816136d7565b9050919050565b60006020820190508181036000830152613ab1816136fa565b9050919050565b60006020820190508181036000830152613ad18161371d565b9050919050565b60006020820190508181036000830152613af181613740565b9050919050565b60006020820190508181036000830152613b1181613763565b9050919050565b60006020820190508181036000830152613b3181613786565b9050919050565b60006020820190508181036000830152613b51816137a9565b9050919050565b60006020820190508181036000830152613b71816137cc565b9050919050565b60006020820190508181036000830152613b91816137ef565b9050919050565b60006020820190508181036000830152613bb181613812565b9050919050565b60006020820190508181036000830152613bd181613835565b9050919050565b60006020820190508181036000830152613bf181613858565b9050919050565b60006020820190508181036000830152613c118161387b565b9050919050565b60006020820190508181036000830152613c318161389e565b9050919050565b6000602082019050613c4d60008301846138c1565b92915050565b6000613c5d613c6e565b9050613c698282613f1a565b919050565b6000604051905090565b600067ffffffffffffffff821115613c9357613c92614052565b5b613c9c82614081565b9050602081019050919050565b600067ffffffffffffffff821115613cc457613cc3614052565b5b613ccd82614081565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d2882613e9c565b9150613d3383613e9c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d6857613d67613fc5565b5b828201905092915050565b6000613d7e82613e9c565b9150613d8983613e9c565b925082613d9957613d98613ff4565b5b828204905092915050565b6000613daf82613e9c565b9150613dba83613e9c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613df357613df2613fc5565b5b828202905092915050565b6000613e0982613e9c565b9150613e1483613e9c565b925082821015613e2757613e26613fc5565b5b828203905092915050565b6000613e3d82613e7c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ed3578082015181840152602081019050613eb8565b83811115613ee2576000848401525b50505050565b60006002820490506001821680613f0057607f821691505b60208210811415613f1457613f13614023565b5b50919050565b613f2382614081565b810181811067ffffffffffffffff82111715613f4257613f41614052565b5b80604052505050565b6000613f5682613e9c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f8957613f88613fc5565b5b600182019050919050565b6000613f9f82613e9c565b9150613faa83613e9c565b925082613fba57613fb9613ff4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f752073656e742074686520696e636f727265637420616d6f756e74206f6660008201527f2045544800000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d696e74206c696d697420657863656564656400000000000000000000000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742074686160008201527f7420616d6f756e74000000000000000000000000000000000000000000000000602082015250565b61465881613e32565b811461466357600080fd5b50565b61466f81613e44565b811461467a57600080fd5b50565b61468681613e50565b811461469157600080fd5b50565b61469d81613e9c565b81146146a857600080fd5b5056fea264697066735822122070e80b26ce53cf34bfc3f895d1749f537bb824eac339a747707f8563be4fe86164736f6c63430008040033

Deployed Bytecode

0x6080604052600436106101f95760003560e01c80636352211e1161010d578063a22cb465116100a0578063d5abeb011161006f578063d5abeb011461073b578063d6b0f48414610766578063e985e9c51461077d578063f18ff65b146107ba578063f2fde38b146107e3576101f9565b8063a22cb46514610681578063a4d66daf146106aa578063b88d4fde146106d5578063c87b56dd146106fe576101f9565b80638da5cb5b116100dc5780638da5cb5b146105d257806395d89b41146105fd5780639b19251a14610628578063a0712d6814610665576101f9565b80636352211e146105165780636c0360eb1461055357806370a082311461057e578063715018a6146105bb576101f9565b80632f745c591161019057806342842e0e1161015f57806342842e0e1461040d578063438a67e7146104365780634e4ddb8e146104735780634f6ccce7146104b057806355f804b3146104ed576101f9565b80632f745c591461037457806335377214146103b15780633ccfd60b146103da5780633ec2d836146103f1576101f9565b806318160ddd116101cc57806318160ddd146102cc5780631c8e8568146102f757806323b872dd1461032257806327ea6f2b1461034b576101f9565b806301ffc9a7146101fe57806306fdde031461023b578063081812fc14610266578063095ea7b3146102a3575b600080fd5b34801561020a57600080fd5b5061022560048036038101906102209190613411565b61080c565b604051610232919061395b565b60405180910390f35b34801561024757600080fd5b5061025061081e565b60405161025d9190613976565b60405180910390f35b34801561027257600080fd5b5061028d600480360381019061028891906134a4565b6108b0565b60405161029a91906138f4565b60405180910390f35b3480156102af57600080fd5b506102ca60048036038101906102c59190613390565b610935565b005b3480156102d857600080fd5b506102e1610a4d565b6040516102ee9190613c38565b60405180910390f35b34801561030357600080fd5b5061030c610a5a565b604051610319919061395b565b60405180910390f35b34801561032e57600080fd5b506103496004803603810190610344919061328a565b610a6d565b005b34801561035757600080fd5b50610372600480360381019061036d91906134a4565b610acd565b005b34801561038057600080fd5b5061039b60048036038101906103969190613390565b610b53565b6040516103a89190613c38565b60405180910390f35b3480156103bd57600080fd5b506103d860048036038101906103d391906133cc565b610bf8565b005b3480156103e657600080fd5b506103ef610d3f565b005b61040b600480360381019061040691906134cd565b610e0a565b005b34801561041957600080fd5b50610434600480360381019061042f919061328a565b610e80565b005b34801561044257600080fd5b5061045d60048036038101906104589190613225565b610ea0565b60405161046a9190613c38565b60405180910390f35b34801561047f57600080fd5b5061049a60048036038101906104959190613225565b610eb8565b6040516104a7919061395b565b60405180910390f35b3480156104bc57600080fd5b506104d760048036038101906104d291906134a4565b610ed8565b6040516104e49190613c38565b60405180910390f35b3480156104f957600080fd5b50610514600480360381019061050f9190613463565b610f6f565b005b34801561052257600080fd5b5061053d600480360381019061053891906134a4565b611005565b60405161054a91906138f4565b60405180910390f35b34801561055f57600080fd5b506105686110b7565b6040516105759190613976565b60405180910390f35b34801561058a57600080fd5b506105a560048036038101906105a09190613225565b611145565b6040516105b29190613c38565b60405180910390f35b3480156105c757600080fd5b506105d06111fd565b005b3480156105de57600080fd5b506105e7611285565b6040516105f491906138f4565b60405180910390f35b34801561060957600080fd5b506106126112af565b60405161061f9190613976565b60405180910390f35b34801561063457600080fd5b5061064f600480360381019061064a9190613225565b611341565b60405161065c919061395b565b60405180910390f35b61067f600480360381019061067a91906134a4565b611361565b005b34801561068d57600080fd5b506106a860048036038101906106a39190613354565b6117dd565b005b3480156106b657600080fd5b506106bf61195e565b6040516106cc9190613c38565b60405180910390f35b3480156106e157600080fd5b506106fc60048036038101906106f791906132d9565b611964565b005b34801561070a57600080fd5b50610725600480360381019061072091906134a4565b6119c6565b6040516107329190613976565b60405180910390f35b34801561074757600080fd5b50610750611a6d565b60405161075d9190613c38565b60405180910390f35b34801561077257600080fd5b5061077b611a73565b005b34801561078957600080fd5b506107a4600480360381019061079f919061324e565b611b0c565b6040516107b1919061395b565b60405180910390f35b3480156107c657600080fd5b506107e160048036038101906107dc91906133cc565b611ba0565b005b3480156107ef57600080fd5b5061080a60048036038101906108059190613225565b611ce7565b005b600061081782611ddf565b9050919050565b60606000805461082d90613ee8565b80601f016020809104026020016040519081016040528092919081815260200182805461085990613ee8565b80156108a65780601f1061087b576101008083540402835291602001916108a6565b820191906000526020600020905b81548152906001019060200180831161088957829003601f168201915b5050505050905090565b60006108bb82611e59565b6108fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108f190613af8565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061094082611005565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156109b1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a890613b78565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166109d0611ec5565b73ffffffffffffffffffffffffffffffffffffffff1614806109ff57506109fe816109f9611ec5565b611b0c565b5b610a3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3590613a78565b60405180910390fd5b610a488383611ecd565b505050565b6000600880549050905090565b601060009054906101000a900460ff1681565b610a7e610a78611ec5565b82611f86565b610abd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab490613bb8565b60405180910390fd5b610ac8838383612064565b505050565b610ad5611ec5565b73ffffffffffffffffffffffffffffffffffffffff16610af3611285565b73ffffffffffffffffffffffffffffffffffffffff1614610b49576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4090613b18565b60405180910390fd5b8060118190555050565b6000610b5e83611145565b8210610b9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b9690613998565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610c00611ec5565b73ffffffffffffffffffffffffffffffffffffffff16610c1e611285565b73ffffffffffffffffffffffffffffffffffffffff1614610c74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c6b90613b18565b60405180910390fd5b60005b82829050811015610d3a576001600e6000858585818110610cc1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190610cd69190613225565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080610d3290613f4b565b915050610c77565b505050565b610d47611ec5565b73ffffffffffffffffffffffffffffffffffffffff16610d65611285565b73ffffffffffffffffffffffffffffffffffffffff1614610dbb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db290613b18565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f19350505050158015610e06573d6000803e3d6000fd5b5050565b66038d7ea4c68000341015610e54576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4b90613b98565b60405180910390fd5b80600b60008481526020019081526020016000209080519060200190610e7b929190612fff565b505050565b610e9b83838360405180602001604052806000815250611964565b505050565b600d6020528060005260406000206000915090505481565b600f6020528060005260406000206000915054906101000a900460ff1681565b6000610ee2610a4d565b8210610f23576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1a90613bd8565b60405180910390fd5b60088281548110610f5d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b610f77611ec5565b73ffffffffffffffffffffffffffffffffffffffff16610f95611285565b73ffffffffffffffffffffffffffffffffffffffff1614610feb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe290613b18565b60405180910390fd5b80600c9080519060200190611001929190612fff565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156110ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a590613ab8565b60405180910390fd5b80915050919050565b600c80546110c490613ee8565b80601f01602080910402602001604051908101604052809291908181526020018280546110f090613ee8565b801561113d5780601f106111125761010080835404028352916020019161113d565b820191906000526020600020905b81548152906001019060200180831161112057829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111ad90613a98565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611205611ec5565b73ffffffffffffffffffffffffffffffffffffffff16611223611285565b73ffffffffffffffffffffffffffffffffffffffff1614611279576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127090613b18565b60405180910390fd5b61128360006122c0565b565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546112be90613ee8565b80601f01602080910402602001604051908101604052809291908181526020018280546112ea90613ee8565b80156113375780601f1061130c57610100808354040283529160200191611337565b820191906000526020600020905b81548152906001019060200180831161131a57829003601f168201915b5050505050905090565b600e6020528060005260406000206000915054906101000a900460ff1681565b611369611285565b73ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614156113f85761088b816113a8610a4d565b6113b29190613d1d565b11156113f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113ea90613c18565b60405180910390fd5b61145c565b609761088b6114079190613dfe565b81611410610a4d565b61141a9190613d1d565b111561145b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145290613c18565b60405180910390fd5b5b601060009054906101000a900460ff1661169d57600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16806115115750600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff165b61151a57600080fd5b600f60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff161561160c57600160115461157b9190613d1d565b81600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546115c69190613d1d565b1115611607576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115fe90613bf8565b60405180910390fd5b61169c565b60115481600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205461165a9190613d1d565b111561169b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169290613bf8565b60405180910390fd5b5b5b6000805b8281101561179557600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054662386f26fc100006116fb9190613da4565b66d529ae9e86000061170d9190613d1d565b826117189190613d1d565b915061172b33611726610a4d565b612386565b6001600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461177b9190613d1d565b92505081905550808061178d90613f4b565b9150506116a1565b50803410156117d9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117d090613b98565b60405180910390fd5b5050565b6117e5611ec5565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611853576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161184a90613a38565b60405180910390fd5b8060056000611860611ec5565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661190d611ec5565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611952919061395b565b60405180910390a35050565b60115481565b61197561196f611ec5565b83611f86565b6119b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119ab90613bb8565b60405180910390fd5b6119c0848484846123a4565b50505050565b60606119d182611e59565b611a10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0790613b58565b60405180910390fd5b6000611a1a612400565b90506000815111611a3a5760405180602001604052806000815250611a65565b80611a4484612492565b604051602001611a559291906138d0565b6040516020818303038152906040525b915050919050565b61088b81565b611a7b611ec5565b73ffffffffffffffffffffffffffffffffffffffff16611a99611285565b73ffffffffffffffffffffffffffffffffffffffff1614611aef576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ae690613b18565b60405180910390fd5b6001601060006101000a81548160ff021916908315150217905550565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611ba8611ec5565b73ffffffffffffffffffffffffffffffffffffffff16611bc6611285565b73ffffffffffffffffffffffffffffffffffffffff1614611c1c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1390613b18565b60405180910390fd5b60005b82829050811015611ce2576001600f6000858585818110611c69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9050602002016020810190611c7e9190613225565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508080611cda90613f4b565b915050611c1f565b505050565b611cef611ec5565b73ffffffffffffffffffffffffffffffffffffffff16611d0d611285565b73ffffffffffffffffffffffffffffffffffffffff1614611d63576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d5a90613b18565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dd3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dca906139d8565b60405180910390fd5b611ddc816122c0565b50565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611e525750611e518261263f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611f4083611005565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f9182611e59565b611fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fc790613a58565b60405180910390fd5b6000611fdb83611005565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061204a57508373ffffffffffffffffffffffffffffffffffffffff16612032846108b0565b73ffffffffffffffffffffffffffffffffffffffff16145b8061205b575061205a8185611b0c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661208482611005565b73ffffffffffffffffffffffffffffffffffffffff16146120da576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120d190613b38565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561214a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214190613a18565b60405180910390fd5b612155838383612721565b612160600082611ecd565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546121b09190613dfe565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122079190613d1d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6123a0828260405180602001604052806000815250612731565b5050565b6123af848484612064565b6123bb8484848461278c565b6123fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123f1906139b8565b60405180910390fd5b50505050565b6060600c805461240f90613ee8565b80601f016020809104026020016040519081016040528092919081815260200182805461243b90613ee8565b80156124885780601f1061245d57610100808354040283529160200191612488565b820191906000526020600020905b81548152906001019060200180831161246b57829003601f168201915b5050505050905090565b606060008214156124da576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061263a565b600082905060005b6000821461250c5780806124f590613f4b565b915050600a826125059190613d73565b91506124e2565b60008167ffffffffffffffff81111561254e577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156125805781602001600182028036833780820191505090505b5090505b60008514612633576001826125999190613dfe565b9150600a856125a89190613f94565b60306125b49190613d1d565b60f81b8183815181106125f0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561262c9190613d73565b9450612584565b8093505050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061270a57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061271a575061271982612923565b5b9050919050565b61272c83838361298d565b505050565b61273b8383612aa1565b612748600084848461278c565b612787576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161277e906139b8565b60405180910390fd5b505050565b60006127ad8473ffffffffffffffffffffffffffffffffffffffff16612c6f565b15612916578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127d6611ec5565b8786866040518563ffffffff1660e01b81526004016127f8949392919061390f565b602060405180830381600087803b15801561281257600080fd5b505af192505050801561284357506040513d601f19601f82011682018060405250810190612840919061343a565b60015b6128c6573d8060008114612873576040519150601f19603f3d011682016040523d82523d6000602084013e612878565b606091505b506000815114156128be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b5906139b8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061291b565b600190505b949350505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612998838383612c82565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156129db576129d681612c87565b612a1a565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612a1957612a188382612cd0565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612a5d57612a5881612e3d565b612a9c565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612a9b57612a9a8282612f80565b5b5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612b11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0890613ad8565b60405180910390fd5b612b1a81611e59565b15612b5a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b51906139f8565b60405180910390fd5b612b6660008383612721565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612bb69190613d1d565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612cdd84611145565b612ce79190613dfe565b9050600060076000848152602001908152602001600020549050818114612dcc576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612e519190613dfe565b9050600060096000848152602001908152602001600020549050600060088381548110612ea7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612eef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480612f64577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b6000612f8b83611145565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b82805461300b90613ee8565b90600052602060002090601f01602090048101928261302d5760008555613074565b82601f1061304657805160ff1916838001178555613074565b82800160010185558215613074579182015b82811115613073578251825591602001919060010190613058565b5b5090506130819190613085565b5090565b5b8082111561309e576000816000905550600101613086565b5090565b60006130b56130b084613c78565b613c53565b9050828152602081018484840111156130cd57600080fd5b6130d8848285613ea6565b509392505050565b60006130f36130ee84613ca9565b613c53565b90508281526020810184848401111561310b57600080fd5b613116848285613ea6565b509392505050565b60008135905061312d8161464f565b92915050565b60008083601f84011261314557600080fd5b8235905067ffffffffffffffff81111561315e57600080fd5b60208301915083602082028301111561317657600080fd5b9250929050565b60008135905061318c81614666565b92915050565b6000813590506131a18161467d565b92915050565b6000815190506131b68161467d565b92915050565b600082601f8301126131cd57600080fd5b81356131dd8482602086016130a2565b91505092915050565b600082601f8301126131f757600080fd5b81356132078482602086016130e0565b91505092915050565b60008135905061321f81614694565b92915050565b60006020828403121561323757600080fd5b60006132458482850161311e565b91505092915050565b6000806040838503121561326157600080fd5b600061326f8582860161311e565b92505060206132808582860161311e565b9150509250929050565b60008060006060848603121561329f57600080fd5b60006132ad8682870161311e565b93505060206132be8682870161311e565b92505060406132cf86828701613210565b9150509250925092565b600080600080608085870312156132ef57600080fd5b60006132fd8782880161311e565b945050602061330e8782880161311e565b935050604061331f87828801613210565b925050606085013567ffffffffffffffff81111561333c57600080fd5b613348878288016131bc565b91505092959194509250565b6000806040838503121561336757600080fd5b60006133758582860161311e565b92505060206133868582860161317d565b9150509250929050565b600080604083850312156133a357600080fd5b60006133b18582860161311e565b92505060206133c285828601613210565b9150509250929050565b600080602083850312156133df57600080fd5b600083013567ffffffffffffffff8111156133f957600080fd5b61340585828601613133565b92509250509250929050565b60006020828403121561342357600080fd5b600061343184828501613192565b91505092915050565b60006020828403121561344c57600080fd5b600061345a848285016131a7565b91505092915050565b60006020828403121561347557600080fd5b600082013567ffffffffffffffff81111561348f57600080fd5b61349b848285016131e6565b91505092915050565b6000602082840312156134b657600080fd5b60006134c484828501613210565b91505092915050565b600080604083850312156134e057600080fd5b60006134ee85828601613210565b925050602083013567ffffffffffffffff81111561350b57600080fd5b613517858286016131e6565b9150509250929050565b61352a81613e32565b82525050565b61353981613e44565b82525050565b600061354a82613cda565b6135548185613cf0565b9350613564818560208601613eb5565b61356d81614081565b840191505092915050565b600061358382613ce5565b61358d8185613d01565b935061359d818560208601613eb5565b6135a681614081565b840191505092915050565b60006135bc82613ce5565b6135c68185613d12565b93506135d6818560208601613eb5565b80840191505092915050565b60006135ef602b83613d01565b91506135fa82614092565b604082019050919050565b6000613612603283613d01565b915061361d826140e1565b604082019050919050565b6000613635602683613d01565b915061364082614130565b604082019050919050565b6000613658601c83613d01565b91506136638261417f565b602082019050919050565b600061367b602483613d01565b9150613686826141a8565b604082019050919050565b600061369e601983613d01565b91506136a9826141f7565b602082019050919050565b60006136c1602c83613d01565b91506136cc82614220565b604082019050919050565b60006136e4603883613d01565b91506136ef8261426f565b604082019050919050565b6000613707602a83613d01565b9150613712826142be565b604082019050919050565b600061372a602983613d01565b91506137358261430d565b604082019050919050565b600061374d602083613d01565b91506137588261435c565b602082019050919050565b6000613770602c83613d01565b915061377b82614385565b604082019050919050565b6000613793602083613d01565b915061379e826143d4565b602082019050919050565b60006137b6602983613d01565b91506137c1826143fd565b604082019050919050565b60006137d9602f83613d01565b91506137e48261444c565b604082019050919050565b60006137fc602183613d01565b91506138078261449b565b604082019050919050565b600061381f602483613d01565b915061382a826144ea565b604082019050919050565b6000613842603183613d01565b915061384d82614539565b604082019050919050565b6000613865602c83613d01565b915061387082614588565b604082019050919050565b6000613888601383613d01565b9150613893826145d7565b602082019050919050565b60006138ab602883613d01565b91506138b682614600565b604082019050919050565b6138ca81613e9c565b82525050565b60006138dc82856135b1565b91506138e882846135b1565b91508190509392505050565b60006020820190506139096000830184613521565b92915050565b60006080820190506139246000830187613521565b6139316020830186613521565b61393e60408301856138c1565b8181036060830152613950818461353f565b905095945050505050565b60006020820190506139706000830184613530565b92915050565b600060208201905081810360008301526139908184613578565b905092915050565b600060208201905081810360008301526139b1816135e2565b9050919050565b600060208201905081810360008301526139d181613605565b9050919050565b600060208201905081810360008301526139f181613628565b9050919050565b60006020820190508181036000830152613a118161364b565b9050919050565b60006020820190508181036000830152613a318161366e565b9050919050565b60006020820190508181036000830152613a5181613691565b9050919050565b60006020820190508181036000830152613a71816136b4565b9050919050565b60006020820190508181036000830152613a91816136d7565b9050919050565b60006020820190508181036000830152613ab1816136fa565b9050919050565b60006020820190508181036000830152613ad18161371d565b9050919050565b60006020820190508181036000830152613af181613740565b9050919050565b60006020820190508181036000830152613b1181613763565b9050919050565b60006020820190508181036000830152613b3181613786565b9050919050565b60006020820190508181036000830152613b51816137a9565b9050919050565b60006020820190508181036000830152613b71816137cc565b9050919050565b60006020820190508181036000830152613b91816137ef565b9050919050565b60006020820190508181036000830152613bb181613812565b9050919050565b60006020820190508181036000830152613bd181613835565b9050919050565b60006020820190508181036000830152613bf181613858565b9050919050565b60006020820190508181036000830152613c118161387b565b9050919050565b60006020820190508181036000830152613c318161389e565b9050919050565b6000602082019050613c4d60008301846138c1565b92915050565b6000613c5d613c6e565b9050613c698282613f1a565b919050565b6000604051905090565b600067ffffffffffffffff821115613c9357613c92614052565b5b613c9c82614081565b9050602081019050919050565b600067ffffffffffffffff821115613cc457613cc3614052565b5b613ccd82614081565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613d2882613e9c565b9150613d3383613e9c565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613d6857613d67613fc5565b5b828201905092915050565b6000613d7e82613e9c565b9150613d8983613e9c565b925082613d9957613d98613ff4565b5b828204905092915050565b6000613daf82613e9c565b9150613dba83613e9c565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613df357613df2613fc5565b5b828202905092915050565b6000613e0982613e9c565b9150613e1483613e9c565b925082821015613e2757613e26613fc5565b5b828203905092915050565b6000613e3d82613e7c565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015613ed3578082015181840152602081019050613eb8565b83811115613ee2576000848401525b50505050565b60006002820490506001821680613f0057607f821691505b60208210811415613f1457613f13614023565b5b50919050565b613f2382614081565b810181811067ffffffffffffffff82111715613f4257613f41614052565b5b80604052505050565b6000613f5682613e9c565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415613f8957613f88613fc5565b5b600182019050919050565b6000613f9f82613e9c565b9150613faa83613e9c565b925082613fba57613fb9613ff4565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f596f752073656e742074686520696e636f727265637420616d6f756e74206f6660008201527f2045544800000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f4d696e74206c696d697420657863656564656400000000000000000000000000600082015250565b7f4e6f7420656e6f756768204e465473206c65667420746f206d696e742074686160008201527f7420616d6f756e74000000000000000000000000000000000000000000000000602082015250565b61465881613e32565b811461466357600080fd5b50565b61466f81613e44565b811461467a57600080fd5b50565b61468681613e50565b811461469157600080fd5b50565b61469d81613e9c565b81146146a857600080fd5b5056fea264697066735822122070e80b26ce53cf34bfc3f895d1749f537bb824eac339a747707f8563be4fe86164736f6c63430008040033

Deployed Bytecode Sourcemap

43136:3069:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46031:171;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21554:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23113:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22636:411;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35285:113;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43518:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24003:339;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44421:87;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34953:256;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43897:193;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44516:142;;;;;;;;;;;;;:::i;:::-;;43592:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43359:44;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43458:53;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35475:233;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43785:104;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21248:239;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43303:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20978:208;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42438:94;;;;;;;;;;;;;:::i;:::-;;41787:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21723:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43410:41;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44666:1060;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;23406:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;43562:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24669:328;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21898:334;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43220:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44323:90;;;;;;;;;;;;;:::i;:::-;;23772:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44098:217;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;42687:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46031:171;46134:4;46158:36;46182:11;46158:23;:36::i;:::-;46151:43;;46031:171;;;:::o;21554:100::-;21608:13;21641:5;21634:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21554:100;:::o;23113:221::-;23189:7;23217:16;23225:7;23217;:16::i;:::-;23209:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23302:15;:24;23318:7;23302:24;;;;;;;;;;;;;;;;;;;;;23295:31;;23113:221;;;:::o;22636:411::-;22717:13;22733:23;22748:7;22733:14;:23::i;:::-;22717:39;;22781:5;22775:11;;:2;:11;;;;22767:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;22875:5;22859:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;22884:37;22901:5;22908:12;:10;:12::i;:::-;22884:16;:37::i;:::-;22859:62;22837:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23018:21;23027:2;23031:7;23018:8;:21::i;:::-;22636:411;;;:::o;35285:113::-;35346:7;35373:10;:17;;;;35366:24;;35285:113;:::o;43518:37::-;;;;;;;;;;;;;:::o;24003:339::-;24198:41;24217:12;:10;:12::i;:::-;24231:7;24198:18;:41::i;:::-;24190:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24306:28;24316:4;24322:2;24326:7;24306:9;:28::i;:::-;24003:339;;;:::o;44421:87::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44492:8:::1;44484:5;:16;;;;44421:87:::0;:::o;34953:256::-;35050:7;35086:23;35103:5;35086:16;:23::i;:::-;35078:5;:31;35070:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;35175:12;:19;35188:5;35175:19;;;;;;;;;;;;;;;:26;35195:5;35175:26;;;;;;;;;;;;35168:33;;34953:256;;;;:::o;43897:193::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43987:6:::1;43982:101;44003:9;;:16;;43999:1;:20;43982:101;;;44067:4;44041:9;:23;44051:9;;44061:1;44051:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44041:23;;;;;;;;;;;;;;;;:30;;;;;;;;;;;;;;;;;;44021:3;;;;;:::i;:::-;;;;43982:101;;;;43897:193:::0;;:::o;44516:142::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44566:12:::1;44581:21;44566:36;;44621:10;44613:28;;:37;44642:7;44613:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;42078:1;44516:142::o:0;43592:185::-;43691:4;43678:9;:17;;43670:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43765:4;43747:6;:15;43754:7;43747:15;;;;;;;;;;;:22;;;;;;;;;;;;:::i;:::-;;43592:185;;:::o;24413:::-;24551:39;24568:4;24574:2;24578:7;24551:39;;;;;;;;;;;;:16;:39::i;:::-;24413:185;;;:::o;43359:44::-;;;;;;;;;;;;;;;;;:::o;43458:53::-;;;;;;;;;;;;;;;;;;;;;;:::o;35475:233::-;35550:7;35586:30;:28;:30::i;:::-;35578:5;:38;35570:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;35683:10;35694:5;35683:17;;;;;;;;;;;;;;;;;;;;;;;;35676:24;;35475:233;;;:::o;43785:104::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;43871:10:::1;43861:7;:20;;;;;;;;;;;;:::i;:::-;;43785:104:::0;:::o;21248:239::-;21320:7;21340:13;21356:7;:16;21364:7;21356:16;;;;;;;;;;;;;;;;;;;;;21340:32;;21408:1;21391:19;;:5;:19;;;;21383:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21474:5;21467:12;;;21248:239;;;:::o;43303:49::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;20978:208::-;21050:7;21095:1;21078:19;;:5;:19;;;;21070:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21162:9;:16;21172:5;21162:16;;;;;;;;;;;;;;;;21155:23;;20978:208;;;:::o;42438:94::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42503:21:::1;42521:1;42503:9;:21::i;:::-;42438:94::o:0;41787:87::-;41833:7;41860:6;;;;;;;;;;;41853:13;;41787:87;:::o;21723:104::-;21779:13;21812:7;21805:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21723:104;:::o;43410:41::-;;;;;;;;;;;;;;;;;;;;;;:::o;44666:1060::-;44739:7;:5;:7::i;:::-;44725:21;;:10;:21;;;44721:269;;;43253:4;44787:6;44771:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:35;;44763:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;44721:269;;;44930:3;43253:4;44918:15;;;;:::i;:::-;44908:6;44892:13;:11;:13::i;:::-;:22;;;;:::i;:::-;:41;;44884:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;44721:269;45005:17;;;;;;;;;;;45000:399;;45047:9;:21;45057:10;45047:21;;;;;;;;;;;;;;;;;;;;;;;;;:58;;;;45072:21;:33;45094:10;45072:33;;;;;;;;;;;;;;;;;;;;;;;;;45047:58;45039:67;;;;;;45125:21;:33;45147:10;45125:33;;;;;;;;;;;;;;;;;;;;;;;;;45121:267;;;45232:1;45224:5;;:9;;;;:::i;:::-;45214:6;45187:12;:24;45200:10;45187:24;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;:46;;45179:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;45121:267;;;45343:5;;45333:6;45306:12;:24;45319:10;45306:24;;;;;;;;;;;;;;;;:33;;;;:::i;:::-;:42;;45298:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;45121:267;45000:399;45411:9;45439:6;45435:205;45455:6;45451:1;:10;45435:205;;;45508:12;:24;45521:10;45508:24;;;;;;;;;;;;;;;;45500:5;:32;;;;:::i;:::-;45492:5;:40;;;;:::i;:::-;45483:50;;;;;:::i;:::-;;;45548:36;45558:10;45570:13;:11;:13::i;:::-;45548:9;:36::i;:::-;45627:1;45599:12;:24;45612:10;45599:24;;;;;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;45463:3;;;;;:::i;:::-;;;;45435:205;;;;45673:4;45660:9;:17;;45652:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;44666:1060;;:::o;23406:295::-;23521:12;:10;:12::i;:::-;23509:24;;:8;:24;;;;23501:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;23621:8;23576:18;:32;23595:12;:10;:12::i;:::-;23576:32;;;;;;;;;;;;;;;:42;23609:8;23576:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;23674:8;23645:48;;23660:12;:10;:12::i;:::-;23645:48;;;23684:8;23645:48;;;;;;:::i;:::-;;;;;;;;23406:295;;:::o;43562:21::-;;;;:::o;24669:328::-;24844:41;24863:12;:10;:12::i;:::-;24877:7;24844:18;:41::i;:::-;24836:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24950:39;24964:4;24970:2;24974:7;24983:5;24950:13;:39::i;:::-;24669:328;;;;:::o;21898:334::-;21971:13;22005:16;22013:7;22005;:16::i;:::-;21997:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22086:21;22110:10;:8;:10::i;:::-;22086:34;;22162:1;22144:7;22138:21;:25;:86;;;;;;;;;;;;;;;;;22190:7;22199:18;:7;:16;:18::i;:::-;22173:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22138:86;22131:93;;;21898:334;;;:::o;43220:37::-;43253:4;43220:37;:::o;44323:90::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44401:4:::1;44381:17;;:24;;;;;;;;;;;;;;;;;;44323:90::o:0;23772:164::-;23869:4;23893:18;:25;23912:5;23893:25;;;;;;;;;;;;;;;:35;23919:8;23893:35;;;;;;;;;;;;;;;;;;;;;;;;;23886:42;;23772:164;;;;:::o;44098:217::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;44200:6:::1;44195:113;44216:9;;:16;;44212:1;:20;44195:113;;;44292:4;44254:21;:35;44276:9;;44286:1;44276:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;44254:35;;;;;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;44234:3;;;;;:::i;:::-;;;;44195:113;;;;44098:217:::0;;:::o;42687:192::-;42018:12;:10;:12::i;:::-;42007:23;;:7;:5;:7::i;:::-;:23;;;41999:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;42796:1:::1;42776:22;;:8;:22;;;;42768:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;42852:19;42862:8;42852:9;:19::i;:::-;42687:192:::0;:::o;34645:224::-;34747:4;34786:35;34771:50;;;:11;:50;;;;:90;;;;34825:36;34849:11;34825:23;:36::i;:::-;34771:90;34764:97;;34645:224;;;:::o;26507:127::-;26572:4;26624:1;26596:30;;:7;:16;26604:7;26596:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26589:37;;26507:127;;;:::o;16043:98::-;16096:7;16123:10;16116:17;;16043:98;:::o;30489:174::-;30591:2;30564:15;:24;30580:7;30564:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30647:7;30643:2;30609:46;;30618:23;30633:7;30618:14;:23::i;:::-;30609:46;;;;;;;;;;;;30489:174;;:::o;26801:348::-;26894:4;26919:16;26927:7;26919;:16::i;:::-;26911:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;26995:13;27011:23;27026:7;27011:14;:23::i;:::-;26995:39;;27064:5;27053:16;;:7;:16;;;:51;;;;27097:7;27073:31;;:20;27085:7;27073:11;:20::i;:::-;:31;;;27053:51;:87;;;;27108:32;27125:5;27132:7;27108:16;:32::i;:::-;27053:87;27045:96;;;26801:348;;;;:::o;29793:578::-;29952:4;29925:31;;:23;29940:7;29925:14;:23::i;:::-;:31;;;29917:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;30035:1;30021:16;;:2;:16;;;;30013:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30091:39;30112:4;30118:2;30122:7;30091:20;:39::i;:::-;30195:29;30212:1;30216:7;30195:8;:29::i;:::-;30256:1;30237:9;:15;30247:4;30237:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30285:1;30268:9;:13;30278:2;30268:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30316:2;30297:7;:16;30305:7;30297:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30355:7;30351:2;30336:27;;30345:4;30336:27;;;;;;;;;;;;29793:578;;;:::o;42887:173::-;42943:16;42962:6;;;;;;;;;;;42943:25;;42988:8;42979:6;;:17;;;;;;;;;;;;;;;;;;43043:8;43012:40;;43033:8;43012:40;;;;;;;;;;;;42887:173;;:::o;27491:110::-;27567:26;27577:2;27581:7;27567:26;;;;;;;;;;;;:9;:26::i;:::-;27491:110;;:::o;25879:315::-;26036:28;26046:4;26052:2;26056:7;26036:9;:28::i;:::-;26083:48;26106:4;26112:2;26116:7;26125:5;26083:22;:48::i;:::-;26075:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25879:315;;;;:::o;45734:100::-;45786:13;45819:7;45812:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;45734:100;:::o;16564:723::-;16620:13;16850:1;16841:5;:10;16837:53;;;16868:10;;;;;;;;;;;;;;;;;;;;;16837:53;16900:12;16915:5;16900:20;;16931:14;16956:78;16971:1;16963:4;:9;16956:78;;16989:8;;;;;:::i;:::-;;;;17020:2;17012:10;;;;;:::i;:::-;;;16956:78;;;17044:19;17076:6;17066:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17044:39;;17094:154;17110:1;17101:5;:10;17094:154;;17138:1;17128:11;;;;;:::i;:::-;;;17205:2;17197:5;:10;;;;:::i;:::-;17184:2;:24;;;;:::i;:::-;17171:39;;17154:6;17161;17154:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;17234:2;17225:11;;;;;:::i;:::-;;;17094:154;;;17272:6;17258:21;;;;;16564:723;;;;:::o;20609:305::-;20711:4;20763:25;20748:40;;;:11;:40;;;;:105;;;;20820:33;20805:48;;;:11;:48;;;;20748:105;:158;;;;20870:36;20894:11;20870:23;:36::i;:::-;20748:158;20728:178;;20609:305;;;:::o;45842:181::-;45970:45;45997:4;46003:2;46007:7;45970:26;:45::i;:::-;45842:181;;;:::o;27828:321::-;27958:18;27964:2;27968:7;27958:5;:18::i;:::-;28009:54;28040:1;28044:2;28048:7;28057:5;28009:22;:54::i;:::-;27987:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;27828:321;;;:::o;31228:799::-;31383:4;31404:15;:2;:13;;;:15::i;:::-;31400:620;;;31456:2;31440:36;;;31477:12;:10;:12::i;:::-;31491:4;31497:7;31506:5;31440:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;31436:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31699:1;31682:6;:13;:18;31678:272;;;31725:60;;;;;;;;;;:::i;:::-;;;;;;;;31678:272;31900:6;31894:13;31885:6;31881:2;31877:15;31870:38;31436:529;31573:41;;;31563:51;;;:6;:51;;;;31556:58;;;;;31400:620;32004:4;31997:11;;31228:799;;;;;;;:::o;19117:157::-;19202:4;19241:25;19226:40;;;:11;:40;;;;19219:47;;19117:157;;;:::o;36321:589::-;36465:45;36492:4;36498:2;36502:7;36465:26;:45::i;:::-;36543:1;36527:18;;:4;:18;;;36523:187;;;36562:40;36594:7;36562:31;:40::i;:::-;36523:187;;;36632:2;36624:10;;:4;:10;;;36620:90;;36651:47;36684:4;36690:7;36651:32;:47::i;:::-;36620:90;36523:187;36738:1;36724:16;;:2;:16;;;36720:183;;;36757:45;36794:7;36757:36;:45::i;:::-;36720:183;;;36830:4;36824:10;;:2;:10;;;36820:83;;36851:40;36879:2;36883:7;36851:27;:40::i;:::-;36820:83;36720:183;36321:589;;;:::o;28485:382::-;28579:1;28565:16;;:2;:16;;;;28557:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28638:16;28646:7;28638;:16::i;:::-;28637:17;28629:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28700:45;28729:1;28733:2;28737:7;28700:20;:45::i;:::-;28775:1;28758:9;:13;28768:2;28758:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28806:2;28787:7;:16;28795:7;28787:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28851:7;28847:2;28826:33;;28843:1;28826:33;;;;;;;;;;;;28485:382;;:::o;8091:387::-;8151:4;8359:12;8426:7;8414:20;8406:28;;8469:1;8462:4;:8;8455:15;;;8091:387;;;:::o;32599:126::-;;;;:::o;37633:164::-;37737:10;:17;;;;37710:15;:24;37726:7;37710:24;;;;;;;;;;;:44;;;;37765:10;37781:7;37765:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37633:164;:::o;38424:988::-;38690:22;38740:1;38715:22;38732:4;38715:16;:22::i;:::-;:26;;;;:::i;:::-;38690:51;;38752:18;38773:17;:26;38791:7;38773:26;;;;;;;;;;;;38752:47;;38920:14;38906:10;:28;38902:328;;38951:19;38973:12;:18;38986:4;38973:18;;;;;;;;;;;;;;;:34;38992:14;38973:34;;;;;;;;;;;;38951:56;;39057:11;39024:12;:18;39037:4;39024:18;;;;;;;;;;;;;;;:30;39043:10;39024:30;;;;;;;;;;;:44;;;;39174:10;39141:17;:30;39159:11;39141:30;;;;;;;;;;;:43;;;;38902:328;;39326:17;:26;39344:7;39326:26;;;;;;;;;;;39319:33;;;39370:12;:18;39383:4;39370:18;;;;;;;;;;;;;;;:34;39389:14;39370:34;;;;;;;;;;;39363:41;;;38424:988;;;;:::o;39707:1079::-;39960:22;40005:1;39985:10;:17;;;;:21;;;;:::i;:::-;39960:46;;40017:18;40038:15;:24;40054:7;40038:24;;;;;;;;;;;;40017:45;;40389:19;40411:10;40422:14;40411:26;;;;;;;;;;;;;;;;;;;;;;;;40389:48;;40475:11;40450:10;40461;40450:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;40586:10;40555:15;:28;40571:11;40555:28;;;;;;;;;;;:41;;;;40727:15;:24;40743:7;40727:24;;;;;;;;;;;40720:31;;;40762:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39707:1079;;;;:::o;37211:221::-;37296:14;37313:20;37330:2;37313:16;:20::i;:::-;37296:37;;37371:7;37344:12;:16;37357:2;37344:16;;;;;;;;;;;;;;;:24;37361:6;37344:24;;;;;;;;;;;:34;;;;37418:6;37389:17;:26;37407:7;37389:26;;;;;;;;;;;:35;;;;37211:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:345::-;434:5;459:66;475:49;517:6;475:49;:::i;:::-;459:66;:::i;:::-;450:75;;548:6;541:5;534:21;586:4;579:5;575:16;624:3;615:6;610:3;606:16;603:25;600:2;;;641:1;638;631:12;600:2;654:41;688:6;683:3;678;654:41;:::i;:::-;440:261;;;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;759:87;;;;:::o;869:367::-;942:8;952:6;1002:3;995:4;987:6;983:17;979:27;969:2;;1020:1;1017;1010:12;969:2;1056:6;1043:20;1033:30;;1086:18;1078:6;1075:30;1072:2;;;1118:1;1115;1108:12;1072:2;1155:4;1147:6;1143:17;1131:29;;1209:3;1201:4;1193:6;1189:17;1179:8;1175:32;1172:41;1169:2;;;1226:1;1223;1216:12;1169:2;959:277;;;;;:::o;1242:133::-;1285:5;1323:6;1310:20;1301:29;;1339:30;1363:5;1339:30;:::i;:::-;1291:84;;;;:::o;1381:137::-;1426:5;1464:6;1451:20;1442:29;;1480:32;1506:5;1480:32;:::i;:::-;1432:86;;;;:::o;1524:141::-;1580:5;1611:6;1605:13;1596:22;;1627:32;1653:5;1627:32;:::i;:::-;1586:79;;;;:::o;1684:271::-;1739:5;1788:3;1781:4;1773:6;1769:17;1765:27;1755:2;;1806:1;1803;1796:12;1755:2;1846:6;1833:20;1871:78;1945:3;1937:6;1930:4;1922:6;1918:17;1871:78;:::i;:::-;1862:87;;1745:210;;;;;:::o;1975:273::-;2031:5;2080:3;2073:4;2065:6;2061:17;2057:27;2047:2;;2098:1;2095;2088:12;2047:2;2138:6;2125:20;2163:79;2238:3;2230:6;2223:4;2215:6;2211:17;2163:79;:::i;:::-;2154:88;;2037:211;;;;;:::o;2254:139::-;2300:5;2338:6;2325:20;2316:29;;2354:33;2381:5;2354:33;:::i;:::-;2306:87;;;;:::o;2399:262::-;2458:6;2507:2;2495:9;2486:7;2482:23;2478:32;2475:2;;;2523:1;2520;2513:12;2475:2;2566:1;2591:53;2636:7;2627:6;2616:9;2612:22;2591:53;:::i;:::-;2581:63;;2537:117;2465:196;;;;:::o;2667:407::-;2735:6;2743;2792:2;2780:9;2771:7;2767:23;2763:32;2760:2;;;2808:1;2805;2798:12;2760:2;2851:1;2876:53;2921:7;2912:6;2901:9;2897:22;2876:53;:::i;:::-;2866:63;;2822:117;2978:2;3004:53;3049:7;3040:6;3029:9;3025:22;3004:53;:::i;:::-;2994:63;;2949:118;2750:324;;;;;:::o;3080:552::-;3157:6;3165;3173;3222:2;3210:9;3201:7;3197:23;3193:32;3190:2;;;3238:1;3235;3228:12;3190:2;3281:1;3306:53;3351:7;3342:6;3331:9;3327:22;3306:53;:::i;:::-;3296:63;;3252:117;3408:2;3434:53;3479:7;3470:6;3459:9;3455:22;3434:53;:::i;:::-;3424:63;;3379:118;3536:2;3562:53;3607:7;3598:6;3587:9;3583:22;3562:53;:::i;:::-;3552:63;;3507:118;3180:452;;;;;:::o;3638:809::-;3733:6;3741;3749;3757;3806:3;3794:9;3785:7;3781:23;3777:33;3774:2;;;3823:1;3820;3813:12;3774:2;3866:1;3891:53;3936:7;3927:6;3916:9;3912:22;3891:53;:::i;:::-;3881:63;;3837:117;3993:2;4019:53;4064:7;4055:6;4044:9;4040:22;4019:53;:::i;:::-;4009:63;;3964:118;4121:2;4147:53;4192:7;4183:6;4172:9;4168:22;4147:53;:::i;:::-;4137:63;;4092:118;4277:2;4266:9;4262:18;4249:32;4308:18;4300:6;4297:30;4294:2;;;4340:1;4337;4330:12;4294:2;4368:62;4422:7;4413:6;4402:9;4398:22;4368:62;:::i;:::-;4358:72;;4220:220;3764:683;;;;;;;:::o;4453:401::-;4518:6;4526;4575:2;4563:9;4554:7;4550:23;4546:32;4543:2;;;4591:1;4588;4581:12;4543:2;4634:1;4659:53;4704:7;4695:6;4684:9;4680:22;4659:53;:::i;:::-;4649:63;;4605:117;4761:2;4787:50;4829:7;4820:6;4809:9;4805:22;4787:50;:::i;:::-;4777:60;;4732:115;4533:321;;;;;:::o;4860:407::-;4928:6;4936;4985:2;4973:9;4964:7;4960:23;4956:32;4953:2;;;5001:1;4998;4991:12;4953:2;5044:1;5069:53;5114:7;5105:6;5094:9;5090:22;5069:53;:::i;:::-;5059:63;;5015:117;5171:2;5197:53;5242:7;5233:6;5222:9;5218:22;5197:53;:::i;:::-;5187:63;;5142:118;4943:324;;;;;:::o;5273:425::-;5359:6;5367;5416:2;5404:9;5395:7;5391:23;5387:32;5384:2;;;5432:1;5429;5422:12;5384:2;5503:1;5492:9;5488:17;5475:31;5533:18;5525:6;5522:30;5519:2;;;5565:1;5562;5555:12;5519:2;5601:80;5673:7;5664:6;5653:9;5649:22;5601:80;:::i;:::-;5583:98;;;;5446:245;5374:324;;;;;:::o;5704:260::-;5762:6;5811:2;5799:9;5790:7;5786:23;5782:32;5779:2;;;5827:1;5824;5817:12;5779:2;5870:1;5895:52;5939:7;5930:6;5919:9;5915:22;5895:52;:::i;:::-;5885:62;;5841:116;5769:195;;;;:::o;5970:282::-;6039:6;6088:2;6076:9;6067:7;6063:23;6059:32;6056:2;;;6104:1;6101;6094:12;6056:2;6147:1;6172:63;6227:7;6218:6;6207:9;6203:22;6172:63;:::i;:::-;6162:73;;6118:127;6046:206;;;;:::o;6258:375::-;6327:6;6376:2;6364:9;6355:7;6351:23;6347:32;6344:2;;;6392:1;6389;6382:12;6344:2;6463:1;6452:9;6448:17;6435:31;6493:18;6485:6;6482:30;6479:2;;;6525:1;6522;6515:12;6479:2;6553:63;6608:7;6599:6;6588:9;6584:22;6553:63;:::i;:::-;6543:73;;6406:220;6334:299;;;;:::o;6639:262::-;6698:6;6747:2;6735:9;6726:7;6722:23;6718:32;6715:2;;;6763:1;6760;6753:12;6715:2;6806:1;6831:53;6876:7;6867:6;6856:9;6852:22;6831:53;:::i;:::-;6821:63;;6777:117;6705:196;;;;:::o;6907:520::-;6985:6;6993;7042:2;7030:9;7021:7;7017:23;7013:32;7010:2;;;7058:1;7055;7048:12;7010:2;7101:1;7126:53;7171:7;7162:6;7151:9;7147:22;7126:53;:::i;:::-;7116:63;;7072:117;7256:2;7245:9;7241:18;7228:32;7287:18;7279:6;7276:30;7273:2;;;7319:1;7316;7309:12;7273:2;7347:63;7402:7;7393:6;7382:9;7378:22;7347:63;:::i;:::-;7337:73;;7199:221;7000:427;;;;;:::o;7433:118::-;7520:24;7538:5;7520:24;:::i;:::-;7515:3;7508:37;7498:53;;:::o;7557:109::-;7638:21;7653:5;7638:21;:::i;:::-;7633:3;7626:34;7616:50;;:::o;7672:360::-;7758:3;7786:38;7818:5;7786:38;:::i;:::-;7840:70;7903:6;7898:3;7840:70;:::i;:::-;7833:77;;7919:52;7964:6;7959:3;7952:4;7945:5;7941:16;7919:52;:::i;:::-;7996:29;8018:6;7996:29;:::i;:::-;7991:3;7987:39;7980:46;;7762:270;;;;;:::o;8038:364::-;8126:3;8154:39;8187:5;8154:39;:::i;:::-;8209:71;8273:6;8268:3;8209:71;:::i;:::-;8202:78;;8289:52;8334:6;8329:3;8322:4;8315:5;8311:16;8289:52;:::i;:::-;8366:29;8388:6;8366:29;:::i;:::-;8361:3;8357:39;8350:46;;8130:272;;;;;:::o;8408:377::-;8514:3;8542:39;8575:5;8542:39;:::i;:::-;8597:89;8679:6;8674:3;8597:89;:::i;:::-;8590:96;;8695:52;8740:6;8735:3;8728:4;8721:5;8717:16;8695:52;:::i;:::-;8772:6;8767:3;8763:16;8756:23;;8518:267;;;;;:::o;8791:366::-;8933:3;8954:67;9018:2;9013:3;8954:67;:::i;:::-;8947:74;;9030:93;9119:3;9030:93;:::i;:::-;9148:2;9143:3;9139:12;9132:19;;8937:220;;;:::o;9163:366::-;9305:3;9326:67;9390:2;9385:3;9326:67;:::i;:::-;9319:74;;9402:93;9491:3;9402:93;:::i;:::-;9520:2;9515:3;9511:12;9504:19;;9309:220;;;:::o;9535:366::-;9677:3;9698:67;9762:2;9757:3;9698:67;:::i;:::-;9691:74;;9774:93;9863:3;9774:93;:::i;:::-;9892:2;9887:3;9883:12;9876:19;;9681:220;;;:::o;9907:366::-;10049:3;10070:67;10134:2;10129:3;10070:67;:::i;:::-;10063:74;;10146:93;10235:3;10146:93;:::i;:::-;10264:2;10259:3;10255:12;10248:19;;10053:220;;;:::o;10279:366::-;10421:3;10442:67;10506:2;10501:3;10442:67;:::i;:::-;10435:74;;10518:93;10607:3;10518:93;:::i;:::-;10636:2;10631:3;10627:12;10620:19;;10425:220;;;:::o;10651:366::-;10793:3;10814:67;10878:2;10873:3;10814:67;:::i;:::-;10807:74;;10890:93;10979:3;10890:93;:::i;:::-;11008:2;11003:3;10999:12;10992:19;;10797:220;;;:::o;11023:366::-;11165:3;11186:67;11250:2;11245:3;11186:67;:::i;:::-;11179:74;;11262:93;11351:3;11262:93;:::i;:::-;11380:2;11375:3;11371:12;11364:19;;11169:220;;;:::o;11395:366::-;11537:3;11558:67;11622:2;11617:3;11558:67;:::i;:::-;11551:74;;11634:93;11723:3;11634:93;:::i;:::-;11752:2;11747:3;11743:12;11736:19;;11541:220;;;:::o;11767:366::-;11909:3;11930:67;11994:2;11989:3;11930:67;:::i;:::-;11923:74;;12006:93;12095:3;12006:93;:::i;:::-;12124:2;12119:3;12115:12;12108:19;;11913:220;;;:::o;12139:366::-;12281:3;12302:67;12366:2;12361:3;12302:67;:::i;:::-;12295:74;;12378:93;12467:3;12378:93;:::i;:::-;12496:2;12491:3;12487:12;12480:19;;12285:220;;;:::o;12511:366::-;12653:3;12674:67;12738:2;12733:3;12674:67;:::i;:::-;12667:74;;12750:93;12839:3;12750:93;:::i;:::-;12868:2;12863:3;12859:12;12852:19;;12657:220;;;:::o;12883:366::-;13025:3;13046:67;13110:2;13105:3;13046:67;:::i;:::-;13039:74;;13122:93;13211:3;13122:93;:::i;:::-;13240:2;13235:3;13231:12;13224:19;;13029:220;;;:::o;13255:366::-;13397:3;13418:67;13482:2;13477:3;13418:67;:::i;:::-;13411:74;;13494:93;13583:3;13494:93;:::i;:::-;13612:2;13607:3;13603:12;13596:19;;13401:220;;;:::o;13627:366::-;13769:3;13790:67;13854:2;13849:3;13790:67;:::i;:::-;13783:74;;13866:93;13955:3;13866:93;:::i;:::-;13984:2;13979:3;13975:12;13968:19;;13773:220;;;:::o;13999:366::-;14141:3;14162:67;14226:2;14221:3;14162:67;:::i;:::-;14155:74;;14238:93;14327:3;14238:93;:::i;:::-;14356:2;14351:3;14347:12;14340:19;;14145:220;;;:::o;14371:366::-;14513:3;14534:67;14598:2;14593:3;14534:67;:::i;:::-;14527:74;;14610:93;14699:3;14610:93;:::i;:::-;14728:2;14723:3;14719:12;14712:19;;14517:220;;;:::o;14743:366::-;14885:3;14906:67;14970:2;14965:3;14906:67;:::i;:::-;14899:74;;14982:93;15071:3;14982:93;:::i;:::-;15100:2;15095:3;15091:12;15084:19;;14889:220;;;:::o;15115:366::-;15257:3;15278:67;15342:2;15337:3;15278:67;:::i;:::-;15271:74;;15354:93;15443:3;15354:93;:::i;:::-;15472:2;15467:3;15463:12;15456:19;;15261:220;;;:::o;15487:366::-;15629:3;15650:67;15714:2;15709:3;15650:67;:::i;:::-;15643:74;;15726:93;15815:3;15726:93;:::i;:::-;15844:2;15839:3;15835:12;15828:19;;15633:220;;;:::o;15859:366::-;16001:3;16022:67;16086:2;16081:3;16022:67;:::i;:::-;16015:74;;16098:93;16187:3;16098:93;:::i;:::-;16216:2;16211:3;16207:12;16200:19;;16005:220;;;:::o;16231:366::-;16373:3;16394:67;16458:2;16453:3;16394:67;:::i;:::-;16387:74;;16470:93;16559:3;16470:93;:::i;:::-;16588:2;16583:3;16579:12;16572:19;;16377:220;;;:::o;16603:118::-;16690:24;16708:5;16690:24;:::i;:::-;16685:3;16678:37;16668:53;;:::o;16727:435::-;16907:3;16929:95;17020:3;17011:6;16929:95;:::i;:::-;16922:102;;17041:95;17132:3;17123:6;17041:95;:::i;:::-;17034:102;;17153:3;17146:10;;16911:251;;;;;:::o;17168:222::-;17261:4;17299:2;17288:9;17284:18;17276:26;;17312:71;17380:1;17369:9;17365:17;17356:6;17312:71;:::i;:::-;17266:124;;;;:::o;17396:640::-;17591:4;17629:3;17618:9;17614:19;17606:27;;17643:71;17711:1;17700:9;17696:17;17687:6;17643:71;:::i;:::-;17724:72;17792:2;17781:9;17777:18;17768:6;17724:72;:::i;:::-;17806;17874:2;17863:9;17859:18;17850:6;17806:72;:::i;:::-;17925:9;17919:4;17915:20;17910:2;17899:9;17895:18;17888:48;17953:76;18024:4;18015:6;17953:76;:::i;:::-;17945:84;;17596:440;;;;;;;:::o;18042:210::-;18129:4;18167:2;18156:9;18152:18;18144:26;;18180:65;18242:1;18231:9;18227:17;18218:6;18180:65;:::i;:::-;18134:118;;;;:::o;18258:313::-;18371:4;18409:2;18398:9;18394:18;18386:26;;18458:9;18452:4;18448:20;18444:1;18433:9;18429:17;18422:47;18486:78;18559:4;18550:6;18486:78;:::i;:::-;18478:86;;18376:195;;;;:::o;18577:419::-;18743:4;18781:2;18770:9;18766:18;18758:26;;18830:9;18824:4;18820:20;18816:1;18805:9;18801:17;18794:47;18858:131;18984:4;18858:131;:::i;:::-;18850:139;;18748:248;;;:::o;19002:419::-;19168:4;19206:2;19195:9;19191:18;19183:26;;19255:9;19249:4;19245:20;19241:1;19230:9;19226:17;19219:47;19283:131;19409:4;19283:131;:::i;:::-;19275:139;;19173:248;;;:::o;19427:419::-;19593:4;19631:2;19620:9;19616:18;19608:26;;19680:9;19674:4;19670:20;19666:1;19655:9;19651:17;19644:47;19708:131;19834:4;19708:131;:::i;:::-;19700:139;;19598:248;;;:::o;19852:419::-;20018:4;20056:2;20045:9;20041:18;20033:26;;20105:9;20099:4;20095:20;20091:1;20080:9;20076:17;20069:47;20133:131;20259:4;20133:131;:::i;:::-;20125:139;;20023:248;;;:::o;20277:419::-;20443:4;20481:2;20470:9;20466:18;20458:26;;20530:9;20524:4;20520:20;20516:1;20505:9;20501:17;20494:47;20558:131;20684:4;20558:131;:::i;:::-;20550:139;;20448:248;;;:::o;20702:419::-;20868:4;20906:2;20895:9;20891:18;20883:26;;20955:9;20949:4;20945:20;20941:1;20930:9;20926:17;20919:47;20983:131;21109:4;20983:131;:::i;:::-;20975:139;;20873:248;;;:::o;21127:419::-;21293:4;21331:2;21320:9;21316:18;21308:26;;21380:9;21374:4;21370:20;21366:1;21355:9;21351:17;21344:47;21408:131;21534:4;21408:131;:::i;:::-;21400:139;;21298:248;;;:::o;21552:419::-;21718:4;21756:2;21745:9;21741:18;21733:26;;21805:9;21799:4;21795:20;21791:1;21780:9;21776:17;21769:47;21833:131;21959:4;21833:131;:::i;:::-;21825:139;;21723:248;;;:::o;21977:419::-;22143:4;22181:2;22170:9;22166:18;22158:26;;22230:9;22224:4;22220:20;22216:1;22205:9;22201:17;22194:47;22258:131;22384:4;22258:131;:::i;:::-;22250:139;;22148:248;;;:::o;22402:419::-;22568:4;22606:2;22595:9;22591:18;22583:26;;22655:9;22649:4;22645:20;22641:1;22630:9;22626:17;22619:47;22683:131;22809:4;22683:131;:::i;:::-;22675:139;;22573:248;;;:::o;22827:419::-;22993:4;23031:2;23020:9;23016:18;23008:26;;23080:9;23074:4;23070:20;23066:1;23055:9;23051:17;23044:47;23108:131;23234:4;23108:131;:::i;:::-;23100:139;;22998:248;;;:::o;23252:419::-;23418:4;23456:2;23445:9;23441:18;23433:26;;23505:9;23499:4;23495:20;23491:1;23480:9;23476:17;23469:47;23533:131;23659:4;23533:131;:::i;:::-;23525:139;;23423:248;;;:::o;23677:419::-;23843:4;23881:2;23870:9;23866:18;23858:26;;23930:9;23924:4;23920:20;23916:1;23905:9;23901:17;23894:47;23958:131;24084:4;23958:131;:::i;:::-;23950:139;;23848:248;;;:::o;24102:419::-;24268:4;24306:2;24295:9;24291:18;24283:26;;24355:9;24349:4;24345:20;24341:1;24330:9;24326:17;24319:47;24383:131;24509:4;24383:131;:::i;:::-;24375:139;;24273:248;;;:::o;24527:419::-;24693:4;24731:2;24720:9;24716:18;24708:26;;24780:9;24774:4;24770:20;24766:1;24755:9;24751:17;24744:47;24808:131;24934:4;24808:131;:::i;:::-;24800:139;;24698:248;;;:::o;24952:419::-;25118:4;25156:2;25145:9;25141:18;25133:26;;25205:9;25199:4;25195:20;25191:1;25180:9;25176:17;25169:47;25233:131;25359:4;25233:131;:::i;:::-;25225:139;;25123:248;;;:::o;25377:419::-;25543:4;25581:2;25570:9;25566:18;25558:26;;25630:9;25624:4;25620:20;25616:1;25605:9;25601:17;25594:47;25658:131;25784:4;25658:131;:::i;:::-;25650:139;;25548:248;;;:::o;25802:419::-;25968:4;26006:2;25995:9;25991:18;25983:26;;26055:9;26049:4;26045:20;26041:1;26030:9;26026:17;26019:47;26083:131;26209:4;26083:131;:::i;:::-;26075:139;;25973:248;;;:::o;26227:419::-;26393:4;26431:2;26420:9;26416:18;26408:26;;26480:9;26474:4;26470:20;26466:1;26455:9;26451:17;26444:47;26508:131;26634:4;26508:131;:::i;:::-;26500:139;;26398:248;;;:::o;26652:419::-;26818:4;26856:2;26845:9;26841:18;26833:26;;26905:9;26899:4;26895:20;26891:1;26880:9;26876:17;26869:47;26933:131;27059:4;26933:131;:::i;:::-;26925:139;;26823:248;;;:::o;27077:419::-;27243:4;27281:2;27270:9;27266:18;27258:26;;27330:9;27324:4;27320:20;27316:1;27305:9;27301:17;27294:47;27358:131;27484:4;27358:131;:::i;:::-;27350:139;;27248:248;;;:::o;27502:222::-;27595:4;27633:2;27622:9;27618:18;27610:26;;27646:71;27714:1;27703:9;27699:17;27690:6;27646:71;:::i;:::-;27600:124;;;;:::o;27730:129::-;27764:6;27791:20;;:::i;:::-;27781:30;;27820:33;27848:4;27840:6;27820:33;:::i;:::-;27771:88;;;:::o;27865:75::-;27898:6;27931:2;27925:9;27915:19;;27905:35;:::o;27946:307::-;28007:4;28097:18;28089:6;28086:30;28083:2;;;28119:18;;:::i;:::-;28083:2;28157:29;28179:6;28157:29;:::i;:::-;28149:37;;28241:4;28235;28231:15;28223:23;;28012:241;;;:::o;28259:308::-;28321:4;28411:18;28403:6;28400:30;28397:2;;;28433:18;;:::i;:::-;28397:2;28471:29;28493:6;28471:29;:::i;:::-;28463:37;;28555:4;28549;28545:15;28537:23;;28326:241;;;:::o;28573:98::-;28624:6;28658:5;28652:12;28642:22;;28631:40;;;:::o;28677:99::-;28729:6;28763:5;28757:12;28747:22;;28736:40;;;:::o;28782:168::-;28865:11;28899:6;28894:3;28887:19;28939:4;28934:3;28930:14;28915:29;;28877:73;;;;:::o;28956:169::-;29040:11;29074:6;29069:3;29062:19;29114:4;29109:3;29105:14;29090:29;;29052:73;;;;:::o;29131:148::-;29233:11;29270:3;29255:18;;29245:34;;;;:::o;29285:305::-;29325:3;29344:20;29362:1;29344:20;:::i;:::-;29339:25;;29378:20;29396:1;29378:20;:::i;:::-;29373:25;;29532:1;29464:66;29460:74;29457:1;29454:81;29451:2;;;29538:18;;:::i;:::-;29451:2;29582:1;29579;29575:9;29568:16;;29329:261;;;;:::o;29596:185::-;29636:1;29653:20;29671:1;29653:20;:::i;:::-;29648:25;;29687:20;29705:1;29687:20;:::i;:::-;29682:25;;29726:1;29716:2;;29731:18;;:::i;:::-;29716:2;29773:1;29770;29766:9;29761:14;;29638:143;;;;:::o;29787:348::-;29827:7;29850:20;29868:1;29850:20;:::i;:::-;29845:25;;29884:20;29902:1;29884:20;:::i;:::-;29879:25;;30072:1;30004:66;30000:74;29997:1;29994:81;29989:1;29982:9;29975:17;29971:105;29968:2;;;30079:18;;:::i;:::-;29968:2;30127:1;30124;30120:9;30109:20;;29835:300;;;;:::o;30141:191::-;30181:4;30201:20;30219:1;30201:20;:::i;:::-;30196:25;;30235:20;30253:1;30235:20;:::i;:::-;30230:25;;30274:1;30271;30268:8;30265:2;;;30279:18;;:::i;:::-;30265:2;30324:1;30321;30317:9;30309:17;;30186:146;;;;:::o;30338:96::-;30375:7;30404:24;30422:5;30404:24;:::i;:::-;30393:35;;30383:51;;;:::o;30440:90::-;30474:7;30517:5;30510:13;30503:21;30492:32;;30482:48;;;:::o;30536:149::-;30572:7;30612:66;30605:5;30601:78;30590:89;;30580:105;;;:::o;30691:126::-;30728:7;30768:42;30761:5;30757:54;30746:65;;30736:81;;;:::o;30823:77::-;30860:7;30889:5;30878:16;;30868:32;;;:::o;30906:154::-;30990:6;30985:3;30980;30967:30;31052:1;31043:6;31038:3;31034:16;31027:27;30957:103;;;:::o;31066:307::-;31134:1;31144:113;31158:6;31155:1;31152:13;31144:113;;;31243:1;31238:3;31234:11;31228:18;31224:1;31219:3;31215:11;31208:39;31180:2;31177:1;31173:10;31168:15;;31144:113;;;31275:6;31272:1;31269:13;31266:2;;;31355:1;31346:6;31341:3;31337:16;31330:27;31266:2;31115:258;;;;:::o;31379:320::-;31423:6;31460:1;31454:4;31450:12;31440:22;;31507:1;31501:4;31497:12;31528:18;31518:2;;31584:4;31576:6;31572:17;31562:27;;31518:2;31646;31638:6;31635:14;31615:18;31612:38;31609:2;;;31665:18;;:::i;:::-;31609:2;31430:269;;;;:::o;31705:281::-;31788:27;31810:4;31788:27;:::i;:::-;31780:6;31776:40;31918:6;31906:10;31903:22;31882:18;31870:10;31867:34;31864:62;31861:2;;;31929:18;;:::i;:::-;31861:2;31969:10;31965:2;31958:22;31748:238;;;:::o;31992:233::-;32031:3;32054:24;32072:5;32054:24;:::i;:::-;32045:33;;32100:66;32093:5;32090:77;32087:2;;;32170:18;;:::i;:::-;32087:2;32217:1;32210:5;32206:13;32199:20;;32035:190;;;:::o;32231:176::-;32263:1;32280:20;32298:1;32280:20;:::i;:::-;32275:25;;32314:20;32332:1;32314:20;:::i;:::-;32309:25;;32353:1;32343:2;;32358:18;;:::i;:::-;32343:2;32399:1;32396;32392:9;32387:14;;32265:142;;;;:::o;32413:180::-;32461:77;32458:1;32451:88;32558:4;32555:1;32548:15;32582:4;32579:1;32572:15;32599:180;32647:77;32644:1;32637:88;32744:4;32741:1;32734:15;32768:4;32765:1;32758:15;32785:180;32833:77;32830:1;32823:88;32930:4;32927:1;32920:15;32954:4;32951:1;32944:15;32971:180;33019:77;33016:1;33009:88;33116:4;33113:1;33106:15;33140:4;33137:1;33130:15;33157:102;33198:6;33249:2;33245:7;33240:2;33233:5;33229:14;33225:28;33215:38;;33205:54;;;:::o;33265:230::-;33405:34;33401:1;33393:6;33389:14;33382:58;33474:13;33469:2;33461:6;33457:15;33450:38;33371:124;:::o;33501:237::-;33641:34;33637:1;33629:6;33625:14;33618:58;33710:20;33705:2;33697:6;33693:15;33686:45;33607:131;:::o;33744:225::-;33884:34;33880:1;33872:6;33868:14;33861:58;33953:8;33948:2;33940:6;33936:15;33929:33;33850:119;:::o;33975:178::-;34115:30;34111:1;34103:6;34099:14;34092:54;34081:72;:::o;34159:223::-;34299:34;34295:1;34287:6;34283:14;34276:58;34368:6;34363:2;34355:6;34351:15;34344:31;34265:117;:::o;34388:175::-;34528:27;34524:1;34516:6;34512:14;34505:51;34494:69;:::o;34569:231::-;34709:34;34705:1;34697:6;34693:14;34686:58;34778:14;34773:2;34765:6;34761:15;34754:39;34675:125;:::o;34806:243::-;34946:34;34942:1;34934:6;34930:14;34923:58;35015:26;35010:2;35002:6;34998:15;34991:51;34912:137;:::o;35055:229::-;35195:34;35191:1;35183:6;35179:14;35172:58;35264:12;35259:2;35251:6;35247:15;35240:37;35161:123;:::o;35290:228::-;35430:34;35426:1;35418:6;35414:14;35407:58;35499:11;35494:2;35486:6;35482:15;35475:36;35396:122;:::o;35524:182::-;35664:34;35660:1;35652:6;35648:14;35641:58;35630:76;:::o;35712:231::-;35852:34;35848:1;35840:6;35836:14;35829:58;35921:14;35916:2;35908:6;35904:15;35897:39;35818:125;:::o;35949:182::-;36089:34;36085:1;36077:6;36073:14;36066:58;36055:76;:::o;36137:228::-;36277:34;36273:1;36265:6;36261:14;36254:58;36346:11;36341:2;36333:6;36329:15;36322:36;36243:122;:::o;36371:234::-;36511:34;36507:1;36499:6;36495:14;36488:58;36580:17;36575:2;36567:6;36563:15;36556:42;36477:128;:::o;36611:220::-;36751:34;36747:1;36739:6;36735:14;36728:58;36820:3;36815:2;36807:6;36803:15;36796:28;36717:114;:::o;36837:223::-;36977:34;36973:1;36965:6;36961:14;36954:58;37046:6;37041:2;37033:6;37029:15;37022:31;36943:117;:::o;37066:236::-;37206:34;37202:1;37194:6;37190:14;37183:58;37275:19;37270:2;37262:6;37258:15;37251:44;37172:130;:::o;37308:231::-;37448:34;37444:1;37436:6;37432:14;37425:58;37517:14;37512:2;37504:6;37500:15;37493:39;37414:125;:::o;37545:169::-;37685:21;37681:1;37673:6;37669:14;37662:45;37651:63;:::o;37720:227::-;37860:34;37856:1;37848:6;37844:14;37837:58;37929:10;37924:2;37916:6;37912:15;37905:35;37826:121;:::o;37953:122::-;38026:24;38044:5;38026:24;:::i;:::-;38019:5;38016:35;38006:2;;38065:1;38062;38055:12;38006:2;37996:79;:::o;38081:116::-;38151:21;38166:5;38151:21;:::i;:::-;38144:5;38141:32;38131:2;;38187:1;38184;38177:12;38131:2;38121:76;:::o;38203:120::-;38275:23;38292:5;38275:23;:::i;:::-;38268:5;38265:34;38255:2;;38313:1;38310;38303:12;38255:2;38245:78;:::o;38329:122::-;38402:24;38420:5;38402:24;:::i;:::-;38395:5;38392:35;38382:2;;38441:1;38438;38431:12;38382:2;38372:79;:::o

Swarm Source

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