ETH Price: $3,390.71 (-1.23%)

Token

Stats (STATS)
 

Overview

Max Total Supply

5,862 STATS

Holders

2,792

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 STATS
0xF2Fb34C4323F9bf4a5c04fE277f96588dDE5316f
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AbilityScores

Compiler Version
v0.8.4+commit.c7e474f2

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, GNU AGPLv3 license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-09-04
*/

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

/**
 * @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;
}




/**
 * @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);
    }
}




/*
 * @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;
    }
}









/**
 * @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);
    }
}





/**
 * @dev Contract module that helps prevent reentrant calls to a function.
 *
 * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier
 * available, which can be applied to functions to make sure there are no nested
 * (reentrant) calls to them.
 *
 * Note that because there is a single `nonReentrant` guard, functions marked as
 * `nonReentrant` may not call one another. This can be worked around by making
 * those functions `private`, and then adding `external` `nonReentrant` entry
 * points to them.
 *
 * TIP: If you would like to learn more about reentrancy and alternative ways
 * to protect against it, check out our blog post
 * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].
 */
abstract contract ReentrancyGuard {
    // Booleans are more expensive than uint256 or any type that takes up a full
    // word because each write operation emits an extra SLOAD to first read the
    // slot's contents, replace the bits taken up by the boolean, and then write
    // back. This is the compiler's defense against contract upgrades and
    // pointer aliasing, and it cannot be disabled.

    // The values being non-zero value makes deployment a bit more expensive,
    // but in exchange the refund on every call to nonReentrant will be lower in
    // amount. Since refunds are capped to a percentage of the total
    // transaction's gas, it is best to keep them low in cases like this one, to
    // increase the likelihood of the full refund coming into effect.
    uint256 private constant _NOT_ENTERED = 1;
    uint256 private constant _ENTERED = 2;

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and make it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

        // Any calls to nonReentrant after this point will fail
        _status = _ENTERED;

        _;

        // By storing the original value once again, a refund is triggered (see
        // https://eips.ethereum.org/EIPS/eip-2200)
        _status = _NOT_ENTERED;
    }
}














