ETH Price: $3,828.01 (+5.44%)

Token

Ability Score (SCORE)
 

Overview

Max Total Supply

5,993 SCORE

Holders

1,825

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
2 SCORE
0x2c941171bd2a7aeda7c2767c438dff36eaafdafc
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, MIT license

Contract Source Code (Solidity)

/**
 *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(0xFF9C1b15B16263C61d017ee9F65C50e4AE0113D7);
    
    // 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 getDexterity(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Dexterity");
    }
    
    function getConstitution(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Constitution");
    }
    
    function getIntelligence(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Intelligence");
    }

    function getWisdom(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Wisdom");
    }
    
    function getCharisma(uint256 tokenId) public pure returns (string memory) {
        return pluck(tokenId, "Charisma");
    }
    
    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: white; font-family: serif; font-size: 14px; }</style><rect width="100%" height="100%" fill="black" /><text x="10" y="20" class="base">';

        parts[1] = getStrength(tokenId);

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

        parts[3] = getDexterity(tokenId);

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

        parts[5] = getConstitution(tokenId);

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

        parts[7] = getIntelligence(tokenId);

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

        parts[9] = getWisdom(tokenId);

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

        parts[11] = getCharisma(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": "Ability Scores are randomized table top RPG style stats generated and stored on chain. Feel free to use Ability Scores 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("Ability Score", "SCORE") 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":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getCharisma","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getConstitution","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getDexterity","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getIntelligence","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":"getWisdom","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"}]

608060405273ff9c1b15b16263c61d017ee9f65c50e4ae0113d7600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055503480156200006657600080fd5b506040518060400160405280600d81526020017f4162696c6974792053636f7265000000000000000000000000000000000000008152506040518060400160405280600581526020017f53434f52450000000000000000000000000000000000000000000000000000008152508160009080519060200190620000eb92919062000203565b5080600190805190602001906200010492919062000203565b5050506001600a819055506200012f620001236200013560201b60201c565b6200013d60201b60201c565b62000318565b600033905090565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200021190620002b3565b90600052602060002090601f01602090048101928262000235576000855562000281565b82601f106200025057805160ff191683800117855562000281565b8280016001018555821562000281579182015b828111156200028057825182559160200191906001019062000263565b5b50905062000290919062000294565b5090565b5b80821115620002af57600081600090555060010162000295565b5090565b60006002820490506001821680620002cc57607f821691505b60208210811415620002e357620002e2620002e9565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614e7e80620003286000396000f3fe608060405234801561001057600080fd5b50600436106101c45760003560e01c80636352211e116100f9578063baa5b27f11610097578063e53fbda611610071578063e53fbda61461053b578063e985e9c51461056b578063f2fde38b1461059b578063f3a4aba9146105b7576101c4565b8063baa5b27f146104ab578063c87b56dd146104db578063e15f22551461050b576101c4565b80638da5cb5b116100d35780638da5cb5b1461043757806395d89b4114610455578063a22cb46514610473578063b88d4fde1461048f576101c4565b80636352211e146103cd57806370a08231146103fd578063715018a61461042d576101c4565b80632f745c591161016657806342842e0e1161014057806342842e0e14610349578063434f48c41461036557806347d8636a146103815780634f6ccce71461039d576101c4565b80632f745c59146102cd57806330799dc6146102fd578063379607f51461032d576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806318160ddd1461026357806323b872dd146102815780632df78d311461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de91906135ac565b6105e7565b6040516101f09190613d88565b60405180910390f35b610201610661565b60405161020e9190613da3565b60405180910390f35b610231600480360381019061022c91906135fe565b6106f3565b60405161023e9190613d21565b60405180910390f35b610261600480360381019061025c9190613570565b610778565b005b61026b610890565b6040516102789190614045565b60405180910390f35b61029b6004803603810190610296919061346a565b61089d565b005b6102b760048036038101906102b291906135fe565b6108fd565b6040516102c49190613da3565b60405180910390f35b6102e760048036038101906102e29190613570565b610945565b6040516102f49190614045565b60405180910390f35b610317600480360381019061031291906135fe565b6109ea565b6040516103249190613da3565b60405180910390f35b610347600480360381019061034291906135fe565b610a32565b005b610363600480360381019061035e919061346a565b610aed565b005b61037f600480360381019061037a91906135fe565b610b0d565b005b61039b600480360381019061039691906135fe565b610c44565b005b6103b760048036038101906103b291906135fe565b610e16565b6040516103c49190614045565b60405180910390f35b6103e760048036038101906103e291906135fe565b610ead565b6040516103f49190613d21565b60405180910390f35b610417600480360381019061041291906133dc565b610f5f565b6040516104249190614045565b60405180910390f35b610435611017565b005b61043f61109f565b60405161044c9190613d21565b60405180910390f35b61045d6110c9565b60405161046a9190613da3565b60405180910390f35b61048d60048036038101906104889190613534565b61115b565b005b6104a960048036038101906104a491906134b9565b6112dc565b005b6104c560048036038101906104c091906135fe565b61133e565b6040516104d29190613da3565b60405180910390f35b6104f560048036038101906104f091906135fe565b611386565b6040516105029190613da3565b60405180910390f35b610525600480360381019061052091906135fe565b611bdc565b6040516105329190613da3565b60405180910390f35b610555600480360381019061055091906135fe565b611c24565b6040516105629190613da3565b60405180910390f35b6105856004803603810190610580919061342e565b611c6c565b6040516105929190613d88565b60405180910390f35b6105b560048036038101906105b091906133dc565b611d00565b005b6105d160048036038101906105cc91906135fe565b611df8565b6040516105de9190613da3565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061065a575061065982611e40565b5b9050919050565b606060008054610670906142c4565b80601f016020809104026020016040519081016040528092919081815260200182805461069c906142c4565b80156106e95780601f106106be576101008083540402835291602001916106e9565b820191906000526020600020905b8154815290600101906020018083116106cc57829003601f168201915b5050505050905090565b60006106fe82611f22565b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073490613f45565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078382610ead565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107eb90613fc5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610813611f8e565b73ffffffffffffffffffffffffffffffffffffffff16148061084257506108418161083c611f8e565b611c6c565b5b610881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087890613ec5565b60405180910390fd5b61088b8383611f96565b505050565b6000600880549050905090565b6108ae6108a8611f8e565b8261204f565b6108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e490613fe5565b60405180910390fd5b6108f883838361212d565b505050565b606061093e826040518060400160405280600881526020017f4368617269736d61000000000000000000000000000000000000000000000000815250612389565b9050919050565b600061095083610f5f565b8210610991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098890613dc5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610a2b826040518060400160405280600681526020017f576973646f6d0000000000000000000000000000000000000000000000000000815250612389565b9050919050565b6002600a541415610a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6f90614025565b60405180910390fd5b6002600a81905550611f4081118015610a92575061256881105b610ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac890613f85565b60405180910390fd5b610ae2610adc611f8e565b8261250a565b6001600a8190555050565b610b08838383604051806020016040528060008152506112dc565b505050565b6002600a541415610b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4a90614025565b60405180910390fd5b6002600a81905550610b63611f8e565b73ffffffffffffffffffffffffffffffffffffffff16610b8161109f565b73ffffffffffffffffffffffffffffffffffffffff1614610bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bce90613f65565b60405180910390fd5b61256781118015610be9575061271181105b610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90613f85565b60405180910390fd5b610c39610c3361109f565b8261250a565b6001600a8190555050565b6002600a541415610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190614025565b60405180910390fd5b6002600a81905550600081118015610ca35750611f4181105b610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990613f85565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610d549190614045565b60206040518083038186803b158015610d6c57600080fd5b505afa158015610d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da49190613405565b73ffffffffffffffffffffffffffffffffffffffff1614610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190613e45565b60405180910390fd5b610e0b610e05611f8e565b8261250a565b6001600a8190555050565b6000610e20610890565b8210610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890614005565b60405180910390fd5b60088281548110610e9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90613f05565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790613ee5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61101f611f8e565b73ffffffffffffffffffffffffffffffffffffffff1661103d61109f565b73ffffffffffffffffffffffffffffffffffffffff1614611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a90613f65565b60405180910390fd5b61109d6000612528565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546110d8906142c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611104906142c4565b80156111515780601f1061112657610100808354040283529160200191611151565b820191906000526020600020905b81548152906001019060200180831161113457829003601f168201915b5050505050905090565b611163611f8e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c890613e85565b60405180910390fd5b80600560006111de611f8e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661128b611f8e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112d09190613d88565b60405180910390a35050565b6112ed6112e7611f8e565b8361204f565b61132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390613fe5565b60405180910390fd5b611338848484846125ee565b50505050565b606061137f826040518060400160405280600c81526020017f496e74656c6c6967656e63650000000000000000000000000000000000000000815250612389565b9050919050565b60606113906132ce565b60405180610120016040528060fd8152602001614ce460fd9139816000600d81106113e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506113f583611c24565b816001600d811061142f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614e2160289139816002600d811061148a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061149b83611bdc565b816003600d81106114d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614c4260289139816004600d8110611530577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061154183611df8565b816005600d811061157b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614c9360289139816006600d81106115d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506115e78361133e565b816007600d8110611621577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001614cbb60299139816008600d811061167c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061168d836109ea565b816009600d81106116c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001614c6a6029913981600a600d8110611722577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611733836108fd565b81600b600d811061176d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081600c600d81106117e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506000816000600d8110611829577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151826001600d8110611868577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151836002600d81106118a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151846003600d81106118e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151856004600d8110611925577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151866005600d8110611964577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151876006600d81106119a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151886007600d81106119e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151896008600d8110611a21577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611a3e99989796959493929190613b50565b604051602081830303815290604052905080826009600d8110611a8a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600a600d8110611ac9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600b600d8110611b08577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600c600d8110611b47577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611b60959493929190613b05565b60405160208183030381529060405290506000611bad611b7f8661264a565b611b88846127f7565b604051602001611b99929190613cba565b6040516020818303038152906040526127f7565b905080604051602001611bc09190613cff565b6040516020818303038152906040529150819350505050919050565b6060611c1d826040518060400160405280600981526020017f4465787465726974790000000000000000000000000000000000000000000000815250612389565b9050919050565b6060611c65826040518060400160405280600881526020017f537472656e677468000000000000000000000000000000000000000000000000815250612389565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d08611f8e565b73ffffffffffffffffffffffffffffffffffffffff16611d2661109f565b73ffffffffffffffffffffffffffffffffffffffff1614611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390613f65565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de390613e05565b60405180910390fd5b611df581612528565b50565b6060611e39826040518060400160405280600c81526020017f436f6e737469747574696f6e0000000000000000000000000000000000000000815250612389565b9050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f0b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f1b5750611f1a826129b5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661200983610ead565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061205a82611f22565b612099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209090613ea5565b60405180910390fd5b60006120a483610ead565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061211357508373ffffffffffffffffffffffffffffffffffffffff166120fb846106f3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061212457506121238185611c6c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661214d82610ead565b73ffffffffffffffffffffffffffffffffffffffff16146121a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219a90613fa5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220a90613e65565b60405180910390fd5b61221e838383612a1f565b612229600082611f96565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461227991906141da565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122d091906140f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060006123bf8361239a8661264a565b6040516020016123ab929190613c5c565b604051602081830303815290604052612b33565b9050600081905060006123fa856123d58861264a565b6040516020016123e6929190613c2d565b604051602081830303815290604052612b33565b9050808211612409578161240b565b805b915060006124418661241c8961264a565b60405160200161242d929190613bfe565b604051602081830303815290604052612b33565b90508083116124505782612452565b805b92506000612488876124638a61264a565b604051602001612474929190613bcf565b604051602081830303815290604052612b33565b90508084116124975783612499565b805b9350600084828486896124ac91906140f9565b6124b691906140f9565b6124c091906140f9565b6124ca91906141da565b90506000886124d88361264a565b6040516020016124e9929190613c8b565b60405160208183030381529060405290508097505050505050505092915050565b612524828260405180602001604052806000815250612b7e565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125f984848461212d565b61260584848484612bd9565b612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90613de5565b60405180910390fd5b50505050565b60606000821415612692576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127f2565b600082905060005b600082146126c45780806126ad90614327565b915050600a826126bd919061414f565b915061269a565b60008167ffffffffffffffff811115612706577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127385781602001600182028036833780820191505090505b5090505b600085146127eb5760018261275191906141da565b9150600a856127609190614370565b603061276c91906140f9565b60f81b8183815181106127a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127e4919061414f565b945061273c565b8093505050505b919050565b6060600082519050600081141561282057604051806020016040528060008152509150506129b0565b6000600360028361283191906140f9565b61283b919061414f565b60046128479190614180565b9050600060208261285891906140f9565b67ffffffffffffffff811115612897577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128c95781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614de1604091399050600181016020830160005b8681101561296d5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506128f4565b5060038606600181146129875760028114612997576129a2565b613d3d60f01b60028303526129a2565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a2a838383612d70565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a6d57612a6881612d75565b612aac565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612aab57612aaa8382612dbe565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612aef57612aea81612f2b565b612b2e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b2d57612b2c828261306e565b5b5b505050565b60006001600683604051602001612b4a9190613aee565b6040516020818303038152906040528051906020012060001c612b6d9190614370565b612b7791906140f9565b9050919050565b612b8883836130ed565b612b956000848484612bd9565b612bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcb90613de5565b60405180910390fd5b505050565b6000612bfa8473ffffffffffffffffffffffffffffffffffffffff166132bb565b15612d63578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c23611f8e565b8786866040518563ffffffff1660e01b8152600401612c459493929190613d3c565b602060405180830381600087803b158015612c5f57600080fd5b505af1925050508015612c9057506040513d601f19601f82011682018060405250810190612c8d91906135d5565b60015b612d13573d8060008114612cc0576040519150601f19603f3d011682016040523d82523d6000602084013e612cc5565b606091505b50600081511415612d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0290613de5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d68565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612dcb84610f5f565b612dd591906141da565b9050600060076000848152602001908152602001600020549050818114612eba576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612f3f91906141da565b9050600060096000848152602001908152602001600020549050600060088381548110612f95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612fdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613052577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061307983610f5f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561315d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315490613f25565b60405180910390fd5b61316681611f22565b156131a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319d90613e25565b60405180910390fd5b6131b260008383612a1f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461320291906140f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b604051806101a00160405280600d905b60608152602001906001900390816132de5790505090565b600061330961330484614085565b614060565b90508281526020810184848401111561332157600080fd5b61332c848285614282565b509392505050565b60008135905061334381614be5565b92915050565b60008151905061335881614be5565b92915050565b60008135905061336d81614bfc565b92915050565b60008135905061338281614c13565b92915050565b60008151905061339781614c13565b92915050565b600082601f8301126133ae57600080fd5b81356133be8482602086016132f6565b91505092915050565b6000813590506133d681614c2a565b92915050565b6000602082840312156133ee57600080fd5b60006133fc84828501613334565b91505092915050565b60006020828403121561341757600080fd5b600061342584828501613349565b91505092915050565b6000806040838503121561344157600080fd5b600061344f85828601613334565b925050602061346085828601613334565b9150509250929050565b60008060006060848603121561347f57600080fd5b600061348d86828701613334565b935050602061349e86828701613334565b92505060406134af868287016133c7565b9150509250925092565b600080600080608085870312156134cf57600080fd5b60006134dd87828801613334565b94505060206134ee87828801613334565b93505060406134ff878288016133c7565b925050606085013567ffffffffffffffff81111561351c57600080fd5b6135288782880161339d565b91505092959194509250565b6000806040838503121561354757600080fd5b600061355585828601613334565b92505060206135668582860161335e565b9150509250929050565b6000806040838503121561358357600080fd5b600061359185828601613334565b92505060206135a2858286016133c7565b9150509250929050565b6000602082840312156135be57600080fd5b60006135cc84828501613373565b91505092915050565b6000602082840312156135e757600080fd5b60006135f584828501613388565b91505092915050565b60006020828403121561361057600080fd5b600061361e848285016133c7565b91505092915050565b6136308161420e565b82525050565b61363f81614220565b82525050565b6000613650826140b6565b61365a81856140cc565b935061366a818560208601614291565b6136738161445d565b840191505092915050565b6000613689826140c1565b61369381856140dd565b93506136a3818560208601614291565b6136ac8161445d565b840191505092915050565b60006136c2826140c1565b6136cc81856140ee565b93506136dc818560208601614291565b80840191505092915050565b60006136f56001836140ee565b91506137008261446e565b600182019050919050565b6000613718602b836140dd565b915061372382614497565b604082019050919050565b600061373b6032836140dd565b9150613746826144e6565b604082019050919050565b600061375e6026836140dd565b915061376982614535565b604082019050919050565b6000613781601c836140dd565b915061378c82614584565b602082019050919050565b60006137a46001836140ee565b91506137af826145ad565b600182019050919050565b60006137c7600e836140dd565b91506137d2826145d6565b602082019050919050565b60006137ea6024836140dd565b91506137f5826145ff565b604082019050919050565b600061380d6019836140dd565b91506138188261464e565b602082019050919050565b60006138306011836140ee565b915061383b82614677565b601182019050919050565b6000613853602c836140dd565b915061385e826146a0565b604082019050919050565b60006138766038836140dd565b9150613881826146ef565b604082019050919050565b6000613899602a836140dd565b91506138a48261473e565b604082019050919050565b60006138bc6029836140dd565b91506138c78261478d565b604082019050919050565b60006138df6002836140ee565b91506138ea826147dc565b600282019050919050565b60006139026020836140dd565b915061390d82614805565b602082019050919050565b6000613925602c836140dd565b91506139308261482e565b604082019050919050565b60006139486020836140dd565b91506139538261487d565b602082019050919050565b600061396b6010836140dd565b9150613976826148a6565b602082019050919050565b600061398e6029836140dd565b9150613999826148cf565b604082019050919050565b60006139b160c5836140ee565b91506139bc8261491e565b60c582019050919050565b60006139d46001836140ee565b91506139df82614a2b565b600182019050919050565b60006139f76021836140dd565b9150613a0282614a54565b604082019050919050565b6000613a1a601d836140ee565b9150613a2582614aa3565b601d82019050919050565b6000613a3d6031836140dd565b9150613a4882614acc565b604082019050919050565b6000613a606001836140ee565b9150613a6b82614b1b565b600182019050919050565b6000613a83602c836140dd565b9150613a8e82614b44565b604082019050919050565b6000613aa66002836140ee565b9150613ab182614b93565b600282019050919050565b6000613ac9601f836140dd565b9150613ad482614bbc565b602082019050919050565b613ae881614278565b82525050565b6000613afa82846136b7565b915081905092915050565b6000613b1182886136b7565b9150613b1d82876136b7565b9150613b2982866136b7565b9150613b3582856136b7565b9150613b4182846136b7565b91508190509695505050505050565b6000613b5c828c6136b7565b9150613b68828b6136b7565b9150613b74828a6136b7565b9150613b8082896136b7565b9150613b8c82886136b7565b9150613b9882876136b7565b9150613ba482866136b7565b9150613bb082856136b7565b9150613bbc82846136b7565b91508190509a9950505050505050505050565b6000613bdb82856136b7565b9150613be782846136b7565b9150613bf2826136e8565b91508190509392505050565b6000613c0a82856136b7565b9150613c1682846136b7565b9150613c2182613797565b91508190509392505050565b6000613c3982856136b7565b9150613c4582846136b7565b9150613c50826139c7565b91508190509392505050565b6000613c6882856136b7565b9150613c7482846136b7565b9150613c7f82613a53565b91508190509392505050565b6000613c9782856136b7565b9150613ca282613a99565b9150613cae82846136b7565b91508190509392505050565b6000613cc582613823565b9150613cd182856136b7565b9150613cdc826139a4565b9150613ce882846136b7565b9150613cf3826138d2565b91508190509392505050565b6000613d0a82613a0d565b9150613d1682846136b7565b915081905092915050565b6000602082019050613d366000830184613627565b92915050565b6000608082019050613d516000830187613627565b613d5e6020830186613627565b613d6b6040830185613adf565b8181036060830152613d7d8184613645565b905095945050505050565b6000602082019050613d9d6000830184613636565b92915050565b60006020820190508181036000830152613dbd818461367e565b905092915050565b60006020820190508181036000830152613dde8161370b565b9050919050565b60006020820190508181036000830152613dfe8161372e565b9050919050565b60006020820190508181036000830152613e1e81613751565b9050919050565b60006020820190508181036000830152613e3e81613774565b9050919050565b60006020820190508181036000830152613e5e816137ba565b9050919050565b60006020820190508181036000830152613e7e816137dd565b9050919050565b60006020820190508181036000830152613e9e81613800565b9050919050565b60006020820190508181036000830152613ebe81613846565b9050919050565b60006020820190508181036000830152613ede81613869565b9050919050565b60006020820190508181036000830152613efe8161388c565b9050919050565b60006020820190508181036000830152613f1e816138af565b9050919050565b60006020820190508181036000830152613f3e816138f5565b9050919050565b60006020820190508181036000830152613f5e81613918565b9050919050565b60006020820190508181036000830152613f7e8161393b565b9050919050565b60006020820190508181036000830152613f9e8161395e565b9050919050565b60006020820190508181036000830152613fbe81613981565b9050919050565b60006020820190508181036000830152613fde816139ea565b9050919050565b60006020820190508181036000830152613ffe81613a30565b9050919050565b6000602082019050818103600083015261401e81613a76565b9050919050565b6000602082019050818103600083015261403e81613abc565b9050919050565b600060208201905061405a6000830184613adf565b92915050565b600061406a61407b565b905061407682826142f6565b919050565b6000604051905090565b600067ffffffffffffffff8211156140a05761409f61442e565b5b6140a98261445d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061410482614278565b915061410f83614278565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614144576141436143a1565b5b828201905092915050565b600061415a82614278565b915061416583614278565b925082614175576141746143d0565b5b828204905092915050565b600061418b82614278565b915061419683614278565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141cf576141ce6143a1565b5b828202905092915050565b60006141e582614278565b91506141f083614278565b925082821015614203576142026143a1565b5b828203905092915050565b600061421982614258565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142af578082015181840152602081019050614294565b838111156142be576000848401525b50505050565b600060028204905060018216806142dc57607f821691505b602082108114156142f0576142ef6143ff565b5b50919050565b6142ff8261445d565b810181811067ffffffffffffffff8211171561431e5761431d61442e565b5b80604052505050565b600061433282614278565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614365576143646143a1565b5b600182019050919050565b600061437b82614278565b915061438683614278565b925082614396576143956143d0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f3400000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f3300000000000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f74204c6f6f74206f776e6572000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f7b226e616d65223a202253686565742023000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a20224162696c6974792053636f726560008201527f73206172652072616e646f6d697a6564207461626c6520746f7020525047207360208201527f74796c652073746174732067656e65726174656420616e642073746f7265642060408201527f6f6e20636861696e2e204665656c206672656520746f20757365204162696c6960608201527f74792053636f72657320696e20616e792077617920796f752077616e742e222c60808201527f2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b626160a08201527f736536342c00000000000000000000000000000000000000000000000000000060c082015250565b7f3200000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f3100000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f3a20000000000000000000000000000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614bee8161420e565b8114614bf957600080fd5b50565b614c0581614220565b8114614c1057600080fd5b50565b614c1c8161422c565b8114614c2757600080fd5b50565b614c3381614278565b8114614c3e57600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220e367950f387e20675a6b891ef07e9d8b8970d28efa39406d1e9d183a1a2c884964736f6c63430008040033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c45760003560e01c80636352211e116100f9578063baa5b27f11610097578063e53fbda611610071578063e53fbda61461053b578063e985e9c51461056b578063f2fde38b1461059b578063f3a4aba9146105b7576101c4565b8063baa5b27f146104ab578063c87b56dd146104db578063e15f22551461050b576101c4565b80638da5cb5b116100d35780638da5cb5b1461043757806395d89b4114610455578063a22cb46514610473578063b88d4fde1461048f576101c4565b80636352211e146103cd57806370a08231146103fd578063715018a61461042d576101c4565b80632f745c591161016657806342842e0e1161014057806342842e0e14610349578063434f48c41461036557806347d8636a146103815780634f6ccce71461039d576101c4565b80632f745c59146102cd57806330799dc6146102fd578063379607f51461032d576101c4565b8063095ea7b3116101a2578063095ea7b31461024757806318160ddd1461026357806323b872dd146102815780632df78d311461029d576101c4565b806301ffc9a7146101c957806306fdde03146101f9578063081812fc14610217575b600080fd5b6101e360048036038101906101de91906135ac565b6105e7565b6040516101f09190613d88565b60405180910390f35b610201610661565b60405161020e9190613da3565b60405180910390f35b610231600480360381019061022c91906135fe565b6106f3565b60405161023e9190613d21565b60405180910390f35b610261600480360381019061025c9190613570565b610778565b005b61026b610890565b6040516102789190614045565b60405180910390f35b61029b6004803603810190610296919061346a565b61089d565b005b6102b760048036038101906102b291906135fe565b6108fd565b6040516102c49190613da3565b60405180910390f35b6102e760048036038101906102e29190613570565b610945565b6040516102f49190614045565b60405180910390f35b610317600480360381019061031291906135fe565b6109ea565b6040516103249190613da3565b60405180910390f35b610347600480360381019061034291906135fe565b610a32565b005b610363600480360381019061035e919061346a565b610aed565b005b61037f600480360381019061037a91906135fe565b610b0d565b005b61039b600480360381019061039691906135fe565b610c44565b005b6103b760048036038101906103b291906135fe565b610e16565b6040516103c49190614045565b60405180910390f35b6103e760048036038101906103e291906135fe565b610ead565b6040516103f49190613d21565b60405180910390f35b610417600480360381019061041291906133dc565b610f5f565b6040516104249190614045565b60405180910390f35b610435611017565b005b61043f61109f565b60405161044c9190613d21565b60405180910390f35b61045d6110c9565b60405161046a9190613da3565b60405180910390f35b61048d60048036038101906104889190613534565b61115b565b005b6104a960048036038101906104a491906134b9565b6112dc565b005b6104c560048036038101906104c091906135fe565b61133e565b6040516104d29190613da3565b60405180910390f35b6104f560048036038101906104f091906135fe565b611386565b6040516105029190613da3565b60405180910390f35b610525600480360381019061052091906135fe565b611bdc565b6040516105329190613da3565b60405180910390f35b610555600480360381019061055091906135fe565b611c24565b6040516105629190613da3565b60405180910390f35b6105856004803603810190610580919061342e565b611c6c565b6040516105929190613d88565b60405180910390f35b6105b560048036038101906105b091906133dc565b611d00565b005b6105d160048036038101906105cc91906135fe565b611df8565b6040516105de9190613da3565b60405180910390f35b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061065a575061065982611e40565b5b9050919050565b606060008054610670906142c4565b80601f016020809104026020016040519081016040528092919081815260200182805461069c906142c4565b80156106e95780601f106106be576101008083540402835291602001916106e9565b820191906000526020600020905b8154815290600101906020018083116106cc57829003601f168201915b5050505050905090565b60006106fe82611f22565b61073d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161073490613f45565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061078382610ead565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156107f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107eb90613fc5565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610813611f8e565b73ffffffffffffffffffffffffffffffffffffffff16148061084257506108418161083c611f8e565b611c6c565b5b610881576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161087890613ec5565b60405180910390fd5b61088b8383611f96565b505050565b6000600880549050905090565b6108ae6108a8611f8e565b8261204f565b6108ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108e490613fe5565b60405180910390fd5b6108f883838361212d565b505050565b606061093e826040518060400160405280600881526020017f4368617269736d61000000000000000000000000000000000000000000000000815250612389565b9050919050565b600061095083610f5f565b8210610991576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161098890613dc5565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b6060610a2b826040518060400160405280600681526020017f576973646f6d0000000000000000000000000000000000000000000000000000815250612389565b9050919050565b6002600a541415610a78576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6f90614025565b60405180910390fd5b6002600a81905550611f4081118015610a92575061256881105b610ad1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ac890613f85565b60405180910390fd5b610ae2610adc611f8e565b8261250a565b6001600a8190555050565b610b08838383604051806020016040528060008152506112dc565b505050565b6002600a541415610b53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4a90614025565b60405180910390fd5b6002600a81905550610b63611f8e565b73ffffffffffffffffffffffffffffffffffffffff16610b8161109f565b73ffffffffffffffffffffffffffffffffffffffff1614610bd7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bce90613f65565b60405180910390fd5b61256781118015610be9575061271181105b610c28576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c1f90613f85565b60405180910390fd5b610c39610c3361109f565b8261250a565b6001600a8190555050565b6002600a541415610c8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c8190614025565b60405180910390fd5b6002600a81905550600081118015610ca35750611f4181105b610ce2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd990613f85565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff16600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16636352211e836040518263ffffffff1660e01b8152600401610d549190614045565b60206040518083038186803b158015610d6c57600080fd5b505afa158015610d80573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610da49190613405565b73ffffffffffffffffffffffffffffffffffffffff1614610dfa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df190613e45565b60405180910390fd5b610e0b610e05611f8e565b8261250a565b6001600a8190555050565b6000610e20610890565b8210610e61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e5890614005565b60405180910390fd5b60088281548110610e9b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f4d90613f05565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610fd0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fc790613ee5565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b61101f611f8e565b73ffffffffffffffffffffffffffffffffffffffff1661103d61109f565b73ffffffffffffffffffffffffffffffffffffffff1614611093576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161108a90613f65565b60405180910390fd5b61109d6000612528565b565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6060600180546110d8906142c4565b80601f0160208091040260200160405190810160405280929190818152602001828054611104906142c4565b80156111515780601f1061112657610100808354040283529160200191611151565b820191906000526020600020905b81548152906001019060200180831161113457829003601f168201915b5050505050905090565b611163611f8e565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111d1576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111c890613e85565b60405180910390fd5b80600560006111de611f8e565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661128b611f8e565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516112d09190613d88565b60405180910390a35050565b6112ed6112e7611f8e565b8361204f565b61132c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161132390613fe5565b60405180910390fd5b611338848484846125ee565b50505050565b606061137f826040518060400160405280600c81526020017f496e74656c6c6967656e63650000000000000000000000000000000000000000815250612389565b9050919050565b60606113906132ce565b60405180610120016040528060fd8152602001614ce460fd9139816000600d81106113e4577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506113f583611c24565b816001600d811061142f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614e2160289139816002600d811061148a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061149b83611bdc565b816003600d81106114d5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614c4260289139816004600d8110611530577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061154183611df8565b816005600d811061157b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060288152602001614c9360289139816006600d81106115d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506115e78361133e565b816007600d8110611621577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001614cbb60299139816008600d811061167c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002018190525061168d836109ea565b816009600d81106116c7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250604051806060016040528060298152602001614c6a6029913981600a600d8110611722577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020181905250611733836108fd565b81600b600d811061176d577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506040518060400160405280600d81526020017f3c2f746578743e3c2f7376673e0000000000000000000000000000000000000081525081600c600d81106117e5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200201819052506000816000600d8110611829577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151826001600d8110611868577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151836002600d81106118a7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151846003600d81106118e6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151856004600d8110611925577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151866005600d8110611964577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151876006600d81106119a3577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151886007600d81106119e2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151896008600d8110611a21577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611a3e99989796959493929190613b50565b604051602081830303815290604052905080826009600d8110611a8a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015183600a600d8110611ac9577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015184600b600d8110611b08577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b602002015185600c600d8110611b47577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020020151604051602001611b60959493929190613b05565b60405160208183030381529060405290506000611bad611b7f8661264a565b611b88846127f7565b604051602001611b99929190613cba565b6040516020818303038152906040526127f7565b905080604051602001611bc09190613cff565b6040516020818303038152906040529150819350505050919050565b6060611c1d826040518060400160405280600981526020017f4465787465726974790000000000000000000000000000000000000000000000815250612389565b9050919050565b6060611c65826040518060400160405280600881526020017f537472656e677468000000000000000000000000000000000000000000000000815250612389565b9050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d08611f8e565b73ffffffffffffffffffffffffffffffffffffffff16611d2661109f565b73ffffffffffffffffffffffffffffffffffffffff1614611d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d7390613f65565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611dec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de390613e05565b60405180910390fd5b611df581612528565b50565b6060611e39826040518060400160405280600c81526020017f436f6e737469747574696f6e0000000000000000000000000000000000000000815250612389565b9050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611f0b57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611f1b5750611f1a826129b5565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661200983610ead565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061205a82611f22565b612099576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209090613ea5565b60405180910390fd5b60006120a483610ead565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061211357508373ffffffffffffffffffffffffffffffffffffffff166120fb846106f3565b73ffffffffffffffffffffffffffffffffffffffff16145b8061212457506121238185611c6c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661214d82610ead565b73ffffffffffffffffffffffffffffffffffffffff16146121a3576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161219a90613fa5565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612213576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220a90613e65565b60405180910390fd5b61221e838383612a1f565b612229600082611f96565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461227991906141da565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546122d091906140f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b606060006123bf8361239a8661264a565b6040516020016123ab929190613c5c565b604051602081830303815290604052612b33565b9050600081905060006123fa856123d58861264a565b6040516020016123e6929190613c2d565b604051602081830303815290604052612b33565b9050808211612409578161240b565b805b915060006124418661241c8961264a565b60405160200161242d929190613bfe565b604051602081830303815290604052612b33565b90508083116124505782612452565b805b92506000612488876124638a61264a565b604051602001612474929190613bcf565b604051602081830303815290604052612b33565b90508084116124975783612499565b805b9350600084828486896124ac91906140f9565b6124b691906140f9565b6124c091906140f9565b6124ca91906141da565b90506000886124d88361264a565b6040516020016124e9929190613c8b565b60405160208183030381529060405290508097505050505050505092915050565b612524828260405180602001604052806000815250612b7e565b5050565b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6125f984848461212d565b61260584848484612bd9565b612644576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263b90613de5565b60405180910390fd5b50505050565b60606000821415612692576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506127f2565b600082905060005b600082146126c45780806126ad90614327565b915050600a826126bd919061414f565b915061269a565b60008167ffffffffffffffff811115612706577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156127385781602001600182028036833780820191505090505b5090505b600085146127eb5760018261275191906141da565b9150600a856127609190614370565b603061276c91906140f9565b60f81b8183815181106127a8577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856127e4919061414f565b945061273c565b8093505050505b919050565b6060600082519050600081141561282057604051806020016040528060008152509150506129b0565b6000600360028361283191906140f9565b61283b919061414f565b60046128479190614180565b9050600060208261285891906140f9565b67ffffffffffffffff811115612897577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156128c95781602001600182028036833780820191505090505b5090506000604051806060016040528060408152602001614de1604091399050600181016020830160005b8681101561296d5760038101905062ffffff818a015116603f8160121c168401518060081b905060ff603f83600c1c1686015116810190508060081b905060ff603f8360061c1686015116810190508060081b905060ff603f831686015116810190508060e01b905080845260048401935050506128f4565b5060038606600181146129875760028114612997576129a2565b613d3d60f01b60028303526129a2565b603d60f81b60018303525b508484525050819450505050505b919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612a2a838383612d70565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612a6d57612a6881612d75565b612aac565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612aab57612aaa8382612dbe565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612aef57612aea81612f2b565b612b2e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612b2d57612b2c828261306e565b5b5b505050565b60006001600683604051602001612b4a9190613aee565b6040516020818303038152906040528051906020012060001c612b6d9190614370565b612b7791906140f9565b9050919050565b612b8883836130ed565b612b956000848484612bd9565b612bd4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612bcb90613de5565b60405180910390fd5b505050565b6000612bfa8473ffffffffffffffffffffffffffffffffffffffff166132bb565b15612d63578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612c23611f8e565b8786866040518563ffffffff1660e01b8152600401612c459493929190613d3c565b602060405180830381600087803b158015612c5f57600080fd5b505af1925050508015612c9057506040513d601f19601f82011682018060405250810190612c8d91906135d5565b60015b612d13573d8060008114612cc0576040519150601f19603f3d011682016040523d82523d6000602084013e612cc5565b606091505b50600081511415612d0b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d0290613de5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612d68565b600190505b949350505050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612dcb84610f5f565b612dd591906141da565b9050600060076000848152602001908152602001600020549050818114612eba576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600880549050612f3f91906141da565b9050600060096000848152602001908152602001600020549050600060088381548110612f95577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020015490508060088381548110612fdd577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020018190555081600960008381526020019081526020016000208190555060096000858152602001908152602001600020600090556008805480613052577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061307983610f5f565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561315d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161315490613f25565b60405180910390fd5b61316681611f22565b156131a6576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161319d90613e25565b60405180910390fd5b6131b260008383612a1f565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461320291906140f9565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b604051806101a00160405280600d905b60608152602001906001900390816132de5790505090565b600061330961330484614085565b614060565b90508281526020810184848401111561332157600080fd5b61332c848285614282565b509392505050565b60008135905061334381614be5565b92915050565b60008151905061335881614be5565b92915050565b60008135905061336d81614bfc565b92915050565b60008135905061338281614c13565b92915050565b60008151905061339781614c13565b92915050565b600082601f8301126133ae57600080fd5b81356133be8482602086016132f6565b91505092915050565b6000813590506133d681614c2a565b92915050565b6000602082840312156133ee57600080fd5b60006133fc84828501613334565b91505092915050565b60006020828403121561341757600080fd5b600061342584828501613349565b91505092915050565b6000806040838503121561344157600080fd5b600061344f85828601613334565b925050602061346085828601613334565b9150509250929050565b60008060006060848603121561347f57600080fd5b600061348d86828701613334565b935050602061349e86828701613334565b92505060406134af868287016133c7565b9150509250925092565b600080600080608085870312156134cf57600080fd5b60006134dd87828801613334565b94505060206134ee87828801613334565b93505060406134ff878288016133c7565b925050606085013567ffffffffffffffff81111561351c57600080fd5b6135288782880161339d565b91505092959194509250565b6000806040838503121561354757600080fd5b600061355585828601613334565b92505060206135668582860161335e565b9150509250929050565b6000806040838503121561358357600080fd5b600061359185828601613334565b92505060206135a2858286016133c7565b9150509250929050565b6000602082840312156135be57600080fd5b60006135cc84828501613373565b91505092915050565b6000602082840312156135e757600080fd5b60006135f584828501613388565b91505092915050565b60006020828403121561361057600080fd5b600061361e848285016133c7565b91505092915050565b6136308161420e565b82525050565b61363f81614220565b82525050565b6000613650826140b6565b61365a81856140cc565b935061366a818560208601614291565b6136738161445d565b840191505092915050565b6000613689826140c1565b61369381856140dd565b93506136a3818560208601614291565b6136ac8161445d565b840191505092915050565b60006136c2826140c1565b6136cc81856140ee565b93506136dc818560208601614291565b80840191505092915050565b60006136f56001836140ee565b91506137008261446e565b600182019050919050565b6000613718602b836140dd565b915061372382614497565b604082019050919050565b600061373b6032836140dd565b9150613746826144e6565b604082019050919050565b600061375e6026836140dd565b915061376982614535565b604082019050919050565b6000613781601c836140dd565b915061378c82614584565b602082019050919050565b60006137a46001836140ee565b91506137af826145ad565b600182019050919050565b60006137c7600e836140dd565b91506137d2826145d6565b602082019050919050565b60006137ea6024836140dd565b91506137f5826145ff565b604082019050919050565b600061380d6019836140dd565b91506138188261464e565b602082019050919050565b60006138306011836140ee565b915061383b82614677565b601182019050919050565b6000613853602c836140dd565b915061385e826146a0565b604082019050919050565b60006138766038836140dd565b9150613881826146ef565b604082019050919050565b6000613899602a836140dd565b91506138a48261473e565b604082019050919050565b60006138bc6029836140dd565b91506138c78261478d565b604082019050919050565b60006138df6002836140ee565b91506138ea826147dc565b600282019050919050565b60006139026020836140dd565b915061390d82614805565b602082019050919050565b6000613925602c836140dd565b91506139308261482e565b604082019050919050565b60006139486020836140dd565b91506139538261487d565b602082019050919050565b600061396b6010836140dd565b9150613976826148a6565b602082019050919050565b600061398e6029836140dd565b9150613999826148cf565b604082019050919050565b60006139b160c5836140ee565b91506139bc8261491e565b60c582019050919050565b60006139d46001836140ee565b91506139df82614a2b565b600182019050919050565b60006139f76021836140dd565b9150613a0282614a54565b604082019050919050565b6000613a1a601d836140ee565b9150613a2582614aa3565b601d82019050919050565b6000613a3d6031836140dd565b9150613a4882614acc565b604082019050919050565b6000613a606001836140ee565b9150613a6b82614b1b565b600182019050919050565b6000613a83602c836140dd565b9150613a8e82614b44565b604082019050919050565b6000613aa66002836140ee565b9150613ab182614b93565b600282019050919050565b6000613ac9601f836140dd565b9150613ad482614bbc565b602082019050919050565b613ae881614278565b82525050565b6000613afa82846136b7565b915081905092915050565b6000613b1182886136b7565b9150613b1d82876136b7565b9150613b2982866136b7565b9150613b3582856136b7565b9150613b4182846136b7565b91508190509695505050505050565b6000613b5c828c6136b7565b9150613b68828b6136b7565b9150613b74828a6136b7565b9150613b8082896136b7565b9150613b8c82886136b7565b9150613b9882876136b7565b9150613ba482866136b7565b9150613bb082856136b7565b9150613bbc82846136b7565b91508190509a9950505050505050505050565b6000613bdb82856136b7565b9150613be782846136b7565b9150613bf2826136e8565b91508190509392505050565b6000613c0a82856136b7565b9150613c1682846136b7565b9150613c2182613797565b91508190509392505050565b6000613c3982856136b7565b9150613c4582846136b7565b9150613c50826139c7565b91508190509392505050565b6000613c6882856136b7565b9150613c7482846136b7565b9150613c7f82613a53565b91508190509392505050565b6000613c9782856136b7565b9150613ca282613a99565b9150613cae82846136b7565b91508190509392505050565b6000613cc582613823565b9150613cd182856136b7565b9150613cdc826139a4565b9150613ce882846136b7565b9150613cf3826138d2565b91508190509392505050565b6000613d0a82613a0d565b9150613d1682846136b7565b915081905092915050565b6000602082019050613d366000830184613627565b92915050565b6000608082019050613d516000830187613627565b613d5e6020830186613627565b613d6b6040830185613adf565b8181036060830152613d7d8184613645565b905095945050505050565b6000602082019050613d9d6000830184613636565b92915050565b60006020820190508181036000830152613dbd818461367e565b905092915050565b60006020820190508181036000830152613dde8161370b565b9050919050565b60006020820190508181036000830152613dfe8161372e565b9050919050565b60006020820190508181036000830152613e1e81613751565b9050919050565b60006020820190508181036000830152613e3e81613774565b9050919050565b60006020820190508181036000830152613e5e816137ba565b9050919050565b60006020820190508181036000830152613e7e816137dd565b9050919050565b60006020820190508181036000830152613e9e81613800565b9050919050565b60006020820190508181036000830152613ebe81613846565b9050919050565b60006020820190508181036000830152613ede81613869565b9050919050565b60006020820190508181036000830152613efe8161388c565b9050919050565b60006020820190508181036000830152613f1e816138af565b9050919050565b60006020820190508181036000830152613f3e816138f5565b9050919050565b60006020820190508181036000830152613f5e81613918565b9050919050565b60006020820190508181036000830152613f7e8161393b565b9050919050565b60006020820190508181036000830152613f9e8161395e565b9050919050565b60006020820190508181036000830152613fbe81613981565b9050919050565b60006020820190508181036000830152613fde816139ea565b9050919050565b60006020820190508181036000830152613ffe81613a30565b9050919050565b6000602082019050818103600083015261401e81613a76565b9050919050565b6000602082019050818103600083015261403e81613abc565b9050919050565b600060208201905061405a6000830184613adf565b92915050565b600061406a61407b565b905061407682826142f6565b919050565b6000604051905090565b600067ffffffffffffffff8211156140a05761409f61442e565b5b6140a98261445d565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061410482614278565b915061410f83614278565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115614144576141436143a1565b5b828201905092915050565b600061415a82614278565b915061416583614278565b925082614175576141746143d0565b5b828204905092915050565b600061418b82614278565b915061419683614278565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156141cf576141ce6143a1565b5b828202905092915050565b60006141e582614278565b91506141f083614278565b925082821015614203576142026143a1565b5b828203905092915050565b600061421982614258565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156142af578082015181840152602081019050614294565b838111156142be576000848401525b50505050565b600060028204905060018216806142dc57607f821691505b602082108114156142f0576142ef6143ff565b5b50919050565b6142ff8261445d565b810181811067ffffffffffffffff8211171561431e5761431d61442e565b5b80604052505050565b600061433282614278565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614365576143646143a1565b5b600182019050919050565b600061437b82614278565b915061438683614278565b925082614396576143956143d0565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f3400000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f3300000000000000000000000000000000000000000000000000000000000000600082015250565b7f4e6f74204c6f6f74206f776e6572000000000000000000000000000000000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f7b226e616d65223a202253686565742023000000000000000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f227d000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f546f6b656e20494420696e76616c696400000000000000000000000000000000600082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f222c20226465736372697074696f6e223a20224162696c6974792053636f726560008201527f73206172652072616e646f6d697a6564207461626c6520746f7020525047207360208201527f74796c652073746174732067656e65726174656420616e642073746f7265642060408201527f6f6e20636861696e2e204665656c206672656520746f20757365204162696c6960608201527f74792053636f72657320696e20616e792077617920796f752077616e742e222c60808201527f2022696d616765223a2022646174613a696d6167652f7376672b786d6c3b626160a08201527f736536342c00000000000000000000000000000000000000000000000000000060c082015250565b7f3200000000000000000000000000000000000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000600082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f3100000000000000000000000000000000000000000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f3a20000000000000000000000000000000000000000000000000000000000000600082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b614bee8161420e565b8114614bf957600080fd5b50565b614c0581614220565b8114614c1057600080fd5b50565b614c1c8161422c565b8114614c2757600080fd5b50565b614c3381614278565b8114614c3e57600080fd5b5056fe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a2073657269663b20666f6e742d73697a653a20313470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220e367950f387e20675a6b891ef07e9d8b8970d28efa39406d1e9d183a1a2c884964736f6c63430008040033

Deployed Bytecode Sourcemap

44490:5267:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38340:224;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25454:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27013:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;26536:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38980:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27903:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45532:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38648:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45398:122;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48319:175;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28313:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48770:186;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;48506:252;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39170:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25148:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24878:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9846:94;;;:::i;:::-;;9195:87;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25623:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27306:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;28569:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45256:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46548:1763;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44970:128;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44832:126;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27672:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;10095:192;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45110:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38340:224;38442:4;38481:35;38466:50;;;:11;:50;;;;:90;;;;38520:36;38544:11;38520:23;:36::i;:::-;38466:90;38459:97;;38340:224;;;:::o;25454:100::-;25508:13;25541:5;25534:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25454:100;:::o;27013:221::-;27089:7;27117:16;27125:7;27117;:16::i;:::-;27109:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27202:15;:24;27218:7;27202:24;;;;;;;;;;;;;;;;;;;;;27195:31;;27013:221;;;:::o;26536:411::-;26617:13;26633:23;26648:7;26633:14;:23::i;:::-;26617:39;;26681:5;26675:11;;:2;:11;;;;26667:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;26775:5;26759:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;26784:37;26801:5;26808:12;:10;:12::i;:::-;26784:16;:37::i;:::-;26759:62;26737:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;26918:21;26927:2;26931:7;26918:8;:21::i;:::-;26536:411;;;:::o;38980:113::-;39041:7;39068:10;:17;;;;39061:24;;38980:113;:::o;27903:339::-;28098:41;28117:12;:10;:12::i;:::-;28131:7;28098:18;:41::i;:::-;28090:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28206:28;28216:4;28222:2;28226:7;28206:9;:28::i;:::-;27903:339;;;:::o;45532:126::-;45591:13;45624:26;45630:7;45624:26;;;;;;;;;;;;;;;;;:5;:26::i;:::-;45617:33;;45532:126;;;:::o;38648:256::-;38745:7;38781:23;38798:5;38781:16;:23::i;:::-;38773:5;:31;38765:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;38870:12;:19;38883:5;38870:19;;;;;;;;;;;;;;;:26;38890:5;38870:26;;;;;;;;;;;;38863:33;;38648:256;;;;:::o;45398:122::-;45455:13;45488:24;45494:7;45488:24;;;;;;;;;;;;;;;;;:5;:24::i;:::-;45481:31;;45398:122;;;:::o;48319:175::-;12134:1;12730:7;;:19;;12722:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12134:1;12863:7;:18;;;;48400:4:::1;48390:7;:14;:32;;;;;48418:4;48408:7;:14;48390:32;48382:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;48454:32;48464:12;:10;:12::i;:::-;48478:7;48454:9;:32::i;:::-;12090:1:::0;13042:7;:22;;;;48319:175;:::o;28313:185::-;28451:39;28468:4;28474:2;28478:7;28451:39;;;;;;;;;;;;:16;:39::i;:::-;28313:185;;;:::o;48770:186::-;12134:1;12730:7;;:19;;12722:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12134:1;12863:7;:18;;;;9426:12:::1;:10;:12::i;:::-;9415:23;;:7;:5;:7::i;:::-;:23;;;9407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;48866:4:::2;48856:7;:14;:33;;;;;48884:5;48874:7;:15;48856:33;48848:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48921:27;48931:7;:5;:7::i;:::-;48940;48921:9;:27::i;:::-;12090:1:::0;13042:7;:22;;;;48770:186;:::o;48506:252::-;12134:1;12730:7;;:19;;12722:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;12134:1;12863:7;:18;;;;48594:1:::1;48584:7;:11;:29;;;;;48609:4;48599:7;:14;48584:29;48576:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;48678:10;48653:35;;:4;;;;;;;;;;;:12;;;48666:7;48653:21;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:35;;;48645:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48718:32;48728:12;:10;:12::i;:::-;48742:7;48718:9;:32::i;:::-;12090:1:::0;13042:7;:22;;;;48506:252;:::o;39170:233::-;39245:7;39281:30;:28;:30::i;:::-;39273:5;:38;39265:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;39378:10;39389:5;39378:17;;;;;;;;;;;;;;;;;;;;;;;;39371:24;;39170:233;;;:::o;25148:239::-;25220:7;25240:13;25256:7;:16;25264:7;25256:16;;;;;;;;;;;;;;;;;;;;;25240:32;;25308:1;25291:19;;:5;:19;;;;25283:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;25374:5;25367:12;;;25148:239;;;:::o;24878:208::-;24950:7;24995:1;24978:19;;:5;:19;;;;24970:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;25062:9;:16;25072:5;25062:16;;;;;;;;;;;;;;;;25055:23;;24878:208;;;:::o;9846:94::-;9426:12;:10;:12::i;:::-;9415:23;;:7;:5;:7::i;:::-;:23;;;9407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9911:21:::1;9929:1;9911:9;:21::i;:::-;9846:94::o:0;9195:87::-;9241:7;9268:6;;;;;;;;;;;9261:13;;9195:87;:::o;25623:104::-;25679:13;25712:7;25705:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25623:104;:::o;27306:295::-;27421:12;:10;:12::i;:::-;27409:24;;:8;:24;;;;27401:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;27521:8;27476:18;:32;27495:12;:10;:12::i;:::-;27476:32;;;;;;;;;;;;;;;:42;27509:8;27476:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;27574:8;27545:48;;27560:12;:10;:12::i;:::-;27545:48;;;27584:8;27545:48;;;;;;:::i;:::-;;;;;;;;27306:295;;:::o;28569:328::-;28744:41;28763:12;:10;:12::i;:::-;28777:7;28744:18;:41::i;:::-;28736:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;28850:39;28864:4;28870:2;28874:7;28883:5;28850:13;:39::i;:::-;28569:328;;;;:::o;45256:134::-;45319:13;45352:30;45358:7;45352:30;;;;;;;;;;;;;;;;;:5;:30::i;:::-;45345:37;;45256:134;;;:::o;46548:1763::-;46613:13;46639:23;;:::i;:::-;46673:266;;;;;;;;;;;;;;;;;:5;46679:1;46673:8;;;;;;;;;;;;;;;;;;:266;;;;46963:20;46975:7;46963:11;:20::i;:::-;46952:5;46958:1;46952:8;;;;;;;;;;;;;;;;;;:31;;;;46996:53;;;;;;;;;;;;;;;;;:5;47002:1;46996:8;;;;;;;;;;;;;;;;;;:53;;;;47073:21;47086:7;47073:12;:21::i;:::-;47062:5;47068:1;47062:8;;;;;;;;;;;;;;;;;;:32;;;;47107:53;;;;;;;;;;;;;;;;;:5;47113:1;47107:8;;;;;;;;;;;;;;;;;;:53;;;;47184:24;47200:7;47184:15;:24::i;:::-;47173:5;47179:1;47173:8;;;;;;;;;;;;;;;;;;:35;;;;47221:53;;;;;;;;;;;;;;;;;:5;47227:1;47221:8;;;;;;;;;;;;;;;;;;:53;;;;47298:24;47314:7;47298:15;:24::i;:::-;47287:5;47293:1;47287:8;;;;;;;;;;;;;;;;;;:35;;;;47335:54;;;;;;;;;;;;;;;;;:5;47341:1;47335:8;;;;;;;;;;;;;;;;;;:54;;;;47413:18;47423:7;47413:9;:18::i;:::-;47402:5;47408:1;47402:8;;;;;;;;;;;;;;;;;;:29;;;;47444:55;;;;;;;;;;;;;;;;;:5;47450:2;47444:9;;;;;;;;;;;;;;;;;;:55;;;;47524:20;47536:7;47524:11;:20::i;:::-;47512:5;47518:2;47512:9;;;;;;;;;;;;;;;;;;:32;;;;47557:27;;;;;;;;;;;;;;;;;:5;47563:2;47557:9;;;;;;;;;;;;;;;;;;:27;;;;47597:20;47644:5;47650:1;47644:8;;;;;;;;;;;;;;;;;;;47654:5;47660:1;47654:8;;;;;;;;;;;;;;;;;;;47664:5;47670:1;47664:8;;;;;;;;;;;;;;;;;;;47674:5;47680:1;47674:8;;;;;;;;;;;;;;;;;;;47684:5;47690:1;47684:8;;;;;;;;;;;;;;;;;;;47694:5;47700:1;47694:8;;;;;;;;;;;;;;;;;;;47704:5;47710:1;47704:8;;;;;;;;;;;;;;;;;;;47714:5;47720:1;47714:8;;;;;;;;;;;;;;;;;;;47724:5;47730:1;47724:8;;;;;;;;;;;;;;;;;;;47627:106;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47597:137;;47778:6;47786:5;47792:1;47786:8;;;;;;;;;;;;;;;;;;;47796:5;47802:2;47796:9;;;;;;;;;;;;;;;;;;;47807:5;47813:2;47807:9;;;;;;;;;;;;;;;;;;;47818:5;47824:2;47818:9;;;;;;;;;;;;;;;;;;;47761:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47745:84;;47850:18;47871:323;47936:17;47945:7;47936:8;:17::i;:::-;48156:28;48176:6;48156:13;:28::i;:::-;47898:293;;;;;;;;;:::i;:::-;;;;;;;;;;;;;47871:13;:323::i;:::-;47850:344;;48271:4;48221:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;48205:72;;48297:6;48290:13;;;;;46548:1763;;;:::o;44970:128::-;45030:13;45063:27;45069:7;45063:27;;;;;;;;;;;;;;;;;:5;:27::i;:::-;45056:34;;44970:128;;;:::o;44832:126::-;44891:13;44924:26;44930:7;44924:26;;;;;;;;;;;;;;;;;:5;:26::i;:::-;44917:33;;44832:126;;;:::o;27672:164::-;27769:4;27793:18;:25;27812:5;27793:25;;;;;;;;;;;;;;;:35;27819:8;27793:35;;;;;;;;;;;;;;;;;;;;;;;;;27786:42;;27672:164;;;;:::o;10095:192::-;9426:12;:10;:12::i;:::-;9415:23;;:7;:5;:7::i;:::-;:23;;;9407:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10204:1:::1;10184:22;;:8;:22;;;;10176:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10260:19;10270:8;10260:9;:19::i;:::-;10095:192:::0;:::o;45110:134::-;45173:13;45206:30;45212:7;45206:30;;;;;;;;;;;;;;;;;:5;:30::i;:::-;45199:37;;45110:134;;;:::o;24509:305::-;24611:4;24663:25;24648:40;;;:11;:40;;;;:105;;;;24720:33;24705:48;;;:11;:48;;;;24648:105;:158;;;;24770:36;24794:11;24770:23;:36::i;:::-;24648:158;24628:178;;24509:305;;;:::o;30407:127::-;30472:4;30524:1;30496:30;;:7;:16;30504:7;30496:16;;;;;;;;;;;;;;;;;;;;;:30;;;;30489:37;;30407:127;;;:::o;8055:98::-;8108:7;8135:10;8128:17;;8055:98;:::o;34389:174::-;34491:2;34464:15;:24;34480:7;34464:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;34547:7;34543:2;34509:46;;34518:23;34533:7;34518:14;:23::i;:::-;34509:46;;;;;;;;;;;;34389:174;;:::o;30701:348::-;30794:4;30819:16;30827:7;30819;:16::i;:::-;30811:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;30895:13;30911:23;30926:7;30911:14;:23::i;:::-;30895:39;;30964:5;30953:16;;:7;:16;;;:51;;;;30997:7;30973:31;;:20;30985:7;30973:11;:20::i;:::-;:31;;;30953:51;:87;;;;31008:32;31025:5;31032:7;31008:16;:32::i;:::-;30953:87;30945:96;;;30701:348;;;;:::o;33693:578::-;33852:4;33825:31;;:23;33840:7;33825:14;:23::i;:::-;:31;;;33817:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;33935:1;33921:16;;:2;:16;;;;33913:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;33991:39;34012:4;34018:2;34022:7;33991:20;:39::i;:::-;34095:29;34112:1;34116:7;34095:8;:29::i;:::-;34156:1;34137:9;:15;34147:4;34137:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;34185:1;34168:9;:13;34178:2;34168:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;34216:2;34197:7;:16;34205:7;34197:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;34255:7;34251:2;34236:27;;34245:4;34236:27;;;;;;;;;;;;33693:578;;;:::o;45670:870::-;45750:13;45776;45792:67;45823:9;45834:17;45843:7;45834:8;:17::i;:::-;45806:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45792:6;:67::i;:::-;45776:83;;45870:11;45884:5;45870:19;;45900:13;45916:67;45947:9;45958:17;45967:7;45958:8;:17::i;:::-;45930:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;45916:6;:67::i;:::-;45900:83;;46006:5;46000:3;:11;:25;;46022:3;46000:25;;;46014:5;46000:25;45994:31;;46036:13;46052:67;46083:9;46094:17;46103:7;46094:8;:17::i;:::-;46066:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46052:6;:67::i;:::-;46036:83;;46142:5;46136:3;:11;:25;;46158:3;46136:25;;;46150:5;46136:25;46130:31;;46172:13;46188:67;46219:9;46230:17;46239:7;46230:8;:17::i;:::-;46202:51;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46188:6;:67::i;:::-;46172:83;;46278:5;46272:3;:11;:25;;46294:3;46272:25;;;46286:5;46272:25;46266:31;;46355:12;46402:3;46394:5;46386;46378;46370;:13;;;;:::i;:::-;:21;;;;:::i;:::-;:29;;;;:::i;:::-;:35;;;;:::i;:::-;46355:50;;46426:20;46473:9;46490:14;46499:4;46490:8;:14::i;:::-;46456:49;;;;;;;;;:::i;:::-;;;;;;;;;;;;;46426:80;;46526:6;46519:13;;;;;;;;;45670:870;;;;:::o;31391:110::-;31467:26;31477:2;31481:7;31467:26;;;;;;;;;;;;:9;:26::i;:::-;31391:110;;:::o;10295:173::-;10351:16;10370:6;;;;;;;;;;;10351:25;;10396:8;10387:6;;:17;;;;;;;;;;;;;;;;;;10451:8;10420:40;;10441:8;10420:40;;;;;;;;;;;;10295:173;;:::o;29779:315::-;29936:28;29946:4;29952:2;29956:7;29936:9;:28::i;:::-;29983:48;30006:4;30012:2;30016:7;30025:5;29983:22;:48::i;:::-;29975:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;29779:315;;;;:::o;48968:715::-;49024:13;49246:1;49237:5;:10;49233:53;;;49264:10;;;;;;;;;;;;;;;;;;;;;49233:53;49296:12;49311:5;49296:20;;49327:14;49352:78;49367:1;49359:4;:9;49352:78;;49385:8;;;;;:::i;:::-;;;;49416:2;49408:10;;;;;:::i;:::-;;;49352:78;;;49440:19;49472:6;49462:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49440:39;;49490:154;49506:1;49497:5;:10;49490:154;;49534:1;49524:11;;;;;:::i;:::-;;;49601:2;49593:5;:10;;;;:::i;:::-;49580:2;:24;;;;:::i;:::-;49567:39;;49550:6;49557;49550:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;49630:2;49621:11;;;;;:::i;:::-;;;49490:154;;;49668:6;49654:21;;;;;48968:715;;;;:::o;50108:1607::-;50166:13;50192:11;50206:4;:11;50192:25;;50239:1;50232:3;:8;50228:23;;;50242:9;;;;;;;;;;;;;;;;;50228:23;50303:18;50341:1;50336;50330:3;:7;;;;:::i;:::-;50329:13;;;;:::i;:::-;50324:1;:19;;;;:::i;:::-;50303:40;;50401:19;50446:2;50433:10;:15;;;;:::i;:::-;50423:26;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50401:48;;50462:18;50483:5;;;;;;;;;;;;;;;;;50462:26;;50552:1;50545:5;50541:13;50597:2;50589:6;50585:15;50648:1;50616:777;50671:3;50668:1;50665:10;50616:777;;;50726:1;50723;50719:9;50714:14;;50784:8;50779:1;50773:4;50769:12;50763:19;50759:34;50864:4;50856:5;50852:2;50848:14;50844:25;50834:8;50830:40;50824:47;50903:3;50900:1;50896:11;50889:18;;50994:4;50985;50977:5;50973:2;50969:14;50965:25;50955:8;50951:40;50945:47;50941:58;50936:3;50932:68;50925:75;;51032:3;51029:1;51025:11;51018:18;;51122:4;51113;51105:5;51102:1;51098:13;51094:24;51084:8;51080:39;51074:46;51070:57;51065:3;51061:67;51054:74;;51160:3;51157:1;51153:11;51146:18;;51242:4;51233;51226:5;51222:16;51212:8;51208:31;51202:38;51198:49;51193:3;51189:59;51182:66;;51282:3;51277;51273:13;51266:20;;51324:3;51313:9;51306:22;51376:1;51365:9;51361:17;51348:30;;50695:698;;50616:777;;;50620:44;51425:1;51420:3;51416:11;51446:1;51441:84;;;;51544:1;51539:82;;;;51409:212;;51441:84;51502:6;51497:3;51493:16;51489:1;51478:9;51474:17;51467:43;51441:84;;51539:82;51600:4;51595:3;51591:14;51587:1;51576:9;51572:17;51565:41;51409:212;;51652:10;51644:6;51637:26;50510:1164;;51700:6;51686:21;;;;;;50108:1607;;;;:::o;23116:157::-;23201:4;23240:25;23225:40;;;:11;:40;;;;23218:47;;23116:157;;;:::o;40016:589::-;40160:45;40187:4;40193:2;40197:7;40160:26;:45::i;:::-;40238:1;40222:18;;:4;:18;;;40218:187;;;40257:40;40289:7;40257:31;:40::i;:::-;40218:187;;;40327:2;40319:10;;:4;:10;;;40315:90;;40346:47;40379:4;40385:7;40346:32;:47::i;:::-;40315:90;40218:187;40433:1;40419:16;;:2;:16;;;40415:183;;;40452:45;40489:7;40452:36;:45::i;:::-;40415:183;;;40525:4;40519:10;;:2;:10;;;40515:83;;40546:40;40574:2;40578:7;40546:27;:40::i;:::-;40515:83;40415:183;40016:589;;;:::o;44672:148::-;44732:7;44811:1;44806;44795:5;44778:23;;;;;;;;:::i;:::-;;;;;;;;;;;;;44768:34;;;;;;44760:43;;:47;;;;:::i;:::-;44759:53;;;;:::i;:::-;44752:60;;44672:148;;;:::o;31728:321::-;31858:18;31864:2;31868:7;31858:5;:18::i;:::-;31909:54;31940:1;31944:2;31948:7;31957:5;31909:22;:54::i;:::-;31887:154;;;;;;;;;;;;:::i;:::-;;;;;;;;;31728:321;;;:::o;35128:803::-;35283:4;35304:15;:2;:13;;;:15::i;:::-;35300:624;;;35356:2;35340:36;;;35377:12;:10;:12::i;:::-;35391:4;35397:7;35406:5;35340:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;35336:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35603:1;35586:6;:13;:18;35582:272;;;35629:60;;;;;;;;;;:::i;:::-;;;;;;;;35582:272;35804:6;35798:13;35789:6;35785:2;35781:15;35774:38;35336:533;35473:45;;;35463:55;;;:6;:55;;;;35456:62;;;;;35300:624;35908:4;35901:11;;35128:803;;;;;;;:::o;36503:126::-;;;;:::o;41328:164::-;41432:10;:17;;;;41405:15;:24;41421:7;41405:24;;;;;;;;;;;:44;;;;41460:10;41476:7;41460:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41328:164;:::o;42119:988::-;42385:22;42435:1;42410:22;42427:4;42410:16;:22::i;:::-;:26;;;;:::i;:::-;42385:51;;42447:18;42468:17;:26;42486:7;42468:26;;;;;;;;;;;;42447:47;;42615:14;42601:10;:28;42597:328;;42646:19;42668:12;:18;42681:4;42668:18;;;;;;;;;;;;;;;:34;42687:14;42668:34;;;;;;;;;;;;42646:56;;42752:11;42719:12;:18;42732:4;42719:18;;;;;;;;;;;;;;;:30;42738:10;42719:30;;;;;;;;;;;:44;;;;42869:10;42836:17;:30;42854:11;42836:30;;;;;;;;;;;:43;;;;42597:328;;43021:17;:26;43039:7;43021:26;;;;;;;;;;;43014:33;;;43065:12;:18;43078:4;43065:18;;;;;;;;;;;;;;;:34;43084:14;43065:34;;;;;;;;;;;43058:41;;;42119:988;;;;:::o;43402:1079::-;43655:22;43700:1;43680:10;:17;;;;:21;;;;:::i;:::-;43655:46;;43712:18;43733:15;:24;43749:7;43733:24;;;;;;;;;;;;43712:45;;44084:19;44106:10;44117:14;44106:26;;;;;;;;;;;;;;;;;;;;;;;;44084:48;;44170:11;44145:10;44156;44145:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;44281:10;44250:15;:28;44266:11;44250:28;;;;;;;;;;;:41;;;;44422:15;:24;44438:7;44422:24;;;;;;;;;;;44415:31;;;44457:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43402:1079;;;;:::o;40906:221::-;40991:14;41008:20;41025:2;41008:16;:20::i;:::-;40991:37;;41066:7;41039:12;:16;41052:2;41039:16;;;;;;;;;;;;;;;:24;41056:6;41039:24;;;;;;;;;;;:34;;;;41113:6;41084:17;:26;41102:7;41084:26;;;;;;;;;;;:35;;;;40906:221;;;:::o;32385:382::-;32479:1;32465:16;;:2;:16;;;;32457:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;32538:16;32546:7;32538;:16::i;:::-;32537:17;32529:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;32600:45;32629:1;32633:2;32637:7;32600:20;:45::i;:::-;32675:1;32658:9;:13;32668:2;32658:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;32706:2;32687:7;:16;32695:7;32687:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;32751:7;32747:2;32726:33;;32743:1;32726:33;;;;;;;;;;;;32385:382;;:::o;15288:387::-;15348:4;15556:12;15623:7;15611:20;15603:28;;15666:1;15659:4;:8;15652:15;;;15288: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:404::-;14596:3;14617:86;14699:3;14694;14617:86;:::i;:::-;14610:93;;14712;14801:3;14712:93;:::i;:::-;14830:3;14825;14821:13;14814:20;;14600:240;;;:::o;14846:400::-;15006:3;15027:84;15109:1;15104:3;15027:84;:::i;:::-;15020:91;;15120:93;15209:3;15120:93;:::i;:::-;15238:1;15233:3;15229:11;15222:18;;15010:236;;;:::o;15252:366::-;15394:3;15415:67;15479:2;15474:3;15415:67;:::i;:::-;15408:74;;15491:93;15580:3;15491:93;:::i;:::-;15609:2;15604:3;15600:12;15593:19;;15398:220;;;:::o;15624:402::-;15784:3;15805:85;15887:2;15882:3;15805:85;:::i;:::-;15798:92;;15899:93;15988:3;15899:93;:::i;:::-;16017:2;16012:3;16008:12;16001:19;;15788:238;;;:::o;16032:366::-;16174:3;16195:67;16259:2;16254:3;16195:67;:::i;:::-;16188:74;;16271:93;16360:3;16271:93;:::i;:::-;16389:2;16384:3;16380:12;16373:19;;16178:220;;;:::o;16404:400::-;16564:3;16585:84;16667:1;16662:3;16585:84;:::i;:::-;16578:91;;16678:93;16767:3;16678:93;:::i;:::-;16796:1;16791:3;16787:11;16780:18;;16568:236;;;:::o;16810:366::-;16952:3;16973:67;17037:2;17032:3;16973:67;:::i;:::-;16966:74;;17049:93;17138:3;17049:93;:::i;:::-;17167:2;17162:3;17158:12;17151:19;;16956:220;;;:::o;17182:400::-;17342:3;17363:84;17445:1;17440:3;17363:84;:::i;:::-;17356:91;;17456:93;17545:3;17456:93;:::i;:::-;17574:1;17569:3;17565:11;17558:18;;17346:236;;;:::o;17588:366::-;17730:3;17751:67;17815:2;17810:3;17751:67;:::i;:::-;17744:74;;17827:93;17916:3;17827:93;:::i;:::-;17945:2;17940:3;17936:12;17929:19;;17734:220;;;:::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:668::-;45868:66;45864:1;45856:6;45852:14;45845:90;45969:34;45964:2;45956:6;45952:15;45945:59;46038:34;46033:2;46025:6;46021:15;46014:59;46107:34;46102:2;46094:6;46090:15;46083:59;46177:66;46171:3;46163:6;46159:16;46152:92;46279:66;46273:3;46265:6;46261:16;46254:92;46381:7;46375:3;46367:6;46363:16;46356:33;45834:562;:::o;46402:151::-;46542:3;46538:1;46530:6;46526:14;46519:27;46508:45;:::o;46559:220::-;46699:34;46695:1;46687:6;46683:14;46676:58;46768:3;46763:2;46755:6;46751:15;46744:28;46665:114;:::o;46785:179::-;46925:31;46921:1;46913:6;46909:14;46902:55;46891:73;:::o;46970:236::-;47110:34;47106:1;47098:6;47094:14;47087:58;47179:19;47174:2;47166:6;47162:15;47155:44;47076:130;:::o;47212:151::-;47352:3;47348:1;47340:6;47336:14;47329:27;47318:45;:::o;47369:231::-;47509:34;47505:1;47497:6;47493:14;47486:58;47578:14;47573:2;47565:6;47561:15;47554:39;47475:125;:::o;47606:152::-;47746:4;47742:1;47734:6;47730:14;47723:28;47712:46;:::o;47764:181::-;47904:33;47900:1;47892:6;47888:14;47881:57;47870:75;:::o;47951:122::-;48024:24;48042:5;48024:24;:::i;:::-;48017:5;48014:35;48004:2;;48063:1;48060;48053:12;48004:2;47994:79;:::o;48079:116::-;48149:21;48164:5;48149:21;:::i;:::-;48142:5;48139:32;48129:2;;48185:1;48182;48175:12;48129:2;48119:76;:::o;48201:120::-;48273:23;48290:5;48273:23;:::i;:::-;48266:5;48263:34;48253:2;;48311:1;48308;48301:12;48253:2;48243:78;:::o;48327:122::-;48400:24;48418:5;48400:24;:::i;:::-;48393:5;48390:35;48380:2;;48439:1;48436;48429:12;48380:2;48370:79;:::o

Swarm Source

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