ETH Price: $3,403.66 (-1.61%)
Gas: 4 Gwei

Token

Drago (DRG)
 

Overview

Max Total Supply

0 DRG

Holders

947

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
0 DRG
0x8e2580fd1d379d10434bfaeefdd48e0e0cb6fca9
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

League of Kingdoms Drago NFT

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Drago

Compiler Version
v0.8.10+commit.fc410830

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-08
*/

pragma solidity ^0.8.0;


// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)
/**
 * @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);
}


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721.sol)
/**
 * @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`.
     *
     * 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 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)
/**
 * @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 `IERC721Receiver.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)
/**
 * @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);
}


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)
/**
 * @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
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)
/**
 * @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;
    }
}


// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)
/**
 * @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);
    }
}


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)
/**
 * @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;
    }
}


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/ERC721.sol)
/**
 * @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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(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);

        _afterTokenTransfer(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 from incorrect owner");
        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);

        _afterTokenTransfer(from, to, tokenId);
    }

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

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

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

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

    /**
     * @dev Hook that is called after any transfer of tokens. This includes
     * minting and burning.
     *
     * Calling conditions:
     *
     * - when `from` and `to` are both non-zero.
     * - `from` and `to` are never both zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {}
}


contract Membership is Context {
    address private owner;
    event MembershipChanged(address indexed owner, uint256 level);
    event OwnerTransferred(address indexed preOwner, address indexed newOwner);

    mapping(address => uint256) internal membership;

    constructor() {
        owner = _msgSender();
        setMembership(_msgSender(), 1);
    }

    function transferOwner(address newOwner) public onlyOwner {
        address preOwner = owner;
        setMembership(newOwner, 1);
        setMembership(preOwner, 0);
        owner = newOwner;
        emit OwnerTransferred(preOwner, newOwner);
    }

    function setMembership(address key, uint256 level) public onlyOwner {
        membership[key] = level;
        emit MembershipChanged(key, level);
    }

    modifier onlyOwner() {
        require(isOwner(), "Membership : caller is not the owner");
        _;
    }

    function isOwner() public view returns (bool) {
        return _msgSender() == owner;
    }


    modifier onlyAdmin() {
        require(isAdmin(), "Membership : caller is not a admin");
        _;
    }

    function isAdmin() public view returns (bool) {
        return membership[_msgSender()] == 1;
    }

    modifier onlyMinter() {
        require(isMinter(), "Memberhsip : caller is not a Minter");
        _;
    }

    function isMinter() public view returns (bool) {
        return isOwner() || membership[_msgSender()] == 11;
    }
    
    function getMembership(address account) public view returns (uint256){
        return membership[account];
    }
}


contract Drago is ERC721, Membership {
    event Born(uint256 indexed id, uint256 indexed parents);
    event Data(uint256 indexed id, uint256 indexed data);

    mapping(uint256 => uint256) private _datas;
    mapping(uint256 => uint256) private _parents;
    mapping(uint256 => uint256) private _breeds;
    mapping(uint256 => uint256) private _fusions;
    string baseURI;
    // constructor() ERC721("DDDA", "DDDB") {
    constructor() ERC721("Drago", "DRG") {
        setBaseURI("https://lok-nft.leagueofkingdoms.com/api/drago/");
    }
    function _baseURI() internal view override returns (string memory) {
        return baseURI;
    }
    function setBaseURI(string memory uri) public onlyOwner {
        baseURI = uri;
    }
    function born(uint256 tokenId, uint256 data) public onlyMinter{
        _datas[tokenId] = data;
        emit Data(tokenId, data);
    }
    function burn(uint256 tokenId) public onlyMinter{
        _burn(tokenId);
    }
    function mint(address to, uint256 tokenId, uint256 data) public onlyMinter{
        _datas[tokenId] = data;
        _mint(to, tokenId);
        emit Data(tokenId, data);
    }
    function breed(uint256 tokenId) public onlyMinter {
        _breeds[tokenId] += 1;
    }
    function fusion(uint256 tokenId) public onlyMinter {
        _fusions[tokenId] += 1;
    }
    function setParents(uint256 tokenId, uint256 parents) public onlyMinter {
        _parents[tokenId] = parents;
        emit Born(tokenId, parents);
    }
    function getParents(uint256 tokenId) public view returns(uint256){
        return _parents[tokenId];
    }
    function getData(uint256 tokenId) public view returns(uint256){
        return _datas[tokenId];
    }
    function getBreed(uint256 tokenId) public view returns(uint256){
        return _breeds[tokenId];
    }
    function getFusion(uint256 tokenId) public view returns(uint256){
        return _fusions[tokenId];
    }
}

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":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"parents","type":"uint256"}],"name":"Born","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":true,"internalType":"uint256","name":"data","type":"uint256"}],"name":"Data","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":false,"internalType":"uint256","name":"level","type":"uint256"}],"name":"MembershipChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"preOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnerTransferred","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"},{"internalType":"uint256","name":"data","type":"uint256"}],"name":"born","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"breed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"fusion","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":"getBreed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getData","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFusion","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"getMembership","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getParents","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAdmin","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isOwner","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"data","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"key","type":"address"},{"internalType":"uint256","name":"level","type":"uint256"}],"name":"setMembership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"parents","type":"uint256"}],"name":"setParents","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"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":"transferOwner","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b506040518060400160405280600581526020017f447261676f0000000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f44524700000000000000000000000000000000000000000000000000000000008152508160009080519060200190620000969291906200031b565b508060019080519060200190620000af9291906200031b565b505050620000c26200015460201b60201c565b600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000124620001166200015460201b60201c565b60016200015c60201b60201c565b6200014e6040518060600160405280602f815260200162003b08602f91396200024660201b60201c565b62000511565b600033905090565b6200016c620002b460201b60201c565b620001ae576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001a59062000452565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f65efeaf737ce094d287661b6a56bb530dce1fc30853708d1912a74f8ae65ffbb826040516200023a91906200048f565b60405180910390a25050565b62000256620002b460201b60201c565b62000298576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200028f9062000452565b60405180910390fd5b80600c9080519060200190620002b09291906200031b565b5050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16620002ff6200015460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b8280546200032990620004db565b90600052602060002090601f0160209004810192826200034d576000855562000399565b82601f106200036857805160ff191683800117855562000399565b8280016001018555821562000399579182015b82811115620003985782518255916020019190600101906200037b565b5b509050620003a89190620003ac565b5090565b5b80821115620003c7576000816000905550600101620003ad565b5090565b600082825260208201905092915050565b7f4d656d62657273686970203a2063616c6c6572206973206e6f7420746865206f60008201527f776e657200000000000000000000000000000000000000000000000000000000602082015250565b60006200043a602483620003cb565b91506200044782620003dc565b604082019050919050565b600060208201905081810360008301526200046d816200042b565b9050919050565b6000819050919050565b620004898162000474565b82525050565b6000602082019050620004a660008301846200047e565b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620004f457607f821691505b602082108114156200050b576200050a620004ac565b5b50919050565b6135e780620005216000396000f3fe608060405234801561001057600080fd5b50600436106101da5760003560e01c80636352211e11610104578063af9a1cd2116100a2578063c87b56dd11610071578063c87b56dd14610561578063cc876ded14610591578063e37bbc5e146105ad578063e985e9c5146105dd576101da565b8063af9a1cd2146104db578063b6db75a0146104f7578063b88d4fde14610515578063c6575fd414610531576101da565b8063874dae88116100de578063874dae88146104675780638f32d59b1461048357806395d89b41146104a1578063a22cb465146104bf576101da565b80636352211e146103eb5780636ea535311461041b57806370a0823114610437576101da565b806323b872dd1161017c57806342966c681161014b57806342966c68146103795780634fb2e45d1461039557806350e59eb3146103b157806355f804b3146103cf576101da565b806323b872dd146102e1578063242a0087146102fd57806334c5a0441461032d57806342842e0e1461035d576101da565b8063081812fc116101b8578063081812fc1461025d578063095ea7b31461028d5780630e5ff21a146102a9578063156e29f6146102c5576101da565b80630178fe3f146101df57806301ffc9a71461020f57806306fdde031461023f575b600080fd5b6101f960048036038101906101f491906122a7565b61060d565b60405161020691906122e3565b60405180910390f35b61022960048036038101906102249190612356565b61062a565b604051610236919061239e565b60405180910390f35b61024761070c565b6040516102549190612452565b60405180910390f35b610277600480360381019061027291906122a7565b61079e565b60405161028491906124b5565b60405180910390f35b6102a760048036038101906102a291906124fc565b610823565b005b6102c360048036038101906102be919061253c565b61093b565b005b6102df60048036038101906102da919061257c565b6109cc565b005b6102fb60048036038101906102f691906125cf565b610a68565b005b610317600480360381019061031291906122a7565b610ac8565b60405161032491906122e3565b60405180910390f35b61034760048036038101906103429190612622565b610ae5565b60405161035491906122e3565b60405180910390f35b610377600480360381019061037291906125cf565b610b2e565b005b610393600480360381019061038e91906122a7565b610b4e565b005b6103af60048036038101906103aa9190612622565b610ba1565b005b6103b9610cc4565b6040516103c6919061239e565b60405180910390f35b6103e960048036038101906103e49190612784565b610d24565b005b610405600480360381019061040091906122a7565b610d85565b60405161041291906124b5565b60405180910390f35b610435600480360381019061043091906122a7565b610e37565b005b610451600480360381019061044c9190612622565b610eac565b60405161045e91906122e3565b60405180910390f35b610481600480360381019061047c91906124fc565b610f64565b005b61048b611041565b604051610498919061239e565b60405180910390f35b6104a96110a0565b6040516104b69190612452565b60405180910390f35b6104d960048036038101906104d491906127f9565b611132565b005b6104f560048036038101906104f091906122a7565b611148565b005b6104ff6111bd565b60405161050c919061239e565b60405180910390f35b61052f600480360381019061052a91906128da565b61120e565b005b61054b600480360381019061054691906122a7565b611270565b60405161055891906122e3565b60405180910390f35b61057b600480360381019061057691906122a7565b61128d565b6040516105889190612452565b60405180910390f35b6105ab60048036038101906105a6919061253c565b611334565b005b6105c760048036038101906105c291906122a7565b6113c5565b6040516105d491906122e3565b60405180910390f35b6105f760048036038101906105f2919061295d565b6113e2565b604051610604919061239e565b60405180910390f35b600060086000838152602001908152602001600020549050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106f557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610705575061070482611476565b5b9050919050565b60606000805461071b906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610747906129cc565b80156107945780601f1061076957610100808354040283529160200191610794565b820191906000526020600020905b81548152906001019060200180831161077757829003601f168201915b5050505050905090565b60006107a9826114e0565b6107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90612a70565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061082e82610d85565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561089f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089690612b02565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108be61154c565b73ffffffffffffffffffffffffffffffffffffffff1614806108ed57506108ec816108e761154c565b6113e2565b5b61092c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092390612b94565b60405180910390fd5b6109368383611554565b505050565b610943610cc4565b610982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097990612c26565b60405180910390fd5b80600960008481526020019081526020016000208190555080827fb7930209271eb89b797c042649ff37eb43dc8deb0d0929dd849c35ee45debacf60405160405180910390a35050565b6109d4610cc4565b610a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0a90612c26565b60405180910390fd5b806008600084815260200190815260200160002081905550610a35838361160d565b80827fdeceb300b46c4bcd559f1a5206ed749c73f30312ec5a675a828ab0d7ec1bcb1860405160405180910390a3505050565b610a79610a7361154c565b826117e7565b610ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaf90612cb8565b60405180910390fd5b610ac38383836118c5565b505050565b600060096000838152602001908152602001600020549050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b498383836040518060200160405280600081525061120e565b505050565b610b56610cc4565b610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90612c26565b60405180910390fd5b610b9e81611b2c565b50565b610ba9611041565b610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf90612d4a565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610c1a826001610f64565b610c25816000610f64565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8934ce4adea8d9ce0d714d2c22b86790e41b7731c84b926fbbdc1d40ff6533c960405160405180910390a35050565b6000610cce611041565b80610d1f5750600b60076000610ce261154c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b905090565b610d2c611041565b610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6290612d4a565b60405180910390fd5b80600c9080519060200190610d819291906121ba565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590612ddc565b60405180910390fd5b80915050919050565b610e3f610cc4565b610e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7590612c26565b60405180910390fd5b6001600b60008381526020019081526020016000206000828254610ea29190612e2b565b9250508190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1490612ef3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f6c611041565b610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa290612d4a565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f65efeaf737ce094d287661b6a56bb530dce1fc30853708d1912a74f8ae65ffbb8260405161103591906122e3565b60405180910390a25050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661108461154c565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6060600180546110af906129cc565b80601f01602080910402602001604051908101604052809291908181526020018280546110db906129cc565b80156111285780601f106110fd57610100808354040283529160200191611128565b820191906000526020600020905b81548152906001019060200180831161110b57829003601f168201915b5050505050905090565b61114461113d61154c565b8383611c49565b5050565b611150610cc4565b61118f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118690612c26565b60405180910390fd5b6001600a600083815260200190815260200160002060008282546111b39190612e2b565b9250508190555050565b60006001600760006111cd61154c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414905090565b61121f61121961154c565b836117e7565b61125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590612cb8565b60405180910390fd5b61126a84848484611db6565b50505050565b6000600b6000838152602001908152602001600020549050919050565b6060611298826114e0565b6112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90612f85565b60405180910390fd5b60006112e1611e12565b90506000815111611301576040518060200160405280600081525061132c565b8061130b84611ea4565b60405160200161131c929190612fe1565b6040516020818303038152906040525b915050919050565b61133c610cc4565b61137b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137290612c26565b60405180910390fd5b80600860008481526020019081526020016000208190555080827fdeceb300b46c4bcd559f1a5206ed749c73f30312ec5a675a828ab0d7ec1bcb1860405160405180910390a35050565b6000600a6000838152602001908152602001600020549050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115c783610d85565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490613051565b60405180910390fd5b611686816114e0565b156116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd906130bd565b60405180910390fd5b6116d260008383612005565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117229190612e2b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117e36000838361200a565b5050565b60006117f2826114e0565b611831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118289061314f565b60405180910390fd5b600061183c83610d85565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061187e575061187d81856113e2565b5b806118bc57508373ffffffffffffffffffffffffffffffffffffffff166118a48461079e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118e582610d85565b73ffffffffffffffffffffffffffffffffffffffff161461193b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611932906131e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a290613273565b60405180910390fd5b6119b6838383612005565b6119c1600082611554565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a119190613293565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a689190612e2b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b2783838361200a565b505050565b6000611b3782610d85565b9050611b4581600084612005565b611b50600083611554565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ba09190613293565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c458160008461200a565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caf90613313565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611da9919061239e565b60405180910390a3505050565b611dc18484846118c5565b611dcd8484848461200f565b611e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e03906133a5565b60405180910390fd5b50505050565b6060600c8054611e21906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4d906129cc565b8015611e9a5780601f10611e6f57610100808354040283529160200191611e9a565b820191906000526020600020905b815481529060010190602001808311611e7d57829003601f168201915b5050505050905090565b60606000821415611eec576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612000565b600082905060005b60008214611f1e578080611f07906133c5565b915050600a82611f17919061343d565b9150611ef4565b60008167ffffffffffffffff811115611f3a57611f39612659565b5b6040519080825280601f01601f191660200182016040528015611f6c5781602001600182028036833780820191505090505b5090505b60008514611ff957600182611f859190613293565b9150600a85611f94919061346e565b6030611fa09190612e2b565b60f81b818381518110611fb657611fb561349f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ff2919061343d565b9450611f70565b8093505050505b919050565b505050565b505050565b60006120308473ffffffffffffffffffffffffffffffffffffffff16612197565b1561218a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261205961154c565b8786866040518563ffffffff1660e01b815260040161207b9493929190613523565b6020604051808303816000875af19250505080156120b757506040513d601f19601f820116820180604052508101906120b49190613584565b60015b61213a573d80600081146120e7576040519150601f19603f3d011682016040523d82523d6000602084013e6120ec565b606091505b50600081511415612132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612129906133a5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061218f565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546121c6906129cc565b90600052602060002090601f0160209004810192826121e8576000855561222f565b82601f1061220157805160ff191683800117855561222f565b8280016001018555821561222f579182015b8281111561222e578251825591602001919060010190612213565b5b50905061223c9190612240565b5090565b5b80821115612259576000816000905550600101612241565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61228481612271565b811461228f57600080fd5b50565b6000813590506122a18161227b565b92915050565b6000602082840312156122bd576122bc612267565b5b60006122cb84828501612292565b91505092915050565b6122dd81612271565b82525050565b60006020820190506122f860008301846122d4565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612333816122fe565b811461233e57600080fd5b50565b6000813590506123508161232a565b92915050565b60006020828403121561236c5761236b612267565b5b600061237a84828501612341565b91505092915050565b60008115159050919050565b61239881612383565b82525050565b60006020820190506123b3600083018461238f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156123f35780820151818401526020810190506123d8565b83811115612402576000848401525b50505050565b6000601f19601f8301169050919050565b6000612424826123b9565b61242e81856123c4565b935061243e8185602086016123d5565b61244781612408565b840191505092915050565b6000602082019050818103600083015261246c8184612419565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061249f82612474565b9050919050565b6124af81612494565b82525050565b60006020820190506124ca60008301846124a6565b92915050565b6124d981612494565b81146124e457600080fd5b50565b6000813590506124f6816124d0565b92915050565b6000806040838503121561251357612512612267565b5b6000612521858286016124e7565b925050602061253285828601612292565b9150509250929050565b6000806040838503121561255357612552612267565b5b600061256185828601612292565b925050602061257285828601612292565b9150509250929050565b60008060006060848603121561259557612594612267565b5b60006125a3868287016124e7565b93505060206125b486828701612292565b92505060406125c586828701612292565b9150509250925092565b6000806000606084860312156125e8576125e7612267565b5b60006125f6868287016124e7565b9350506020612607868287016124e7565b925050604061261886828701612292565b9150509250925092565b60006020828403121561263857612637612267565b5b6000612646848285016124e7565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61269182612408565b810181811067ffffffffffffffff821117156126b0576126af612659565b5b80604052505050565b60006126c361225d565b90506126cf8282612688565b919050565b600067ffffffffffffffff8211156126ef576126ee612659565b5b6126f882612408565b9050602081019050919050565b82818337600083830152505050565b6000612727612722846126d4565b6126b9565b90508281526020810184848401111561274357612742612654565b5b61274e848285612705565b509392505050565b600082601f83011261276b5761276a61264f565b5b813561277b848260208601612714565b91505092915050565b60006020828403121561279a57612799612267565b5b600082013567ffffffffffffffff8111156127b8576127b761226c565b5b6127c484828501612756565b91505092915050565b6127d681612383565b81146127e157600080fd5b50565b6000813590506127f3816127cd565b92915050565b600080604083850312156128105761280f612267565b5b600061281e858286016124e7565b925050602061282f858286016127e4565b9150509250929050565b600067ffffffffffffffff82111561285457612853612659565b5b61285d82612408565b9050602081019050919050565b600061287d61287884612839565b6126b9565b90508281526020810184848401111561289957612898612654565b5b6128a4848285612705565b509392505050565b600082601f8301126128c1576128c061264f565b5b81356128d184826020860161286a565b91505092915050565b600080600080608085870312156128f4576128f3612267565b5b6000612902878288016124e7565b9450506020612913878288016124e7565b935050604061292487828801612292565b925050606085013567ffffffffffffffff8111156129455761294461226c565b5b612951878288016128ac565b91505092959194509250565b6000806040838503121561297457612973612267565b5b6000612982858286016124e7565b9250506020612993858286016124e7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129e457607f821691505b602082108114156129f8576129f761299d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612a5a602c836123c4565b9150612a65826129fe565b604082019050919050565b60006020820190508181036000830152612a8981612a4d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612aec6021836123c4565b9150612af782612a90565b604082019050919050565b60006020820190508181036000830152612b1b81612adf565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612b7e6038836123c4565b9150612b8982612b22565b604082019050919050565b60006020820190508181036000830152612bad81612b71565b9050919050565b7f4d656d62657268736970203a2063616c6c6572206973206e6f742061204d696e60008201527f7465720000000000000000000000000000000000000000000000000000000000602082015250565b6000612c106023836123c4565b9150612c1b82612bb4565b604082019050919050565b60006020820190508181036000830152612c3f81612c03565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612ca26031836123c4565b9150612cad82612c46565b604082019050919050565b60006020820190508181036000830152612cd181612c95565b9050919050565b7f4d656d62657273686970203a2063616c6c6572206973206e6f7420746865206f60008201527f776e657200000000000000000000000000000000000000000000000000000000602082015250565b6000612d346024836123c4565b9150612d3f82612cd8565b604082019050919050565b60006020820190508181036000830152612d6381612d27565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612dc66029836123c4565b9150612dd182612d6a565b604082019050919050565b60006020820190508181036000830152612df581612db9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e3682612271565b9150612e4183612271565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e7657612e75612dfc565b5b828201905092915050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612edd602a836123c4565b9150612ee882612e81565b604082019050919050565b60006020820190508181036000830152612f0c81612ed0565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612f6f602f836123c4565b9150612f7a82612f13565b604082019050919050565b60006020820190508181036000830152612f9e81612f62565b9050919050565b600081905092915050565b6000612fbb826123b9565b612fc58185612fa5565b9350612fd58185602086016123d5565b80840191505092915050565b6000612fed8285612fb0565b9150612ff98284612fb0565b91508190509392505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061303b6020836123c4565b915061304682613005565b602082019050919050565b6000602082019050818103600083015261306a8161302e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006130a7601c836123c4565b91506130b282613071565b602082019050919050565b600060208201905081810360008301526130d68161309a565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613139602c836123c4565b9150613144826130dd565b604082019050919050565b600060208201905081810360008301526131688161312c565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006131cb6025836123c4565b91506131d68261316f565b604082019050919050565b600060208201905081810360008301526131fa816131be565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061325d6024836123c4565b915061326882613201565b604082019050919050565b6000602082019050818103600083015261328c81613250565b9050919050565b600061329e82612271565b91506132a983612271565b9250828210156132bc576132bb612dfc565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006132fd6019836123c4565b9150613308826132c7565b602082019050919050565b6000602082019050818103600083015261332c816132f0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061338f6032836123c4565b915061339a82613333565b604082019050919050565b600060208201905081810360008301526133be81613382565b9050919050565b60006133d082612271565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561340357613402612dfc565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061344882612271565b915061345383612271565b9250826134635761346261340e565b5b828204905092915050565b600061347982612271565b915061348483612271565b9250826134945761349361340e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006134f5826134ce565b6134ff81856134d9565b935061350f8185602086016123d5565b61351881612408565b840191505092915050565b600060808201905061353860008301876124a6565b61354560208301866124a6565b61355260408301856122d4565b818103606083015261356481846134ea565b905095945050505050565b60008151905061357e8161232a565b92915050565b60006020828403121561359a57613599612267565b5b60006135a88482850161356f565b9150509291505056fea26469706673582212203a7f35bf55ba14986d7e6bbd19aafc9255f2be17ab87db8c7f5da83fad65c19664736f6c634300080a003368747470733a2f2f6c6f6b2d6e66742e6c65616775656f666b696e67646f6d732e636f6d2f6170692f647261676f2f

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101da5760003560e01c80636352211e11610104578063af9a1cd2116100a2578063c87b56dd11610071578063c87b56dd14610561578063cc876ded14610591578063e37bbc5e146105ad578063e985e9c5146105dd576101da565b8063af9a1cd2146104db578063b6db75a0146104f7578063b88d4fde14610515578063c6575fd414610531576101da565b8063874dae88116100de578063874dae88146104675780638f32d59b1461048357806395d89b41146104a1578063a22cb465146104bf576101da565b80636352211e146103eb5780636ea535311461041b57806370a0823114610437576101da565b806323b872dd1161017c57806342966c681161014b57806342966c68146103795780634fb2e45d1461039557806350e59eb3146103b157806355f804b3146103cf576101da565b806323b872dd146102e1578063242a0087146102fd57806334c5a0441461032d57806342842e0e1461035d576101da565b8063081812fc116101b8578063081812fc1461025d578063095ea7b31461028d5780630e5ff21a146102a9578063156e29f6146102c5576101da565b80630178fe3f146101df57806301ffc9a71461020f57806306fdde031461023f575b600080fd5b6101f960048036038101906101f491906122a7565b61060d565b60405161020691906122e3565b60405180910390f35b61022960048036038101906102249190612356565b61062a565b604051610236919061239e565b60405180910390f35b61024761070c565b6040516102549190612452565b60405180910390f35b610277600480360381019061027291906122a7565b61079e565b60405161028491906124b5565b60405180910390f35b6102a760048036038101906102a291906124fc565b610823565b005b6102c360048036038101906102be919061253c565b61093b565b005b6102df60048036038101906102da919061257c565b6109cc565b005b6102fb60048036038101906102f691906125cf565b610a68565b005b610317600480360381019061031291906122a7565b610ac8565b60405161032491906122e3565b60405180910390f35b61034760048036038101906103429190612622565b610ae5565b60405161035491906122e3565b60405180910390f35b610377600480360381019061037291906125cf565b610b2e565b005b610393600480360381019061038e91906122a7565b610b4e565b005b6103af60048036038101906103aa9190612622565b610ba1565b005b6103b9610cc4565b6040516103c6919061239e565b60405180910390f35b6103e960048036038101906103e49190612784565b610d24565b005b610405600480360381019061040091906122a7565b610d85565b60405161041291906124b5565b60405180910390f35b610435600480360381019061043091906122a7565b610e37565b005b610451600480360381019061044c9190612622565b610eac565b60405161045e91906122e3565b60405180910390f35b610481600480360381019061047c91906124fc565b610f64565b005b61048b611041565b604051610498919061239e565b60405180910390f35b6104a96110a0565b6040516104b69190612452565b60405180910390f35b6104d960048036038101906104d491906127f9565b611132565b005b6104f560048036038101906104f091906122a7565b611148565b005b6104ff6111bd565b60405161050c919061239e565b60405180910390f35b61052f600480360381019061052a91906128da565b61120e565b005b61054b600480360381019061054691906122a7565b611270565b60405161055891906122e3565b60405180910390f35b61057b600480360381019061057691906122a7565b61128d565b6040516105889190612452565b60405180910390f35b6105ab60048036038101906105a6919061253c565b611334565b005b6105c760048036038101906105c291906122a7565b6113c5565b6040516105d491906122e3565b60405180910390f35b6105f760048036038101906105f2919061295d565b6113e2565b604051610604919061239e565b60405180910390f35b600060086000838152602001908152602001600020549050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806106f557507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610705575061070482611476565b5b9050919050565b60606000805461071b906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054610747906129cc565b80156107945780601f1061076957610100808354040283529160200191610794565b820191906000526020600020905b81548152906001019060200180831161077757829003601f168201915b5050505050905090565b60006107a9826114e0565b6107e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016107df90612a70565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600061082e82610d85565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561089f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161089690612b02565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff166108be61154c565b73ffffffffffffffffffffffffffffffffffffffff1614806108ed57506108ec816108e761154c565b6113e2565b5b61092c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092390612b94565b60405180910390fd5b6109368383611554565b505050565b610943610cc4565b610982576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161097990612c26565b60405180910390fd5b80600960008481526020019081526020016000208190555080827fb7930209271eb89b797c042649ff37eb43dc8deb0d0929dd849c35ee45debacf60405160405180910390a35050565b6109d4610cc4565b610a13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0a90612c26565b60405180910390fd5b806008600084815260200190815260200160002081905550610a35838361160d565b80827fdeceb300b46c4bcd559f1a5206ed749c73f30312ec5a675a828ab0d7ec1bcb1860405160405180910390a3505050565b610a79610a7361154c565b826117e7565b610ab8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610aaf90612cb8565b60405180910390fd5b610ac38383836118c5565b505050565b600060096000838152602001908152602001600020549050919050565b6000600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610b498383836040518060200160405280600081525061120e565b505050565b610b56610cc4565b610b95576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8c90612c26565b60405180910390fd5b610b9e81611b2c565b50565b610ba9611041565b610be8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bdf90612d4a565b60405180910390fd5b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050610c1a826001610f64565b610c25816000610f64565b81600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8934ce4adea8d9ce0d714d2c22b86790e41b7731c84b926fbbdc1d40ff6533c960405160405180910390a35050565b6000610cce611041565b80610d1f5750600b60076000610ce261154c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054145b905090565b610d2c611041565b610d6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6290612d4a565b60405180910390fd5b80600c9080519060200190610d819291906121ba565b5050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610e2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e2590612ddc565b60405180910390fd5b80915050919050565b610e3f610cc4565b610e7e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e7590612c26565b60405180910390fd5b6001600b60008381526020019081526020016000206000828254610ea29190612e2b565b9250508190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610f1d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f1490612ef3565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610f6c611041565b610fab576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fa290612d4a565b60405180910390fd5b80600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508173ffffffffffffffffffffffffffffffffffffffff167f65efeaf737ce094d287661b6a56bb530dce1fc30853708d1912a74f8ae65ffbb8260405161103591906122e3565b60405180910390a25050565b6000600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1661108461154c565b73ffffffffffffffffffffffffffffffffffffffff1614905090565b6060600180546110af906129cc565b80601f01602080910402602001604051908101604052809291908181526020018280546110db906129cc565b80156111285780601f106110fd57610100808354040283529160200191611128565b820191906000526020600020905b81548152906001019060200180831161110b57829003601f168201915b5050505050905090565b61114461113d61154c565b8383611c49565b5050565b611150610cc4565b61118f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161118690612c26565b60405180910390fd5b6001600a600083815260200190815260200160002060008282546111b39190612e2b565b9250508190555050565b60006001600760006111cd61154c565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205414905090565b61121f61121961154c565b836117e7565b61125e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125590612cb8565b60405180910390fd5b61126a84848484611db6565b50505050565b6000600b6000838152602001908152602001600020549050919050565b6060611298826114e0565b6112d7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ce90612f85565b60405180910390fd5b60006112e1611e12565b90506000815111611301576040518060200160405280600081525061132c565b8061130b84611ea4565b60405160200161131c929190612fe1565b6040516020818303038152906040525b915050919050565b61133c610cc4565b61137b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161137290612c26565b60405180910390fd5b80600860008481526020019081526020016000208190555080827fdeceb300b46c4bcd559f1a5206ed749c73f30312ec5a675a828ab0d7ec1bcb1860405160405180910390a35050565b6000600a6000838152602001908152602001600020549050919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115c783610d85565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561167d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161167490613051565b60405180910390fd5b611686816114e0565b156116c6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116bd906130bd565b60405180910390fd5b6116d260008383612005565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117229190612e2b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46117e36000838361200a565b5050565b60006117f2826114e0565b611831576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118289061314f565b60405180910390fd5b600061183c83610d85565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061187e575061187d81856113e2565b5b806118bc57508373ffffffffffffffffffffffffffffffffffffffff166118a48461079e565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166118e582610d85565b73ffffffffffffffffffffffffffffffffffffffff161461193b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611932906131e1565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156119ab576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016119a290613273565b60405180910390fd5b6119b6838383612005565b6119c1600082611554565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a119190613293565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611a689190612e2b565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611b2783838361200a565b505050565b6000611b3782610d85565b9050611b4581600084612005565b611b50600083611554565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ba09190613293565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611c458160008461200a565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611cb8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611caf90613313565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611da9919061239e565b60405180910390a3505050565b611dc18484846118c5565b611dcd8484848461200f565b611e0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e03906133a5565b60405180910390fd5b50505050565b6060600c8054611e21906129cc565b80601f0160208091040260200160405190810160405280929190818152602001828054611e4d906129cc565b8015611e9a5780601f10611e6f57610100808354040283529160200191611e9a565b820191906000526020600020905b815481529060010190602001808311611e7d57829003601f168201915b5050505050905090565b60606000821415611eec576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612000565b600082905060005b60008214611f1e578080611f07906133c5565b915050600a82611f17919061343d565b9150611ef4565b60008167ffffffffffffffff811115611f3a57611f39612659565b5b6040519080825280601f01601f191660200182016040528015611f6c5781602001600182028036833780820191505090505b5090505b60008514611ff957600182611f859190613293565b9150600a85611f94919061346e565b6030611fa09190612e2b565b60f81b818381518110611fb657611fb561349f565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85611ff2919061343d565b9450611f70565b8093505050505b919050565b505050565b505050565b60006120308473ffffffffffffffffffffffffffffffffffffffff16612197565b1561218a578373ffffffffffffffffffffffffffffffffffffffff1663150b7a0261205961154c565b8786866040518563ffffffff1660e01b815260040161207b9493929190613523565b6020604051808303816000875af19250505080156120b757506040513d601f19601f820116820180604052508101906120b49190613584565b60015b61213a573d80600081146120e7576040519150601f19603f3d011682016040523d82523d6000602084013e6120ec565b606091505b50600081511415612132576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612129906133a5565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061218f565b600190505b949350505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b8280546121c6906129cc565b90600052602060002090601f0160209004810192826121e8576000855561222f565b82601f1061220157805160ff191683800117855561222f565b8280016001018555821561222f579182015b8281111561222e578251825591602001919060010190612213565b5b50905061223c9190612240565b5090565b5b80821115612259576000816000905550600101612241565b5090565b6000604051905090565b600080fd5b600080fd5b6000819050919050565b61228481612271565b811461228f57600080fd5b50565b6000813590506122a18161227b565b92915050565b6000602082840312156122bd576122bc612267565b5b60006122cb84828501612292565b91505092915050565b6122dd81612271565b82525050565b60006020820190506122f860008301846122d4565b92915050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612333816122fe565b811461233e57600080fd5b50565b6000813590506123508161232a565b92915050565b60006020828403121561236c5761236b612267565b5b600061237a84828501612341565b91505092915050565b60008115159050919050565b61239881612383565b82525050565b60006020820190506123b3600083018461238f565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156123f35780820151818401526020810190506123d8565b83811115612402576000848401525b50505050565b6000601f19601f8301169050919050565b6000612424826123b9565b61242e81856123c4565b935061243e8185602086016123d5565b61244781612408565b840191505092915050565b6000602082019050818103600083015261246c8184612419565b905092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600061249f82612474565b9050919050565b6124af81612494565b82525050565b60006020820190506124ca60008301846124a6565b92915050565b6124d981612494565b81146124e457600080fd5b50565b6000813590506124f6816124d0565b92915050565b6000806040838503121561251357612512612267565b5b6000612521858286016124e7565b925050602061253285828601612292565b9150509250929050565b6000806040838503121561255357612552612267565b5b600061256185828601612292565b925050602061257285828601612292565b9150509250929050565b60008060006060848603121561259557612594612267565b5b60006125a3868287016124e7565b93505060206125b486828701612292565b92505060406125c586828701612292565b9150509250925092565b6000806000606084860312156125e8576125e7612267565b5b60006125f6868287016124e7565b9350506020612607868287016124e7565b925050604061261886828701612292565b9150509250925092565b60006020828403121561263857612637612267565b5b6000612646848285016124e7565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61269182612408565b810181811067ffffffffffffffff821117156126b0576126af612659565b5b80604052505050565b60006126c361225d565b90506126cf8282612688565b919050565b600067ffffffffffffffff8211156126ef576126ee612659565b5b6126f882612408565b9050602081019050919050565b82818337600083830152505050565b6000612727612722846126d4565b6126b9565b90508281526020810184848401111561274357612742612654565b5b61274e848285612705565b509392505050565b600082601f83011261276b5761276a61264f565b5b813561277b848260208601612714565b91505092915050565b60006020828403121561279a57612799612267565b5b600082013567ffffffffffffffff8111156127b8576127b761226c565b5b6127c484828501612756565b91505092915050565b6127d681612383565b81146127e157600080fd5b50565b6000813590506127f3816127cd565b92915050565b600080604083850312156128105761280f612267565b5b600061281e858286016124e7565b925050602061282f858286016127e4565b9150509250929050565b600067ffffffffffffffff82111561285457612853612659565b5b61285d82612408565b9050602081019050919050565b600061287d61287884612839565b6126b9565b90508281526020810184848401111561289957612898612654565b5b6128a4848285612705565b509392505050565b600082601f8301126128c1576128c061264f565b5b81356128d184826020860161286a565b91505092915050565b600080600080608085870312156128f4576128f3612267565b5b6000612902878288016124e7565b9450506020612913878288016124e7565b935050604061292487828801612292565b925050606085013567ffffffffffffffff8111156129455761294461226c565b5b612951878288016128ac565b91505092959194509250565b6000806040838503121561297457612973612267565b5b6000612982858286016124e7565b9250506020612993858286016124e7565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806129e457607f821691505b602082108114156129f8576129f761299d565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000612a5a602c836123c4565b9150612a65826129fe565b604082019050919050565b60006020820190508181036000830152612a8981612a4d565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000612aec6021836123c4565b9150612af782612a90565b604082019050919050565b60006020820190508181036000830152612b1b81612adf565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000612b7e6038836123c4565b9150612b8982612b22565b604082019050919050565b60006020820190508181036000830152612bad81612b71565b9050919050565b7f4d656d62657268736970203a2063616c6c6572206973206e6f742061204d696e60008201527f7465720000000000000000000000000000000000000000000000000000000000602082015250565b6000612c106023836123c4565b9150612c1b82612bb4565b604082019050919050565b60006020820190508181036000830152612c3f81612c03565b9050919050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b6000612ca26031836123c4565b9150612cad82612c46565b604082019050919050565b60006020820190508181036000830152612cd181612c95565b9050919050565b7f4d656d62657273686970203a2063616c6c6572206973206e6f7420746865206f60008201527f776e657200000000000000000000000000000000000000000000000000000000602082015250565b6000612d346024836123c4565b9150612d3f82612cd8565b604082019050919050565b60006020820190508181036000830152612d6381612d27565b9050919050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000612dc66029836123c4565b9150612dd182612d6a565b604082019050919050565b60006020820190508181036000830152612df581612db9565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000612e3682612271565b9150612e4183612271565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115612e7657612e75612dfc565b5b828201905092915050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000612edd602a836123c4565b9150612ee882612e81565b604082019050919050565b60006020820190508181036000830152612f0c81612ed0565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000612f6f602f836123c4565b9150612f7a82612f13565b604082019050919050565b60006020820190508181036000830152612f9e81612f62565b9050919050565b600081905092915050565b6000612fbb826123b9565b612fc58185612fa5565b9350612fd58185602086016123d5565b80840191505092915050565b6000612fed8285612fb0565b9150612ff98284612fb0565b91508190509392505050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061303b6020836123c4565b915061304682613005565b602082019050919050565b6000602082019050818103600083015261306a8161302e565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006130a7601c836123c4565b91506130b282613071565b602082019050919050565b600060208201905081810360008301526130d68161309a565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613139602c836123c4565b9150613144826130dd565b604082019050919050565b600060208201905081810360008301526131688161312c565b9050919050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006131cb6025836123c4565b91506131d68261316f565b604082019050919050565b600060208201905081810360008301526131fa816131be565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b600061325d6024836123c4565b915061326882613201565b604082019050919050565b6000602082019050818103600083015261328c81613250565b9050919050565b600061329e82612271565b91506132a983612271565b9250828210156132bc576132bb612dfc565b5b828203905092915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b60006132fd6019836123c4565b9150613308826132c7565b602082019050919050565b6000602082019050818103600083015261332c816132f0565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600061338f6032836123c4565b915061339a82613333565b604082019050919050565b600060208201905081810360008301526133be81613382565b9050919050565b60006133d082612271565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82141561340357613402612dfc565b5b600182019050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b600061344882612271565b915061345383612271565b9250826134635761346261340e565b5b828204905092915050565b600061347982612271565b915061348483612271565b9250826134945761349361340e565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600081519050919050565b600082825260208201905092915050565b60006134f5826134ce565b6134ff81856134d9565b935061350f8185602086016123d5565b61351881612408565b840191505092915050565b600060808201905061353860008301876124a6565b61354560208301866124a6565b61355260408301856122d4565b818103606083015261356481846134ea565b905095945050505050565b60008151905061357e8161232a565b92915050565b60006020828403121561359a57613599612267565b5b60006135a88482850161356f565b9150509291505056fea26469706673582212203a7f35bf55ba14986d7e6bbd19aafc9255f2be17ab87db8c7f5da83fad65c19664736f6c634300080a0033

Deployed Bytecode Sourcemap

35562:1975:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;37207:103;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;20829:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21774:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23334:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22857:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36931:156;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36552:179;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;24084:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37093:108;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35439:114;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24494:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36465:81;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34321:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35311:116;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36227:88;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21468:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36833:92;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;21198:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34583:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34864:93;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;21943:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23627:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36737:90;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35083:101;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;24750:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37427:107;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;22118:334;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36321:138;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37316:105;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23853:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37207:103;37261:7;37287:6;:15;37294:7;37287:15;;;;;;;;;;;;37280:22;;37207:103;;;:::o;20829:305::-;20931:4;20983:25;20968:40;;;:11;:40;;;;:105;;;;21040:33;21025:48;;;:11;:48;;;;20968:105;:158;;;;21090:36;21114:11;21090:23;:36::i;:::-;20968:158;20948:178;;20829:305;;;:::o;21774:100::-;21828:13;21861:5;21854:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21774:100;:::o;23334:221::-;23410:7;23438:16;23446:7;23438;:16::i;:::-;23430:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;23523:15;:24;23539:7;23523:24;;;;;;;;;;;;;;;;;;;;;23516:31;;23334:221;;;:::o;22857:411::-;22938:13;22954:23;22969:7;22954:14;:23::i;:::-;22938:39;;23002:5;22996:11;;:2;:11;;;;22988:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;23096:5;23080:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;23105:37;23122:5;23129:12;:10;:12::i;:::-;23105:16;:37::i;:::-;23080:62;23058:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;23239:21;23248:2;23252:7;23239:8;:21::i;:::-;22927:341;22857:411;;:::o;36931:156::-;35233:10;:8;:10::i;:::-;35225:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37034:7:::1;37014:8;:17;37023:7;37014:17;;;;;;;;;;;:27;;;;37071:7;37062;37057:22;;;;;;;;;;36931:156:::0;;:::o;36552:179::-;35233:10;:8;:10::i;:::-;35225:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36655:4:::1;36637:6;:15;36644:7;36637:15;;;;;;;;;;;:22;;;;36670:18;36676:2;36680:7;36670:5;:18::i;:::-;36718:4;36709:7;36704:19;;;;;;;;;;36552:179:::0;;;:::o;24084:339::-;24279:41;24298:12;:10;:12::i;:::-;24312:7;24279:18;:41::i;:::-;24271:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;24387:28;24397:4;24403:2;24407:7;24387:9;:28::i;:::-;24084:339;;;:::o;37093:108::-;37150:7;37176:8;:17;37185:7;37176:17;;;;;;;;;;;;37169:24;;37093:108;;;:::o;35439:114::-;35500:7;35526:10;:19;35537:7;35526:19;;;;;;;;;;;;;;;;35519:26;;35439:114;;;:::o;24494:185::-;24632:39;24649:4;24655:2;24659:7;24632:39;;;;;;;;;;;;:16;:39::i;:::-;24494:185;;;:::o;36465:81::-;35233:10;:8;:10::i;:::-;35225:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36524:14:::1;36530:7;36524:5;:14::i;:::-;36465:81:::0;:::o;34321:254::-;34786:9;:7;:9::i;:::-;34778:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34390:16:::1;34409:5;;;;;;;;;;;34390:24;;34425:26;34439:8;34449:1;34425:13;:26::i;:::-;34462;34476:8;34486:1;34462:13;:26::i;:::-;34507:8;34499:5;;:16;;;;;;;;;;;;;;;;;;34558:8;34531:36;;34548:8;34531:36;;;;;;;;;;;;34379:196;34321:254:::0;:::o;35311:116::-;35352:4;35376:9;:7;:9::i;:::-;:43;;;;35417:2;35389:10;:24;35400:12;:10;:12::i;:::-;35389:24;;;;;;;;;;;;;;;;:30;35376:43;35369:50;;35311:116;:::o;36227:88::-;34786:9;:7;:9::i;:::-;34778:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36304:3:::1;36294:7;:13;;;;;;;;;;;;:::i;:::-;;36227:88:::0;:::o;21468:239::-;21540:7;21560:13;21576:7;:16;21584:7;21576:16;;;;;;;;;;;;;;;;;;;;;21560:32;;21628:1;21611:19;;:5;:19;;;;21603:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;21694:5;21687:12;;;21468:239;;;:::o;36833:92::-;35233:10;:8;:10::i;:::-;35225:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36916:1:::1;36895:8;:17;36904:7;36895:17;;;;;;;;;;;;:22;;;;;;;:::i;:::-;;;;;;;;36833:92:::0;:::o;21198:208::-;21270:7;21315:1;21298:19;;:5;:19;;;;21290:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;21382:9;:16;21392:5;21382:16;;;;;;;;;;;;;;;;21375:23;;21198:208;;;:::o;34583:155::-;34786:9;:7;:9::i;:::-;34778:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;34680:5:::1;34662:10;:15;34673:3;34662:15;;;;;;;;;;;;;;;:23;;;;34719:3;34701:29;;;34724:5;34701:29;;;;;;:::i;:::-;;;;;;;;34583:155:::0;;:::o;34864:93::-;34904:4;34944:5;;;;;;;;;;;34928:21;;:12;:10;:12::i;:::-;:21;;;34921:28;;34864:93;:::o;21943:104::-;21999:13;22032:7;22025:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21943:104;:::o;23627:155::-;23722:52;23741:12;:10;:12::i;:::-;23755:8;23765;23722:18;:52::i;:::-;23627:155;;:::o;36737:90::-;35233:10;:8;:10::i;:::-;35225:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36818:1:::1;36798:7;:16;36806:7;36798:16;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;36737:90:::0;:::o;35083:101::-;35123:4;35175:1;35147:10;:24;35158:12;:10;:12::i;:::-;35147:24;;;;;;;;;;;;;;;;:29;35140:36;;35083:101;:::o;24750:328::-;24925:41;24944:12;:10;:12::i;:::-;24958:7;24925:18;:41::i;:::-;24917:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;25031:39;25045:4;25051:2;25055:7;25064:5;25031:13;:39::i;:::-;24750:328;;;;:::o;37427:107::-;37483:7;37509:8;:17;37518:7;37509:17;;;;;;;;;;;;37502:24;;37427:107;;;:::o;22118:334::-;22191:13;22225:16;22233:7;22225;:16::i;:::-;22217:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;22306:21;22330:10;:8;:10::i;:::-;22306:34;;22382:1;22364:7;22358:21;:25;:86;;;;;;;;;;;;;;;;;22410:7;22419:18;:7;:16;:18::i;:::-;22393:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;22358:86;22351:93;;;22118:334;;;:::o;36321:138::-;35233:10;:8;:10::i;:::-;35225:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;36412:4:::1;36394:6;:15;36401:7;36394:15;;;;;;;;;;;:22;;;;36446:4;36437:7;36432:19;;;;;;;;;;36321:138:::0;;:::o;37316:105::-;37371:7;37397;:16;37405:7;37397:16;;;;;;;;;;;;37390:23;;37316:105;;;:::o;23853:164::-;23950:4;23974:18;:25;23993:5;23974:25;;;;;;;;;;;;;;;:35;24000:8;23974:35;;;;;;;;;;;;;;;;;;;;;;;;;23967:42;;23853:164;;;;:::o;19361:157::-;19446:4;19485:25;19470:40;;;:11;:40;;;;19463:47;;19361:157;;;:::o;26588:127::-;26653:4;26705:1;26677:30;;:7;:16;26685:7;26677:16;;;;;;;;;;;;;;;;;;;;;:30;;;;26670:37;;26588:127;;;:::o;16339:98::-;16392:7;16419:10;16412:17;;16339:98;:::o;30734:174::-;30836:2;30809:15;:24;30825:7;30809:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;30892:7;30888:2;30854:46;;30863:23;30878:7;30863:14;:23::i;:::-;30854:46;;;;;;;;;;;;30734:174;;:::o;28566:439::-;28660:1;28646:16;;:2;:16;;;;28638:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;28719:16;28727:7;28719;:16::i;:::-;28718:17;28710:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;28781:45;28810:1;28814:2;28818:7;28781:20;:45::i;:::-;28856:1;28839:9;:13;28849:2;28839:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;28887:2;28868:7;:16;28876:7;28868:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;28932:7;28928:2;28907:33;;28924:1;28907:33;;;;;;;;;;;;28953:44;28981:1;28985:2;28989:7;28953:19;:44::i;:::-;28566:439;;:::o;26882:348::-;26975:4;27000:16;27008:7;27000;:16::i;:::-;26992:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;27076:13;27092:23;27107:7;27092:14;:23::i;:::-;27076:39;;27145:5;27134:16;;:7;:16;;;:52;;;;27154:32;27171:5;27178:7;27154:16;:32::i;:::-;27134:52;:87;;;;27214:7;27190:31;;:20;27202:7;27190:11;:20::i;:::-;:31;;;27134:87;27126:96;;;26882:348;;;;:::o;29991:625::-;30150:4;30123:31;;:23;30138:7;30123:14;:23::i;:::-;:31;;;30115:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;30229:1;30215:16;;:2;:16;;;;30207:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;30285:39;30306:4;30312:2;30316:7;30285:20;:39::i;:::-;30389:29;30406:1;30410:7;30389:8;:29::i;:::-;30450:1;30431:9;:15;30441:4;30431:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;30479:1;30462:9;:13;30472:2;30462:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;30510:2;30491:7;:16;30499:7;30491:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;30549:7;30545:2;30530:27;;30539:4;30530:27;;;;;;;;;;;;30570:38;30590:4;30596:2;30600:7;30570:19;:38::i;:::-;29991:625;;;:::o;29234:420::-;29294:13;29310:23;29325:7;29310:14;:23::i;:::-;29294:39;;29346:48;29367:5;29382:1;29386:7;29346:20;:48::i;:::-;29435:29;29452:1;29456:7;29435:8;:29::i;:::-;29497:1;29477:9;:16;29487:5;29477:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;29516:7;:16;29524:7;29516:16;;;;;;;;;;;;29509:23;;;;;;;;;;;29578:7;29574:1;29550:36;;29559:5;29550:36;;;;;;;;;;;;29599:47;29619:5;29634:1;29638:7;29599:19;:47::i;:::-;29283:371;29234:420;:::o;31050:315::-;31205:8;31196:17;;:5;:17;;;;31188:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;31292:8;31254:18;:25;31273:5;31254:25;;;;;;;;;;;;;;;:35;31280:8;31254:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;31338:8;31316:41;;31331:5;31316:41;;;31348:8;31316:41;;;;;;:::i;:::-;;;;;;;;31050:315;;;:::o;25960:::-;26117:28;26127:4;26133:2;26137:7;26117:9;:28::i;:::-;26164:48;26187:4;26193:2;26197:7;26206:5;26164:22;:48::i;:::-;26156:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;25960:315;;;;:::o;36121:100::-;36173:13;36206:7;36199:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36121:100;:::o;16835:723::-;16891:13;17121:1;17112:5;:10;17108:53;;;17139:10;;;;;;;;;;;;;;;;;;;;;17108:53;17171:12;17186:5;17171:20;;17202:14;17227:78;17242:1;17234:4;:9;17227:78;;17260:8;;;;;:::i;:::-;;;;17291:2;17283:10;;;;;:::i;:::-;;;17227:78;;;17315:19;17347:6;17337:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;17315:39;;17365:154;17381:1;17372:5;:10;17365:154;;17409:1;17399:11;;;;;:::i;:::-;;;17476:2;17468:5;:10;;;;:::i;:::-;17455:2;:24;;;;:::i;:::-;17442:39;;17425:6;17432;17425:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;17505:2;17496:11;;;;;:::i;:::-;;;17365:154;;;17543:6;17529:21;;;;;16835:723;;;;:::o;33301:126::-;;;;:::o;33812:125::-;;;;:::o;31930:799::-;32085:4;32106:15;:2;:13;;;:15::i;:::-;32102:620;;;32158:2;32142:36;;;32179:12;:10;:12::i;:::-;32193:4;32199:7;32208:5;32142:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;32138:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32401:1;32384:6;:13;:18;32380:272;;;32427:60;;;;;;;;;;:::i;:::-;;;;;;;;32380:272;32602:6;32596:13;32587:6;32583:2;32579:15;32572:38;32138:529;32275:41;;;32265:51;;;:6;:51;;;;32258:58;;;;;32102:620;32706:4;32699:11;;31930:799;;;;;;;:::o;8473:326::-;8533:4;8790:1;8768:7;:19;;;:23;8761:30;;8473:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:77;371:7;400:5;389:16;;334:77;;;:::o;417:122::-;490:24;508:5;490:24;:::i;:::-;483:5;480:35;470:63;;529:1;526;519:12;470:63;417:122;:::o;545:139::-;591:5;629:6;616:20;607:29;;645:33;672:5;645:33;:::i;:::-;545:139;;;;:::o;690:329::-;749:6;798:2;786:9;777:7;773:23;769:32;766:119;;;804:79;;:::i;:::-;766:119;924:1;949:53;994:7;985:6;974:9;970:22;949:53;:::i;:::-;939:63;;895:117;690:329;;;;:::o;1025:118::-;1112:24;1130:5;1112:24;:::i;:::-;1107:3;1100:37;1025:118;;:::o;1149:222::-;1242:4;1280:2;1269:9;1265:18;1257:26;;1293:71;1361:1;1350:9;1346:17;1337:6;1293:71;:::i;:::-;1149:222;;;;:::o;1377:149::-;1413:7;1453:66;1446:5;1442:78;1431:89;;1377:149;;;:::o;1532:120::-;1604:23;1621:5;1604:23;:::i;:::-;1597:5;1594:34;1584:62;;1642:1;1639;1632:12;1584:62;1532:120;:::o;1658:137::-;1703:5;1741:6;1728:20;1719:29;;1757:32;1783:5;1757:32;:::i;:::-;1658:137;;;;:::o;1801:327::-;1859:6;1908:2;1896:9;1887:7;1883:23;1879:32;1876:119;;;1914:79;;:::i;:::-;1876:119;2034:1;2059:52;2103:7;2094:6;2083:9;2079:22;2059:52;:::i;:::-;2049:62;;2005:116;1801:327;;;;:::o;2134:90::-;2168:7;2211:5;2204:13;2197:21;2186:32;;2134:90;;;:::o;2230:109::-;2311:21;2326:5;2311:21;:::i;:::-;2306:3;2299:34;2230:109;;:::o;2345:210::-;2432:4;2470:2;2459:9;2455:18;2447:26;;2483:65;2545:1;2534:9;2530:17;2521:6;2483:65;:::i;:::-;2345:210;;;;:::o;2561:99::-;2613:6;2647:5;2641:12;2631:22;;2561:99;;;:::o;2666:169::-;2750:11;2784:6;2779:3;2772:19;2824:4;2819:3;2815:14;2800:29;;2666:169;;;;:::o;2841:307::-;2909:1;2919:113;2933:6;2930:1;2927:13;2919:113;;;3018:1;3013:3;3009:11;3003:18;2999:1;2994:3;2990:11;2983:39;2955:2;2952:1;2948:10;2943:15;;2919:113;;;3050:6;3047:1;3044:13;3041:101;;;3130:1;3121:6;3116:3;3112:16;3105:27;3041:101;2890:258;2841:307;;;:::o;3154:102::-;3195:6;3246:2;3242:7;3237:2;3230:5;3226:14;3222:28;3212:38;;3154:102;;;:::o;3262:364::-;3350:3;3378:39;3411:5;3378:39;:::i;:::-;3433:71;3497:6;3492:3;3433:71;:::i;:::-;3426:78;;3513:52;3558:6;3553:3;3546:4;3539:5;3535:16;3513:52;:::i;:::-;3590:29;3612:6;3590:29;:::i;:::-;3585:3;3581:39;3574:46;;3354:272;3262:364;;;;:::o;3632:313::-;3745:4;3783:2;3772:9;3768:18;3760:26;;3832:9;3826:4;3822:20;3818:1;3807:9;3803:17;3796:47;3860:78;3933:4;3924:6;3860:78;:::i;:::-;3852:86;;3632:313;;;;:::o;3951:126::-;3988:7;4028:42;4021:5;4017:54;4006:65;;3951:126;;;:::o;4083:96::-;4120:7;4149:24;4167:5;4149:24;:::i;:::-;4138:35;;4083:96;;;:::o;4185:118::-;4272:24;4290:5;4272:24;:::i;:::-;4267:3;4260:37;4185:118;;:::o;4309:222::-;4402:4;4440:2;4429:9;4425:18;4417:26;;4453:71;4521:1;4510:9;4506:17;4497:6;4453:71;:::i;:::-;4309:222;;;;:::o;4537:122::-;4610:24;4628:5;4610:24;:::i;:::-;4603:5;4600:35;4590:63;;4649:1;4646;4639:12;4590:63;4537:122;:::o;4665:139::-;4711:5;4749:6;4736:20;4727:29;;4765:33;4792:5;4765:33;:::i;:::-;4665:139;;;;:::o;4810:474::-;4878:6;4886;4935:2;4923:9;4914:7;4910:23;4906:32;4903:119;;;4941:79;;:::i;:::-;4903:119;5061:1;5086:53;5131:7;5122:6;5111:9;5107:22;5086:53;:::i;:::-;5076:63;;5032:117;5188:2;5214:53;5259:7;5250:6;5239:9;5235:22;5214:53;:::i;:::-;5204:63;;5159:118;4810:474;;;;;:::o;5290:::-;5358:6;5366;5415:2;5403:9;5394:7;5390:23;5386:32;5383:119;;;5421:79;;:::i;:::-;5383:119;5541:1;5566:53;5611:7;5602:6;5591:9;5587:22;5566:53;:::i;:::-;5556:63;;5512:117;5668:2;5694:53;5739:7;5730:6;5719:9;5715:22;5694:53;:::i;:::-;5684:63;;5639:118;5290:474;;;;;:::o;5770:619::-;5847:6;5855;5863;5912:2;5900:9;5891:7;5887:23;5883:32;5880:119;;;5918:79;;:::i;:::-;5880:119;6038:1;6063:53;6108:7;6099:6;6088:9;6084:22;6063:53;:::i;:::-;6053:63;;6009:117;6165:2;6191:53;6236:7;6227:6;6216:9;6212:22;6191:53;:::i;:::-;6181:63;;6136:118;6293:2;6319:53;6364:7;6355:6;6344:9;6340:22;6319:53;:::i;:::-;6309:63;;6264:118;5770:619;;;;;:::o;6395:::-;6472:6;6480;6488;6537:2;6525:9;6516:7;6512:23;6508:32;6505:119;;;6543:79;;:::i;:::-;6505:119;6663:1;6688:53;6733:7;6724:6;6713:9;6709:22;6688:53;:::i;:::-;6678:63;;6634:117;6790:2;6816:53;6861:7;6852:6;6841:9;6837:22;6816:53;:::i;:::-;6806:63;;6761:118;6918:2;6944:53;6989:7;6980:6;6969:9;6965:22;6944:53;:::i;:::-;6934:63;;6889:118;6395:619;;;;;:::o;7020:329::-;7079:6;7128:2;7116:9;7107:7;7103:23;7099:32;7096:119;;;7134:79;;:::i;:::-;7096:119;7254:1;7279:53;7324:7;7315:6;7304:9;7300:22;7279:53;:::i;:::-;7269:63;;7225:117;7020:329;;;;:::o;7355:117::-;7464:1;7461;7454:12;7478:117;7587:1;7584;7577:12;7601:180;7649:77;7646:1;7639:88;7746:4;7743:1;7736:15;7770:4;7767:1;7760:15;7787:281;7870:27;7892:4;7870:27;:::i;:::-;7862:6;7858:40;8000:6;7988:10;7985:22;7964:18;7952:10;7949:34;7946:62;7943:88;;;8011:18;;:::i;:::-;7943:88;8051:10;8047:2;8040:22;7830:238;7787:281;;:::o;8074:129::-;8108:6;8135:20;;:::i;:::-;8125:30;;8164:33;8192:4;8184:6;8164:33;:::i;:::-;8074:129;;;:::o;8209:308::-;8271:4;8361:18;8353:6;8350:30;8347:56;;;8383:18;;:::i;:::-;8347:56;8421:29;8443:6;8421:29;:::i;:::-;8413:37;;8505:4;8499;8495:15;8487:23;;8209:308;;;:::o;8523:154::-;8607:6;8602:3;8597;8584:30;8669:1;8660:6;8655:3;8651:16;8644:27;8523:154;;;:::o;8683:412::-;8761:5;8786:66;8802:49;8844:6;8802:49;:::i;:::-;8786:66;:::i;:::-;8777:75;;8875:6;8868:5;8861:21;8913:4;8906:5;8902:16;8951:3;8942:6;8937:3;8933:16;8930:25;8927:112;;;8958:79;;:::i;:::-;8927:112;9048:41;9082:6;9077:3;9072;9048:41;:::i;:::-;8767:328;8683:412;;;;;:::o;9115:340::-;9171:5;9220:3;9213:4;9205:6;9201:17;9197:27;9187:122;;9228:79;;:::i;:::-;9187:122;9345:6;9332:20;9370:79;9445:3;9437:6;9430:4;9422:6;9418:17;9370:79;:::i;:::-;9361:88;;9177:278;9115:340;;;;:::o;9461:509::-;9530:6;9579:2;9567:9;9558:7;9554:23;9550:32;9547:119;;;9585:79;;:::i;:::-;9547:119;9733:1;9722:9;9718:17;9705:31;9763:18;9755:6;9752:30;9749:117;;;9785:79;;:::i;:::-;9749:117;9890:63;9945:7;9936:6;9925:9;9921:22;9890:63;:::i;:::-;9880:73;;9676:287;9461:509;;;;:::o;9976:116::-;10046:21;10061:5;10046:21;:::i;:::-;10039:5;10036:32;10026:60;;10082:1;10079;10072:12;10026:60;9976:116;:::o;10098:133::-;10141:5;10179:6;10166:20;10157:29;;10195:30;10219:5;10195:30;:::i;:::-;10098:133;;;;:::o;10237:468::-;10302:6;10310;10359:2;10347:9;10338:7;10334:23;10330:32;10327:119;;;10365:79;;:::i;:::-;10327:119;10485:1;10510:53;10555:7;10546:6;10535:9;10531:22;10510:53;:::i;:::-;10500:63;;10456:117;10612:2;10638:50;10680:7;10671:6;10660:9;10656:22;10638:50;:::i;:::-;10628:60;;10583:115;10237:468;;;;;:::o;10711:307::-;10772:4;10862:18;10854:6;10851:30;10848:56;;;10884:18;;:::i;:::-;10848:56;10922:29;10944:6;10922:29;:::i;:::-;10914:37;;11006:4;11000;10996:15;10988:23;;10711:307;;;:::o;11024:410::-;11101:5;11126:65;11142:48;11183:6;11142:48;:::i;:::-;11126:65;:::i;:::-;11117:74;;11214:6;11207:5;11200:21;11252:4;11245:5;11241:16;11290:3;11281:6;11276:3;11272:16;11269:25;11266:112;;;11297:79;;:::i;:::-;11266:112;11387:41;11421:6;11416:3;11411;11387:41;:::i;:::-;11107:327;11024:410;;;;;:::o;11453:338::-;11508:5;11557:3;11550:4;11542:6;11538:17;11534:27;11524:122;;11565:79;;:::i;:::-;11524:122;11682:6;11669:20;11707:78;11781:3;11773:6;11766:4;11758:6;11754:17;11707:78;:::i;:::-;11698:87;;11514:277;11453:338;;;;:::o;11797:943::-;11892:6;11900;11908;11916;11965:3;11953:9;11944:7;11940:23;11936:33;11933:120;;;11972:79;;:::i;:::-;11933:120;12092:1;12117:53;12162:7;12153:6;12142:9;12138:22;12117:53;:::i;:::-;12107:63;;12063:117;12219:2;12245:53;12290:7;12281:6;12270:9;12266:22;12245:53;:::i;:::-;12235:63;;12190:118;12347:2;12373:53;12418:7;12409:6;12398:9;12394:22;12373:53;:::i;:::-;12363:63;;12318:118;12503:2;12492:9;12488:18;12475:32;12534:18;12526:6;12523:30;12520:117;;;12556:79;;:::i;:::-;12520:117;12661:62;12715:7;12706:6;12695:9;12691:22;12661:62;:::i;:::-;12651:72;;12446:287;11797:943;;;;;;;:::o;12746:474::-;12814:6;12822;12871:2;12859:9;12850:7;12846:23;12842:32;12839:119;;;12877:79;;:::i;:::-;12839:119;12997:1;13022:53;13067:7;13058:6;13047:9;13043:22;13022:53;:::i;:::-;13012:63;;12968:117;13124:2;13150:53;13195:7;13186:6;13175:9;13171:22;13150:53;:::i;:::-;13140:63;;13095:118;12746:474;;;;;:::o;13226:180::-;13274:77;13271:1;13264:88;13371:4;13368:1;13361:15;13395:4;13392:1;13385:15;13412:320;13456:6;13493:1;13487:4;13483:12;13473:22;;13540:1;13534:4;13530:12;13561:18;13551:81;;13617:4;13609:6;13605:17;13595:27;;13551:81;13679:2;13671:6;13668:14;13648:18;13645:38;13642:84;;;13698:18;;:::i;:::-;13642:84;13463:269;13412:320;;;:::o;13738:231::-;13878:34;13874:1;13866:6;13862:14;13855:58;13947:14;13942:2;13934:6;13930:15;13923:39;13738:231;:::o;13975:366::-;14117:3;14138:67;14202:2;14197:3;14138:67;:::i;:::-;14131:74;;14214:93;14303:3;14214:93;:::i;:::-;14332:2;14327:3;14323:12;14316:19;;13975:366;;;:::o;14347:419::-;14513:4;14551:2;14540:9;14536:18;14528:26;;14600:9;14594:4;14590:20;14586:1;14575:9;14571:17;14564:47;14628:131;14754:4;14628:131;:::i;:::-;14620:139;;14347:419;;;:::o;14772:220::-;14912:34;14908:1;14900:6;14896:14;14889:58;14981:3;14976:2;14968:6;14964:15;14957:28;14772:220;:::o;14998:366::-;15140:3;15161:67;15225:2;15220:3;15161:67;:::i;:::-;15154:74;;15237:93;15326:3;15237:93;:::i;:::-;15355:2;15350:3;15346:12;15339:19;;14998:366;;;:::o;15370:419::-;15536:4;15574:2;15563:9;15559:18;15551:26;;15623:9;15617:4;15613:20;15609:1;15598:9;15594:17;15587:47;15651:131;15777:4;15651:131;:::i;:::-;15643:139;;15370:419;;;:::o;15795:243::-;15935:34;15931:1;15923:6;15919:14;15912:58;16004:26;15999:2;15991:6;15987:15;15980:51;15795:243;:::o;16044:366::-;16186:3;16207:67;16271:2;16266:3;16207:67;:::i;:::-;16200:74;;16283:93;16372:3;16283:93;:::i;:::-;16401:2;16396:3;16392:12;16385:19;;16044:366;;;:::o;16416:419::-;16582:4;16620:2;16609:9;16605:18;16597:26;;16669:9;16663:4;16659:20;16655:1;16644:9;16640:17;16633:47;16697:131;16823:4;16697:131;:::i;:::-;16689:139;;16416:419;;;:::o;16841:222::-;16981:34;16977:1;16969:6;16965:14;16958:58;17050:5;17045:2;17037:6;17033:15;17026:30;16841:222;:::o;17069:366::-;17211:3;17232:67;17296:2;17291:3;17232:67;:::i;:::-;17225:74;;17308:93;17397:3;17308:93;:::i;:::-;17426:2;17421:3;17417:12;17410:19;;17069:366;;;:::o;17441:419::-;17607:4;17645:2;17634:9;17630:18;17622:26;;17694:9;17688:4;17684:20;17680:1;17669:9;17665:17;17658:47;17722:131;17848:4;17722:131;:::i;:::-;17714:139;;17441:419;;;:::o;17866:236::-;18006:34;18002:1;17994:6;17990:14;17983:58;18075:19;18070:2;18062:6;18058:15;18051:44;17866:236;:::o;18108:366::-;18250:3;18271:67;18335:2;18330:3;18271:67;:::i;:::-;18264:74;;18347:93;18436:3;18347:93;:::i;:::-;18465:2;18460:3;18456:12;18449:19;;18108:366;;;:::o;18480:419::-;18646:4;18684:2;18673:9;18669:18;18661:26;;18733:9;18727:4;18723:20;18719:1;18708:9;18704:17;18697:47;18761:131;18887:4;18761:131;:::i;:::-;18753:139;;18480:419;;;:::o;18905:223::-;19045:34;19041:1;19033:6;19029:14;19022:58;19114:6;19109:2;19101:6;19097:15;19090:31;18905:223;:::o;19134:366::-;19276:3;19297:67;19361:2;19356:3;19297:67;:::i;:::-;19290:74;;19373:93;19462:3;19373:93;:::i;:::-;19491:2;19486:3;19482:12;19475:19;;19134:366;;;:::o;19506:419::-;19672:4;19710:2;19699:9;19695:18;19687:26;;19759:9;19753:4;19749:20;19745:1;19734:9;19730:17;19723:47;19787:131;19913:4;19787:131;:::i;:::-;19779:139;;19506:419;;;:::o;19931:228::-;20071:34;20067:1;20059:6;20055:14;20048:58;20140:11;20135:2;20127:6;20123:15;20116:36;19931:228;:::o;20165:366::-;20307:3;20328:67;20392:2;20387:3;20328:67;:::i;:::-;20321:74;;20404:93;20493:3;20404:93;:::i;:::-;20522:2;20517:3;20513:12;20506:19;;20165:366;;;:::o;20537:419::-;20703:4;20741:2;20730:9;20726:18;20718:26;;20790:9;20784:4;20780:20;20776:1;20765:9;20761:17;20754:47;20818:131;20944:4;20818:131;:::i;:::-;20810:139;;20537:419;;;:::o;20962:180::-;21010:77;21007:1;21000:88;21107:4;21104:1;21097:15;21131:4;21128:1;21121:15;21148:305;21188:3;21207:20;21225:1;21207:20;:::i;:::-;21202:25;;21241:20;21259:1;21241:20;:::i;:::-;21236:25;;21395:1;21327:66;21323:74;21320:1;21317:81;21314:107;;;21401:18;;:::i;:::-;21314:107;21445:1;21442;21438:9;21431:16;;21148:305;;;;:::o;21459:229::-;21599:34;21595:1;21587:6;21583:14;21576:58;21668:12;21663:2;21655:6;21651:15;21644:37;21459:229;:::o;21694:366::-;21836:3;21857:67;21921:2;21916:3;21857:67;:::i;:::-;21850:74;;21933:93;22022:3;21933:93;:::i;:::-;22051:2;22046:3;22042:12;22035:19;;21694:366;;;:::o;22066:419::-;22232:4;22270:2;22259:9;22255:18;22247:26;;22319:9;22313:4;22309:20;22305:1;22294:9;22290:17;22283:47;22347:131;22473:4;22347:131;:::i;:::-;22339:139;;22066:419;;;:::o;22491:234::-;22631:34;22627:1;22619:6;22615:14;22608:58;22700:17;22695:2;22687:6;22683:15;22676:42;22491:234;:::o;22731:366::-;22873:3;22894:67;22958:2;22953:3;22894:67;:::i;:::-;22887:74;;22970:93;23059:3;22970:93;:::i;:::-;23088:2;23083:3;23079:12;23072:19;;22731:366;;;:::o;23103:419::-;23269:4;23307:2;23296:9;23292:18;23284:26;;23356:9;23350:4;23346:20;23342:1;23331:9;23327:17;23320:47;23384:131;23510:4;23384:131;:::i;:::-;23376:139;;23103:419;;;:::o;23528:148::-;23630:11;23667:3;23652:18;;23528:148;;;;:::o;23682:377::-;23788:3;23816:39;23849:5;23816:39;:::i;:::-;23871:89;23953:6;23948:3;23871:89;:::i;:::-;23864:96;;23969:52;24014:6;24009:3;24002:4;23995:5;23991:16;23969:52;:::i;:::-;24046:6;24041:3;24037:16;24030:23;;23792:267;23682:377;;;;:::o;24065:435::-;24245:3;24267:95;24358:3;24349:6;24267:95;:::i;:::-;24260:102;;24379:95;24470:3;24461:6;24379:95;:::i;:::-;24372:102;;24491:3;24484:10;;24065:435;;;;;:::o;24506:182::-;24646:34;24642:1;24634:6;24630:14;24623:58;24506:182;:::o;24694:366::-;24836:3;24857:67;24921:2;24916:3;24857:67;:::i;:::-;24850:74;;24933:93;25022:3;24933:93;:::i;:::-;25051:2;25046:3;25042:12;25035:19;;24694:366;;;:::o;25066:419::-;25232:4;25270:2;25259:9;25255:18;25247:26;;25319:9;25313:4;25309:20;25305:1;25294:9;25290:17;25283:47;25347:131;25473:4;25347:131;:::i;:::-;25339:139;;25066:419;;;:::o;25491:178::-;25631:30;25627:1;25619:6;25615:14;25608:54;25491:178;:::o;25675:366::-;25817:3;25838:67;25902:2;25897:3;25838:67;:::i;:::-;25831:74;;25914:93;26003:3;25914:93;:::i;:::-;26032:2;26027:3;26023:12;26016:19;;25675:366;;;:::o;26047:419::-;26213:4;26251:2;26240:9;26236:18;26228:26;;26300:9;26294:4;26290:20;26286:1;26275:9;26271:17;26264:47;26328:131;26454:4;26328:131;:::i;:::-;26320:139;;26047:419;;;:::o;26472:231::-;26612:34;26608:1;26600:6;26596:14;26589:58;26681:14;26676:2;26668:6;26664:15;26657:39;26472:231;:::o;26709:366::-;26851:3;26872:67;26936:2;26931:3;26872:67;:::i;:::-;26865:74;;26948:93;27037:3;26948:93;:::i;:::-;27066:2;27061:3;27057:12;27050:19;;26709:366;;;:::o;27081:419::-;27247:4;27285:2;27274:9;27270:18;27262:26;;27334:9;27328:4;27324:20;27320:1;27309:9;27305:17;27298:47;27362:131;27488:4;27362:131;:::i;:::-;27354:139;;27081:419;;;:::o;27506:224::-;27646:34;27642:1;27634:6;27630:14;27623:58;27715:7;27710:2;27702:6;27698:15;27691:32;27506:224;:::o;27736:366::-;27878:3;27899:67;27963:2;27958:3;27899:67;:::i;:::-;27892:74;;27975:93;28064:3;27975:93;:::i;:::-;28093:2;28088:3;28084:12;28077:19;;27736:366;;;:::o;28108:419::-;28274:4;28312:2;28301:9;28297:18;28289:26;;28361:9;28355:4;28351:20;28347:1;28336:9;28332:17;28325:47;28389:131;28515:4;28389:131;:::i;:::-;28381:139;;28108:419;;;:::o;28533:223::-;28673:34;28669:1;28661:6;28657:14;28650:58;28742:6;28737:2;28729:6;28725:15;28718:31;28533:223;:::o;28762:366::-;28904:3;28925:67;28989:2;28984:3;28925:67;:::i;:::-;28918:74;;29001:93;29090:3;29001:93;:::i;:::-;29119:2;29114:3;29110:12;29103:19;;28762:366;;;:::o;29134:419::-;29300:4;29338:2;29327:9;29323:18;29315:26;;29387:9;29381:4;29377:20;29373:1;29362:9;29358:17;29351:47;29415:131;29541:4;29415:131;:::i;:::-;29407:139;;29134:419;;;:::o;29559:191::-;29599:4;29619:20;29637:1;29619:20;:::i;:::-;29614:25;;29653:20;29671:1;29653:20;:::i;:::-;29648:25;;29692:1;29689;29686:8;29683:34;;;29697:18;;:::i;:::-;29683:34;29742:1;29739;29735:9;29727:17;;29559:191;;;;:::o;29756:175::-;29896:27;29892:1;29884:6;29880:14;29873:51;29756:175;:::o;29937:366::-;30079:3;30100:67;30164:2;30159:3;30100:67;:::i;:::-;30093:74;;30176:93;30265:3;30176:93;:::i;:::-;30294:2;30289:3;30285:12;30278:19;;29937:366;;;:::o;30309:419::-;30475:4;30513:2;30502:9;30498:18;30490:26;;30562:9;30556:4;30552:20;30548:1;30537:9;30533:17;30526:47;30590:131;30716:4;30590:131;:::i;:::-;30582:139;;30309:419;;;:::o;30734:237::-;30874:34;30870:1;30862:6;30858:14;30851:58;30943:20;30938:2;30930:6;30926:15;30919:45;30734:237;:::o;30977:366::-;31119:3;31140:67;31204:2;31199:3;31140:67;:::i;:::-;31133:74;;31216:93;31305:3;31216:93;:::i;:::-;31334:2;31329:3;31325:12;31318:19;;30977:366;;;:::o;31349:419::-;31515:4;31553:2;31542:9;31538:18;31530:26;;31602:9;31596:4;31592:20;31588:1;31577:9;31573:17;31566:47;31630:131;31756:4;31630:131;:::i;:::-;31622:139;;31349:419;;;:::o;31774:233::-;31813:3;31836:24;31854:5;31836:24;:::i;:::-;31827:33;;31882:66;31875:5;31872:77;31869:103;;;31952:18;;:::i;:::-;31869:103;31999:1;31992:5;31988:13;31981:20;;31774:233;;;:::o;32013:180::-;32061:77;32058:1;32051:88;32158:4;32155:1;32148:15;32182:4;32179:1;32172:15;32199:185;32239:1;32256:20;32274:1;32256:20;:::i;:::-;32251:25;;32290:20;32308:1;32290:20;:::i;:::-;32285:25;;32329:1;32319:35;;32334:18;;:::i;:::-;32319:35;32376:1;32373;32369:9;32364:14;;32199:185;;;;:::o;32390:176::-;32422:1;32439:20;32457:1;32439:20;:::i;:::-;32434:25;;32473:20;32491:1;32473:20;:::i;:::-;32468:25;;32512:1;32502:35;;32517:18;;:::i;:::-;32502:35;32558:1;32555;32551:9;32546:14;;32390:176;;;;:::o;32572:180::-;32620:77;32617:1;32610:88;32717:4;32714:1;32707:15;32741:4;32738:1;32731:15;32758:98;32809:6;32843:5;32837:12;32827:22;;32758:98;;;:::o;32862:168::-;32945:11;32979:6;32974:3;32967:19;33019:4;33014:3;33010:14;32995:29;;32862:168;;;;:::o;33036:360::-;33122:3;33150:38;33182:5;33150:38;:::i;:::-;33204:70;33267:6;33262:3;33204:70;:::i;:::-;33197:77;;33283:52;33328:6;33323:3;33316:4;33309:5;33305:16;33283:52;:::i;:::-;33360:29;33382:6;33360:29;:::i;:::-;33355:3;33351:39;33344:46;;33126:270;33036:360;;;;:::o;33402:640::-;33597:4;33635:3;33624:9;33620:19;33612:27;;33649:71;33717:1;33706:9;33702:17;33693:6;33649:71;:::i;:::-;33730:72;33798:2;33787:9;33783:18;33774:6;33730:72;:::i;:::-;33812;33880:2;33869:9;33865:18;33856:6;33812:72;:::i;:::-;33931:9;33925:4;33921:20;33916:2;33905:9;33901:18;33894:48;33959:76;34030:4;34021:6;33959:76;:::i;:::-;33951:84;;33402:640;;;;;;;:::o;34048:141::-;34104:5;34135:6;34129:13;34120:22;;34151:32;34177:5;34151:32;:::i;:::-;34048:141;;;;:::o;34195:349::-;34264:6;34313:2;34301:9;34292:7;34288:23;34284:32;34281:119;;;34319:79;;:::i;:::-;34281:119;34439:1;34464:63;34519:7;34510:6;34499:9;34495:22;34464:63;:::i;:::-;34454:73;;34410:127;34195:349;;;;:::o

Swarm Source

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