/**
 * @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);
}







/**
 * @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);
}





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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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









/**
 * @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;
    }
}


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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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







/**
 * @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);
}


/**
 * @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();
    }
}


contract AbilityScores is ERC721Enumerable, ReentrancyGuard, Ownable {

    ERC721 loot = ERC721(0x4F8730E0b32B04beaa5757e5aea3aeF970E5B613);
    
    // mirror a dice roll
    function random(string memory input) internal pure returns (uint256) {
        return (uint256(keccak256(abi.encodePacked(input))) % 6) + 1;
    }
    
    function getStrength(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Strength");
    }
    
    function getAiming(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Aiming");
    }
    
    function getStamina(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Stamina");
    }
    
    function getStealth(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Stealth");
    }

    function getDriving(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Driving");
    }
    
    function getSwimming(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Swimming");
    }
    
    function pluck(uint256 tokenId, string memory keyPrefix) internal pure returns (string memory) {
        uint256 roll1 = random(string(abi.encodePacked(keyPrefix, toString(tokenId), "1")));
        uint256 min = roll1;
        uint256 roll2 = random(string(abi.encodePacked(keyPrefix, toString(tokenId), "2")));
        min = min > roll2 ? roll2 : min;
        uint256 roll3 = random(string(abi.encodePacked(keyPrefix, toString(tokenId), "3")));
        min = min > roll3 ? roll3 : min;
        uint256 roll4 = random(string(abi.encodePacked(keyPrefix, toString(tokenId), "4")));
        min = min > roll4 ? roll4 : min;
        
        // get 3 highest dice rolls
        uint256 stat = roll1 + roll2 + roll3 + roll4 - min;
        
        string memory output = string(abi.encodePacked(keyPrefix, ": ", toString(stat)));

        return output;
    }

    function tokenURI(uint256 tokenId) override public pure returns (string memory) {
        string[13] memory parts;
        parts[0] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: black; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="#01ff01" /><text x="10" y="20" class="base">';

        parts[1] = getStrength(tokenId);

        parts[2] = '</text><text x="10" y="40" class="base">';

        parts[3] = getAiming(tokenId);

        parts[4] = '</text><text x="10" y="60" class="base">';

        parts[5] = getStamina(tokenId);

        parts[6] = '</text><text x="10" y="80" class="base">';

        parts[7] = getStealth(tokenId);

        parts[8] = '</text><text x="10" y="100" class="base">';

        parts[9] = getDriving(tokenId);

        parts[10] = '</text><text x="10" y="120" class="base">';

        parts[11] = getSwimming(tokenId);

        parts[12] = '</text></svg>';

        string memory output = string(abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8]));
        output = string(abi.encodePacked(output, parts[9], parts[10], parts[11], parts[12]));
        
        string memory json = Base64.encode(bytes(string(abi.encodePacked('{"name": "Sheet #', toString(tokenId), '", "description": "Skill Stats are randomized RPG style stats generated and stored on chain. Feel free to use Skill Stats in any way you want.", "image": "data:image/svg+xml;base64,', Base64.encode(bytes(output)), '"}'))));
        output = string(abi.encodePacked('data:application/json;base64,', json));

        return output;
    }

    function claim(uint256 tokenId) public nonReentrant {
        require(tokenId > 8000 && tokenId < 9576, "Token ID invalid");
        _safeMint(_msgSender(), tokenId);
    }
    
    function claimForLoot(uint256 tokenId) public nonReentrant {
        require(tokenId > 0 && tokenId < 8001, "Token ID invalid");
        require(loot.ownerOf(tokenId) == msg.sender, "Not Loot owner");
        _safeMint(_msgSender(), tokenId);
    }
    
    function ownerClaim(uint256 tokenId) public nonReentrant onlyOwner {
        require(tokenId > 9575 && tokenId < 10001, "Token ID invalid");
        _safeMint(owner(), tokenId);
    }
    
    function toString(uint256 value) internal pure returns (string memory) {
    // Inspired by OraclizeAPI's implementation - MIT license
    // 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);
    }
    
    constructor() ERC721("Stats", "STATS") Ownable() {}
}

/// [MIT License]
/// @title Base64
/// @notice Provides a function for encoding some bytes in base64
/// @author Brecht Devos <[email protected]>
library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

    /// @notice Encodes some bytes to the base64 representation
    function encode(bytes memory data) internal pure returns (string memory) {
        uint256 len = data.length;
        if (len == 0) return "";

        // multiply by 4/3 rounded up
        uint256 encodedLen = 4 * ((len + 2) / 3);

        // Add some extra buffer at the end
        bytes memory result = new bytes(encodedLen + 32);

        bytes memory table = TABLE;

        assembly {
            let tablePtr := add(table, 1)
            let resultPtr := add(result, 32)

            for {
                let i := 0
            } lt(i, len) {

            } {
                i := add(i, 3)
                let input := and(mload(add(data, i)), 0xffffff)

                let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF))
                out := shl(8, out)
                out := add(out, and(mload(add(tablePtr, and(input, 0x3F))), 0xFF))
                out := shl(224, out)

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

            switch mod(len, 3)
            case 1 {
                mstore(sub(resultPtr, 2), shl(240, 0x3d3d))
            }
            case 2 {
                mstore(sub(resultPtr, 1), shl(248, 0x3d))
            }

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"claimForLoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getAiming","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDriving","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStamina","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStealth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStrength","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSwimming","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","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":"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":"ownerClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"pure","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"}]

6080604052734f8730e0b32b04beaa5757e5aea3aef970e5b613600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b506040518060400160405280600581526020017f53746174730000000000000000000000000000000000000000000000000000008152506040518060400160405280600581526020017f53544154530000000000000000000000000000000000000000000000000000008152508160009080519060200190620000eb92919062000203565b5080600190805190602001906200010492919062000203565b5050506001600a819055506200012f620001236200013560201b60201c565b6200013d60201b60201c565b62000318565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021190620002b3565b90600052602060002090601f01602090048101928262000235576000855562000281565b82601f106200025057805160ff191683800117855562000281565b8280016001018555821562000281579182015b828111156200028057825182559160200191906001019062000263565b5b50905062000290919062000294565b5090565b5b80821115620002af57600081600090555060010162000295565b5090565b60006002820490506001821680620002cc57607f821691505b60208210811415620002e357620002e2620002e9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614e5a80620003286000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80635a5a0885116100f9578063a7c8efc311610097578063e53fbda611610071578063e53fbda61461053b578063e62256301461056b578063e985e9c51461059b578063f2fde38b146105cb576101c4565b8063a7c8efc3146104bf578063b88d4fde146104ef578063c87b56dd1461050b576101c4565b8063715018a6116100d3578063715018a61461045d5780638da5cb5b1461046757806395d89b4114610485578063a22cb465146104a3576101c4565b80635a5a0885146103cd5780636352211e146103fd57806370a082311461042d576101c4565b8063350d560211610166578063434f48c411610140578063434f48c41461033557806347d8636a146103515780634f6ccce71461036d578063566f9f141461039d576101c4565b8063350d5602146102cd578063379607f5146102fd57806342842e0e14610319576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806318160ddd1461026357806323b872dd146102815780632f745c591461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de91906135ac565b6105e7565b6040516101f09190613d88565b60405180910390f35b610201610661565b60405161020e9190613da3565b60405180910390f35b610231600480360381019061022c91906135fe565b6106f3565b60405161023e9190613d21565b60405180910390f35b610261600480360381019061025c9190613570565b610778565b005b61026b610890565b6040516102789190614045565b60405180910390f35b61029b6004803603810190610296919061346a565b61089d565b005b6102b760048036038101906102b29190613570565b6108fd565b6040516102c49190614045565b60405180910390f35b6102e760048036038101906102e291906135fe565b6109a2565b6040516102f49190613da3565b60405180910390f35b610317600480360381019061031291906135fe565b6109ea565b005b610333600480360381019061032e919061346a565b610aa5565b005b61034f600480360381019061034a91906135fe565b610ac5565b005b61036b600480360381019061036691906135fe565b610bfc565b005b610387600480360381019061038291906135fe565b610dce565b6040516103949190614045565b60405180910390f35b6103b760048036038101906103b291906135fe565b610e65565b6040516103c49190613da3565b60405180910390f35b6103e760048036038101906103e291906135fe565b610ead565b6040516103f49190613da3565b60405180910390f35b610417600480360381019061041291906135fe565b610ef5565b6040516104249190613d21565b60405180910390f35b610447600480360381019061044291906133dc565b610fa7565b6040516104549190614045565b60405180910390f35b61046561105f565b005b61046f6110e7565b60405161047c9190613d21565b60405180910390f35b61048d611111565b60405161049a9190613da3565b60405180910390f35b6104bd60048036038101906104b89190613534565b6111a3565b005b6104d960048036038101906104d491906135fe565b611324565b6040516104e69190613da3565b60405180910390f35b610509600480360381019061050491906134b9565b61136c565b005b610525600480360381019061052091906135fe565b6113ce565b6040516105329190613da3565b60405180910390f35b610555600480360381019061055091906135fe565b611c24565b6040516105629190613da3565b60405180910390f35b610585600480360381019061058091906135fe565b611c6c565b6040516105929190613da3565b60405180910390f35b6105b560048036038101906105b0919061342e565b611cb4565b6040516105c29190613d88565b60405180910390f35b6105e560048036038101906105e091906133dc565b611d48565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061065a575061065982611e40565b5b9050919050565b606060008054610670906142c4565b80601f016020809104026020016040519081016040528092919081815260200182805461069c906142c4565b80156106e95780601f106106be576101008083540402835291602001916106e9565b820191906000526020600020905b8154815290600101906020018083116106cc57829003601f168201915b5050505050905090565b60006106fe82611f22565b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073490613f45565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078382610ef5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107eb90613fc5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610813611f8e565b73ffffffffffffffffffffffffffffffffffffffff16148061084257506108418161083c611f8e565b611cb4565b5b610881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087890613ec5565b60405180910390fd5b61088b8383611f96565b505050565b6000600880549050905090565b6108ae6108a8611f8e565b8261204f565b6108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e490613fe5565b60405180910390fd5b6108f883838361212d565b505050565b600061090883610fa7565b8210610949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094090613dc5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60606109e3826040518060400160405280600781526020017f44726976696e6700000000000000000000000000000000000000000000000000815250612389565b9050919050565b6002600a541415610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2790614025565b60405180910390fd5b6002600a81905550611f4081118015610a4a575061256881105b610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090613f85565b60405180910390fd5b610a9a610a94611f8e565b8261250a565b6001600a8190555050565b610ac08383836040518060200160405280600081525061136c565b505050565b6002600a541415610b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0290614025565b60405180910390fd5b6002600a81905550610b1b611f8e565b73ffffffffffffffffffffffffffffffffffffffff16610b396110e7565b73ffffffffffffffffffffffffffffffffffffffff1614610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690613f65565b60405180910390fd5b61256781118015610ba1575061271181105b610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd790613f85565b60405180910390fd5b610bf1610beb6110e7565b8261250a565b6001600a8190555050565b6002600a541415610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3990614025565b60405180910390fd5b6002600a81905550600081118015610c5b5750611f4181105b610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9190613f85565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610d0c9190614045565b60206040518083038186803b158015610d2457600080fd5b505afa158015610d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5c9190613405565b73ffffffffffffffffffffffffffffffffffffffff1614610db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da990613e45565b60405180910390fd5b610dc3610dbd611f8e565b8261250a565b6001600a8190555050565b6000610dd8610890565b8210610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1090614005565b60405180910390fd5b60088281548110610e53577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6060610ea6826040518060400160405280600881526020017f5377696d6d696e67000000000000000000000000000000000000000000000000815250612389565b9050919050565b6060610eee826040518060400160405280600681526020017f41696d696e670000000000000000000000000000000000000000000000000000815250612389565b9050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9590613f05565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100f90613ee5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611067611f8e565b73ffffffffffffffffffffffffffffffffffffffff166110856110e7565b73ffffffffffffffffffffffffffffffffffffffff16146110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290613f65565b60405180910390fd5b6110e56000612528565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611120906142c4565b80601f016020809104026020016040519081016040528092919081815260200182805461114c906142c4565b80156111995780601f1061116e57610100808354040283529160200191611199565b820191906000526020600020905b81548152906001019060200180831161117c57829003601f168201915b5050505050905090565b6111ab611f8e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121090613e85565b60405180910390fd5b8060056000611226611f8e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112d3611f8e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113189190613d88565b60405180910390a35050565b6060611365826040518060400160405280600781526020017f537465616c746800000000000000000000000000000000000000000000000000815250612389565b9050919050565b61137d611377611f8e565b8361204f565b6113bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b390613fe5565b60405180910390fd5b6113c8848484846125ee565b50505050565b60606113d86132ce565b60405180610120016040528060ff8152602001614cbe60ff9139816000600d811061142c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061143d83611c24565b816001600d8110611477577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614dfd60289139816002600d81106114d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506114e383610ead565b816003600d811061151d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614c1c60289139816004600d8110611578577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061158983611c6c565b816005600d81106115c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614c6d60289139816006600d811061161e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061162f83611324565b816007600d8110611669577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001614c9560299139816008600d81106116c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506116d5836109a2565b816009600d811061170f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001614c446029913981600a600d811061176a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061177b83610e65565b81600b600d81106117b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081600c600d811061182d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506000816000600d8110611871577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151826001600d81106118b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151836002600d81106118ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151846003600d811061192e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151856004600d811061196d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151866005600d81106119ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151876006600d81106119eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151886007600d8110611a2a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151896008600d8110611a69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611a8699989796959493929190613b50565b604051602081830303815290604052905080826009600d8110611ad2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600a600d8110611b11577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600b600d8110611b50577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600c600d8110611b8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611ba8959493929190613b05565b60405160208183030381529060405290506000611bf5611bc78661264a565b611bd0846127f7565b604051602001611be1929190613cba565b6040516020818303038152906040526127f7565b905080604051602001611c089190613cff565b6040516020818303038152906040529150819350505050919050565b6060611c65826040518060400160405280600881526020017f537472656e677468000000000000000000000000000000000000000000000000815250612389565b9050919050565b6060611cad826040518060400160405280600781526020017f5374616d696e6100000000000000000000000000000000000000000000000000815250612389565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d50611f8e565b73ffffffffffffffffffffffffffffffffffffffff16611d6e6110e7565b73ffffffffffffffffffffffffffffffffffffffff1614611dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbb90613f65565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b90613e05565b60405180910390fd5b611e3d81612528565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f0b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f1b5750611f1a826129b5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661200983610ef5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061205a82611f22565b612099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209090613ea5565b60405180910390fd5b60006120a483610ef5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061211357508373ffffffffffffffffffffffffffffffffffffffff166120fb846106f3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061212457506121238185611cb4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661214d82610ef5565b73ffffffffffffffffffffffffffffffffffffffff16146121a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219a90613fa5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220a90613e65565b60405180910390fd5b61221e838383612a1f565b612229600082611f96565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461227991906141da565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122d091906140f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060006123bf8361239a8661264a565b6040516020016123ab929190613c5c565b604051602081830303815290604052612b33565b9050600081905060006123fa856123d58861264a565b6040516020016123e6929190613c2d565b604051602081830303815290604052612b33565b9050808211612409578161240b565b805b915060006124418661241c8961264a565b60405160200161242d929190613bfe565b604051602081830303815290604052612b33565b90508083116124505782612452565b805b92506000612488876124638a61264a565b604051602001612474929190613bcf565b604051602081830303815290604052612b33565b90508084116124975783612499565b805b9350600084828486896124ac91906140f9565b6124b691906140f9565b6124c091906140f9565b6124ca91906141da565b90506000886124d88361264a565b6040516020016124e9929190613c8b565b60405160208183030381529060405290508097505050505050505092915050565b612524828260405180602001604052806000815250612b7e565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125f984848461212d565b61260584848484612bd9565b612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90613de5565b60405180910390fd5b50505050565b60606000821415612692576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127f2565b600082905060005b600082146126c45780806126ad90614327565b915050600a826126bd919061414f565b915061269a565b60008167ffffffffffffffff811115612706577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127385781602001600182028036833780820191505090505b5090505b600085146127eb5760018261275191906141da565b9150600a856127609190614370565b603061276c91906140f9565b60f81b8183815181106127a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127e4919061414f565b945061273c565b8093505050505b919050565b6060600082519050600081141561282057604051806020016040528060008152509150506129b0565b6000600360028361283191906140f9565b61283b919061414f565b60046128479190614180565b9050600060208261285891906140f9565b67ffffffffffffffff811115612897577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128c95781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614dbd604091399050600181016020830160005b8681101561296d5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506128f4565b5060038606600181146129875760028114612997576129a2565b613d3d60f01b60028303526129a2565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a2a838383612d70565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a6d57612a6881612d75565b612aac565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612aab57612aaa8382612dbe565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612aef57612aea81612f2b565b612b2e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b2d57612b2c828261306e565b5b5b505050565b60006001600683604051602001612b4a9190613aee565b6040516020818303038152906040528051906020012060001c612b6d9190614370565b612b7791906140f9565b9050919050565b612b8883836130ed565b612b956000848484612bd9565b612bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcb90613de5565b60405180910390fd5b505050565b6000612bfa8473ffffffffffffffffffffffffffffffffffffffff166132bb565b15612d63578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c23611f8e565b8786866040518563ffffffff1660e01b8152600401612c459493929190613d3c565b602060405180830381600087803b158015612c5f57600080fd5b505af1925050508015612c9057506040513d601f19601f82011682018060405250810190612c8d91906135d5565b60015b612d13573d8060008114612cc0576040519150601f19603f3d011682016040523d82523d6000602084013e612cc5565b606091505b50600081511415612d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0290613de5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d68565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612dcb84610fa7565b612dd591906141da565b9050600060076000848152602001908152602001600020549050818114612eba576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612f3f91906141da565b9050600060096000848152602001908152602001600020549050600060088381548110612f95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612fdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613052577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061307983610fa7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561315d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315490613f25565b60405180910390fd5b61316681611f22565b156131a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319d90613e25565b60405180910390fd5b6131b260008383612a1f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461320291906140f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b604051806101a00160405280600d905b60608152602001906001900390816132de5790505090565b600061330961330484614085565b614060565b90508281526020810184848401111561332157600080fd5b61332c848285614282565b509392505050565b60008135905061334381614bbf565b92915050565b60008151905061335881614bbf565b92915050565b60008135905061336d81614bd6565b92915050565b60008135905061338281614bed565b92915050565b60008151905061339781614bed565b92915050565b600082601f8301126133ae57600080fd5b81356133be8482602086016132f6565b91505092915050565b6000813590506133d681614c04565b92915050565b6000602082840312156133ee57600080fd5b60006133fc84828501613334565b91505092915050565b60006020828403121561341757600080fd5b600061342584828501613349565b91505092915050565b6000806040838503121561344157600080fd5b600061344f85828601613334565b925050602061346085828601613334565b9150509250929050565b60008060006060848603121561347f57600080fd5b600061348d86828701613334565b935050602061349e86828701613334565b92505060406134af868287016133c7565b9150509250925092565b600080600080608085870312156134cf57600080fd5b60006134dd87828801613334565b94505060206134ee87828801613334565b93505060406134ff878288016133c7565b925050606085013567ffffffffffffffff81111561351c57600080fd5b6135288782880161339d565b91505092959194509250565b6000806040838503121561354757600080fd5b600061355585828601613334565b92505060206135668582860161335e565b9150509250929050565b6000806040838503121561358357600080fd5b600061359185828601613334565b92505060206135a2858286016133c7565b9150509250929050565b6000602082840312156135be57600080fd5b60006135cc84828501613373565b91505092915050565b6000602082840312156135e757600080fd5b60006135f584828501613388565b91505092915050565b60006020828403121561361057600080fd5b600061361e848285016133c7565b91505092915050565b6136308161420e565b82525050565b61363f81614220565b82525050565b6000613650826140b6565b61365a81856140cc565b935061366a818560208601614291565b6136738161445d565b840191505092915050565b6000613689826140c1565b61369381856140dd565b93506136a3818560208601614291565b6136ac8161445d565b840191505092915050565b60006136c2826140c1565b6136cc81856140ee565b93506136dc818560208601614291565b80840191505092915050565b60006136f56001836140ee565b91506137008261446e565b600182019050919050565b6000613718602b836140dd565b915061372382614497565b604082019050919050565b600061373b6032836140dd565b9150613746826144e6565b604082019050919050565b600061375e6026836140dd565b915061376982614535565b604082019050919050565b6000613781601c836140dd565b915061378c82614584565b602082019050919050565b60006137a46001836140ee565b91506137af826145ad565b600182019050919050565b60006137c7600e836140dd565b91506137d2826145d6565b602082019050919050565b60006137ea6024836140dd565b91506137f5826145ff565b604082019050919050565b600061380d6019836140dd565b91506138188261464e565b602082019050919050565b60006138306011836140ee565b915061383b82614677565b601182019050919050565b6000613853602c836140dd565b915061385e826146a0565b604082019050919050565b60006138766038836140dd565b9150613881826146ef565b604082019050919050565b6000613899602a836140dd565b91506138a48261473e565b604082019050919050565b60006138bc6029836140dd565b91506138c78261478d565b604082019050919050565b60006138df6002836140ee565b91506138ea826147dc565b600282019050919050565b60006139026020836140dd565b915061390d82614805565b602082019050919050565b6000613925602c836140dd565b91506139308261482e565b604082019050919050565b60006139486020836140dd565b91506139538261487d565b602082019050919050565b600061396b6010836140dd565b9150613976826148a6565b602082019050919050565b600061398e6029836140dd565b9150613999826148cf565b604082019050919050565b60006139b16001836140ee565b91506139bc8261491e565b600182019050919050565b60006139d46021836140dd565b91506139df82614947565b604082019050919050565b60006139f7601d836140ee565b9150613a0282614996565b601d82019050919050565b6000613a1a6031836140dd565b9150613a25826149bf565b604082019050919050565b6000613a3d6001836140ee565b9150613a4882614a0e565b600182019050919050565b6000613a60602c836140dd565b9150613a6b82614a37565b604082019050919050565b6000613a836002836140ee565b9150613a8e82614a86565b600282019050919050565b6000613aa6601f836140dd565b9150613ab182614aaf565b602082019050919050565b6000613ac960b5836140ee565b9150613ad482614ad8565b60b582019050919050565b613ae881614278565b82525050565b6000613afa82846136b7565b915081905092915050565b6000613b1182886136b7565b9150613b1d82876136b7565b9150613b2982866136b7565b9150613b3582856136b7565b9150613b4182846136b7565b91508190509695505050505050565b6000613b5c828c6136b7565b9150613b68828b6136b7565b9150613b74828a6136b7565b9150613b8082896136b7565b9150613b8c82886136b7565b9150613b9882876136b7565b9150613ba482866136b7565b9150613bb082856136b7565b9150613bbc82846136b7565b91508190509a9950505050505050505050565b6000613bdb82856136b7565b9150613be782846136b7565b9150613bf2826136e8565b91508190509392505050565b6000613c0a82856136b7565b9150613c1682846136b7565b9150613c2182613797565b91508190509392505050565b6000613c3982856136b7565b9150613c4582846136b7565b9150613c50826139a4565b91508190509392505050565b6000613c6882856136b7565b9150613c7482846136b7565b9150613c7f82613a30565b91508190509392505050565b6000613c9782856136b7565b9150613ca282613a76565b9150613cae82846136b7565b91508190509392505050565b6000613cc582613823565b9150613cd182856136b7565b9150613cdc82613abc565b9150613ce882846136b7565b9150613cf3826138d2565b91508190509392505050565b6000613d0a826139ea565b9150613d1682846136b7565b915081905092915050565b6000602082019050613d366000830184613627565b92915050565b6000608082019050613d516000830187613627565b613d5e6020830186613627565b613d6b6040830185613adf565b8181036060830152613d7d8184613645565b905095945050505050565b6000602082019050613d9d6000830184613636565b92915050565b60006020820190508181036000830152613dbd818461367e565b905092915050565b60006020820190508181036000830152613dde8161370b565b9050919050565b60006020820190508181036000830152613dfe8161372e565b9050919050565b60006020820190508181036000830152613e1e81613751565b9050919050565b60006020820190508181036000830152613e3e81613774565b9050919050565b60006020820190508181036000830152613e5e816137ba565b9050919050565b60006020820190508181036000830152613e7e816137dd565b9050919050565b60006020820190508181036000830152613e9e81613800565b9050919050565b60006020820190508181036000830152613ebe81613846565b9050919050565b60006020820190508181036000830152613ede81613869565b9050919050565b60006020820190508181036000830152613efe8161388c565b9050919050565b60006020820190508181036000830152613f1e816138af565b9050919050565b60006020820190508181036000830152613f3e816138f5565b9050919050565b60006020820190508181036000830152613f5e81613918565b9050919050565b60006020820190508181036000830152613f7e8161393b565b9050919050565b60006020820190508181036000830152613f9e8161395e565b9050919050565b60006020820190508181036000830152613fbe81613981565b9050919050565b60006020820190508181036000830152613fde816139c7565b9050919050565b60006020820190508181036000830152613ffe81613a0d565b9050919050565b6000602082019050818103600083015261401e81613a53565b9050919050565b6000602082019050818103600083015261403e81613a99565b9050919050565b600060208201905061405a6000830184613adf565b92915050565b600061406a61407b565b905061407682826142f6565b919050565b6000604051905090565b600067ffffffffffffffff8211156140a05761409f61442e565b5b6140a98261445d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061410482614278565b915061410f83614278565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614144576141436143a1565b5b828201905092915050565b600061415a82614278565b915061416583614278565b925082614175576141746143d0565b5b828204905092915050565b600061418b82614278565b915061419683614278565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141cf576141ce6143a1565b5b828202905092915050565b60006141e582614278565b91506141f083614278565b925082821015614203576142026143a1565b5b828203905092915050565b600061421982614258565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142af578082015181840152602081019050614294565b838111156142be576000848401525b50505050565b600060028204905060018216806142dc57607f821691505b602082108114156142f0576142ef6143ff565b5b50919050565b6142ff8261445d565b810181811067ffffffffffffffff8211171561431e5761431d61442e565b5b80604052505050565b600061433282614278565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614365576143646143a1565b5b600182019050919050565b600061437b82614278565b915061438683614278565b925082614396576143956143d0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f3400000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f3300000000000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f74204c6f6f74206f776e6572000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f7b226e616d65223a202253686565742023000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f3200000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f3100000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f3a20000000000000000000000000000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f222c20226465736372697074696f6e223a2022536b696c6c205374617473206160008201527f72652072616e646f6d697a656420525047207374796c6520737461747320676560208201527f6e65726174656420616e642073746f726564206f6e20636861696e2e2046656560408201527f6c206672656520746f2075736520536b696c6c20537461747320696e20616e7960608201527f2077617920796f752077616e742e222c2022696d616765223a2022646174613a60808201527f696d6167652f7376672b786d6c3b6261736536342c000000000000000000000060a082015250565b614bc88161420e565b8114614bd357600080fd5b50565b614bdf81614220565b8114614bea57600080fd5b50565b614bf68161422c565b8114614c0157600080fd5b50565b614c0d81614278565b8114614c1857600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222330316666303122202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212200b19451d1f4ceae08d15748febf7a1291c12fda16a6a2ac0d8161d35e3db23fb64736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80635a5a0885116100f9578063a7c8efc311610097578063e53fbda611610071578063e53fbda61461053b578063e62256301461056b578063e985e9c51461059b578063f2fde38b146105cb576101c4565b8063a7c8efc3146104bf578063b88d4fde146104ef578063c87b56dd1461050b576101c4565b8063715018a6116100d3578063715018a61461045d5780638da5cb5b1461046757806395d89b4114610485578063a22cb465146104a3576101c4565b80635a5a0885146103cd5780636352211e146103fd57806370a082311461042d576101c4565b8063350d560211610166578063434f48c411610140578063434f48c41461033557806347d8636a146103515780634f6ccce71461036d578063566f9f141461039d576101c4565b8063350d5602146102cd578063379607f5146102fd57806342842e0e14610319576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806318160ddd1461026357806323b872dd146102815780632f745c591461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de91906135ac565b6105e7565b6040516101f09190613d88565b60405180910390f35b610201610661565b60405161020e9190613da3565b60405180910390f35b610231600480360381019061022c91906135fe565b6106f3565b60405161023e9190613d21565b60405180910390f35b610261600480360381019061025c9190613570565b610778565b005b61026b610890565b6040516102789190614045565b60405180910390f35b61029b6004803603810190610296919061346a565b61089d565b005b6102b760048036038101906102b29190613570565b6108fd565b6040516102c49190614045565b60405180910390f35b6102e760048036038101906102e291906135fe565b6109a2565b6040516102f49190613da3565b60405180910390f35b610317600480360381019061031291906135fe565b6109ea565b005b610333600480360381019061032e919061346a565b610aa5565b005b61034f600480360381019061034a91906135fe565b610ac5565b005b61036b600480360381019061036691906135fe565b610bfc565b005b610387600480360381019061038291906135fe565b610dce565b6040516103949190614045565b60405180910390f35b6103b760048036038101906103b291906135fe565b610e65565b6040516103c49190613da3565b60405180910390f35b6103e760048036038101906103e291906135fe565b610ead565b6040516103f49190613da3565b60405180910390f35b610417600480360381019061041291906135fe565b610ef5565b6040516104249190613d21565b60405180910390f35b610447600480360381019061044291906133dc565b610fa7565b6040516104549190614045565b60405180910390f35b61046561105f565b005b61046f6110e7565b60405161047c9190613d21565b60405180910390f35b61048d611111565b60405161049a9190613da3565b60405180910390f35b6104bd60048036038101906104b89190613534565b6111a3565b005b6104d960048036038101906104d491906135fe565b611324565b6040516104e69190613da3565b60405180910390f35b610509600480360381019061050491906134b9565b61136c565b005b610525600480360381019061052091906135fe565b6113ce565b6040516105329190613da3565b60405180910390f35b610555600480360381019061055091906135fe565b611c24565b6040516105629190613da3565b60405180910390f35b610585600480360381019061058091906135fe565b611c6c565b6040516105929190613da3565b60405180910390f35b6105b560048036038101906105b0919061342e565b611cb4565b6040516105c29190613d88565b60405180910390f35b6105e560048036038101906105e091906133dc565b611d48565b005b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061065a575061065982611e40565b5b9050919050565b606060008054610670906142c4565b80601f016020809104026020016040519081016040528092919081815260200182805461069c906142c4565b80156106e95780601f106106be576101008083540402835291602001916106e9565b820191906000526020600020905b8154815290600101906020018083116106cc57829003601f168201915b5050505050905090565b60006106fe82611f22565b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073490613f45565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078382610ef5565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107eb90613fc5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610813611f8e565b73ffffffffffffffffffffffffffffffffffffffff16148061084257506108418161083c611f8e565b611cb4565b5b610881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087890613ec5565b60405180910390fd5b61088b8383611f96565b505050565b6000600880549050905090565b6108ae6108a8611f8e565b8261204f565b6108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e490613fe5565b60405180910390fd5b6108f883838361212d565b505050565b600061090883610fa7565b8210610949576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161094090613dc5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b60606109e3826040518060400160405280600781526020017f44726976696e6700000000000000000000000000000000000000000000000000815250612389565b9050919050565b6002600a541415610a30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a2790614025565b60405180910390fd5b6002600a81905550611f4081118015610a4a575061256881105b610a89576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a8090613f85565b60405180910390fd5b610a9a610a94611f8e565b8261250a565b6001600a8190555050565b610ac08383836040518060200160405280600081525061136c565b505050565b6002600a541415610b0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b0290614025565b60405180910390fd5b6002600a81905550610b1b611f8e565b73ffffffffffffffffffffffffffffffffffffffff16610b396110e7565b73ffffffffffffffffffffffffffffffffffffffff1614610b8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8690613f65565b60405180910390fd5b61256781118015610ba1575061271181105b610be0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bd790613f85565b60405180910390fd5b610bf1610beb6110e7565b8261250a565b6001600a8190555050565b6002600a541415610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3990614025565b60405180910390fd5b6002600a81905550600081118015610c5b5750611f4181105b610c9a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9190613f85565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610d0c9190614045565b60206040518083038186803b158015610d2457600080fd5b505afa158015610d38573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610d5c9190613405565b73ffffffffffffffffffffffffffffffffffffffff1614610db2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610da990613e45565b60405180910390fd5b610dc3610dbd611f8e565b8261250a565b6001600a8190555050565b6000610dd8610890565b8210610e19576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e1090614005565b60405180910390fd5b60088281548110610e53577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6060610ea6826040518060400160405280600881526020017f5377696d6d696e67000000000000000000000000000000000000000000000000815250612389565b9050919050565b6060610eee826040518060400160405280600681526020017f41696d696e670000000000000000000000000000000000000000000000000000815250612389565b9050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9590613f05565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611018576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100f90613ee5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b611067611f8e565b73ffffffffffffffffffffffffffffffffffffffff166110856110e7565b73ffffffffffffffffffffffffffffffffffffffff16146110db576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110d290613f65565b60405180910390fd5b6110e56000612528565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b606060018054611120906142c4565b80601f016020809104026020016040519081016040528092919081815260200182805461114c906142c4565b80156111995780601f1061116e57610100808354040283529160200191611199565b820191906000526020600020905b81548152906001019060200180831161117c57829003601f168201915b5050505050905090565b6111ab611f8e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611219576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161121090613e85565b60405180910390fd5b8060056000611226611f8e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166112d3611f8e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516113189190613d88565b60405180910390a35050565b6060611365826040518060400160405280600781526020017f537465616c746800000000000000000000000000000000000000000000000000815250612389565b9050919050565b61137d611377611f8e565b8361204f565b6113bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113b390613fe5565b60405180910390fd5b6113c8848484846125ee565b50505050565b60606113d86132ce565b60405180610120016040528060ff8152602001614cbe60ff9139816000600d811061142c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061143d83611c24565b816001600d8110611477577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614dfd60289139816002600d81106114d2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506114e383610ead565b816003600d811061151d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614c1c60289139816004600d8110611578577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061158983611c6c565b816005600d81106115c3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614c6d60289139816006600d811061161e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061162f83611324565b816007600d8110611669577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001614c9560299139816008600d81106116c4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506116d5836109a2565b816009600d811061170f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001614c446029913981600a600d811061176a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061177b83610e65565b81600b600d81106117b5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081600c600d811061182d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506000816000600d8110611871577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151826001600d81106118b0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151836002600d81106118ef577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151846003600d811061192e577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151856004600d811061196d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151866005600d81106119ac577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151876006600d81106119eb577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151886007600d8110611a2a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151896008600d8110611a69577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611a8699989796959493929190613b50565b604051602081830303815290604052905080826009600d8110611ad2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600a600d8110611b11577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600b600d8110611b50577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600c600d8110611b8f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611ba8959493929190613b05565b60405160208183030381529060405290506000611bf5611bc78661264a565b611bd0846127f7565b604051602001611be1929190613cba565b6040516020818303038152906040526127f7565b905080604051602001611c089190613cff565b6040516020818303038152906040529150819350505050919050565b6060611c65826040518060400160405280600881526020017f537472656e677468000000000000000000000000000000000000000000000000815250612389565b9050919050565b6060611cad826040518060400160405280600781526020017f5374616d696e6100000000000000000000000000000000000000000000000000815250612389565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d50611f8e565b73ffffffffffffffffffffffffffffffffffffffff16611d6e6110e7565b73ffffffffffffffffffffffffffffffffffffffff1614611dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbb90613f65565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b90613e05565b60405180910390fd5b611e3d81612528565b50565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f0b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f1b5750611f1a826129b5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661200983610ef5565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061205a82611f22565b612099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209090613ea5565b60405180910390fd5b60006120a483610ef5565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061211357508373ffffffffffffffffffffffffffffffffffffffff166120fb846106f3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061212457506121238185611cb4565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661214d82610ef5565b73ffffffffffffffffffffffffffffffffffffffff16146121a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219a90613fa5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220a90613e65565b60405180910390fd5b61221e838383612a1f565b612229600082611f96565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461227991906141da565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122d091906140f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060006123bf8361239a8661264a565b6040516020016123ab929190613c5c565b604051602081830303815290604052612b33565b9050600081905060006123fa856123d58861264a565b6040516020016123e6929190613c2d565b604051602081830303815290604052612b33565b9050808211612409578161240b565b805b915060006124418661241c8961264a565b60405160200161242d929190613bfe565b604051602081830303815290604052612b33565b90508083116124505782612452565b805b92506000612488876124638a61264a565b604051602001612474929190613bcf565b604051602081830303815290604052612b33565b90508084116124975783612499565b805b9350600084828486896124ac91906140f9565b6124b691906140f9565b6124c091906140f9565b6124ca91906141da565b90506000886124d88361264a565b6040516020016124e9929190613c8b565b60405160208183030381529060405290508097505050505050505092915050565b612524828260405180602001604052806000815250612b7e565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125f984848461212d565b61260584848484612bd9565b612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90613de5565b60405180910390fd5b50505050565b60606000821415612692576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127f2565b600082905060005b600082146126c45780806126ad90614327565b915050600a826126bd919061414f565b915061269a565b60008167ffffffffffffffff811115612706577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127385781602001600182028036833780820191505090505b5090505b600085146127eb5760018261275191906141da565b9150600a856127609190614370565b603061276c91906140f9565b60f81b8183815181106127a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127e4919061414f565b945061273c565b8093505050505b919050565b6060600082519050600081141561282057604051806020016040528060008152509150506129b0565b6000600360028361283191906140f9565b61283b919061414f565b60046128479190614180565b9050600060208261285891906140f9565b67ffffffffffffffff811115612897577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128c95781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614dbd604091399050600181016020830160005b8681101561296d5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506128f4565b5060038606600181146129875760028114612997576129a2565b613d3d60f01b60028303526129a2565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a2a838383612d70565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a6d57612a6881612d75565b612aac565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612aab57612aaa8382612dbe565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612aef57612aea81612f2b565b612b2e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b2d57612b2c828261306e565b5b5b505050565b60006001600683604051602001612b4a9190613aee565b6040516020818303038152906040528051906020012060001c612b6d9190614370565b612b7791906140f9565b9050919050565b612b8883836130ed565b612b956000848484612bd9565b612bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcb90613de5565b60405180910390fd5b505050565b6000612bfa8473ffffffffffffffffffffffffffffffffffffffff166132bb565b15612d63578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c23611f8e565b8786866040518563ffffffff1660e01b8152600401612c459493929190613d3c565b602060405180830381600087803b158015612c5f57600080fd5b505af1925050508015612c9057506040513d601f19601f82011682018060405250810190612c8d91906135d5565b60015b612d13573d8060008114612cc0576040519150601f19603f3d011682016040523d82523d6000602084013e612cc5565b606091505b50600081511415612d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0290613de5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d68565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612dcb84610fa7565b612dd591906141da565b9050600060076000848152602001908152602001600020549050818114612eba576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612f3f91906141da565b9050600060096000848152602001908152602001600020549050600060088381548110612f95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612fdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613052577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061307983610fa7565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561315d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315490613f25565b60405180910390fd5b61316681611f22565b156131a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319d90613e25565b60405180910390fd5b6131b260008383612a1f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461320291906140f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b604051806101a00160405280600d905b60608152602001906001900390816132de5790505090565b600061330961330484614085565b614060565b90508281526020810184848401111561332157600080fd5b61332c848285614282565b509392505050565b60008135905061334381614bbf565b92915050565b60008151905061335881614bbf565b92915050565b60008135905061336d81614bd6565b92915050565b60008135905061338281614bed565b92915050565b60008151905061339781614bed565b92915050565b600082601f8301126133ae57600080fd5b81356133be8482602086016132f6565b91505092915050565b6000813590506133d681614c04565b92915050565b6000602082840312156133ee57600080fd5b60006133fc84828501613334565b91505092915050565b60006020828403121561341757600080fd5b600061342584828501613349565b91505092915050565b6000806040838503121561344157600080fd5b600061344f85828601613334565b925050602061346085828601613334565b9150509250929050565b60008060006060848603121561347f57600080fd5b600061348d86828701613334565b935050602061349e86828701613334565b92505060406134af868287016133c7565b9150509250925092565b600080600080608085870312156134cf57600080fd5b60006134dd87828801613334565b94505060206134ee87828801613334565b93505060406134ff878288016133c7565b925050606085013567ffffffffffffffff81111561351c57600080fd5b6135288782880161339d565b91505092959194509250565b6000806040838503121561354757600080fd5b600061355585828601613334565b92505060206135668582860161335e565b9150509250929050565b6000806040838503121561358357600080fd5b600061359185828601613334565b92505060206135a2858286016133c7565b9150509250929050565b6000602082840312156135be57600080fd5b60006135cc84828501613373565b91505092915050565b6000602082840312156135e757600080fd5b60006135f584828501613388565b91505092915050565b60006020828403121561361057600080fd5b600061361e848285016133c7565b91505092915050565b6136308161420e565b82525050565b61363f81614220565b82525050565b6000613650826140b6565b61365a81856140cc565b935061366a818560208601614291565b6136738161445d565b840191505092915050565b6000613689826140c1565b61369381856140dd565b93506136a3818560208601614291565b6136ac8161445d565b840191505092915050565b60006136c2826140c1565b6136cc81856140ee565b93506136dc818560208601614291565b80840191505092915050565b60006136f56001836140ee565b91506137008261446e565b600182019050919050565b6000613718602b836140dd565b915061372382614497565b604082019050919050565b600061373b6032836140dd565b9150613746826144e6565b604082019050919050565b600061375e6026836140dd565b915061376982614535565b604082019050919050565b6000613781601c836140dd565b915061378c82614584565b602082019050919050565b60006137a46001836140ee565b91506137af826145ad565b600182019050919050565b60006137c7600e836140dd565b91506137d2826145d6565b602082019050919050565b60006137ea6024836140dd565b91506137f5826145ff565b604082019050919050565b600061380d6019836140dd565b91506138188261464e565b602082019050919050565b60006138306011836140ee565b915061383b82614677565b601182019050919050565b6000613853602c836140dd565b915061385e826146a0565b604082019050919050565b60006138766038836140dd565b9150613881826146ef565b604082019050919050565b6000613899602a836140dd565b91506138a48261473e565b604082019050919050565b60006138bc6029836140dd565b91506138c78261478d565b604082019050919050565b60006138df6002836140ee565b91506138ea826147dc565b600282019050919050565b60006139026020836140dd565b915061390d82614805565b602082019050919050565b6000613925602c836140dd565b91506139308261482e565b604082019050919050565b60006139486020836140dd565b91506139538261487d565b602082019050919050565b600061396b6010836140dd565b9150613976826148a6565b602082019050919050565b600061398e6029836140dd565b9150613999826148cf565b604082019050919050565b60006139b16001836140ee565b91506139bc8261491e565b600182019050919050565b60006139d46021836140dd565b91506139df82614947565b604082019050919050565b60006139f7601d836140ee565b9150613a0282614996565b601d82019050919050565b6000613a1a6031836140dd565b9150613a25826149bf565b604082019050919050565b6000613a3d6001836140ee565b9150613a4882614a0e565b600182019050919050565b6000613a60602c836140dd565b9150613a6b82614a37565b604082019050919050565b6000613a836002836140ee565b9150613a8e82614a86565b600282019050919050565b6000613aa6601f836140dd565b9150613ab182614aaf565b602082019050919050565b6000613ac960b5836140ee565b9150613ad482614ad8565b60b582019050919050565b613ae881614278565b82525050565b6000613afa82846136b7565b915081905092915050565b6000613b1182886136b7565b9150613b1d82876136b7565b9150613b2982866136b7565b9150613b3582856136b7565b9150613b4182846136b7565b91508190509695505050505050565b6000613b5c828c6136b7565b9150613b68828b6136b7565b9150613b74828a6136b7565b9150613b8082896136b7565b9150613b8c82886136b7565b9150613b9882876136b7565b9150613ba482866136b7565b9150613bb082856136b7565b9150613bbc82846136b7565b91508190509a9950505050505050505050565b6000613bdb82856136b7565b9150613be782846136b7565b9150613bf2826136e8565b91508190509392505050565b6000613c0a82856136b7565b9150613c1682846136b7565b9150613c2182613797565b91508190509392505050565b6000613c3982856136b7565b9150613c4582846136b7565b9150613c50826139a4565b91508190509392505050565b6000613c6882856136b7565b9150613c7482846136b7565b9150613c7f82613a30565b91508190509392505050565b6000613c9782856136b7565b9150613ca282613a76565b9150613cae82846136b7565b91508190509392505050565b6000613cc582613823565b9150613cd182856136b7565b9150613cdc82613abc565b9150613ce882846136b7565b9150613cf3826138d2565b91508190509392505050565b6000613d0a826139ea565b9150613d1682846136b7565b915081905092915050565b6000602082019050613d366000830184613627565b92915050565b6000608082019050613d516000830187613627565b613d5e6020830186613627565b613d6b6040830185613adf565b8181036060830152613d7d8184613645565b905095945050505050565b6000602082019050613d9d6000830184613636565b92915050565b60006020820190508181036000830152613dbd818461367e565b905092915050565b60006020820190508181036000830152613dde8161370b565b9050919050565b60006020820190508181036000830152613dfe8161372e565b9050919050565b60006020820190508181036000830152613e1e81613751565b9050919050565b60006020820190508181036000830152613e3e81613774565b9050919050565b60006020820190508181036000830152613e5e816137ba565b9050919050565b60006020820190508181036000830152613e7e816137dd565b9050919050565b60006020820190508181036000830152613e9e81613800565b9050919050565b60006020820190508181036000830152613ebe81613846565b9050919050565b60006020820190508181036000830152613ede81613869565b9050919050565b60006020820190508181036000830152613efe8161388c565b9050919050565b60006020820190508181036000830152613f1e816138af565b9050919050565b60006020820190508181036000830152613f3e816138f5565b9050919050565b60006020820190508181036000830152613f5e81613918565b9050919050565b60006020820190508181036000830152613f7e8161393b565b9050919050565b60006020820190508181036000830152613f9e8161395e565b9050919050565b60006020820190508181036000830152613fbe81613981565b9050919050565b60006020820190508181036000830152613fde816139c7565b9050919050565b60006020820190508181036000830152613ffe81613a0d565b9050919050565b6000602082019050818103600083015261401e81613a53565b9050919050565b6000602082019050818103600083015261403e81613a99565b9050919050565b600060208201905061405a6000830184613adf565b92915050565b600061406a61407b565b905061407682826142f6565b919050565b6000604051905090565b600067ffffffffffffffff8211156140a05761409f61442e565b5b6140a98261445d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061410482614278565b915061410f83614278565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614144576141436143a1565b5b828201905092915050565b600061415a82614278565b915061416583614278565b925082614175576141746143d0565b5b828204905092915050565b600061418b82614278565b915061419683614278565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141cf576141ce6143a1565b5b828202905092915050565b60006141e582614278565b91506141f083614278565b925082821015614203576142026143a1565b5b828203905092915050565b600061421982614258565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142af578082015181840152602081019050614294565b838111156142be576000848401525b50505050565b600060028204905060018216806142dc57607f821691505b602082108114156142f0576142ef6143ff565b5b50919050565b6142ff8261445d565b810181811067ffffffffffffffff8211171561431e5761431d61442e565b5b80604052505050565b600061433282614278565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614365576143646143a1565b5b600182019050919050565b600061437b82614278565b915061438683614278565b925082614396576143956143d0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f3400000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f3300000000000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f74204c6f6f74206f776e6572000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f7b226e616d65223a202253686565742023000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f3200000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f3100000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f3a20000000000000000000000000000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f222c20226465736372697074696f6e223a2022536b696c6c205374617473206160008201527f72652072616e646f6d697a656420525047207374796c6520737461747320676560208201527f6e65726174656420616e642073746f726564206f6e20636861696e2e2046656560408201527f6c206672656520746f2075736520536b696c6c20537461747320696e20616e7960608201527f2077617920796f752077616e742e222c2022696d616765223a2022646174613a60808201527f696d6167652f7376672b786d6c3b6261736536342c000000000000000000000060a082015250565b614bc88161420e565b8114614bd357600080fd5b50565b614bdf81614220565b8114614bea57600080fd5b50565b614bf68161422c565b8114614c0157600080fd5b50565b614c0d81614278565b8114614c1857600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a20626c61636b3b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222330316666303122202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea26469706673582212200b19451d1f4ceae08d15748febf7a1291c12fda16a6a2ac0d8161d35e3db23fb64736f6c63430008040033

Deployed Bytecode Sourcemap

44561:5209:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38411:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25525:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27084:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26607:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39051:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27974:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38719:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45443:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48340:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28384:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48791:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48527:252;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39241:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45579:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45041:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25219:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24949:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9917:94;;;:::i;:::-;;9266:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25694:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27377:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45311:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28640:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46595:1737;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44903:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45175:124;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27743:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10166:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38411:224;38513:4;38552:35;38537:50;;;:11;:50;;;;:90;;;;38591:36;38615:11;38591:23;:36::i;:::-;38537:90;38530:97;;38411:224;;;:::o;25525:100::-;25579:13;25612:5;25605:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25525:100;:::o;27084:221::-;27160:7;27188:16;27196:7;27188;:16::i;:::-;27180:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27273:15;:24;27289:7;27273:24;;;;;;;;;;;;;;;;;;;;;27266:31;;27084:221;;;:::o;26607:411::-;26688:13;26704:23;26719:7;26704:14;:23::i;:::-;26688:39;;26752:5;26746:11;;:2;:11;;;;26738:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26846:5;26830:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26855:37;26872:5;26879:12;:10;:12::i;:::-;26855:16;:37::i;:::-;26830:62;26808:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26989:21;26998:2;27002:7;26989:8;:21::i;:::-;26607:411;;;:::o;39051:113::-;39112:7;39139:10;:17;;;;39132:24;;39051:113;:::o;27974:339::-;28169:41;28188:12;:10;:12::i;:::-;28202:7;28169:18;:41::i;:::-;28161:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28277:28;28287:4;28293:2;28297:7;28277:9;:28::i;:::-;27974:339;;;:::o;38719:256::-;38816:7;38852:23;38869:5;38852:16;:23::i;:::-;38844:5;:31;38836:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38941:12;:19;38954:5;38941:19;;;;;;;;;;;;;;;:26;38961:5;38941:26;;;;;;;;;;;;38934:33;;38719:256;;;;:::o;45443:124::-;45501:13;45534:25;45540:7;45534:25;;;;;;;;;;;;;;;;;:5;:25::i;:::-;45527:32;;45443:124;;;:::o;48340:175::-;12205:1;12801:7;;:19;;12793:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12205:1;12934:7;:18;;;;48421:4:::1;48411:7;:14;:32;;;;;48439:4;48429:7;:14;48411:32;48403:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48475:32;48485:12;:10;:12::i;:::-;48499:7;48475:9;:32::i;:::-;12161:1:::0;13113:7;:22;;;;48340:175;:::o;28384:185::-;28522:39;28539:4;28545:2;28549:7;28522:39;;;;;;;;;;;;:16;:39::i;:::-;28384:185;;;:::o;48791:186::-;12205:1;12801:7;;:19;;12793:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12205:1;12934:7;:18;;;;9497:12:::1;:10;:12::i;:::-;9486:23;;:7;:5;:7::i;:::-;:23;;;9478:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48887:4:::2;48877:7;:14;:33;;;;;48905:5;48895:7;:15;48877:33;48869:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48942:27;48952:7;:5;:7::i;:::-;48961;48942:9;:27::i;:::-;12161:1:::0;13113:7;:22;;;;48791:186;:::o;48527:252::-;12205:1;12801:7;;:19;;12793:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12205:1;12934:7;:18;;;;48615:1:::1;48605:7;:11;:29;;;;;48630:4;48620:7;:14;48605:29;48597:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48699:10;48674:35;;:4;;;;;;;;;;;:12;;;48687:7;48674:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;;48666:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48739:32;48749:12;:10;:12::i;:::-;48763:7;48739:9;:32::i;:::-;12161:1:::0;13113:7;:22;;;;48527:252;:::o;39241:233::-;39316:7;39352:30;:28;:30::i;:::-;39344:5;:38;39336:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39449:10;39460:5;39449:17;;;;;;;;;;;;;;;;;;;;;;;;39442:24;;39241:233;;;:::o;45579:126::-;45638:13;45671:26;45677:7;45671:26;;;;;;;;;;;;;;;;;:5;:26::i;:::-;45664:33;;45579:126;;;:::o;45041:122::-;45098:13;45131:24;45137:7;45131:24;;;;;;;;;;;;;;;;;:5;:24::i;:::-;45124:31;;45041:122;;;:::o;25219:239::-;25291:7;25311:13;25327:7;:16;25335:7;25327:16;;;;;;;;;;;;;;;;;;;;;25311:32;;25379:1;25362:19;;:5;:19;;;;25354:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25445:5;25438:12;;;25219:239;;;:::o;24949:208::-;25021:7;25066:1;25049:19;;:5;:19;;;;25041:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25133:9;:16;25143:5;25133:16;;;;;;;;;;;;;;;;25126:23;;24949:208;;;:::o;9917:94::-;9497:12;:10;:12::i;:::-;9486:23;;:7;:5;:7::i;:::-;:23;;;9478:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9982:21:::1;10000:1;9982:9;:21::i;:::-;9917:94::o:0;9266:87::-;9312:7;9339:6;;;;;;;;;;;9332:13;;9266:87;:::o;25694:104::-;25750:13;25783:7;25776:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25694:104;:::o;27377:295::-;27492:12;:10;:12::i;:::-;27480:24;;:8;:24;;;;27472:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27592:8;27547:18;:32;27566:12;:10;:12::i;:::-;27547:32;;;;;;;;;;;;;;;:42;27580:8;27547:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27645:8;27616:48;;27631:12;:10;:12::i;:::-;27616:48;;;27655:8;27616:48;;;;;;:::i;:::-;;;;;;;;27377:295;;:::o;45311:124::-;45369:13;45402:25;45408:7;45402:25;;;;;;;;;;;;;;;;;:5;:25::i;:::-;45395:32;;45311:124;;;:::o;28640:328::-;28815:41;28834:12;:10;:12::i;:::-;28848:7;28815:18;:41::i;:::-;28807:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28921:39;28935:4;28941:2;28945:7;28954:5;28921:13;:39::i;:::-;28640:328;;;;:::o;46595:1737::-;46660:13;46686:23;;:::i;:::-;46720:268;;;;;;;;;;;;;;;;;:5;46726:1;46720:8;;;;;;;;;;;;;;;;;;:268;;;;47012:20;47024:7;47012:11;:20::i;:::-;47001:5;47007:1;47001:8;;;;;;;;;;;;;;;;;;:31;;;;47045:53;;;;;;;;;;;;;;;;;:5;47051:1;47045:8;;;;;;;;;;;;;;;;;;:53;;;;47122:18;47132:7;47122:9;:18::i;:::-;47111:5;47117:1;47111:8;;;;;;;;;;;;;;;;;;:29;;;;47153:53;;;;;;;;;;;;;;;;;:5;47159:1;47153:8;;;;;;;;;;;;;;;;;;:53;;;;47230:19;47241:7;47230:10;:19::i;:::-;47219:5;47225:1;47219:8;;;;;;;;;;;;;;;;;;:30;;;;47262:53;;;;;;;;;;;;;;;;;:5;47268:1;47262:8;;;;;;;;;;;;;;;;;;:53;;;;47339:19;47350:7;47339:10;:19::i;:::-;47328:5;47334:1;47328:8;;;;;;;;;;;;;;;;;;:30;;;;47371:54;;;;;;;;;;;;;;;;;:5;47377:1;47371:8;;;;;;;;;;;;;;;;;;:54;;;;47449:19;47460:7;47449:10;:19::i;:::-;47438:5;47444:1;47438:8;;;;;;;;;;;;;;;;;;:30;;;;47481:55;;;;;;;;;;;;;;;;;:5;47487:2;47481:9;;;;;;;;;;;;;;;;;;:55;;;;47561:20;47573:7;47561:11;:20::i;:::-;47549:5;47555:2;47549:9;;;;;;;;;;;;;;;;;;:32;;;;47594:27;;;;;;;;;;;;;;;;;:5;47600:2;47594:9;;;;;;;;;;;;;;;;;;:27;;;;47634:20;47681:5;47687:1;47681:8;;;;;;;;;;;;;;;;;;;47691:5;47697:1;47691:8;;;;;;;;;;;;;;;;;;;47701:5;47707:1;47701:8;;;;;;;;;;;;;;;;;;;47711:5;47717:1;47711:8;;;;;;;;;;;;;;;;;;;47721:5;47727:1;47721:8;;;;;;;;;;;;;;;;;;;47731:5;47737:1;47731:8;;;;;;;;;;;;;;;;;;;47741:5;47747:1;47741:8;;;;;;;;;;;;;;;;;;;47751:5;47757:1;47751:8;;;;;;;;;;;;;;;;;;;47761:5;47767:1;47761:8;;;;;;;;;;;;;;;;;;;47664:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47634:137;;47815:6;47823:5;47829:1;47823:8;;;;;;;;;;;;;;;;;;;47833:5;47839:2;47833:9;;;;;;;;;;;;;;;;;;;47844:5;47850:2;47844:9;;;;;;;;;;;;;;;;;;;47855:5;47861:2;47855:9;;;;;;;;;;;;;;;;;;;47798:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47782:84;;47887:18;47908:307;47973:17;47982:7;47973:8;:17::i;:::-;48177:28;48197:6;48177:13;:28::i;:::-;47935:277;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47908:13;:307::i;:::-;47887:328;;48292:4;48242:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;48226:72;;48318:6;48311:13;;;;;46595:1737;;;:::o;44903:126::-;44962:13;44995:26;45001:7;44995:26;;;;;;;;;;;;;;;;;:5;:26::i;:::-;44988:33;;44903:126;;;:::o;45175:124::-;45233:13;45266:25;45272:7;45266:25;;;;;;;;;;;;;;;;;:5;:25::i;:::-;45259:32;;45175:124;;;:::o;27743:164::-;27840:4;27864:18;:25;27883:5;27864:25;;;;;;;;;;;;;;;:35;27890:8;27864:35;;;;;;;;;;;;;;;;;;;;;;;;;27857:42;;27743:164;;;;:::o;10166:192::-;9497:12;:10;:12::i;:::-;9486:23;;:7;:5;:7::i;:::-;:23;;;9478:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10275:1:::1;10255:22;;:8;:22;;;;10247:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10331:19;10341:8;10331:9;:19::i;:::-;10166:192:::0;:::o;24580:305::-;24682:4;24734:25;24719:40;;;:11;:40;;;;:105;;;;24791:33;24776:48;;;:11;:48;;;;24719:105;:158;;;;24841:36;24865:11;24841:23;:36::i;:::-;24719:158;24699:178;;24580:305;;;:::o;30478:127::-;30543:4;30595:1;30567:30;;:7;:16;30575:7;30567:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30560:37;;30478:127;;;:::o;8126:98::-;8179:7;8206:10;8199:17;;8126:98;:::o;34460:174::-;34562:2;34535:15;:24;34551:7;34535:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34618:7;34614:2;34580:46;;34589:23;34604:7;34589:14;:23::i;:::-;34580:46;;;;;;;;;;;;34460:174;;:::o;30772:348::-;30865:4;30890:16;30898:7;30890;:16::i;:::-;30882:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30966:13;30982:23;30997:7;30982:14;:23::i;:::-;30966:39;;31035:5;31024:16;;:7;:16;;;:51;;;;31068:7;31044:31;;:20;31056:7;31044:11;:20::i;:::-;:31;;;31024:51;:87;;;;31079:32;31096:5;31103:7;31079:16;:32::i;:::-;31024:87;31016:96;;;30772:348;;;;:::o;33764:578::-;33923:4;33896:31;;:23;33911:7;33896:14;:23::i;:::-;:31;;;33888:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;34006:1;33992:16;;:2;:16;;;;33984:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;34062:39;34083:4;34089:2;34093:7;34062:20;:39::i;:::-;34166:29;34183:1;34187:7;34166:8;:29::i;:::-;34227:1;34208:9;:15;34218:4;34208:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34256:1;34239:9;:13;34249:2;34239:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34287:2;34268:7;:16;34276:7;34268:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34326:7;34322:2;34307:27;;34316:4;34307:27;;;;;;;;;;;;33764:578;;;:::o;45717:870::-;45797:13;45823;45839:67;45870:9;45881:17;45890:7;45881:8;:17::i;:::-;45853:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45839:6;:67::i;:::-;45823:83;;45917:11;45931:5;45917:19;;45947:13;45963:67;45994:9;46005:17;46014:7;46005:8;:17::i;:::-;45977:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45963:6;:67::i;:::-;45947:83;;46053:5;46047:3;:11;:25;;46069:3;46047:25;;;46061:5;46047:25;46041:31;;46083:13;46099:67;46130:9;46141:17;46150:7;46141:8;:17::i;:::-;46113:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46099:6;:67::i;:::-;46083:83;;46189:5;46183:3;:11;:25;;46205:3;46183:25;;;46197:5;46183:25;46177:31;;46219:13;46235:67;46266:9;46277:17;46286:7;46277:8;:17::i;:::-;46249:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46235:6;:67::i;:::-;46219:83;;46325:5;46319:3;:11;:25;;46341:3;46319:25;;;46333:5;46319:25;46313:31;;46402:12;46449:3;46441:5;46433;46425;46417;:13;;;;:::i;:::-;:21;;;;:::i;:::-;:29;;;;:::i;:::-;:35;;;;:::i;:::-;46402:50;;46473:20;46520:9;46537:14;46546:4;46537:8;:14::i;:::-;46503:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46473:80;;46573:6;46566:13;;;;;;;;;45717:870;;;;:::o;31462:110::-;31538:26;31548:2;31552:7;31538:26;;;;;;;;;;;;:9;:26::i;:::-;31462:110;;:::o;10366:173::-;10422:16;10441:6;;;;;;;;;;;10422:25;;10467:8;10458:6;;:17;;;;;;;;;;;;;;;;;;10522:8;10491:40;;10512:8;10491:40;;;;;;;;;;;;10366:173;;:::o;29850:315::-;30007:28;30017:4;30023:2;30027:7;30007:9;:28::i;:::-;30054:48;30077:4;30083:2;30087:7;30096:5;30054:22;:48::i;:::-;30046:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29850:315;;;;:::o;48989:715::-;49045:13;49267:1;49258:5;:10;49254:53;;;49285:10;;;;;;;;;;;;;;;;;;;;;49254:53;49317:12;49332:5;49317:20;;49348:14;49373:78;49388:1;49380:4;:9;49373:78;;49406:8;;;;;:::i;:::-;;;;49437:2;49429:10;;;;;:::i;:::-;;;49373:78;;;49461:19;49493:6;49483:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49461:39;;49511:154;49527:1;49518:5;:10;49511:154;;49555:1;49545:11;;;;;:::i;:::-;;;49622:2;49614:5;:10;;;;:::i;:::-;49601:2;:24;;;;:::i;:::-;49588:39;;49571:6;49578;49571:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;49651:2;49642:11;;;;;:::i;:::-;;;49511:154;;;49689:6;49675:21;;;;;48989:715;;;;:::o;50121:1607::-;50179:13;50205:11;50219:4;:11;50205:25;;50252:1;50245:3;:8;50241:23;;;50255:9;;;;;;;;;;;;;;;;;50241:23;50316:18;50354:1;50349;50343:3;:7;;;;:::i;:::-;50342:13;;;;:::i;:::-;50337:1;:19;;;;:::i;:::-;50316:40;;50414:19;50459:2;50446:10;:15;;;;:::i;:::-;50436:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50414:48;;50475:18;50496:5;;;;;;;;;;;;;;;;;50475:26;;50565:1;50558:5;50554:13;50610:2;50602:6;50598:15;50661:1;50629:777;50684:3;50681:1;50678:10;50629:777;;;50739:1;50736;50732:9;50727:14;;50797:8;50792:1;50786:4;50782:12;50776:19;50772:34;50877:4;50869:5;50865:2;50861:14;50857:25;50847:8;50843:40;50837:47;50916:3;50913:1;50909:11;50902:18;;51007:4;50998;50990:5;50986:2;50982:14;50978:25;50968:8;50964:40;50958:47;50954:58;50949:3;50945:68;50938:75;;51045:3;51042:1;51038:11;51031:18;;51135:4;51126;51118:5;51115:1;51111:13;51107:24;51097:8;51093:39;51087:46;51083:57;51078:3;51074:67;51067:74;;51173:3;51170:1;51166:11;51159:18;;51255:4;51246;51239:5;51235:16;51225:8;51221:31;51215:38;51211:49;51206:3;51202:59;51195:66;;51295:3;51290;51286:13;51279:20;;51337:3;51326:9;51319:22;51389:1;51378:9;51374:17;51361:30;;50708:698;;50629:777;;;50633:44;51438:1;51433:3;51429:11;51459:1;51454:84;;;;51557:1;51552:82;;;;51422:212;;51454:84;51515:6;51510:3;51506:16;51502:1;51491:9;51487:17;51480:43;51454:84;;51552:82;51613:4;51608:3;51604:14;51600:1;51589:9;51585:17;51578:41;51422:212;;51665:10;51657:6;51650:26;50523:1164;;51713:6;51699:21;;;;;;50121:1607;;;;:::o;23187:157::-;23272:4;23311:25;23296:40;;;:11;:40;;;;23289:47;;23187:157;;;:::o;40087:589::-;40231:45;40258:4;40264:2;40268:7;40231:26;:45::i;:::-;40309:1;40293:18;;:4;:18;;;40289:187;;;40328:40;40360:7;40328:31;:40::i;:::-;40289:187;;;40398:2;40390:10;;:4;:10;;;40386:90;;40417:47;40450:4;40456:7;40417:32;:47::i;:::-;40386:90;40289:187;40504:1;40490:16;;:2;:16;;;40486:183;;;40523:45;40560:7;40523:36;:45::i;:::-;40486:183;;;40596:4;40590:10;;:2;:10;;;40586:83;;40617:40;40645:2;40649:7;40617:27;:40::i;:::-;40586:83;40486:183;40087:589;;;:::o;44743:148::-;44803:7;44882:1;44877;44866:5;44849:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;44839:34;;;;;;44831:43;;:47;;;;:::i;:::-;44830:53;;;;:::i;:::-;44823:60;;44743:148;;;:::o;31799:321::-;31929:18;31935:2;31939:7;31929:5;:18::i;:::-;31980:54;32011:1;32015:2;32019:7;32028:5;31980:22;:54::i;:::-;31958:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31799:321;;;:::o;35199:803::-;35354:4;35375:15;:2;:13;;;:15::i;:::-;35371:624;;;35427:2;35411:36;;;35448:12;:10;:12::i;:::-;35462:4;35468:7;35477:5;35411:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35407:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35674:1;35657:6;:13;:18;35653:272;;;35700:60;;;;;;;;;;:::i;:::-;;;;;;;;35653:272;35875:6;35869:13;35860:6;35856:2;35852:15;35845:38;35407:533;35544:45;;;35534:55;;;:6;:55;;;;35527:62;;;;;35371:624;35979:4;35972:11;;35199:803;;;;;;;:::o;36574:126::-;;;;:::o;41399:164::-;41503:10;:17;;;;41476:15;:24;41492:7;41476:24;;;;;;;;;;;:44;;;;41531:10;41547:7;41531:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41399:164;:::o;42190:988::-;42456:22;42506:1;42481:22;42498:4;42481:16;:22::i;:::-;:26;;;;:::i;:::-;42456:51;;42518:18;42539:17;:26;42557:7;42539:26;;;;;;;;;;;;42518:47;;42686:14;42672:10;:28;42668:328;;42717:19;42739:12;:18;42752:4;42739:18;;;;;;;;;;;;;;;:34;42758:14;42739:34;;;;;;;;;;;;42717:56;;42823:11;42790:12;:18;42803:4;42790:18;;;;;;;;;;;;;;;:30;42809:10;42790:30;;;;;;;;;;;:44;;;;42940:10;42907:17;:30;42925:11;42907:30;;;;;;;;;;;:43;;;;42668:328;;43092:17;:26;43110:7;43092:26;;;;;;;;;;;43085:33;;;43136:12;:18;43149:4;43136:18;;;;;;;;;;;;;;;:34;43155:14;43136:34;;;;;;;;;;;43129:41;;;42190:988;;;;:::o;43473:1079::-;43726:22;43771:1;43751:10;:17;;;;:21;;;;:::i;:::-;43726:46;;43783:18;43804:15;:24;43820:7;43804:24;;;;;;;;;;;;43783:45;;44155:19;44177:10;44188:14;44177:26;;;;;;;;;;;;;;;;;;;;;;;;44155:48;;44241:11;44216:10;44227;44216:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44352:10;44321:15;:28;44337:11;44321:28;;;;;;;;;;;:41;;;;44493:15;:24;44509:7;44493:24;;;;;;;;;;;44486:31;;;44528:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43473:1079;;;;:::o;40977:221::-;41062:14;41079:20;41096:2;41079:16;:20::i;:::-;41062:37;;41137:7;41110:12;:16;41123:2;41110:16;;;;;;;;;;;;;;;:24;41127:6;41110:24;;;;;;;;;;;:34;;;;41184:6;41155:17;:26;41173:7;41155:26;;;;;;;;;;;:35;;;;40977:221;;;:::o;32456:382::-;32550:1;32536:16;;:2;:16;;;;32528:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32609:16;32617:7;32609;:16::i;:::-;32608:17;32600:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32671:45;32700:1;32704:2;32708:7;32671:20;:45::i;:::-;32746:1;32729:9;:13;32739:2;32729:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32777:2;32758:7;:16;32766:7;32758:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32822:7;32818:2;32797:33;;32814:1;32797:33;;;;;;;;;;;;32456:382;;:::o;15359:387::-;15419:4;15627:12;15694:7;15682:20;15674:28;;15737:1;15730:4;:8;15723:15;;;15359:387;;;:::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::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:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:143::-;558:5;589:6;583:13;574:22;;605:33;632:5;605:33;:::i;:::-;564:80;;;;:::o;650:133::-;693:5;731:6;718:20;709:29;;747:30;771:5;747:30;:::i;:::-;699:84;;;;:::o;789:137::-;834:5;872:6;859:20;850:29;;888:32;914:5;888:32;:::i;:::-;840:86;;;;:::o;932:141::-;988:5;1019:6;1013:13;1004:22;;1035:32;1061:5;1035:32;:::i;:::-;994:79;;;;:::o;1092:271::-;1147:5;1196:3;1189:4;1181:6;1177:17;1173:27;1163:2;;1214:1;1211;1204:12;1163:2;1254:6;1241:20;1279:78;1353:3;1345:6;1338:4;1330:6;1326:17;1279:78;:::i;:::-;1270:87;;1153:210;;;;;:::o;1369:139::-;1415:5;1453:6;1440:20;1431:29;;1469:33;1496:5;1469:33;:::i;:::-;1421:87;;;;:::o;1514:262::-;1573:6;1622:2;1610:9;1601:7;1597:23;1593:32;1590:2;;;1638:1;1635;1628:12;1590:2;1681:1;1706:53;1751:7;1742:6;1731:9;1727:22;1706:53;:::i;:::-;1696:63;;1652:117;1580:196;;;;:::o;1782:284::-;1852:6;1901:2;1889:9;1880:7;1876:23;1872:32;1869:2;;;1917:1;1914;1907:12;1869:2;1960:1;1985:64;2041:7;2032:6;2021:9;2017:22;1985:64;:::i;:::-;1975:74;;1931:128;1859:207;;;;:::o;2072:407::-;2140:6;2148;2197:2;2185:9;2176:7;2172:23;2168:32;2165:2;;;2213:1;2210;2203:12;2165:2;2256:1;2281:53;2326:7;2317:6;2306:9;2302:22;2281:53;:::i;:::-;2271:63;;2227:117;2383:2;2409:53;2454:7;2445:6;2434:9;2430:22;2409:53;:::i;:::-;2399:63;;2354:118;2155:324;;;;;:::o;2485:552::-;2562:6;2570;2578;2627:2;2615:9;2606:7;2602:23;2598:32;2595:2;;;2643:1;2640;2633:12;2595:2;2686:1;2711:53;2756:7;2747:6;2736:9;2732:22;2711:53;:::i;:::-;2701:63;;2657:117;2813:2;2839:53;2884:7;2875:6;2864:9;2860:22;2839:53;:::i;:::-;2829:63;;2784:118;2941:2;2967:53;3012:7;3003:6;2992:9;2988:22;2967:53;:::i;:::-;2957:63;;2912:118;2585:452;;;;;:::o;3043:809::-;3138:6;3146;3154;3162;3211:3;3199:9;3190:7;3186:23;3182:33;3179:2;;;3228:1;3225;3218:12;3179:2;3271:1;3296:53;3341:7;3332:6;3321:9;3317:22;3296:53;:::i;:::-;3286:63;;3242:117;3398:2;3424:53;3469:7;3460:6;3449:9;3445:22;3424:53;:::i;:::-;3414:63;;3369:118;3526:2;3552:53;3597:7;3588:6;3577:9;3573:22;3552:53;:::i;:::-;3542:63;;3497:118;3682:2;3671:9;3667:18;3654:32;3713:18;3705:6;3702:30;3699:2;;;3745:1;3742;3735:12;3699:2;3773:62;3827:7;3818:6;3807:9;3803:22;3773:62;:::i;:::-;3763:72;;3625:220;3169:683;;;;;;;:::o;3858:401::-;3923:6;3931;3980:2;3968:9;3959:7;3955:23;3951:32;3948:2;;;3996:1;3993;3986:12;3948:2;4039:1;4064:53;4109:7;4100:6;4089:9;4085:22;4064:53;:::i;:::-;4054:63;;4010:117;4166:2;4192:50;4234:7;4225:6;4214:9;4210:22;4192:50;:::i;:::-;4182:60;;4137:115;3938:321;;;;;:::o;4265:407::-;4333:6;4341;4390:2;4378:9;4369:7;4365:23;4361:32;4358:2;;;4406:1;4403;4396:12;4358:2;4449:1;4474:53;4519:7;4510:6;4499:9;4495:22;4474:53;:::i;:::-;4464:63;;4420:117;4576:2;4602:53;4647:7;4638:6;4627:9;4623:22;4602:53;:::i;:::-;4592:63;;4547:118;4348:324;;;;;:::o;4678:260::-;4736:6;4785:2;4773:9;4764:7;4760:23;4756:32;4753:2;;;4801:1;4798;4791:12;4753:2;4844:1;4869:52;4913:7;4904:6;4893:9;4889:22;4869:52;:::i;:::-;4859:62;;4815:116;4743:195;;;;:::o;4944:282::-;5013:6;5062:2;5050:9;5041:7;5037:23;5033:32;5030:2;;;5078:1;5075;5068:12;5030:2;5121:1;5146:63;5201:7;5192:6;5181:9;5177:22;5146:63;:::i;:::-;5136:73;;5092:127;5020:206;;;;:::o;5232:262::-;5291:6;5340:2;5328:9;5319:7;5315:23;5311:32;5308:2;;;5356:1;5353;5346:12;5308:2;5399:1;5424:53;5469:7;5460:6;5449:9;5445:22;5424:53;:::i;:::-;5414:63;;5370:117;5298:196;;;;:::o;5500:118::-;5587:24;5605:5;5587:24;:::i;:::-;5582:3;5575:37;5565:53;;:::o;5624:109::-;5705:21;5720:5;5705:21;:::i;:::-;5700:3;5693:34;5683:50;;:::o;5739:360::-;5825:3;5853:38;5885:5;5853:38;:::i;:::-;5907:70;5970:6;5965:3;5907:70;:::i;:::-;5900:77;;5986:52;6031:6;6026:3;6019:4;6012:5;6008:16;5986:52;:::i;:::-;6063:29;6085:6;6063:29;:::i;:::-;6058:3;6054:39;6047:46;;5829:270;;;;;:::o;6105:364::-;6193:3;6221:39;6254:5;6221:39;:::i;:::-;6276:71;6340:6;6335:3;6276:71;:::i;:::-;6269:78;;6356:52;6401:6;6396:3;6389:4;6382:5;6378:16;6356:52;:::i;:::-;6433:29;6455:6;6433:29;:::i;:::-;6428:3;6424:39;6417:46;;6197:272;;;;;:::o;6475:377::-;6581:3;6609:39;6642:5;6609:39;:::i;:::-;6664:89;6746:6;6741:3;6664:89;:::i;:::-;6657:96;;6762:52;6807:6;6802:3;6795:4;6788:5;6784:16;6762:52;:::i;:::-;6839:6;6834:3;6830:16;6823:23;;6585:267;;;;;:::o;6858:400::-;7018:3;7039:84;7121:1;7116:3;7039:84;:::i;:::-;7032:91;;7132:93;7221:3;7132:93;:::i;:::-;7250:1;7245:3;7241:11;7234:18;;7022:236;;;:::o;7264:366::-;7406:3;7427:67;7491:2;7486:3;7427:67;:::i;:::-;7420:74;;7503:93;7592:3;7503:93;:::i;:::-;7621:2;7616:3;7612:12;7605:19;;7410:220;;;:::o;7636:366::-;7778:3;7799:67;7863:2;7858:3;7799:67;:::i;:::-;7792:74;;7875:93;7964:3;7875:93;:::i;:::-;7993:2;7988:3;7984:12;7977:19;;7782:220;;;:::o;8008:366::-;8150:3;8171:67;8235:2;8230:3;8171:67;:::i;:::-;8164:74;;8247:93;8336:3;8247:93;:::i;:::-;8365:2;8360:3;8356:12;8349:19;;8154:220;;;:::o;8380:366::-;8522:3;8543:67;8607:2;8602:3;8543:67;:::i;:::-;8536:74;;8619:93;8708:3;8619:93;:::i;:::-;8737:2;8732:3;8728:12;8721:19;;8526:220;;;:::o;8752:400::-;8912:3;8933:84;9015:1;9010:3;8933:84;:::i;:::-;8926:91;;9026:93;9115:3;9026:93;:::i;:::-;9144:1;9139:3;9135:11;9128:18;;8916:236;;;:::o;9158:366::-;9300:3;9321:67;9385:2;9380:3;9321:67;:::i;:::-;9314:74;;9397:93;9486:3;9397:93;:::i;:::-;9515:2;9510:3;9506:12;9499:19;;9304:220;;;:::o;9530:366::-;9672:3;9693:67;9757:2;9752:3;9693:67;:::i;:::-;9686:74;;9769:93;9858:3;9769:93;:::i;:::-;9887:2;9882:3;9878:12;9871:19;;9676:220;;;:::o;9902:366::-;10044:3;10065:67;10129:2;10124:3;10065:67;:::i;:::-;10058:74;;10141:93;10230:3;10141:93;:::i;:::-;10259:2;10254:3;10250:12;10243:19;;10048:220;;;:::o;10274:402::-;10434:3;10455:85;10537:2;10532:3;10455:85;:::i;:::-;10448:92;;10549:93;10638:3;10549:93;:::i;:::-;10667:2;10662:3;10658:12;10651:19;;10438:238;;;:::o;10682:366::-;10824:3;10845:67;10909:2;10904:3;10845:67;:::i;:::-;10838:74;;10921:93;11010:3;10921:93;:::i;:::-;11039:2;11034:3;11030:12;11023:19;;10828:220;;;:::o;11054:366::-;11196:3;11217:67;11281:2;11276:3;11217:67;:::i;:::-;11210:74;;11293:93;11382:3;11293:93;:::i;:::-;11411:2;11406:3;11402:12;11395:19;;11200:220;;;:::o;11426:366::-;11568:3;11589:67;11653:2;11648:3;11589:67;:::i;:::-;11582:74;;11665:93;11754:3;11665:93;:::i;:::-;11783:2;11778:3;11774:12;11767:19;;11572:220;;;:::o;11798:366::-;11940:3;11961:67;12025:2;12020:3;11961:67;:::i;:::-;11954:74;;12037:93;12126:3;12037:93;:::i;:::-;12155:2;12150:3;12146:12;12139:19;;11944:220;;;:::o;12170:400::-;12330:3;12351:84;12433:1;12428:3;12351:84;:::i;:::-;12344:91;;12444:93;12533:3;12444:93;:::i;:::-;12562:1;12557:3;12553:11;12546:18;;12334:236;;;:::o;12576:366::-;12718:3;12739:67;12803:2;12798:3;12739:67;:::i;:::-;12732:74;;12815:93;12904:3;12815:93;:::i;:::-;12933:2;12928:3;12924:12;12917:19;;12722:220;;;:::o;12948:366::-;13090:3;13111:67;13175:2;13170:3;13111:67;:::i;:::-;13104:74;;13187:93;13276:3;13187:93;:::i;:::-;13305:2;13300:3;13296:12;13289:19;;13094:220;;;:::o;13320:366::-;13462:3;13483:67;13547:2;13542:3;13483:67;:::i;:::-;13476:74;;13559:93;13648:3;13559:93;:::i;:::-;13677:2;13672:3;13668:12;13661:19;;13466:220;;;:::o;13692:366::-;13834:3;13855:67;13919:2;13914:3;13855:67;:::i;:::-;13848:74;;13931:93;14020:3;13931:93;:::i;:::-;14049:2;14044:3;14040:12;14033:19;;13838:220;;;:::o;14064:366::-;14206:3;14227:67;14291:2;14286:3;14227:67;:::i;:::-;14220:74;;14303:93;14392:3;14303:93;:::i;:::-;14421:2;14416:3;14412:12;14405:19;;14210:220;;;:::o;14436:400::-;14596:3;14617:84;14699:1;14694:3;14617:84;:::i;:::-;14610:91;;14710:93;14799:3;14710:93;:::i;:::-;14828:1;14823:3;14819:11;14812:18;;14600:236;;;:::o;14842:366::-;14984:3;15005:67;15069:2;15064:3;15005:67;:::i;:::-;14998:74;;15081:93;15170:3;15081:93;:::i;:::-;15199:2;15194:3;15190:12;15183:19;;14988:220;;;:::o;15214:402::-;15374:3;15395:85;15477:2;15472:3;15395:85;:::i;:::-;15388:92;;15489:93;15578:3;15489:93;:::i;:::-;15607:2;15602:3;15598:12;15591:19;;15378:238;;;:::o;15622:366::-;15764:3;15785:67;15849:2;15844:3;15785:67;:::i;:::-;15778:74;;15861:93;15950:3;15861:93;:::i;:::-;15979:2;15974:3;15970:12;15963:19;;15768:220;;;:::o;15994:400::-;16154:3;16175:84;16257:1;16252:3;16175:84;:::i;:::-;16168:91;;16268:93;16357:3;16268:93;:::i;:::-;16386:1;16381:3;16377:11;16370:18;;16158:236;;;:::o;16400:366::-;16542:3;16563:67;16627:2;16622:3;16563:67;:::i;:::-;16556:74;;16639:93;16728:3;16639:93;:::i;:::-;16757:2;16752:3;16748:12;16741:19;;16546:220;;;:::o;16772:400::-;16932:3;16953:84;17035:1;17030:3;16953:84;:::i;:::-;16946:91;;17046:93;17135:3;17046:93;:::i;:::-;17164:1;17159:3;17155:11;17148:18;;16936:236;;;:::o;17178:366::-;17320:3;17341:67;17405:2;17400:3;17341:67;:::i;:::-;17334:74;;17417:93;17506:3;17417:93;:::i;:::-;17535:2;17530:3;17526:12;17519:19;;17324:220;;;:::o;17550:404::-;17710:3;17731:86;17813:3;17808;17731:86;:::i;:::-;17724:93;;17826;17915:3;17826:93;:::i;:::-;17944:3;17939;17935:13;17928:20;;17714:240;;;:::o;17960:118::-;18047:24;18065:5;18047:24;:::i;:::-;18042:3;18035:37;18025:53;;:::o;18084:275::-;18216:3;18238:95;18329:3;18320:6;18238:95;:::i;:::-;18231:102;;18350:3;18343:10;;18220:139;;;;:::o;18365:915::-;18689:3;18711:95;18802:3;18793:6;18711:95;:::i;:::-;18704:102;;18823:95;18914:3;18905:6;18823:95;:::i;:::-;18816:102;;18935:95;19026:3;19017:6;18935:95;:::i;:::-;18928:102;;19047:95;19138:3;19129:6;19047:95;:::i;:::-;19040:102;;19159:95;19250:3;19241:6;19159:95;:::i;:::-;19152:102;;19271:3;19264:10;;18693:587;;;;;;;;:::o;19286:1555::-;19802:3;19824:95;19915:3;19906:6;19824:95;:::i;:::-;19817:102;;19936:95;20027:3;20018:6;19936:95;:::i;:::-;19929:102;;20048:95;20139:3;20130:6;20048:95;:::i;:::-;20041:102;;20160:95;20251:3;20242:6;20160:95;:::i;:::-;20153:102;;20272:95;20363:3;20354:6;20272:95;:::i;:::-;20265:102;;20384:95;20475:3;20466:6;20384:95;:::i;:::-;20377:102;;20496:95;20587:3;20578:6;20496:95;:::i;:::-;20489:102;;20608:95;20699:3;20690:6;20608:95;:::i;:::-;20601:102;;20720:95;20811:3;20802:6;20720:95;:::i;:::-;20713:102;;20832:3;20825:10;;19806:1035;;;;;;;;;;;;:::o;20847:701::-;21128:3;21150:95;21241:3;21232:6;21150:95;:::i;:::-;21143:102;;21262:95;21353:3;21344:6;21262:95;:::i;:::-;21255:102;;21374:148;21518:3;21374:148;:::i;:::-;21367:155;;21539:3;21532:10;;21132:416;;;;;:::o;21554:701::-;21835:3;21857:95;21948:3;21939:6;21857:95;:::i;:::-;21850:102;;21969:95;22060:3;22051:6;21969:95;:::i;:::-;21962:102;;22081:148;22225:3;22081:148;:::i;:::-;22074:155;;22246:3;22239:10;;21839:416;;;;;:::o;22261:701::-;22542:3;22564:95;22655:3;22646:6;22564:95;:::i;:::-;22557:102;;22676:95;22767:3;22758:6;22676:95;:::i;:::-;22669:102;;22788:148;22932:3;22788:148;:::i;:::-;22781:155;;22953:3;22946:10;;22546:416;;;;;:::o;22968:701::-;23249:3;23271:95;23362:3;23353:6;23271:95;:::i;:::-;23264:102;;23383:95;23474:3;23465:6;23383:95;:::i;:::-;23376:102;;23495:148;23639:3;23495:148;:::i;:::-;23488:155;;23660:3;23653:10;;23253:416;;;;;:::o;23675:701::-;23956:3;23978:95;24069:3;24060:6;23978:95;:::i;:::-;23971:102;;24090:148;24234:3;24090:148;:::i;:::-;24083:155;;24255:95;24346:3;24337:6;24255:95;:::i;:::-;24248:102;;24367:3;24360:10;;23960:416;;;;;:::o;24382:1233::-;24865:3;24887:148;25031:3;24887:148;:::i;:::-;24880:155;;25052:95;25143:3;25134:6;25052:95;:::i;:::-;25045:102;;25164:148;25308:3;25164:148;:::i;:::-;25157:155;;25329:95;25420:3;25411:6;25329:95;:::i;:::-;25322:102;;25441:148;25585:3;25441:148;:::i;:::-;25434:155;;25606:3;25599:10;;24869:746;;;;;:::o;25621:541::-;25854:3;25876:148;26020:3;25876:148;:::i;:::-;25869:155;;26041:95;26132:3;26123:6;26041:95;:::i;:::-;26034:102;;26153:3;26146:10;;25858:304;;;;:::o;26168:222::-;26261:4;26299:2;26288:9;26284:18;26276:26;;26312:71;26380:1;26369:9;26365:17;26356:6;26312:71;:::i;:::-;26266:124;;;;:::o;26396:640::-;26591:4;26629:3;26618:9;26614:19;26606:27;;26643:71;26711:1;26700:9;26696:17;26687:6;26643:71;:::i;:::-;26724:72;26792:2;26781:9;26777:18;26768:6;26724:72;:::i;:::-;26806;26874:2;26863:9;26859:18;26850:6;26806:72;:::i;:::-;26925:9;26919:4;26915:20;26910:2;26899:9;26895:18;26888:48;26953:76;27024:4;27015:6;26953:76;:::i;:::-;26945:84;;26596:440;;;;;;;:::o;27042:210::-;27129:4;27167:2;27156:9;27152:18;27144:26;;27180:65;27242:1;27231:9;27227:17;27218:6;27180:65;:::i;:::-;27134:118;;;;:::o;27258:313::-;27371:4;27409:2;27398:9;27394:18;27386:26;;27458:9;27452:4;27448:20;27444:1;27433:9;27429:17;27422:47;27486:78;27559:4;27550:6;27486:78;:::i;:::-;27478:86;;27376:195;;;;:::o;27577:419::-;27743:4;27781:2;27770:9;27766:18;27758:26;;27830:9;27824:4;27820:20;27816:1;27805:9;27801:17;27794:47;27858:131;27984:4;27858:131;:::i;:::-;27850:139;;27748:248;;;:::o;28002:419::-;28168:4;28206:2;28195:9;28191:18;28183:26;;28255:9;28249:4;28245:20;28241:1;28230:9;28226:17;28219:47;28283:131;28409:4;28283:131;:::i;:::-;28275:139;;28173:248;;;:::o;28427:419::-;28593:4;28631:2;28620:9;28616:18;28608:26;;28680:9;28674:4;28670:20;28666:1;28655:9;28651:17;28644:47;28708:131;28834:4;28708:131;:::i;:::-;28700:139;;28598:248;;;:::o;28852:419::-;29018:4;29056:2;29045:9;29041:18;29033:26;;29105:9;29099:4;29095:20;29091:1;29080:9;29076:17;29069:47;29133:131;29259:4;29133:131;:::i;:::-;29125:139;;29023:248;;;:::o;29277:419::-;29443:4;29481:2;29470:9;29466:18;29458:26;;29530:9;29524:4;29520:20;29516:1;29505:9;29501:17;29494:47;29558:131;29684:4;29558:131;:::i;:::-;29550:139;;29448:248;;;:::o;29702:419::-;29868:4;29906:2;29895:9;29891:18;29883:26;;29955:9;29949:4;29945:20;29941:1;29930:9;29926:17;29919:47;29983:131;30109:4;29983:131;:::i;:::-;29975:139;;29873:248;;;:::o;30127:419::-;30293:4;30331:2;30320:9;30316:18;30308:26;;30380:9;30374:4;30370:20;30366:1;30355:9;30351:17;30344:47;30408:131;30534:4;30408:131;:::i;:::-;30400:139;;30298:248;;;:::o;30552:419::-;30718:4;30756:2;30745:9;30741:18;30733:26;;30805:9;30799:4;30795:20;30791:1;30780:9;30776:17;30769:47;30833:131;30959:4;30833:131;:::i;:::-;30825:139;;30723:248;;;:::o;30977:419::-;31143:4;31181:2;31170:9;31166:18;31158:26;;31230:9;31224:4;31220:20;31216:1;31205:9;31201:17;31194:47;31258:131;31384:4;31258:131;:::i;:::-;31250:139;;31148:248;;;:::o;31402:419::-;31568:4;31606:2;31595:9;31591:18;31583:26;;31655:9;31649:4;31645:20;31641:1;31630:9;31626:17;31619:47;31683:131;31809:4;31683:131;:::i;:::-;31675:139;;31573:248;;;:::o;31827:419::-;31993:4;32031:2;32020:9;32016:18;32008:26;;32080:9;32074:4;32070:20;32066:1;32055:9;32051:17;32044:47;32108:131;32234:4;32108:131;:::i;:::-;32100:139;;31998:248;;;:::o;32252:419::-;32418:4;32456:2;32445:9;32441:18;32433:26;;32505:9;32499:4;32495:20;32491:1;32480:9;32476:17;32469:47;32533:131;32659:4;32533:131;:::i;:::-;32525:139;;32423:248;;;:::o;32677:419::-;32843:4;32881:2;32870:9;32866:18;32858:26;;32930:9;32924:4;32920:20;32916:1;32905:9;32901:17;32894:47;32958:131;33084:4;32958:131;:::i;:::-;32950:139;;32848:248;;;:::o;33102:419::-;33268:4;33306:2;33295:9;33291:18;33283:26;;33355:9;33349:4;33345:20;33341:1;33330:9;33326:17;33319:47;33383:131;33509:4;33383:131;:::i;:::-;33375:139;;33273:248;;;:::o;33527:419::-;33693:4;33731:2;33720:9;33716:18;33708:26;;33780:9;33774:4;33770:20;33766:1;33755:9;33751:17;33744:47;33808:131;33934:4;33808:131;:::i;:::-;33800:139;;33698:248;;;:::o;33952:419::-;34118:4;34156:2;34145:9;34141:18;34133:26;;34205:9;34199:4;34195:20;34191:1;34180:9;34176:17;34169:47;34233:131;34359:4;34233:131;:::i;:::-;34225:139;;34123:248;;;:::o;34377:419::-;34543:4;34581:2;34570:9;34566:18;34558:26;;34630:9;34624:4;34620:20;34616:1;34605:9;34601:17;34594:47;34658:131;34784:4;34658:131;:::i;:::-;34650:139;;34548:248;;;:::o;34802:419::-;34968:4;35006:2;34995:9;34991:18;34983:26;;35055:9;35049:4;35045:20;35041:1;35030:9;35026:17;35019:47;35083:131;35209:4;35083:131;:::i;:::-;35075:139;;34973:248;;;:::o;35227:419::-;35393:4;35431:2;35420:9;35416:18;35408:26;;35480:9;35474:4;35470:20;35466:1;35455:9;35451:17;35444:47;35508:131;35634:4;35508:131;:::i;:::-;35500:139;;35398:248;;;:::o;35652:419::-;35818:4;35856:2;35845:9;35841:18;35833:26;;35905:9;35899:4;35895:20;35891:1;35880:9;35876:17;35869:47;35933:131;36059:4;35933:131;:::i;:::-;35925:139;;35823:248;;;:::o;36077:222::-;36170:4;36208:2;36197:9;36193:18;36185:26;;36221:71;36289:1;36278:9;36274:17;36265:6;36221:71;:::i;:::-;36175:124;;;;:::o;36305:129::-;36339:6;36366:20;;:::i;:::-;36356:30;;36395:33;36423:4;36415:6;36395:33;:::i;:::-;36346:88;;;:::o;36440:75::-;36473:6;36506:2;36500:9;36490:19;;36480:35;:::o;36521:307::-;36582:4;36672:18;36664:6;36661:30;36658:2;;;36694:18;;:::i;:::-;36658:2;36732:29;36754:6;36732:29;:::i;:::-;36724:37;;36816:4;36810;36806:15;36798:23;;36587:241;;;:::o;36834:98::-;36885:6;36919:5;36913:12;36903:22;;36892:40;;;:::o;36938:99::-;36990:6;37024:5;37018:12;37008:22;;36997:40;;;:::o;37043:168::-;37126:11;37160:6;37155:3;37148:19;37200:4;37195:3;37191:14;37176:29;;37138:73;;;;:::o;37217:169::-;37301:11;37335:6;37330:3;37323:19;37375:4;37370:3;37366:14;37351:29;;37313:73;;;;:::o;37392:148::-;37494:11;37531:3;37516:18;;37506:34;;;;:::o;37546:305::-;37586:3;37605:20;37623:1;37605:20;:::i;:::-;37600:25;;37639:20;37657:1;37639:20;:::i;:::-;37634:25;;37793:1;37725:66;37721:74;37718:1;37715:81;37712:2;;;37799:18;;:::i;:::-;37712:2;37843:1;37840;37836:9;37829:16;;37590:261;;;;:::o;37857:185::-;37897:1;37914:20;37932:1;37914:20;:::i;:::-;37909:25;;37948:20;37966:1;37948:20;:::i;:::-;37943:25;;37987:1;37977:2;;37992:18;;:::i;:::-;37977:2;38034:1;38031;38027:9;38022:14;;37899:143;;;;:::o;38048:348::-;38088:7;38111:20;38129:1;38111:20;:::i;:::-;38106:25;;38145:20;38163:1;38145:20;:::i;:::-;38140:25;;38333:1;38265:66;38261:74;38258:1;38255:81;38250:1;38243:9;38236:17;38232:105;38229:2;;;38340:18;;:::i;:::-;38229:2;38388:1;38385;38381:9;38370:20;;38096:300;;;;:::o;38402:191::-;38442:4;38462:20;38480:1;38462:20;:::i;:::-;38457:25;;38496:20;38514:1;38496:20;:::i;:::-;38491:25;;38535:1;38532;38529:8;38526:2;;;38540:18;;:::i;:::-;38526:2;38585:1;38582;38578:9;38570:17;;38447:146;;;;:::o;38599:96::-;38636:7;38665:24;38683:5;38665:24;:::i;:::-;38654:35;;38644:51;;;:::o;38701:90::-;38735:7;38778:5;38771:13;38764:21;38753:32;;38743:48;;;:::o;38797:149::-;38833:7;38873:66;38866:5;38862:78;38851:89;;38841:105;;;:::o;38952:126::-;38989:7;39029:42;39022:5;39018:54;39007:65;;38997:81;;;:::o;39084:77::-;39121:7;39150:5;39139:16;;39129:32;;;:::o;39167:154::-;39251:6;39246:3;39241;39228:30;39313:1;39304:6;39299:3;39295:16;39288:27;39218:103;;;:::o;39327:307::-;39395:1;39405:113;39419:6;39416:1;39413:13;39405:113;;;39504:1;39499:3;39495:11;39489:18;39485:1;39480:3;39476:11;39469:39;39441:2;39438:1;39434:10;39429:15;;39405:113;;;39536:6;39533:1;39530:13;39527:2;;;39616:1;39607:6;39602:3;39598:16;39591:27;39527:2;39376:258;;;;:::o;39640:320::-;39684:6;39721:1;39715:4;39711:12;39701:22;;39768:1;39762:4;39758:12;39789:18;39779:2;;39845:4;39837:6;39833:17;39823:27;;39779:2;39907;39899:6;39896:14;39876:18;39873:38;39870:2;;;39926:18;;:::i;:::-;39870:2;39691:269;;;;:::o;39966:281::-;40049:27;40071:4;40049:27;:::i;:::-;40041:6;40037:40;40179:6;40167:10;40164:22;40143:18;40131:10;40128:34;40125:62;40122:2;;;40190:18;;:::i;:::-;40122:2;40230:10;40226:2;40219:22;40009:238;;;:::o;40253:233::-;40292:3;40315:24;40333:5;40315:24;:::i;:::-;40306:33;;40361:66;40354:5;40351:77;40348:2;;;40431:18;;:::i;:::-;40348:2;40478:1;40471:5;40467:13;40460:20;;40296:190;;;:::o;40492:176::-;40524:1;40541:20;40559:1;40541:20;:::i;:::-;40536:25;;40575:20;40593:1;40575:20;:::i;:::-;40570:25;;40614:1;40604:2;;40619:18;;:::i;:::-;40604:2;40660:1;40657;40653:9;40648:14;;40526:142;;;;:::o;40674:180::-;40722:77;40719:1;40712:88;40819:4;40816:1;40809:15;40843:4;40840:1;40833:15;40860:180;40908:77;40905:1;40898:88;41005:4;41002:1;40995:15;41029:4;41026:1;41019:15;41046:180;41094:77;41091:1;41084:88;41191:4;41188:1;41181:15;41215:4;41212:1;41205:15;41232:180;41280:77;41277:1;41270:88;41377:4;41374:1;41367:15;41401:4;41398:1;41391:15;41418:102;41459:6;41510:2;41506:7;41501:2;41494:5;41490:14;41486:28;41476:38;;41466:54;;;:::o;41526:151::-;41666:3;41662:1;41654:6;41650:14;41643:27;41632:45;:::o;41683:230::-;41823:34;41819:1;41811:6;41807:14;41800:58;41892:13;41887:2;41879:6;41875:15;41868:38;41789:124;:::o;41919:237::-;42059:34;42055:1;42047:6;42043:14;42036:58;42128:20;42123:2;42115:6;42111:15;42104:45;42025:131;:::o;42162:225::-;42302:34;42298:1;42290:6;42286:14;42279:58;42371:8;42366:2;42358:6;42354:15;42347:33;42268:119;:::o;42393:178::-;42533:30;42529:1;42521:6;42517:14;42510:54;42499:72;:::o;42577:151::-;42717:3;42713:1;42705:6;42701:14;42694:27;42683:45;:::o;42734:164::-;42874:16;42870:1;42862:6;42858:14;42851:40;42840:58;:::o;42904:223::-;43044:34;43040:1;43032:6;43028:14;43021:58;43113:6;43108:2;43100:6;43096:15;43089:31;43010:117;:::o;43133:175::-;43273:27;43269:1;43261:6;43257:14;43250:51;43239:69;:::o;43314:214::-;43454:66;43450:1;43442:6;43438:14;43431:90;43420:108;:::o;43534:231::-;43674:34;43670:1;43662:6;43658:14;43651:58;43743:14;43738:2;43730:6;43726:15;43719:39;43640:125;:::o;43771:243::-;43911:34;43907:1;43899:6;43895:14;43888:58;43980:26;43975:2;43967:6;43963:15;43956:51;43877:137;:::o;44020:229::-;44160:34;44156:1;44148:6;44144:14;44137:58;44229:12;44224:2;44216:6;44212:15;44205:37;44126:123;:::o;44255:228::-;44395:34;44391:1;44383:6;44379:14;44372:58;44464:11;44459:2;44451:6;44447:15;44440:36;44361:122;:::o;44489:214::-;44629:66;44625:1;44617:6;44613:14;44606:90;44595:108;:::o;44709:182::-;44849:34;44845:1;44837:6;44833:14;44826:58;44815:76;:::o;44897:231::-;45037:34;45033:1;45025:6;45021:14;45014:58;45106:14;45101:2;45093:6;45089:15;45082:39;45003:125;:::o;45134:182::-;45274:34;45270:1;45262:6;45258:14;45251:58;45240:76;:::o;45322:166::-;45462:18;45458:1;45450:6;45446:14;45439:42;45428:60;:::o;45494:228::-;45634:34;45630:1;45622:6;45618:14;45611:58;45703:11;45698:2;45690:6;45686:15;45679:36;45600:122;:::o;45728:151::-;45868:3;45864:1;45856:6;45852:14;45845:27;45834:45;:::o;45885:220::-;46025:34;46021:1;46013:6;46009:14;46002:58;46094:3;46089:2;46081:6;46077:15;46070:28;45991:114;:::o;46111:179::-;46251:31;46247:1;46239:6;46235:14;46228:55;46217:73;:::o;46296:236::-;46436:34;46432:1;46424:6;46420:14;46413:58;46505:19;46500:2;46492:6;46488:15;46481:44;46402:130;:::o;46538:151::-;46678:3;46674:1;46666:6;46662:14;46655:27;46644:45;:::o;46695:231::-;46835:34;46831:1;46823:6;46819:14;46812:58;46904:14;46899:2;46891:6;46887:15;46880:39;46801:125;:::o;46932:152::-;47072:4;47068:1;47060:6;47056:14;47049:28;47038:46;:::o;47090:181::-;47230:33;47226:1;47218:6;47214:14;47207:57;47196:75;:::o;47277:582::-;47417:66;47413:1;47405:6;47401:14;47394:90;47518:34;47513:2;47505:6;47501:15;47494:59;47587:34;47582:2;47574:6;47570:15;47563:59;47656:34;47651:2;47643:6;47639:15;47632:59;47726:66;47720:3;47712:6;47708:16;47701:92;47828:23;47822:3;47814:6;47810:16;47803:49;47383:476;:::o;47865:122::-;47938:24;47956:5;47938:24;:::i;:::-;47931:5;47928:35;47918:2;;47977:1;47974;47967:12;47918:2;47908:79;:::o;47993:116::-;48063:21;48078:5;48063:21;:::i;:::-;48056:5;48053:32;48043:2;;48099:1;48096;48089:12;48043:2;48033:76;:::o;48115:120::-;48187:23;48204:5;48187:23;:::i;:::-;48180:5;48177:34;48167:2;;48225:1;48222;48215:12;48167:2;48157:78;:::o;48241:122::-;48314:24;48332:5;48314:24;:::i;:::-;48307:5;48304:35;48294:2;;48353:1;48350;48343:12;48294:2;48284:79;:::o

Swarm Source

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