ETH Price: $3,399.19 (+1.94%)
Gas: 3.7 Gwei

Token

deckk (DKK)
 

Overview

Max Total Supply

8,888 DKK

Holders

1,445

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
xyzxyzyz.eth
Balance
5 DKK
0xcc482382afc7178bdfdc3c6a4682c4cf03a5f506
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
deckk

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, None license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: UNLICENSED

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


pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

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


pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: @openzeppelin/contracts/utils/Address.sol


pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/utils/Context.sol


pragma solidity ^0.8.0;

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

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

// File: @openzeppelin/contracts/utils/Strings.sol


pragma solidity ^0.8.0;

/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _HEX_SYMBOLS = "0123456789abcdef";

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT licence
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        if (value == 0) {
            return "0x00";
        }
        uint256 temp = value;
        uint256 length = 0;
        while (temp != 0) {
            length++;
            temp >>= 8;
        }
        return toHexString(value, length);
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.
     */
    function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {
        bytes memory buffer = new bytes(2 * length + 2);
        buffer[0] = "0";
        buffer[1] = "x";
        for (uint256 i = 2 * length + 1; i > 1; --i) {
            buffer[i] = _HEX_SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }
}

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


pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check
 * for the additional interface id that will be supported. For example:
 *
 * ```solidity
 * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
 *     return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);
 * }
 * ```
 *
 * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC165).interfaceId;
    }
}

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


pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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


pragma solidity ^0.8.0;


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

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

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

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


pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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


pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

// File: contracts/deckk.sol



pragma solidity ^0.8.0;


contract deckk is ERC721Enumerable, ReentrancyGuard, Ownable {
    uint16 public _tokenIds = 0;
    bool public mintEnabled = false;
    mapping(uint16 => uint64) public _tokenSeeds;
    string[5] _y = ["12.0", "22.65", "33.3", "43.95", "54.6"];
    string[15] _cards = [
        "JOKER",
        "T",
        "9",
        "2",
        "3",
        "4",
        "5",
        "6",
        "7",
        "8",
        "J",
        "Q",
        "K",
        "A",
        "JOKER"
    ];
    uint256[6] _strength = [10, 15, 30, 85, 1000, 1000];
    string[6] _types = ["D", "C", "H", "S", "B", "R"];
    string[6] _typeSymbolos = [
        unicode"♦",
        unicode"♣",
        unicode"♥",
        unicode"♠",
        "",
        ""
    ];

    string[4] _typeNames = ["Diamonds", "Clubs", "Hearts", "Spades"];
    string[5] _numbers = ["1st", "2nd", "3rd", "4th", "5th"];

    constructor() ERC721("deckk", "DKK") Ownable() {
        mintEnabled = false;
    }

    function getSeed(uint256 tokenId) private view returns(uint64) {
        if (0 < tokenId && tokenId <= 8888) {
            return _tokenSeeds[uint16(tokenId)];
        }
        return uint64(tokenId);
    }

    function enableMinting(bool value) public onlyOwner returns (bool) {
        mintEnabled = value;
        return true;
    }

    function claim(uint256 count) public nonReentrant returns (bool) {
        require(mintEnabled);
        require(0 < count && count < 6);
        require(_tokenIds >= 0 && _tokenIds + count < 8889, "Token ID invalid");
        for (uint256 i = 0; i < count; i++) {
            _tokenIds += 1;
            _safeMint(_msgSender(), uint256(_tokenIds));
            _tokenSeeds[_tokenIds] = uint64(
                random(
                    string(
                        abi.encodePacked(
                            "TOKENSEED",
                            block.timestamp,
                            block.difficulty,
                            _tokenIds
                        )
                    )
                )
            );
        }
        return true;
    }

    function tokenCardNumber(uint256 tokenId, uint256 cardId)
        public
        view
        returns (uint256)
    {
        return pluck(tokenId, cardId, units);
    }

    function tokenCardType(uint256 tokenId, uint256 cardId)
        public
        view
        returns (uint256)
    {
        uint256 rand = random(
            string(
                abi.encodePacked(
                    "CARDTYPE",
                    tokenId,
                    getSeed(tokenId)/(2**(6*(cardId-1))) % 64
                )
            )
        );

        rand = rand % 10000;
        if (rand < 4711) return 1;
        if (rand < 7867) return 2;
        if (rand < 9445) return 3;
        return 4;
    }

    function tokenCardTypePure(
        uint256 tokenId,
        uint256 cardId,
        uint256 cardRank
    ) public view returns (uint256) {
        if (cardRank == 0) return 5;
        if (cardRank == 14) return 6;
        return tokenCardType(tokenId, cardId);
    }

    function tokenCardColor(uint256 cardRank, uint256 cardType)
        public
        pure
        returns (string memory)
    {
        if (cardRank == 0) return "bj";
        if (cardRank == 14) return "rj";
        if (cardType == 1 || cardType == 3) return "r";
        return "b";
    }

    function tokenCommandingCardNumber(uint256 tokenId)
        public
        view
        returns (uint256)
    {
        return (uint256(getSeed(tokenId)) % 5) + 1;
    }

    function getPureCard(uint256 card) public view returns (string memory) {
        if (card == 0 || card == 14) return "X";
        return _cards[card];
    }

    function tokenPureURI(uint256 tokenId) public view returns (string memory) {
        uint256 card1 = tokenCardNumber(tokenId, 1);
        uint256 card2 = tokenCardNumber(tokenId, 2);
        uint256 card3 = tokenCardNumber(tokenId, 3);
        uint256 card4 = tokenCardNumber(tokenId, 4);
        uint256 card5 = tokenCardNumber(tokenId, 5);

        string memory output = string(
            abi.encodePacked(
                getPureCard(card1),
                _types[tokenCardTypePure(tokenId, 1, card1) - 1],
                getPureCard(card2),
                _types[tokenCardTypePure(tokenId, 2, card2) - 1],
                getPureCard(card3),
                _types[tokenCardTypePure(tokenId, 3, card3) - 1]
            )
        );
        return
            output = string(
                abi.encodePacked(
                    output,
                    getPureCard(card4),
                    _types[tokenCardTypePure(tokenId, 4, card4) - 1],
                    getPureCard(card5),
                    _types[tokenCardTypePure(tokenId, 5, card5) - 1],
                    "*",
                    toString(tokenCommandingCardNumber(tokenId))
                )
            );
    }

    function tokenURIJSON(uint256 tokenId)
        private
        view
        returns (string memory)
    {
        uint256[] memory suits = new uint256[](6);
        for (uint256 i = 0; i < 6; i++) suits[i] = 0;

        uint256[] memory cardRank = new uint256[](5);
        uint256 strength = 0;
        uint256 max_rank = 1;
        uint256 max_suit = 1;
        uint256 commandingCard = tokenCommandingCardNumber(tokenId);

        string
            memory svg = '<svg viewBox="0 0 120 120" xmlns="http://www.w3.org/2000/svg"><rect width="100%" height="100%" fill="#f5f5f5" /><style>.r{ font: 7.75px serif; fill: red; }.b{ font: 7.75px serif; fill: black;}.rj{ font: 7.75px monospace; fill: red; }.bj{ font: 7.75px monospace; fill: black;}</style>';

        string memory attributes = "";

        for (uint256 i = 1; i <= 5; i++) {
            cardRank[i - 1] = tokenCardNumber(tokenId, i);
            uint256 cardType = tokenCardTypePure(tokenId, i, cardRank[i - 1]);

            svg = string(
                abi.encodePacked(
                    svg,
                    '<text x="5.25" y="',
                    _y[i - 1],
                    '" class="',
                    tokenCardColor(cardRank[i - 1], cardType),
                    '">',
                    _cards[cardRank[i - 1]],
                    _typeSymbolos[cardType - 1],
                    commandingCard == i ? '<tspan class="b">*</tspan>' : "",
                    "</text>"
                )
            );

            uint256 c = 1;
            for (uint256 j = 1; j < i; j++) {
                if (cardRank[i - 1] == cardRank[j - 1]) c++;
            }
            if (c > max_rank) {
                max_rank = c;
            }
            suits[cardType - 1]++;
            if (suits[cardType - 1] > max_suit) {
                max_suit = suits[cardType - 1];
            }
            strength += _strength[cardType - 1];

            attributes = string(
                abi.encodePacked(
                    attributes,
                    '{"trait_type": "',
                    _numbers[i - 1],
                    ' Card", "value": "',
                    _cards[cardRank[i - 1]],
                    '"},'
                )
            );
        }

        svg = string(abi.encodePacked(svg, "</svg>"));

        attributes = string(
            abi.encodePacked(
                attributes,
                '{"trait_type": "Commanding Card", "value": "',
                toString(tokenCommandingCardNumber(tokenId)),
                '"},',
                '{"trait_type": "Max Rank Sequence", "value": "',
                toString(max_rank),
                '"},',
                '{"trait_type": "Max Suite Sequence", "value": "',
                toString(max_suit),
                '"},'
            )
        );

        for (uint256 i = 0; i < 4; i++) {
            attributes = string(
                abi.encodePacked(
                    attributes,
                    '{"trait_type": "Total ',
                    _typeNames[i],
                    '", "value": "',
                    toString(suits[i]),
                    '"},'
                )
            );
        }

        attributes = string(
            abi.encodePacked(
                attributes,
                '{"trait_type": "Net Strength", "value": "',
                toString(strength),
                '"},'
                '{"trait_type": "Jokers", "value": "',
                toString(suits[4]),
                '"}'
            )
        );

        string memory json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "set #',
                        toString(tokenId),
                        '", "description": "Sets of randomised 5 cards, generated and stored on-chain. Feel free to use deckk in any way you want.", "image": "data:image/svg+xml;base64,',
                        Base64.encode(bytes(svg)),
                        '","attributes": [',
                        attributes,
                        "]}"
                    )
                )
            )
        );
        return string(abi.encodePacked("data:application/json;base64,", json));
    }

    function syntheticTokenURI(address val)
        public
        view
        returns (string memory)
    {
        return tokenURIJSON(uint256(keccak256(abi.encode(val))));
    }

    function mySyntheticTokenURI()
        public
        view
        returns (string memory)
    {
        return tokenURIJSON(uint256(keccak256(abi.encode(_msgSender()))));
    }

    function syntheticTokenPureURI(address val)
        public
        view
        returns (string memory)
    {
        return tokenPureURI(uint256(keccak256(abi.encode(val))));
    }

    function mySyntheticTokenPureURI()
        public
        view
        returns (string memory)
    {
        return tokenPureURI(uint256(keccak256(abi.encode(_msgSender()))));
    }

    function tokenURI(uint256 tokenId)
        public
        view
        override
        returns (string memory)
    {
        if (tokenId > _tokenIds) return "Not Minted";
        return tokenURIJSON(tokenId);
    }

    // Random number generation copied from n project
    // https://etherscan.io/address/0x05a46f1e545526fb803ff974c790acea34d1f2d6#code

    uint8[] private units = [
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        1,
        2,
        3,
        4,
        5,
        6,
        7,
        8,
        9,
        10
    ];

    uint8[] private multipliers = [
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        1,
        0
    ];

    uint8[] private suffixes = [1, 2];

    function random(string memory input) internal pure returns (uint256) {
        return uint256(keccak256(abi.encodePacked(input, "MetaString")));
    }

    function pluck(
        uint256 tokenId, uint256 cardId,
        uint8[] memory sourceArray
    ) internal view returns (uint256) {
        uint256 rand = random(
            string(
                abi.encodePacked(
                    "CardNumber",
                    cardId,
                    tokenId,
                    getSeed(tokenId)/(2**(6*(4+cardId))) % 64
                )
            )
        );
        uint256 output = sourceArray[rand % sourceArray.length];
        uint256 luck = rand % 21;
        if (luck > 14) {
            output += suffixes[rand % suffixes.length];
        }
        if (luck >= 19) {
            if (luck == 19) {
                output =
                    (output * multipliers[rand % multipliers.length]) +
                    suffixes[rand % suffixes.length];
            } else {
                output = (output * multipliers[rand % multipliers.length]);
            }
        }
        return output;
    }

    function toString(uint256 value) internal pure returns (string memory) {
        // Inspired by OraclizeAPI's implementation - MIT license
        // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol

        if (value == 0) {
            return "0";
        }
        uint256 temp = value;
        uint256 digits;
        while (temp != 0) {
            digits++;
            temp /= 10;
        }
        bytes memory buffer = new bytes(digits);
        while (value != 0) {
            digits -= 1;
            buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));
            value /= 10;
        }
        return string(buffer);
    }
}

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

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

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

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

        bytes memory table = TABLE;

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

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

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

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

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

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

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"_tokenIds","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint16","name":"","type":"uint16"}],"name":"_tokenSeeds","outputs":[{"internalType":"uint64","name":"","type":"uint64"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"count","type":"uint256"}],"name":"claim","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"value","type":"bool"}],"name":"enableMinting","outputs":[{"internalType":"bool","name":"","type":"bool"}],"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":"card","type":"uint256"}],"name":"getPureCard","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"mintEnabled","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mySyntheticTokenPureURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mySyntheticTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"syntheticTokenPureURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"val","type":"address"}],"name":"syntheticTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"cardRank","type":"uint256"},{"internalType":"uint256","name":"cardType","type":"uint256"}],"name":"tokenCardColor","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"cardId","type":"uint256"}],"name":"tokenCardNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"cardId","type":"uint256"}],"name":"tokenCardType","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"cardId","type":"uint256"},{"internalType":"uint256","name":"cardRank","type":"uint256"}],"name":"tokenCardTypePure","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenCommandingCardNumber","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenPureURI","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"}]

600b805462ffffff60a01b19169055600461012081815263031322e360e41b61014052608090815260056101608181526432322e363560d81b6101805260a0526101a08381526333332e3360e01b6101c05260c0526101e08181526434332e393560d81b6102005260e052610260604052610220928352631a9a171b60e11b61024052610100929092526200009891600d919062000a6c565b50604080516102208101825260056101e08201818152642527a5a2a960d91b6102008401819052908352835180850185526001808252601560fa1b6020838101919091528086019290925285518087018752818152603960f81b818401528587015285518087018752818152601960f91b81840152606086015285518087018752818152603360f81b81840152608086015285518087018752818152600d60fa1b8184015260a086015285518087018752818152603560f81b8184015260c086015285518087018752818152601b60f91b8184015260e086015285518087018752818152603760f81b8184015261010086015285518087018752818152600760fb1b8184015261012086015285518087018752818152602560f91b8184015261014086015285518087018752818152605160f81b8184015261016086015285518087018752818152604b60f81b8184015261018086015285518087018752908152604160f81b818301526101a08501528451808601909552918452908301526101c08101919091526200023090601290600f62000ac3565b506040805160c081018252600a8152600f6020820152601e91810191909152605560608201526103e86080820181905260a08201526200027590602190600662000b08565b506040805161010081018252600160c08201818152601160fa1b60e0840152825282518084018452818152604360f81b6020828101919091528084019190915283518085018552828152600960fb1b818301528385015283518085018552828152605360f81b81830152606084015283518085018552828152602160f91b8183015260808401528351808501909452908352602960f91b9083015260a08101919091526200032890602790600662000b4d565b506040518060c0016040528060405180604001604052806003815260200162714cd360e91b815250815260200160405180604001604052806003815260200162e299a360e81b815250815260200160405180604001604052806003815260200162e299a560e81b8152508152602001604051806040016040528060038152602001620714cd60ed1b815250815260200160405180602001604052806000815250815260200160405180602001604052806000815250815250602d906006620003f292919062000b4d565b506040518060800160405280604051806040016040528060088152602001674469616d6f6e647360c01b815250815260200160405180604001604052806005815260200164436c75627360d81b81525081526020016040518060400160405280600681526020016548656172747360d01b81525081526020016040518060400160405280600681526020016553706164657360d01b81525081525060339060046200049f92919062000b92565b506040805160e081018252600360a08201818152620c5cdd60ea1b60c0840152825282518084018452818152620c9b9960ea1b6020828101919091528084019190915283518085018552828152620cdc9960ea1b81830152838501528351808501855282815262068e8d60eb1b81830152606084015283518085019094529083526206ae8d60eb1b9083015260808101919091526200054390603790600562000a6c565b50604080516104a08101825260018082526002602083018190526003938301849052600460608401819052600560808501819052600660a08601819052600760c08701819052600860e08801819052600961010089018190526101208901889052610140890187905261016089018a905261018089018690526101a089018590526101c089018490526101e08901839052610200890182905261022089018190526102408901889052610260890187905261028089018a90526102a089018690526102c089018590526102e089018490526103008901839052610320890182905261034089018190526103608901979097526103808801959095526103a08701979097526103c08601929092526103e0850152610400840152610420830193909352610440820192909252610460810191909152600a6104808201526200068f90603c90602562000bd7565b5060408051610b0081018252600180825260208201819052918101829052606081018290526080810182905260a0810182905260c0810182905260e08101829052610100810182905261012081018290526101408101829052610160810182905261018081018290526101a081018290526101c081018290526101e08101829052610200810182905261022081018290526102408101829052610260810182905261028081018290526102a081018290526102c081018290526102e08101829052610300810182905261032081018290526103408101829052610360810182905261038081018290526103a081018290526103c081018290526103e08101829052610400810182905261042081018290526104408101829052610460810182905261048081018290526104a081018290526104c081018290526104e08101829052610500810182905261052081018290526105408101829052610560810182905261058081018290526105a081018290526105c081018290526105e08101829052610600810182905261062081018290526106408101829052610660810182905261068081018290526106a081018290526106c081018290526106e08101829052610700810182905261072081018290526107408101829052610760810182905261078081018290526107a081018290526107c081018290526107e08101829052610800810182905261082081018290526108408101829052610860810182905261088081018290526108a081018290526108c081018290526108e08101829052610900810182905261092081018290526109408101829052610960810182905261098081018290526109a081018290526109c081018290526109e08101829052610a008101829052610a208101829052610a408101829052610a608101829052610a808101829052610aa08101829052610ac08101919091526000610ae08201526200096190603d90605862000bd7565b5060408051808201909152600181526002602082018190526200098791603e9162000bd7565b503480156200099557600080fd5b5060408051808201825260058152646465636b6b60d81b602080830191825283518085019094526003845262444b4b60e81b908401528151919291620009de9160009162000c7f565b508051620009f490600190602084019062000c7f565b50506001600a555062000a073362000a1a565b600b805460ff60b01b1916905562000db3565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b826005810192821562000ab1579160200282015b8281111562000ab1578251805162000aa091849160209091019062000c7f565b509160200191906001019062000a80565b5062000abf92915062000cfc565b5090565b82600f810192821562000ab1579160200282015b8281111562000ab1578251805162000af791849160209091019062000c7f565b509160200191906001019062000ad7565b826006810192821562000b3f579160200282015b8281111562000b3f578251829061ffff1690559160200191906001019062000b1c565b5062000abf92915062000d1d565b826006810192821562000ab1579160200282015b8281111562000ab1578251805162000b8191849160209091019062000c7f565b509160200191906001019062000b61565b826004810192821562000ab1579160200282015b8281111562000ab1578251805162000bc691849160209091019062000c7f565b509160200191906001019062000ba6565b82805482825590600052602060002090601f0160209004810192821562000b3f5791602002820160005b8382111562000c4157835183826101000a81548160ff021916908360ff160217905550926020019260010160208160000104928301926001030262000c01565b801562000c705782816101000a81549060ff021916905560010160208160000104928301926001030262000c41565b505062000abf92915062000d1d565b82805462000c8d9062000d76565b90600052602060002090601f01602090048101928262000cb1576000855562000b3f565b82601f1062000ccc57805160ff191683800117855562000b3f565b8280016001018555821562000b3f579182015b8281111562000b3f57825182559160200191906001019062000cdf565b8082111562000abf57600062000d13828262000d34565b5060010162000cfc565b5b8082111562000abf576000815560010162000d1e565b50805462000d429062000d76565b6000825580601f1062000d53575050565b601f01602090049060005260206000209081019062000d73919062000d1d565b50565b600181811c9082168062000d8b57607f821691505b6020821081141562000dad57634e487b7160e01b600052602260045260246000fd5b50919050565b6136cc8062000dc36000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c806378acea1e11610125578063b88d4fde116100ad578063d12397301161007c578063d1239730146104a2578063d4c8cba8146104b6578063e8de1a5e146104be578063e985e9c5146104d1578063f2fde38b1461050d57600080fd5b8063b88d4fde14610456578063bd97d4f714610469578063c7f5f3d21461047c578063c87b56dd1461048f57600080fd5b80638da5cb5b116100f45780638da5cb5b146103bf57806395d89b41146103d0578063a22cb465146103d8578063aa46a400146103eb578063af405b951461041357600080fd5b806378acea1e1461037357806380162d231461038657806385d909711461039957806388de1905146103ac57600080fd5b8063389d6ccf116101a85780635b93d83b116101775780635b93d83b1461032a5780635bae37c81461033d5780636352211e1461034557806370a0823114610358578063715018a61461036b57600080fd5b8063389d6ccf146102de57806342842e0e146102f1578063484af78a146103045780634f6ccce71461031757600080fd5b806318160ddd116101e457806318160ddd1461029357806323b872dd146102a55780632f745c59146102b8578063379607f5146102cb57600080fd5b806301ffc9a71461021657806306fdde031461023e578063081812fc14610253578063095ea7b31461027e575b600080fd5b61022961022436600461295e565b610520565b60405190151581526020015b60405180910390f35b61024661054b565b60405161023591906131c3565b6102666102613660046129bc565b6105dd565b6040516001600160a01b039091168152602001610235565b61029161028c366004612919565b610677565b005b6008545b604051908152602001610235565b6102916102b33660046127d7565b61078d565b6102976102c6366004612919565b6107be565b6102296102d93660046129bc565b610854565b6102976102ec3660046129f7565b610a53565b6102916102ff3660046127d7565b610a87565b6102466103123660046129d5565b610aa2565b6102976103253660046129bc565b610b41565b610246610338366004612789565b610bd4565b610246610c0e565b6102666103533660046129bc565b610c2a565b610297610366366004612789565b610ca1565b610291610d28565b610229610381366004612943565b610d5e565b610246610394366004612789565b610dab565b6102976103a73660046129d5565b610de5565b6102976103ba3660046129d5565b610e60565b600b546001600160a01b0316610266565b610246610f30565b6102916103e63660046128ef565b610f3f565b600b5461040090600160a01b900461ffff1681565b60405161ffff9091168152602001610235565b61043d610421366004612998565b600c6020526000908152604090205467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610235565b610291610464366004612813565b611004565b6102466104773660046129bc565b61103c565b61029761048a3660046129bc565b611111565b61024661049d3660046129bc565b61113d565b600b5461022990600160b01b900460ff1681565b610246611184565b6102466104cc3660046129bc565b61119b565b6102296104df3660046127a4565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61029161051b366004612789565b611357565b60006001600160e01b0319821663780e9d6360e01b14806105455750610545826113f2565b92915050565b60606000805461055a9061344d565b80601f01602080910402602001604051908101604052809291908181526020018280546105869061344d565b80156105d35780601f106105a8576101008083540402835291602001916105d3565b820191906000526020600020905b8154815290600101906020018083116105b657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661065b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061068282610c2a565b9050806001600160a01b0316836001600160a01b031614156106f05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610652565b336001600160a01b038216148061070c575061070c81336104df565b61077e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610652565b6107888383611442565b505050565b61079733826114b0565b6107b35760405162461bcd60e51b81526004016106529061325d565b6107888383836115a7565b60006107c983610ca1565b821061082b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610652565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60006002600a5414156108a95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610652565b6002600a55600b54600160b01b900460ff166108c457600080fd5b8160001080156108d45750600682105b6108dd57600080fd5b600b546122b9906108fa908490600160a01b900461ffff166132d4565b1061093a5760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b6044820152606401610652565b60005b82811015610a44576001600b60148282829054906101000a900461ffff1661096591906132ae565b92506101000a81548161ffff021916908361ffff16021790555061099c6109893390565b600b54600160a01b900461ffff16611752565b600b54604051681513d2d15394d1515160ba1b6020820152426029820152446049820152600160a01b90910460f01b6001600160f01b03191660698201526109f690606b015b604051602081830303815290604052611770565b600b54600160a01b900461ffff166000908152600c60205260409020805467ffffffffffffffff191667ffffffffffffffff9290921691909117905580610a3c81613488565b91505061093d565b50600190506001600a55919050565b600081610a6257506005610a80565b81600e1415610a7357506006610a80565b610a7d8484610e60565b90505b9392505050565b61078883838360405180602001604052806000815250611004565b606082610ac85750604080518082019091526002815261313560f11b6020820152610545565b82600e1415610af05750604080518082019091526002815261393560f11b6020820152610545565b8160011480610aff5750816003145b15610b2257506040805180820190915260018152603960f91b6020820152610545565b506040805180820190915260018152603160f91b602082015292915050565b6000610b4c60085490565b8210610baf5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610652565b60088281548110610bc257610bc26134f9565b90600052602060002001549050919050565b604080516001600160a01b038316602082015260609161054591015b6040516020818303038152906040528051906020012060001c6117a1565b60408051336020820152606091610c259101610bf0565b905090565b6000818152600260205260408120546001600160a01b0316806105455760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610652565b60006001600160a01b038216610d0c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610652565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610d525760405162461bcd60e51b815260040161065290613228565b610d5c6000611d4e565b565b600b546000906001600160a01b03163314610d8b5760405162461bcd60e51b815260040161065290613228565b50600b805460ff60b01b1916600160b01b8315150217905560015b919050565b604080516001600160a01b038316602082015260609161054591015b6040516020818303038152906040528051906020012060001c61119b565b6000610a808383603c805480602002602001604051908101604052809291908181526020018280548015610e5657602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610e275790505b5050505050611da0565b600080610eda846040610e7460018761340a565b610e7f9060066133eb565b610e8a906002613343565b610e9388611fb7565b67ffffffffffffffff16610ea791906132ec565b610eb191906134a3565b60405167434152445459504560c01b6020820152602881019290925260488201526068016109e2565b9050610ee8612710826134a3565b9050611267811015610efe576001915050610545565b611ebb811015610f12576002915050610545565b6124e5811015610f26576003915050610545565b5060049392505050565b60606001805461055a9061344d565b6001600160a01b038216331415610f985760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610652565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61100e33836114b0565b61102a5760405162461bcd60e51b81526004016106529061325d565b61103684848484611ff5565b50505050565b606081158061104b575081600e145b1561106d5750506040805180820190915260018152600b60fb1b602082015290565b601282600f8110611080576110806134f9565b01805461108c9061344d565b80601f01602080910402602001604051908101604052809291908181526020018280546110b89061344d565b80156111055780601f106110da57610100808354040283529160200191611105565b820191906000526020600020905b8154815290600101906020018083116110e857829003601f168201915b50505050509050919050565b6000600561111e83611fb7565b67ffffffffffffffff1661113291906134a3565b6105459060016132d4565b600b54606090600160a01b900461ffff1682111561117b57505060408051808201909152600a815269139bdd08135a5b9d195960b21b602082015290565b610545826117a1565b60408051336020820152606091610c259101610dc7565b606060006111aa836001610de5565b905060006111b9846002610de5565b905060006111c8856003610de5565b905060006111d7866004610de5565b905060006111e6876005610de5565b905060006111f38661103c565b602760016112038b60018b610a53565b61120d919061340a565b6006811061121d5761121d6134f9565b016112278761103c565b602760016112378d60028c610a53565b611241919061340a565b60068110611251576112516134f9565b0161125b8861103c565b6027600161126b8f60038d610a53565b611275919061340a565b60068110611285576112856134f9565b0160405160200161129b96959493929190612b83565b6040516020818303038152906040529050806112b68461103c565b602760016112c68c600489610a53565b6112d0919061340a565b600681106112e0576112e06134f9565b016112ea8561103c565b602760016112fa8e60058a610a53565b611304919061340a565b60068110611314576113146134f9565b016113266113218e611111565b612028565b60405160200161133b96959493929190612b05565b60408051601f1981840301815291905298975050505050505050565b600b546001600160a01b031633146113815760405162461bcd60e51b815260040161065290613228565b6001600160a01b0381166113e65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610652565b6113ef81611d4e565b50565b60006001600160e01b031982166380ac58cd60e01b148061142357506001600160e01b03198216635b5e139f60e01b145b8061054557506301ffc9a760e01b6001600160e01b0319831614610545565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061147782610c2a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166115295760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610652565b600061153483610c2a565b9050806001600160a01b0316846001600160a01b0316148061156f5750836001600160a01b0316611564846105dd565b6001600160a01b0316145b8061159f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166115ba82610c2a565b6001600160a01b0316146116225760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610652565b6001600160a01b0382166116845760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610652565b61168f838383612126565b61169a600082611442565b6001600160a01b03831660009081526003602052604081208054600192906116c390849061340a565b90915550506001600160a01b03821660009081526003602052604081208054600192906116f19084906132d4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61176c8282604051806020016040528060008152506121de565b5050565b6000816040516020016117839190612d19565b60408051601f19818403018152919052805160209091012092915050565b60408051600680825260e08201909252606091600091906020820160c08036833701905050905060005b60068110156118055760008282815181106117e8576117e86134f9565b6020908102919091010152806117fd81613488565b9150506117cb565b5060408051600580825260c082019092526000916020820160a08036833701905050905060006001808261183888611111565b9050600060405180610140016040528061011b815260200161353c61011b913960408051602081019091526000815290915060015b60058111611bbb5761187f8b82610de5565b8861188b60018461340a565b8151811061189b5761189b6134f9565b602090810291909101015260006118d68c838b6118b960018361340a565b815181106118c9576118c96134f9565b6020026020010151610a53565b905083600d6118e660018561340a565b600581106118f6576118f66134f9565b016119248b61190660018761340a565b81518110611916576119166134f9565b602002602001015184610aa2565b60128c61193260018861340a565b81518110611942576119426134f9565b6020026020010151600f811061195a5761195a6134f9565b01602d61196860018761340a565b60068110611978576119786134f9565b01868a1461199557604051806020016040528060008152506119cc565b6040518060400160405280601a81526020017f3c747370616e20636c6173733d2262223e2a3c2f747370616e3e0000000000008152505b6040516020016119e196959493929190612c62565b60408051601f1981840301815291905293506001805b83811015611a6f578a611a0b60018361340a565b81518110611a1b57611a1b6134f9565b60200260200101518b600186611a31919061340a565b81518110611a4157611a416134f9565b60200260200101511415611a5d5781611a5981613488565b9250505b80611a6781613488565b9150506119f7565b5087811115611a7c578097505b8a611a8860018461340a565b81518110611a9857611a986134f9565b602002602001018051809190611aad90613488565b905250868b611abd60018561340a565b81518110611acd57611acd6134f9565b60200260200101511115611b02578a611ae760018461340a565b81518110611af757611af76134f9565b602002602001015196505b6021611b0f60018461340a565b60068110611b1f57611b1f6134f9565b0154611b2b908a6132d4565b9850836037611b3b60018661340a565b60058110611b4b57611b4b6134f9565b0160128c611b5a60018861340a565b81518110611b6a57611b6a6134f9565b6020026020010151600f8110611b8257611b826134f9565b01604051602001611b9593929190612bec565b604051602081830303815290604052935050508080611bb390613488565b91505061186d565b5081604051602001611bcd9190612e94565b604051602081830303815290604052915080611beb6113218c611111565b611bf487612028565b611bfd87612028565b604051602001611c109493929190612ebe565b604051602081830303815290604052905060005b6004811015611c9a578160338260048110611c4157611c416134f9565b01611c648b8481518110611c5757611c576134f9565b6020026020010151612028565b604051602001611c7693929190612e0f565b60405160208183030381529060405291508080611c9290613488565b915050611c24565b5080611ca587612028565b611cbb8a600481518110611c5757611c576134f9565b604051602001611ccd93929190612d47565b60405160208183030381529060405290506000611d1c611cec8c612028565b611cf585612211565b84604051602001611d0893929190612ff3565b604051602081830303815290604052612211565b905080604051602001611d2f9190613141565b6040516020818303038152906040529950505050505050505050919050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080611e2584866040611db58360046132d4565b611dc09060066133eb565b611dcb906002613343565b611dd48a611fb7565b67ffffffffffffffff16611de891906132ec565b611df291906134a3565b6040516921b0b932273ab6b132b960b11b6020820152602a810193909352604a830191909152606a820152608a016109e2565b9050600083845183611e3791906134a3565b81518110611e4757611e476134f9565b602002602001015160ff1690506000601583611e6391906134a3565b9050600e811115611eb757603e8054611e7c90856134a3565b81548110611e8c57611e8c6134f9565b600091825260209182902091810490910154611eb491601f166101000a900460ff16836132d4565b91505b60138110611fad578060131415611f6457603e8054611ed690856134a3565b81548110611ee657611ee66134f9565b90600052602060002090602091828204019190069054906101000a900460ff1660ff16603d808054905085611f1b91906134a3565b81548110611f2b57611f2b6134f9565b600091825260209182902091810490910154611f5391601f166101000a900460ff16846133eb565b611f5d91906132d4565b9150611fad565b603d8054611f7290856134a3565b81548110611f8257611f826134f9565b600091825260209182902091810490910154611faa91601f166101000a900460ff16836133eb565b91505b5095945050505050565b6000816000108015611fcb57506122b88211155b15611ff1575061ffff166000908152600c602052604090205467ffffffffffffffff1690565b5090565b6120008484846115a7565b61200c84848484612377565b6110365760405162461bcd60e51b8152600401610652906131d6565b60608161204c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612076578061206081613488565b915061206f9050600a836132ec565b9150612050565b60008167ffffffffffffffff8111156120915761209161350f565b6040519080825280601f01601f1916602001820160405280156120bb576020820181803683370190505b5090505b841561159f576120d060018361340a565b91506120dd600a866134a3565b6120e89060306132d4565b60f81b8183815181106120fd576120fd6134f9565b60200101906001600160f81b031916908160001a90535061211f600a866132ec565b94506120bf565b6001600160a01b0383166121815761217c81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6121a4565b816001600160a01b0316836001600160a01b0316146121a4576121a48382612484565b6001600160a01b0382166121bb5761078881612521565b826001600160a01b0316826001600160a01b0316146107885761078882826125d0565b6121e88383612614565b6121f56000848484612377565b6107885760405162461bcd60e51b8152600401610652906131d6565b805160609080612231575050604080516020810190915260008152919050565b600060036122408360026132d4565b61224a91906132ec565b6122559060046133eb565b905060006122648260206132d4565b67ffffffffffffffff81111561227c5761227c61350f565b6040519080825280601f01601f1916602001820160405280156122a6576020820181803683370190505b5090506000604051806060016040528060408152602001613657604091399050600181016020830160005b86811015612332576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016122d1565b50600386066001811461234c576002811461235d57612369565b613d3d60f01b600119830152612369565b603d60f81b6000198301525b505050918152949350505050565b60006001600160a01b0384163b1561247957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123bb903390899088908890600401613186565b602060405180830381600087803b1580156123d557600080fd5b505af1925050508015612405575060408051601f3d908101601f191682019092526124029181019061297b565b60015b61245f573d808015612433576040519150601f19603f3d011682016040523d82523d6000602084013e612438565b606091505b5080516124575760405162461bcd60e51b8152600401610652906131d6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061159f565b506001949350505050565b6000600161249184610ca1565b61249b919061340a565b6000838152600760205260409020549091508082146124ee576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906125339060019061340a565b6000838152600960205260408120546008805493945090928490811061255b5761255b6134f9565b90600052602060002001549050806008838154811061257c5761257c6134f9565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806125b4576125b46134e3565b6001900381819060005260206000200160009055905550505050565b60006125db83610ca1565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661266a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610652565b6000818152600260205260409020546001600160a01b0316156126cf5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610652565b6126db60008383612126565b6001600160a01b03821660009081526003602052604081208054600192906127049084906132d4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b0381168114610da657600080fd5b80358015158114610da657600080fd5b60006020828403121561279b57600080fd5b610a8082612762565b600080604083850312156127b757600080fd5b6127c083612762565b91506127ce60208401612762565b90509250929050565b6000806000606084860312156127ec57600080fd5b6127f584612762565b925061280360208501612762565b9150604084013590509250925092565b6000806000806080858703121561282957600080fd5b61283285612762565b935061284060208601612762565b925060408501359150606085013567ffffffffffffffff8082111561286457600080fd5b818701915087601f83011261287857600080fd5b81358181111561288a5761288a61350f565b604051601f8201601f19908116603f011681019083821181831017156128b2576128b261350f565b816040528281528a60208487010111156128cb57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561290257600080fd5b61290b83612762565b91506127ce60208401612779565b6000806040838503121561292c57600080fd5b61293583612762565b946020939093013593505050565b60006020828403121561295557600080fd5b610a8082612779565b60006020828403121561297057600080fd5b8135610a8081613525565b60006020828403121561298d57600080fd5b8151610a8081613525565b6000602082840312156129aa57600080fd5b813561ffff81168114610a8057600080fd5b6000602082840312156129ce57600080fd5b5035919050565b600080604083850312156129e857600080fd5b50508035926020909101359150565b600080600060608486031215612a0c57600080fd5b505081359360208301359350604090920135919050565b60008151808452612a3b816020860160208601613421565b601f01601f19169290920160200192915050565b60008151612a61818560208601613421565b9290920192915050565b8054600090600181811c9080831680612a8557607f831692505b6020808410821415612aa757634e487b7160e01b600052602260045260246000fd5b818015612abb5760018114612acc57612af9565b60ff19861689528489019650612af9565b60008881526020902060005b86811015612af15781548b820152908501908301612ad8565b505084890196505b50505050505092915050565b60008751612b17818460208c01613421565b875190830190612b2b818360208c01613421565b612b3781830189612a6b565b9150508551612b4a818360208a01613421565b612b5681830187612a6b565b915050601560f91b81528351612b73816001840160208801613421565b0160010198975050505050505050565b60008751612b95818460208c01613421565b612ba181840189612a6b565b90508651612bb3818360208b01613421565b612bbf81830188612a6b565b9150508451612bd2818360208901613421565b612bde81830186612a6b565b9a9950505050505050505050565b60008451612bfe818460208901613421565b6f3d913a3930b4ba2fba3cb832911d101160811b908301908152612c256010820186612a6b565b711021b0b932111610113b30b63ab2911d101160711b81529050612c4c6012820185612a6b565b62089f4b60ea1b81526003019695505050505050565b60008751612c74818460208c01613421565b711e3a32bc3a103c1e911a97191a91103c9e9160711b908301908152612c9d6012820189612a6b565b68111031b630b9b99e9160b91b81528751909150612cc2816009840160208b01613421565b61111f60f11b60099290910191820152612ce8612ce2600b830188612a6b565b86612a6b565b90508351612cfa818360208801613421565b661e17ba32bc3a1f60c91b910190815260070198975050505050505050565b60008251612d2b818460208701613421565b694d657461537472696e6760b01b920191825250600a01919050565b60008451612d59818460208901613421565b80830190507f7b2274726169745f74797065223a20224e657420537472656e677468222c20228152683b30b63ab2911d101160b91b60208201528451612da6816029840160208901613421565b7f227d2c7b2274726169745f74797065223a20224a6f6b657273222c202276616c60299290910191820152653ab2911d101160d11b60498201528351612df381604f840160208801613421565b61227d60f01b604f929091019182015260510195945050505050565b60008451612e21818460208901613421565b7503d913a3930b4ba2fba3cb832911d10112a37ba30b6160551b908301908152612e4e6016820186612a6b565b6c111610113b30b63ab2911d101160991b81528451909150612e7781600d840160208801613421565b62089f4b60ea1b600d929091019182015260100195945050505050565b60008251612ea6818460208701613421565b651e17b9bb339f60d11b920191825250600601919050565b60008551612ed0818460208a01613421565b80830190507f7b2274726169745f74797065223a2022436f6d6d616e64696e6720436172642281526b1610113b30b63ab2911d101160a11b60208201528551612f2081602c840160208a01613421565b62089f4b60ea1b602c929091019182018190527f7b2274726169745f74797065223a20224d61782052616e6b2053657175656e63602f8301526d32911610113b30b63ab2911d101160911b604f8301528551612f8381605d850160208a01613421565b605d9201918201527f7b2274726169745f74797065223a20224d61782053756974652053657175656e60608201526e31b2911610113b30b63ab2911d101160891b6080820152612fe8612fd9608f830186612a4f565b62089f4b60ea1b815260030190565b979650505050505050565b6e7b226e616d65223a2022736574202360881b8152835160009061301e81600f850160208901613421565b7f222c20226465736372697074696f6e223a202253657473206f662072616e646f600f918401918201527f6d6973656420352063617264732c2067656e65726174656420616e642073746f602f8201527f726564206f6e2d636861696e2e204665656c206672656520746f207573652064604f8201527f65636b6b20696e20616e792077617920796f752077616e742e222c2022696d61606f8201527f6765223a2022646174613a696d6167652f7376672b786d6c3b6261736536342c608f82015284516130f38160af840160208901613421565b70222c2261747472696275746573223a205b60781b60af929091019182015283516131258160c0840160208801613421565b615d7d60f01b60c0929091019182015260c20195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161317981601d850160208701613421565b91909101601d0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131b990830184612a23565b9695505050505050565b602081526000610a806020830184612a23565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600061ffff8083168185168083038211156132cb576132cb6134b7565b01949350505050565b600082198211156132e7576132e76134b7565b500190565b6000826132fb576132fb6134cd565b500490565b600181815b8085111561333b578160001904821115613321576133216134b7565b8085161561332e57918102915b93841c9390800290613305565b509250929050565b6000610a80838360008261335957506001610545565b8161336657506000610545565b816001811461337c5760028114613386576133a2565b6001915050610545565b60ff841115613397576133976134b7565b50506001821b610545565b5060208310610133831016604e8410600b84101617156133c5575081810a610545565b6133cf8383613300565b80600019048211156133e3576133e36134b7565b029392505050565b6000816000190483118215151615613405576134056134b7565b500290565b60008282101561341c5761341c6134b7565b500390565b60005b8381101561343c578181015183820152602001613424565b838111156110365750506000910152565b600181811c9082168061346157607f821691505b6020821081141561348257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561349c5761349c6134b7565b5060010190565b6000826134b2576134b26134cd565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146113ef57600080fdfe3c7376672076696577426f783d2230203020313230203132302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222366356635663522202f3e3c7374796c653e2e727b20666f6e743a20372e373570782073657269663b2066696c6c3a207265643b207d2e627b20666f6e743a20372e373570782073657269663b2066696c6c3a20626c61636b3b7d2e726a7b20666f6e743a20372e37357078206d6f6e6f73706163653b2066696c6c3a207265643b207d2e626a7b20666f6e743a20372e37357078206d6f6e6f73706163653b2066696c6c3a20626c61636b3b7d3c2f7374796c653e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212200290c1f4801f4254bc23a0d62c3fe817021fa31f3c465a9ee2d6b1071508e7cc64736f6c63430008070033

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102115760003560e01c806378acea1e11610125578063b88d4fde116100ad578063d12397301161007c578063d1239730146104a2578063d4c8cba8146104b6578063e8de1a5e146104be578063e985e9c5146104d1578063f2fde38b1461050d57600080fd5b8063b88d4fde14610456578063bd97d4f714610469578063c7f5f3d21461047c578063c87b56dd1461048f57600080fd5b80638da5cb5b116100f45780638da5cb5b146103bf57806395d89b41146103d0578063a22cb465146103d8578063aa46a400146103eb578063af405b951461041357600080fd5b806378acea1e1461037357806380162d231461038657806385d909711461039957806388de1905146103ac57600080fd5b8063389d6ccf116101a85780635b93d83b116101775780635b93d83b1461032a5780635bae37c81461033d5780636352211e1461034557806370a0823114610358578063715018a61461036b57600080fd5b8063389d6ccf146102de57806342842e0e146102f1578063484af78a146103045780634f6ccce71461031757600080fd5b806318160ddd116101e457806318160ddd1461029357806323b872dd146102a55780632f745c59146102b8578063379607f5146102cb57600080fd5b806301ffc9a71461021657806306fdde031461023e578063081812fc14610253578063095ea7b31461027e575b600080fd5b61022961022436600461295e565b610520565b60405190151581526020015b60405180910390f35b61024661054b565b60405161023591906131c3565b6102666102613660046129bc565b6105dd565b6040516001600160a01b039091168152602001610235565b61029161028c366004612919565b610677565b005b6008545b604051908152602001610235565b6102916102b33660046127d7565b61078d565b6102976102c6366004612919565b6107be565b6102296102d93660046129bc565b610854565b6102976102ec3660046129f7565b610a53565b6102916102ff3660046127d7565b610a87565b6102466103123660046129d5565b610aa2565b6102976103253660046129bc565b610b41565b610246610338366004612789565b610bd4565b610246610c0e565b6102666103533660046129bc565b610c2a565b610297610366366004612789565b610ca1565b610291610d28565b610229610381366004612943565b610d5e565b610246610394366004612789565b610dab565b6102976103a73660046129d5565b610de5565b6102976103ba3660046129d5565b610e60565b600b546001600160a01b0316610266565b610246610f30565b6102916103e63660046128ef565b610f3f565b600b5461040090600160a01b900461ffff1681565b60405161ffff9091168152602001610235565b61043d610421366004612998565b600c6020526000908152604090205467ffffffffffffffff1681565b60405167ffffffffffffffff9091168152602001610235565b610291610464366004612813565b611004565b6102466104773660046129bc565b61103c565b61029761048a3660046129bc565b611111565b61024661049d3660046129bc565b61113d565b600b5461022990600160b01b900460ff1681565b610246611184565b6102466104cc3660046129bc565b61119b565b6102296104df3660046127a4565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b61029161051b366004612789565b611357565b60006001600160e01b0319821663780e9d6360e01b14806105455750610545826113f2565b92915050565b60606000805461055a9061344d565b80601f01602080910402602001604051908101604052809291908181526020018280546105869061344d565b80156105d35780601f106105a8576101008083540402835291602001916105d3565b820191906000526020600020905b8154815290600101906020018083116105b657829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b031661065b5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061068282610c2a565b9050806001600160a01b0316836001600160a01b031614156106f05760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b6064820152608401610652565b336001600160a01b038216148061070c575061070c81336104df565b61077e5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006064820152608401610652565b6107888383611442565b505050565b61079733826114b0565b6107b35760405162461bcd60e51b81526004016106529061325d565b6107888383836115a7565b60006107c983610ca1565b821061082b5760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b6064820152608401610652565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b60006002600a5414156108a95760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610652565b6002600a55600b54600160b01b900460ff166108c457600080fd5b8160001080156108d45750600682105b6108dd57600080fd5b600b546122b9906108fa908490600160a01b900461ffff166132d4565b1061093a5760405162461bcd60e51b815260206004820152601060248201526f151bdad95b881251081a5b9d985b1a5960821b6044820152606401610652565b60005b82811015610a44576001600b60148282829054906101000a900461ffff1661096591906132ae565b92506101000a81548161ffff021916908361ffff16021790555061099c6109893390565b600b54600160a01b900461ffff16611752565b600b54604051681513d2d15394d1515160ba1b6020820152426029820152446049820152600160a01b90910460f01b6001600160f01b03191660698201526109f690606b015b604051602081830303815290604052611770565b600b54600160a01b900461ffff166000908152600c60205260409020805467ffffffffffffffff191667ffffffffffffffff9290921691909117905580610a3c81613488565b91505061093d565b50600190506001600a55919050565b600081610a6257506005610a80565b81600e1415610a7357506006610a80565b610a7d8484610e60565b90505b9392505050565b61078883838360405180602001604052806000815250611004565b606082610ac85750604080518082019091526002815261313560f11b6020820152610545565b82600e1415610af05750604080518082019091526002815261393560f11b6020820152610545565b8160011480610aff5750816003145b15610b2257506040805180820190915260018152603960f91b6020820152610545565b506040805180820190915260018152603160f91b602082015292915050565b6000610b4c60085490565b8210610baf5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b6064820152608401610652565b60088281548110610bc257610bc26134f9565b90600052602060002001549050919050565b604080516001600160a01b038316602082015260609161054591015b6040516020818303038152906040528051906020012060001c6117a1565b60408051336020820152606091610c259101610bf0565b905090565b6000818152600260205260408120546001600160a01b0316806105455760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b6064820152608401610652565b60006001600160a01b038216610d0c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b6064820152608401610652565b506001600160a01b031660009081526003602052604090205490565b600b546001600160a01b03163314610d525760405162461bcd60e51b815260040161065290613228565b610d5c6000611d4e565b565b600b546000906001600160a01b03163314610d8b5760405162461bcd60e51b815260040161065290613228565b50600b805460ff60b01b1916600160b01b8315150217905560015b919050565b604080516001600160a01b038316602082015260609161054591015b6040516020818303038152906040528051906020012060001c61119b565b6000610a808383603c805480602002602001604051908101604052809291908181526020018280548015610e5657602002820191906000526020600020906000905b825461010083900a900460ff16815260206001928301818104948501949093039092029101808411610e275790505b5050505050611da0565b600080610eda846040610e7460018761340a565b610e7f9060066133eb565b610e8a906002613343565b610e9388611fb7565b67ffffffffffffffff16610ea791906132ec565b610eb191906134a3565b60405167434152445459504560c01b6020820152602881019290925260488201526068016109e2565b9050610ee8612710826134a3565b9050611267811015610efe576001915050610545565b611ebb811015610f12576002915050610545565b6124e5811015610f26576003915050610545565b5060049392505050565b60606001805461055a9061344d565b6001600160a01b038216331415610f985760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c6572000000000000006044820152606401610652565b3360008181526005602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b61100e33836114b0565b61102a5760405162461bcd60e51b81526004016106529061325d565b61103684848484611ff5565b50505050565b606081158061104b575081600e145b1561106d5750506040805180820190915260018152600b60fb1b602082015290565b601282600f8110611080576110806134f9565b01805461108c9061344d565b80601f01602080910402602001604051908101604052809291908181526020018280546110b89061344d565b80156111055780601f106110da57610100808354040283529160200191611105565b820191906000526020600020905b8154815290600101906020018083116110e857829003601f168201915b50505050509050919050565b6000600561111e83611fb7565b67ffffffffffffffff1661113291906134a3565b6105459060016132d4565b600b54606090600160a01b900461ffff1682111561117b57505060408051808201909152600a815269139bdd08135a5b9d195960b21b602082015290565b610545826117a1565b60408051336020820152606091610c259101610dc7565b606060006111aa836001610de5565b905060006111b9846002610de5565b905060006111c8856003610de5565b905060006111d7866004610de5565b905060006111e6876005610de5565b905060006111f38661103c565b602760016112038b60018b610a53565b61120d919061340a565b6006811061121d5761121d6134f9565b016112278761103c565b602760016112378d60028c610a53565b611241919061340a565b60068110611251576112516134f9565b0161125b8861103c565b6027600161126b8f60038d610a53565b611275919061340a565b60068110611285576112856134f9565b0160405160200161129b96959493929190612b83565b6040516020818303038152906040529050806112b68461103c565b602760016112c68c600489610a53565b6112d0919061340a565b600681106112e0576112e06134f9565b016112ea8561103c565b602760016112fa8e60058a610a53565b611304919061340a565b60068110611314576113146134f9565b016113266113218e611111565b612028565b60405160200161133b96959493929190612b05565b60408051601f1981840301815291905298975050505050505050565b600b546001600160a01b031633146113815760405162461bcd60e51b815260040161065290613228565b6001600160a01b0381166113e65760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610652565b6113ef81611d4e565b50565b60006001600160e01b031982166380ac58cd60e01b148061142357506001600160e01b03198216635b5e139f60e01b145b8061054557506301ffc9a760e01b6001600160e01b0319831614610545565b600081815260046020526040902080546001600160a01b0319166001600160a01b038416908117909155819061147782610c2a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b03166115295760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b6064820152608401610652565b600061153483610c2a565b9050806001600160a01b0316846001600160a01b0316148061156f5750836001600160a01b0316611564846105dd565b6001600160a01b0316145b8061159f57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166115ba82610c2a565b6001600160a01b0316146116225760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b6064820152608401610652565b6001600160a01b0382166116845760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b6064820152608401610652565b61168f838383612126565b61169a600082611442565b6001600160a01b03831660009081526003602052604081208054600192906116c390849061340a565b90915550506001600160a01b03821660009081526003602052604081208054600192906116f19084906132d4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b61176c8282604051806020016040528060008152506121de565b5050565b6000816040516020016117839190612d19565b60408051601f19818403018152919052805160209091012092915050565b60408051600680825260e08201909252606091600091906020820160c08036833701905050905060005b60068110156118055760008282815181106117e8576117e86134f9565b6020908102919091010152806117fd81613488565b9150506117cb565b5060408051600580825260c082019092526000916020820160a08036833701905050905060006001808261183888611111565b9050600060405180610140016040528061011b815260200161353c61011b913960408051602081019091526000815290915060015b60058111611bbb5761187f8b82610de5565b8861188b60018461340a565b8151811061189b5761189b6134f9565b602090810291909101015260006118d68c838b6118b960018361340a565b815181106118c9576118c96134f9565b6020026020010151610a53565b905083600d6118e660018561340a565b600581106118f6576118f66134f9565b016119248b61190660018761340a565b81518110611916576119166134f9565b602002602001015184610aa2565b60128c61193260018861340a565b81518110611942576119426134f9565b6020026020010151600f811061195a5761195a6134f9565b01602d61196860018761340a565b60068110611978576119786134f9565b01868a1461199557604051806020016040528060008152506119cc565b6040518060400160405280601a81526020017f3c747370616e20636c6173733d2262223e2a3c2f747370616e3e0000000000008152505b6040516020016119e196959493929190612c62565b60408051601f1981840301815291905293506001805b83811015611a6f578a611a0b60018361340a565b81518110611a1b57611a1b6134f9565b60200260200101518b600186611a31919061340a565b81518110611a4157611a416134f9565b60200260200101511415611a5d5781611a5981613488565b9250505b80611a6781613488565b9150506119f7565b5087811115611a7c578097505b8a611a8860018461340a565b81518110611a9857611a986134f9565b602002602001018051809190611aad90613488565b905250868b611abd60018561340a565b81518110611acd57611acd6134f9565b60200260200101511115611b02578a611ae760018461340a565b81518110611af757611af76134f9565b602002602001015196505b6021611b0f60018461340a565b60068110611b1f57611b1f6134f9565b0154611b2b908a6132d4565b9850836037611b3b60018661340a565b60058110611b4b57611b4b6134f9565b0160128c611b5a60018861340a565b81518110611b6a57611b6a6134f9565b6020026020010151600f8110611b8257611b826134f9565b01604051602001611b9593929190612bec565b604051602081830303815290604052935050508080611bb390613488565b91505061186d565b5081604051602001611bcd9190612e94565b604051602081830303815290604052915080611beb6113218c611111565b611bf487612028565b611bfd87612028565b604051602001611c109493929190612ebe565b604051602081830303815290604052905060005b6004811015611c9a578160338260048110611c4157611c416134f9565b01611c648b8481518110611c5757611c576134f9565b6020026020010151612028565b604051602001611c7693929190612e0f565b60405160208183030381529060405291508080611c9290613488565b915050611c24565b5080611ca587612028565b611cbb8a600481518110611c5757611c576134f9565b604051602001611ccd93929190612d47565b60405160208183030381529060405290506000611d1c611cec8c612028565b611cf585612211565b84604051602001611d0893929190612ff3565b604051602081830303815290604052612211565b905080604051602001611d2f9190613141565b6040516020818303038152906040529950505050505050505050919050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600080611e2584866040611db58360046132d4565b611dc09060066133eb565b611dcb906002613343565b611dd48a611fb7565b67ffffffffffffffff16611de891906132ec565b611df291906134a3565b6040516921b0b932273ab6b132b960b11b6020820152602a810193909352604a830191909152606a820152608a016109e2565b9050600083845183611e3791906134a3565b81518110611e4757611e476134f9565b602002602001015160ff1690506000601583611e6391906134a3565b9050600e811115611eb757603e8054611e7c90856134a3565b81548110611e8c57611e8c6134f9565b600091825260209182902091810490910154611eb491601f166101000a900460ff16836132d4565b91505b60138110611fad578060131415611f6457603e8054611ed690856134a3565b81548110611ee657611ee66134f9565b90600052602060002090602091828204019190069054906101000a900460ff1660ff16603d808054905085611f1b91906134a3565b81548110611f2b57611f2b6134f9565b600091825260209182902091810490910154611f5391601f166101000a900460ff16846133eb565b611f5d91906132d4565b9150611fad565b603d8054611f7290856134a3565b81548110611f8257611f826134f9565b600091825260209182902091810490910154611faa91601f166101000a900460ff16836133eb565b91505b5095945050505050565b6000816000108015611fcb57506122b88211155b15611ff1575061ffff166000908152600c602052604090205467ffffffffffffffff1690565b5090565b6120008484846115a7565b61200c84848484612377565b6110365760405162461bcd60e51b8152600401610652906131d6565b60608161204c5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612076578061206081613488565b915061206f9050600a836132ec565b9150612050565b60008167ffffffffffffffff8111156120915761209161350f565b6040519080825280601f01601f1916602001820160405280156120bb576020820181803683370190505b5090505b841561159f576120d060018361340a565b91506120dd600a866134a3565b6120e89060306132d4565b60f81b8183815181106120fd576120fd6134f9565b60200101906001600160f81b031916908160001a90535061211f600a866132ec565b94506120bf565b6001600160a01b0383166121815761217c81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6121a4565b816001600160a01b0316836001600160a01b0316146121a4576121a48382612484565b6001600160a01b0382166121bb5761078881612521565b826001600160a01b0316826001600160a01b0316146107885761078882826125d0565b6121e88383612614565b6121f56000848484612377565b6107885760405162461bcd60e51b8152600401610652906131d6565b805160609080612231575050604080516020810190915260008152919050565b600060036122408360026132d4565b61224a91906132ec565b6122559060046133eb565b905060006122648260206132d4565b67ffffffffffffffff81111561227c5761227c61350f565b6040519080825280601f01601f1916602001820160405280156122a6576020820181803683370190505b5090506000604051806060016040528060408152602001613657604091399050600181016020830160005b86811015612332576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016122d1565b50600386066001811461234c576002811461235d57612369565b613d3d60f01b600119830152612369565b603d60f81b6000198301525b505050918152949350505050565b60006001600160a01b0384163b1561247957604051630a85bd0160e11b81526001600160a01b0385169063150b7a02906123bb903390899088908890600401613186565b602060405180830381600087803b1580156123d557600080fd5b505af1925050508015612405575060408051601f3d908101601f191682019092526124029181019061297b565b60015b61245f573d808015612433576040519150601f19603f3d011682016040523d82523d6000602084013e612438565b606091505b5080516124575760405162461bcd60e51b8152600401610652906131d6565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061159f565b506001949350505050565b6000600161249184610ca1565b61249b919061340a565b6000838152600760205260409020549091508082146124ee576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906125339060019061340a565b6000838152600960205260408120546008805493945090928490811061255b5761255b6134f9565b90600052602060002001549050806008838154811061257c5761257c6134f9565b60009182526020808320909101929092558281526009909152604080822084905585825281205560088054806125b4576125b46134e3565b6001900381819060005260206000200160009055905550505050565b60006125db83610ca1565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661266a5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f20616464726573736044820152606401610652565b6000818152600260205260409020546001600160a01b0316156126cf5760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006044820152606401610652565b6126db60008383612126565b6001600160a01b03821660009081526003602052604081208054600192906127049084906132d4565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b80356001600160a01b0381168114610da657600080fd5b80358015158114610da657600080fd5b60006020828403121561279b57600080fd5b610a8082612762565b600080604083850312156127b757600080fd5b6127c083612762565b91506127ce60208401612762565b90509250929050565b6000806000606084860312156127ec57600080fd5b6127f584612762565b925061280360208501612762565b9150604084013590509250925092565b6000806000806080858703121561282957600080fd5b61283285612762565b935061284060208601612762565b925060408501359150606085013567ffffffffffffffff8082111561286457600080fd5b818701915087601f83011261287857600080fd5b81358181111561288a5761288a61350f565b604051601f8201601f19908116603f011681019083821181831017156128b2576128b261350f565b816040528281528a60208487010111156128cb57600080fd5b82602086016020830137600060208483010152809550505050505092959194509250565b6000806040838503121561290257600080fd5b61290b83612762565b91506127ce60208401612779565b6000806040838503121561292c57600080fd5b61293583612762565b946020939093013593505050565b60006020828403121561295557600080fd5b610a8082612779565b60006020828403121561297057600080fd5b8135610a8081613525565b60006020828403121561298d57600080fd5b8151610a8081613525565b6000602082840312156129aa57600080fd5b813561ffff81168114610a8057600080fd5b6000602082840312156129ce57600080fd5b5035919050565b600080604083850312156129e857600080fd5b50508035926020909101359150565b600080600060608486031215612a0c57600080fd5b505081359360208301359350604090920135919050565b60008151808452612a3b816020860160208601613421565b601f01601f19169290920160200192915050565b60008151612a61818560208601613421565b9290920192915050565b8054600090600181811c9080831680612a8557607f831692505b6020808410821415612aa757634e487b7160e01b600052602260045260246000fd5b818015612abb5760018114612acc57612af9565b60ff19861689528489019650612af9565b60008881526020902060005b86811015612af15781548b820152908501908301612ad8565b505084890196505b50505050505092915050565b60008751612b17818460208c01613421565b875190830190612b2b818360208c01613421565b612b3781830189612a6b565b9150508551612b4a818360208a01613421565b612b5681830187612a6b565b915050601560f91b81528351612b73816001840160208801613421565b0160010198975050505050505050565b60008751612b95818460208c01613421565b612ba181840189612a6b565b90508651612bb3818360208b01613421565b612bbf81830188612a6b565b9150508451612bd2818360208901613421565b612bde81830186612a6b565b9a9950505050505050505050565b60008451612bfe818460208901613421565b6f3d913a3930b4ba2fba3cb832911d101160811b908301908152612c256010820186612a6b565b711021b0b932111610113b30b63ab2911d101160711b81529050612c4c6012820185612a6b565b62089f4b60ea1b81526003019695505050505050565b60008751612c74818460208c01613421565b711e3a32bc3a103c1e911a97191a91103c9e9160711b908301908152612c9d6012820189612a6b565b68111031b630b9b99e9160b91b81528751909150612cc2816009840160208b01613421565b61111f60f11b60099290910191820152612ce8612ce2600b830188612a6b565b86612a6b565b90508351612cfa818360208801613421565b661e17ba32bc3a1f60c91b910190815260070198975050505050505050565b60008251612d2b818460208701613421565b694d657461537472696e6760b01b920191825250600a01919050565b60008451612d59818460208901613421565b80830190507f7b2274726169745f74797065223a20224e657420537472656e677468222c20228152683b30b63ab2911d101160b91b60208201528451612da6816029840160208901613421565b7f227d2c7b2274726169745f74797065223a20224a6f6b657273222c202276616c60299290910191820152653ab2911d101160d11b60498201528351612df381604f840160208801613421565b61227d60f01b604f929091019182015260510195945050505050565b60008451612e21818460208901613421565b7503d913a3930b4ba2fba3cb832911d10112a37ba30b6160551b908301908152612e4e6016820186612a6b565b6c111610113b30b63ab2911d101160991b81528451909150612e7781600d840160208801613421565b62089f4b60ea1b600d929091019182015260100195945050505050565b60008251612ea6818460208701613421565b651e17b9bb339f60d11b920191825250600601919050565b60008551612ed0818460208a01613421565b80830190507f7b2274726169745f74797065223a2022436f6d6d616e64696e6720436172642281526b1610113b30b63ab2911d101160a11b60208201528551612f2081602c840160208a01613421565b62089f4b60ea1b602c929091019182018190527f7b2274726169745f74797065223a20224d61782052616e6b2053657175656e63602f8301526d32911610113b30b63ab2911d101160911b604f8301528551612f8381605d850160208a01613421565b605d9201918201527f7b2274726169745f74797065223a20224d61782053756974652053657175656e60608201526e31b2911610113b30b63ab2911d101160891b6080820152612fe8612fd9608f830186612a4f565b62089f4b60ea1b815260030190565b979650505050505050565b6e7b226e616d65223a2022736574202360881b8152835160009061301e81600f850160208901613421565b7f222c20226465736372697074696f6e223a202253657473206f662072616e646f600f918401918201527f6d6973656420352063617264732c2067656e65726174656420616e642073746f602f8201527f726564206f6e2d636861696e2e204665656c206672656520746f207573652064604f8201527f65636b6b20696e20616e792077617920796f752077616e742e222c2022696d61606f8201527f6765223a2022646174613a696d6167652f7376672b786d6c3b6261736536342c608f82015284516130f38160af840160208901613421565b70222c2261747472696275746573223a205b60781b60af929091019182015283516131258160c0840160208801613421565b615d7d60f01b60c0929091019182015260c20195945050505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161317981601d850160208701613421565b91909101601d0192915050565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131b990830184612a23565b9695505050505050565b602081526000610a806020830184612a23565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b600061ffff8083168185168083038211156132cb576132cb6134b7565b01949350505050565b600082198211156132e7576132e76134b7565b500190565b6000826132fb576132fb6134cd565b500490565b600181815b8085111561333b578160001904821115613321576133216134b7565b8085161561332e57918102915b93841c9390800290613305565b509250929050565b6000610a80838360008261335957506001610545565b8161336657506000610545565b816001811461337c5760028114613386576133a2565b6001915050610545565b60ff841115613397576133976134b7565b50506001821b610545565b5060208310610133831016604e8410600b84101617156133c5575081810a610545565b6133cf8383613300565b80600019048211156133e3576133e36134b7565b029392505050565b6000816000190483118215151615613405576134056134b7565b500290565b60008282101561341c5761341c6134b7565b500390565b60005b8381101561343c578181015183820152602001613424565b838111156110365750506000910152565b600181811c9082168061346157607f821691505b6020821081141561348257634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561349c5761349c6134b7565b5060010190565b6000826134b2576134b26134cd565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b0319811681146113ef57600080fdfe3c7376672076696577426f783d2230203020313230203132302220786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f737667223e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d222366356635663522202f3e3c7374796c653e2e727b20666f6e743a20372e373570782073657269663b2066696c6c3a207265643b207d2e627b20666f6e743a20372e373570782073657269663b2066696c6c3a20626c61636b3b7d2e726a7b20666f6e743a20372e37357078206d6f6e6f73706163653b2066696c6c3a207265643b207d2e626a7b20666f6e743a20372e37357078206d6f6e6f73706163653b2066696c6c3a20626c61636b3b7d3c2f7374796c653e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa26469706673582212200290c1f4801f4254bc23a0d62c3fe817021fa31f3c465a9ee2d6b1071508e7cc64736f6c63430008070033

Deployed Bytecode Sourcemap

45888:14098:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34709:224;;;;;;:::i;:::-;;:::i;:::-;;;20506:14:1;;20499:22;20481:41;;20469:2;20454:18;34709:224:0;;;;;;;;21614:100;;;:::i;:::-;;;;;;;:::i;23173:221::-;;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;19804:32:1;;;19786:51;;19774:2;19759:18;23173:221:0;19640:203:1;22696:411:0;;;;;;:::i;:::-;;:::i;:::-;;35349:113;35437:10;:17;35349:113;;;28592:25:1;;;28580:2;28565:18;35349:113:0;28446:177:1;24063:339:0;;;;;;:::i;:::-;;:::i;35017:256::-;;;;;;:::i;:::-;;:::i;47253:797::-;;;;;;:::i;:::-;;:::i;48794:275::-;;;;;;:::i;:::-;;:::i;24473:185::-;;;;;;:::i;:::-;;:::i;49077:297::-;;;;;;:::i;:::-;;:::i;35539:233::-;;;;;;:::i;:::-;;:::i;55330:183::-;;;;;;:::i;:::-;;:::i;55521:::-;;;:::i;21308:239::-;;;;;;:::i;:::-;;:::i;21038:208::-;;;;;;:::i;:::-;;:::i;45194:94::-;;;:::i;47118:127::-;;;;;;:::i;:::-;;:::i;55712:187::-;;;;;;:::i;:::-;;:::i;48058:175::-;;;;;;:::i;:::-;;:::i;48241:545::-;;;;;;:::i;:::-;;:::i;44543:87::-;44616:6;;-1:-1:-1;;;;;44616:6:0;44543:87;;21783:104;;;:::i;23466:295::-;;;;;;:::i;:::-;;:::i;45956:27::-;;;;;-1:-1:-1;;;45956:27:0;;;;;;;;;28427:6:1;28415:19;;;28397:38;;28385:2;28370:18;45956:27:0;28253:188:1;46028:44:0;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;28802:18:1;28790:31;;;28772:50;;28760:2;28745:18;46028:44:0;28628:200:1;24729:328:0;;;;;;:::i;:::-;;:::i;49565:159::-;;;;;;:::i;:::-;;:::i;49382:175::-;;;;;;:::i;:::-;;:::i;56102:223::-;;;;;;:::i;:::-;;:::i;45990:31::-;;;;;-1:-1:-1;;;45990:31:0;;;;;;55907:187;;;:::i;49732:1225::-;;;;;;:::i;:::-;;:::i;23832:164::-;;;;;;:::i;:::-;-1:-1:-1;;;;;23953:25:0;;;23929:4;23953:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;23832:164;45443:192;;;;;;:::i;:::-;;:::i;34709:224::-;34811:4;-1:-1:-1;;;;;;34835:50:0;;-1:-1:-1;;;34835:50:0;;:90;;;34889:36;34913:11;34889:23;:36::i;:::-;34828:97;34709:224;-1:-1:-1;;34709:224:0:o;21614:100::-;21668:13;21701:5;21694:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21614:100;:::o;23173:221::-;23249:7;26656:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26656:16:0;23269:73;;;;-1:-1:-1;;;23269:73:0;;25333:2:1;23269:73:0;;;25315:21:1;25372:2;25352:18;;;25345:30;25411:34;25391:18;;;25384:62;-1:-1:-1;;;25462:18:1;;;25455:42;25514:19;;23269:73:0;;;;;;;;;-1:-1:-1;23362:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;23362:24:0;;23173:221::o;22696:411::-;22777:13;22793:23;22808:7;22793:14;:23::i;:::-;22777:39;;22841:5;-1:-1:-1;;;;;22835:11:0;:2;-1:-1:-1;;;;;22835:11:0;;;22827:57;;;;-1:-1:-1;;;22827:57:0;;26862:2:1;22827:57:0;;;26844:21:1;26901:2;26881:18;;;26874:30;26940:34;26920:18;;;26913:62;-1:-1:-1;;;26991:18:1;;;26984:31;27032:19;;22827:57:0;26660:397:1;22827:57:0;16177:10;-1:-1:-1;;;;;22919:21:0;;;;:62;;-1:-1:-1;22944:37:0;22961:5;16177:10;23832:164;:::i;22944:37::-;22897:168;;;;-1:-1:-1;;;22897:168:0;;23726:2:1;22897:168:0;;;23708:21:1;23765:2;23745:18;;;23738:30;23804:34;23784:18;;;23777:62;23875:26;23855:18;;;23848:54;23919:19;;22897:168:0;23524:420:1;22897:168:0;23078:21;23087:2;23091:7;23078:8;:21::i;:::-;22766:341;22696:411;;:::o;24063:339::-;24258:41;16177:10;24291:7;24258:18;:41::i;:::-;24250:103;;;;-1:-1:-1;;;24250:103:0;;;;;;;:::i;:::-;24366:28;24376:4;24382:2;24386:7;24366:9;:28::i;35017:256::-;35114:7;35150:23;35167:5;35150:16;:23::i;:::-;35142:5;:31;35134:87;;;;-1:-1:-1;;;35134:87:0;;20959:2:1;35134:87:0;;;20941:21:1;20998:2;20978:18;;;20971:30;21037:34;21017:18;;;21010:62;-1:-1:-1;;;21088:18:1;;;21081:41;21139:19;;35134:87:0;20757:407:1;35134:87:0;-1:-1:-1;;;;;;35239:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;35017:256::o;47253:797::-;47312:4;42602:1;43198:7;;:19;;43190:63;;;;-1:-1:-1;;;43190:63:0;;28095:2:1;43190:63:0;;;28077:21:1;28134:2;28114:18;;;28107:30;28173:33;28153:18;;;28146:61;28224:18;;43190:63:0;27893:355:1;43190:63:0;42602:1;43331:7;:18;47337:11:::1;::::0;-1:-1:-1;;;47337:11:0;::::1;;;47329:20;;;::::0;::::1;;47372:5;47368:1;:9;:22;;;;;47389:1;47381:5;:9;47368:22;47360:31;;;::::0;::::1;;47428:9;::::0;47448:4:::1;::::0;47428:17:::1;::::0;47440:5;;-1:-1:-1;;;47428:9:0;::::1;;;:17;:::i;:::-;:24;47402:71;;;::::0;-1:-1:-1;;;47402:71:0;;26107:2:1;47402:71:0::1;::::0;::::1;26089:21:1::0;26146:2;26126:18;;;26119:30;-1:-1:-1;;;26165:18:1;;;26158:46;26221:18;;47402:71:0::1;25905:340:1::0;47402:71:0::1;47489:9;47484:537;47508:5;47504:1;:9;47484:537;;;47548:1;47535:9;;:14;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;47564:43;47574:12;16177:10:::0;;16097:98;47574:12:::1;47596:9;::::0;-1:-1:-1;;;47596:9:0;::::1;;;47564;:43::i;:::-;47916:9;::::0;47734:218:::1;::::0;-1:-1:-1;;;47734:218:0::1;::::0;::::1;18520:24:1::0;47823:15:0::1;18560:11:1::0;;;18553:27;47869:16:0::1;18596:12:1::0;;;18589:28;-1:-1:-1;;;47916:9:0;;::::1;18673:3:1::0;18651:16;-1:-1:-1;;;;;;18651:16:1;18633:12;;;18626:60;47672:322:0::1;::::0;18702:12:1;;47734:218:0::1;;;;;;;;;;;;;47672:6;:322::i;:::-;47634:9;::::0;-1:-1:-1;;;47634:9:0;::::1;;;47622:22;::::0;;;:11:::1;:22;::::0;;;;:387;;-1:-1:-1;;47622:387:0::1;;::::0;;;::::1;::::0;;;::::1;::::0;;47515:3;::::1;::::0;::::1;:::i;:::-;;;;47484:537;;;;48038:4;48031:11;;42558:1:::0;43510:7;:22;47253:797;;-1:-1:-1;47253:797:0:o;48794:275::-;48927:7;48951:13;48947:27;;-1:-1:-1;48973:1:0;48966:8;;48947:27;48989:8;49001:2;48989:14;48985:28;;;-1:-1:-1;49012:1:0;49005:8;;48985:28;49031:30;49045:7;49054:6;49031:13;:30::i;:::-;49024:37;;48794:275;;;;;;:::o;24473:185::-;24611:39;24628:4;24634:2;24638:7;24611:39;;;;;;;;;;;;:16;:39::i;49077:297::-;49185:13;49220;49216:30;;-1:-1:-1;49235:11:0;;;;;;;;;;;;-1:-1:-1;;;49235:11:0;;;;;;49216:30;49261:8;49273:2;49261:14;49257:31;;;-1:-1:-1;49277:11:0;;;;;;;;;;;;-1:-1:-1;;;49277:11:0;;;;;;49257:31;49303:8;49315:1;49303:13;:30;;;;49320:8;49332:1;49320:13;49303:30;49299:46;;;-1:-1:-1;49335:10:0;;;;;;;;;;;;-1:-1:-1;;;49335:10:0;;;;;;49299:46;-1:-1:-1;49356:10:0;;;;;;;;;;;;-1:-1:-1;;;49356:10:0;;;;49077:297;;;;:::o;35539:233::-;35614:7;35650:30;35437:10;:17;;35349:113;35650:30;35642:5;:38;35634:95;;;;-1:-1:-1;;;35634:95:0;;27682:2:1;35634:95:0;;;27664:21:1;27721:2;27701:18;;;27694:30;27760:34;27740:18;;;27733:62;-1:-1:-1;;;27811:18:1;;;27804:42;27863:19;;35634:95:0;27480:408:1;35634:95:0;35747:10;35758:5;35747:17;;;;;;;;:::i;:::-;;;;;;;;;35740:24;;35539:233;;;:::o;55330:183::-;55487:15;;;-1:-1:-1;;;;;19804:32:1;;55487:15:0;;;19786:51:1;55418:13:0;;55456:49;;19759:18:1;55487:15:0;;;;;;;;;;;;;55477:26;;;;;;55469:35;;55456:12;:49::i;55521:183::-;55669:24;;;16177:10;55669:24;;;19786:51:1;55600:13:0;;55638:58;;19759:18:1;55669:24:0;19640:203:1;55638:58:0;55631:65;;55521:183;:::o;21308:239::-;21380:7;21416:16;;;:7;:16;;;;;;-1:-1:-1;;;;;21416:16:0;21451:19;21443:73;;;;-1:-1:-1;;;21443:73:0;;24562:2:1;21443:73:0;;;24544:21:1;24601:2;24581:18;;;24574:30;24640:34;24620:18;;;24613:62;-1:-1:-1;;;24691:18:1;;;24684:39;24740:19;;21443:73:0;24360:405:1;21038:208:0;21110:7;-1:-1:-1;;;;;21138:19:0;;21130:74;;;;-1:-1:-1;;;21130:74:0;;24151:2:1;21130:74:0;;;24133:21:1;24190:2;24170:18;;;24163:30;24229:34;24209:18;;;24202:62;-1:-1:-1;;;24280:18:1;;;24273:40;24330:19;;21130:74:0;23949:406:1;21130:74:0;-1:-1:-1;;;;;;21222:16:0;;;;;:9;:16;;;;;;;21038:208::o;45194:94::-;44616:6;;-1:-1:-1;;;;;44616:6:0;16177:10;44763:23;44755:68;;;;-1:-1:-1;;;44755:68:0;;;;;;;:::i;:::-;45259:21:::1;45277:1;45259:9;:21::i;:::-;45194:94::o:0;47118:127::-;44616:6;;47179:4;;-1:-1:-1;;;;;44616:6:0;16177:10;44763:23;44755:68;;;;-1:-1:-1;;;44755:68:0;;;;;;;:::i;:::-;-1:-1:-1;47196:11:0::1;:19:::0;;-1:-1:-1;;;;47196:19:0::1;-1:-1:-1::0;;;47196:19:0;::::1;;;;::::0;;-1:-1:-1;44834:1:0::1;47118:127:::0;;;:::o;55712:187::-;55873:15;;;-1:-1:-1;;;;;19804:32:1;;55873:15:0;;;19786:51:1;55804:13:0;;55842:49;;19759:18:1;55873:15:0;;;;;;;;;;;;;55863:26;;;;;;55855:35;;55842:12;:49::i;48058:175::-;48164:7;48196:29;48202:7;48211:6;48219:5;48196:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:29::i;48241:545::-;48345:7;;48385:234;48503:7;48572:2;48558:8;48565:1;48558:6;:8;:::i;:::-;48555:12;;:1;:12;:::i;:::-;48551:17;;:1;:17;:::i;:::-;48533:16;48541:7;48533;:16::i;:::-;:36;;;;;;:::i;:::-;:41;;;;:::i;:::-;48431:162;;-1:-1:-1;;;48431:162:0;;;16392:23:1;16431:11;;;16424:27;;;;16467:12;;;16460:28;16504:12;;48431:162:0;16134:388:1;48385:234:0;48370:249;-1:-1:-1;48639:12:0;48646:5;48370:249;48639:12;:::i;:::-;48632:19;;48673:4;48666;:11;48662:25;;;48686:1;48679:8;;;;;48662:25;48709:4;48702;:11;48698:25;;;48722:1;48715:8;;;;;48698:25;48745:4;48738;:11;48734:25;;;48758:1;48751:8;;;;;48734:25;-1:-1:-1;48777:1:0;;48241:545;-1:-1:-1;;;48241:545:0:o;21783:104::-;21839:13;21872:7;21865:14;;;;;:::i;23466:295::-;-1:-1:-1;;;;;23569:24:0;;16177:10;23569:24;;23561:62;;;;-1:-1:-1;;;23561:62:0;;22959:2:1;23561:62:0;;;22941:21:1;22998:2;22978:18;;;22971:30;23037:27;23017:18;;;23010:55;23082:18;;23561:62:0;22757:349:1;23561:62:0;16177:10;23636:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;23636:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;23636:53:0;;;;;;;;;;23705:48;;20481:41:1;;;23636:42:0;;16177:10;23705:48;;20454:18:1;23705:48:0;;;;;;;23466:295;;:::o;24729:328::-;24904:41;16177:10;24937:7;24904:18;:41::i;:::-;24896:103;;;;-1:-1:-1;;;24896:103:0;;;;;;;:::i;:::-;25010:39;25024:4;25030:2;25034:7;25043:5;25010:13;:39::i;:::-;24729:328;;;;:::o;49565:159::-;49621:13;49651:9;;;:23;;;49664:4;49672:2;49664:10;49651:23;49647:39;;;-1:-1:-1;;49676:10:0;;;;;;;;;;;;-1:-1:-1;;;49676:10:0;;;;;49565:159::o;49647:39::-;49704:6;49711:4;49704:12;;;;;;;:::i;:::-;;49697:19;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49565:159;;;:::o;49382:175::-;49482:7;49543:1;49523:16;49531:7;49523;:16::i;:::-;49515:25;;:29;;;;:::i;:::-;49514:35;;49548:1;49514:35;:::i;56102:223::-;56248:9;;56203:13;;-1:-1:-1;;;56248:9:0;;;;56238:19;;56234:44;;;-1:-1:-1;;56259:19:0;;;;;;;;;;;;-1:-1:-1;;;56259:19:0;;;;;56102:223::o;56234:44::-;56296:21;56309:7;56296:12;:21::i;55907:187::-;56059:24;;;16177:10;56059:24;;;19786:51:1;55990:13:0;;56028:58;;19759:18:1;56059:24:0;19640:203:1;49732:1225:0;49792:13;49818;49834:27;49850:7;49859:1;49834:15;:27::i;:::-;49818:43;;49872:13;49888:27;49904:7;49913:1;49888:15;:27::i;:::-;49872:43;;49926:13;49942:27;49958:7;49967:1;49942:15;:27::i;:::-;49926:43;;49980:13;49996:27;50012:7;50021:1;49996:15;:27::i;:::-;49980:43;;50034:13;50050:27;50066:7;50075:1;50050:15;:27::i;:::-;50034:43;;50090:20;50169:18;50181:5;50169:11;:18::i;:::-;50206:6;50252:1;50213:36;50231:7;50240:1;50243:5;50213:17;:36::i;:::-;:40;;;;:::i;:::-;50206:48;;;;;;;:::i;:::-;;50273:18;50285:5;50273:11;:18::i;:::-;50310:6;50356:1;50317:36;50335:7;50344:1;50347:5;50317:17;:36::i;:::-;:40;;;;:::i;:::-;50310:48;;;;;;;:::i;:::-;;50377:18;50389:5;50377:11;:18::i;:::-;50414:6;50460:1;50421:36;50439:7;50448:1;50451:5;50421:17;:36::i;:::-;:40;;;;:::i;:::-;50414:48;;;;;;;:::i;:::-;;50134:343;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50090:398;;50592:6;50621:18;50633:5;50621:11;:18::i;:::-;50662:6;50708:1;50669:36;50687:7;50696:1;50699:5;50669:17;:36::i;:::-;:40;;;;:::i;:::-;50662:48;;;;;;;:::i;:::-;;50733:18;50745:5;50733:11;:18::i;:::-;50774:6;50820:1;50781:36;50799:7;50808:1;50811:5;50781:17;:36::i;:::-;:40;;;;:::i;:::-;50774:48;;;;;;;:::i;:::-;;50871:44;50880:34;50906:7;50880:25;:34::i;:::-;50871:8;:44::i;:::-;50553:381;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;50553:381:0;;;;;;;;;;49732:1225;-1:-1:-1;;;;;;;;49732:1225:0:o;45443:192::-;44616:6;;-1:-1:-1;;;;;44616:6:0;16177:10;44763:23;44755:68;;;;-1:-1:-1;;;44755:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;45532:22:0;::::1;45524:73;;;::::0;-1:-1:-1;;;45524:73:0;;21790:2:1;45524:73:0::1;::::0;::::1;21772:21:1::0;21829:2;21809:18;;;21802:30;21868:34;21848:18;;;21841:62;-1:-1:-1;;;21919:18:1;;;21912:36;21965:19;;45524:73:0::1;21588:402:1::0;45524:73:0::1;45608:19;45618:8;45608:9;:19::i;:::-;45443:192:::0;:::o;20669:305::-;20771:4;-1:-1:-1;;;;;;20808:40:0;;-1:-1:-1;;;20808:40:0;;:105;;-1:-1:-1;;;;;;;20865:48:0;;-1:-1:-1;;;20865:48:0;20808:105;:158;;;-1:-1:-1;;;;;;;;;;19284:40:0;;;20930:36;19175:157;30549:174;30624:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;30624:29:0;-1:-1:-1;;;;;30624:29:0;;;;;;;;:24;;30678:23;30624:24;30678:14;:23::i;:::-;-1:-1:-1;;;;;30669:46:0;;;;;;;;;;;30549:174;;:::o;26861:348::-;26954:4;26656:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26656:16:0;26971:73;;;;-1:-1:-1;;;26971:73:0;;23313:2:1;26971:73:0;;;23295:21:1;23352:2;23332:18;;;23325:30;23391:34;23371:18;;;23364:62;-1:-1:-1;;;23442:18:1;;;23435:42;23494:19;;26971:73:0;23111:408:1;26971:73:0;27055:13;27071:23;27086:7;27071:14;:23::i;:::-;27055:39;;27124:5;-1:-1:-1;;;;;27113:16:0;:7;-1:-1:-1;;;;;27113:16:0;;:51;;;;27157:7;-1:-1:-1;;;;;27133:31:0;:20;27145:7;27133:11;:20::i;:::-;-1:-1:-1;;;;;27133:31:0;;27113:51;:87;;;-1:-1:-1;;;;;;23953:25:0;;;23929:4;23953:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;27168:32;27105:96;26861:348;-1:-1:-1;;;;26861:348:0:o;29853:578::-;30012:4;-1:-1:-1;;;;;29985:31:0;:23;30000:7;29985:14;:23::i;:::-;-1:-1:-1;;;;;29985:31:0;;29977:85;;;;-1:-1:-1;;;29977:85:0;;26452:2:1;29977:85:0;;;26434:21:1;26491:2;26471:18;;;26464:30;26530:34;26510:18;;;26503:62;-1:-1:-1;;;26581:18:1;;;26574:39;26630:19;;29977:85:0;26250:405:1;29977:85:0;-1:-1:-1;;;;;30081:16:0;;30073:65;;;;-1:-1:-1;;;30073:65:0;;22554:2:1;30073:65:0;;;22536:21:1;22593:2;22573:18;;;22566:30;22632:34;22612:18;;;22605:62;-1:-1:-1;;;22683:18:1;;;22676:34;22727:19;;30073:65:0;22352:400:1;30073:65:0;30151:39;30172:4;30178:2;30182:7;30151:20;:39::i;:::-;30255:29;30272:1;30276:7;30255:8;:29::i;:::-;-1:-1:-1;;;;;30297:15:0;;;;;;:9;:15;;;;;:20;;30316:1;;30297:15;:20;;30316:1;;30297:20;:::i;:::-;;;;-1:-1:-1;;;;;;;30328:13:0;;;;;;:9;:13;;;;;:18;;30345:1;;30328:13;:18;;30345:1;;30328:18;:::i;:::-;;;;-1:-1:-1;;30357:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;30357:21:0;-1:-1:-1;;;;;30357:21:0;;;;;;;;;30396:27;;30357:16;;30396:27;;;;;;;29853:578;;;:::o;27551:110::-;27627:26;27637:2;27641:7;27627:26;;;;;;;;;;;;:9;:26::i;:::-;27551:110;;:::o;58104:152::-;58164:7;58226:5;58209:37;;;;;;;;:::i;:::-;;;;-1:-1:-1;;58209:37:0;;;;;;;;;58199:48;;58209:37;58199:48;;;;;58104:152;-1:-1:-1;;58104:152:0:o;50965:4357::-;51109:16;;;51123:1;51109:16;;;;;;;;;51053:13;;51084:22;;51109:16;;;;;;;;;;;-1:-1:-1;51109:16:0;51084:41;;51141:9;51136:44;51160:1;51156;:5;51136:44;;;51179:1;51168:5;51174:1;51168:8;;;;;;;;:::i;:::-;;;;;;;;;;:12;51163:3;;;;:::i;:::-;;;;51136:44;;;-1:-1:-1;51221:16:0;;;51235:1;51221:16;;;;;;;;;51193:25;;51221:16;;;;;;;;;;-1:-1:-1;;51193:44:0;-1:-1:-1;51248:16:0;51298:1;;51248:16;51366:34;51392:7;51366:25;:34::i;:::-;51341:59;;51413:30;:318;;;;;;;;;;;;;;;;;51744:29;;;;;;;;;:24;:29;;51413:318;;-1:-1:-1;51803:1:0;51786:1483;51811:1;51806;:6;51786:1483;;51852:27;51868:7;51877:1;51852:15;:27::i;:::-;51834:8;51843:5;51847:1;51843;:5;:::i;:::-;51834:15;;;;;;;;:::i;:::-;;;;;;;;;;:45;51894:16;51913:46;51931:7;51940:1;51943:8;51952:5;51956:1;51940;51952:5;:::i;:::-;51943:15;;;;;;;;:::i;:::-;;;;;;;51913:17;:46::i;:::-;51894:65;-1:-1:-1;52046:3:0;52115:2;52118:5;52122:1;52118;:5;:::i;:::-;52115:9;;;;;;;:::i;:::-;;52181:41;52196:8;52205:5;52209:1;52205;:5;:::i;:::-;52196:15;;;;;;;;:::i;:::-;;;;;;;52213:8;52181:14;:41::i;:::-;52272:6;52279:8;52288:5;52292:1;52288;:5;:::i;:::-;52279:15;;;;;;;;:::i;:::-;;;;;;;52272:23;;;;;;;:::i;:::-;;52318:13;52332:12;52343:1;52332:8;:12;:::i;:::-;52318:27;;;;;;;:::i;:::-;;52386:1;52368:14;:19;:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52007:467;;;;;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;52007:467:0;;;;;;;;;;-1:-1:-1;52518:1:0;;52534:110;52558:1;52554;:5;52534:110;;;52608:8;52617:5;52621:1;52617;:5;:::i;:::-;52608:15;;;;;;;;:::i;:::-;;;;;;;52589:8;52602:1;52598;:5;;;;:::i;:::-;52589:15;;;;;;;;:::i;:::-;;;;;;;:34;52585:43;;;52625:3;;;;:::i;:::-;;;;52585:43;52561:3;;;;:::i;:::-;;;;52534:110;;;;52666:8;52662:1;:12;52658:65;;;52706:1;52695:12;;52658:65;52737:5;52743:12;52754:1;52743:8;:12;:::i;:::-;52737:19;;;;;;;;:::i;:::-;;;;;;:21;;;;;;;;:::i;:::-;;;-1:-1:-1;52799:8:0;52777:5;52783:12;52794:1;52783:8;:12;:::i;:::-;52777:19;;;;;;;;:::i;:::-;;;;;;;:30;52773:101;;;52839:5;52845:12;52856:1;52845:8;:12;:::i;:::-;52839:19;;;;;;;;:::i;:::-;;;;;;;52828:30;;52773:101;52900:9;52910:12;52921:1;52910:8;:12;:::i;:::-;52900:23;;;;;;;:::i;:::-;;;52888:35;;;;:::i;:::-;;-1:-1:-1;53017:10:0;53091:8;53100:5;53104:1;53100;:5;:::i;:::-;53091:15;;;;;;;:::i;:::-;;53172:6;53179:8;53188:5;53192:1;53188;:5;:::i;:::-;53179:15;;;;;;;;:::i;:::-;;;;;;;53172:23;;;;;;;:::i;:::-;;52978:264;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52940:317;;51819:1450;;51814:3;;;;;:::i;:::-;;;;51786:1483;;;;53311:3;53294:31;;;;;;;;:::i;:::-;;;;;;;;;;;;;53281:45;;53408:10;53502:44;53511:34;53537:7;53511:25;:34::i;53502:44::-;53656:18;53665:8;53656;:18::i;:::-;53785;53794:8;53785;:18::i;:::-;53373:469;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53339:514;;53871:9;53866:370;53890:1;53886;:5;53866:370;;;53990:10;54070;54081:1;54070:13;;;;;;;:::i;:::-;;54144:18;54153:5;54159:1;54153:8;;;;;;;;:::i;:::-;;;;;;;54144;:18::i;:::-;53951:258;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53913:311;;53893:3;;;;;:::i;:::-;;;;53866:370;;;;54317:10;54408:18;54417:8;54408;:18::i;:::-;54524;54533:5;54539:1;54533:8;;;;;;;;:::i;54524:18::-;54282:298;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54248:343;;54604:18;54625:608;54793:17;54802:7;54793:8;:17::i;:::-;55026:25;55046:3;55026:13;:25::i;:::-;55124:10;54706:482;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;54625:13;:608::i;:::-;54604:629;;55308:4;55258:55;;;;;;;;:::i;:::-;;;;;;;;;;;;;55244:70;;;;;;;;;;;50965:4357;;;:::o;45643:173::-;45718:6;;;-1:-1:-1;;;;;45735:17:0;;;-1:-1:-1;;;;;;45735:17:0;;;;;;;45768:40;;45718:6;;;45735:17;45718:6;;45768:40;;45699:16;;45768:40;45688:128;45643:173;:::o;58264:988::-;58388:7;;58423:265;58543:6;58572:7;58641:2;58627:8;58543:6;58627:1;:8;:::i;:::-;58624:12;;:1;:12;:::i;:::-;58620:17;;:1;:17;:::i;:::-;58602:16;58610:7;58602;:16::i;:::-;:36;;;;;;:::i;:::-;:41;;;;:::i;:::-;58469:193;;-1:-1:-1;;;58469:193:0;;;19011:25:1;19052:12;;;19045:28;;;;19089:12;;;19082:28;;;;19126:12;;;19119:28;19163:13;;58469:193:0;18725:457:1;58423:265:0;58408:280;;58699:14;58716:11;58735;:18;58728:4;:25;;;;:::i;:::-;58716:38;;;;;;;;:::i;:::-;;;;;;;58699:55;;;;58765:12;58787:2;58780:4;:9;;;;:::i;:::-;58765:24;;58811:2;58804:4;:9;58800:84;;;58840:8;58856:15;;58849:22;;:4;:22;:::i;:::-;58840:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;58830:42;;58840:32;;;;;;;;58830:42;;:::i;:::-;;;58800:84;58906:2;58898:4;:10;58894:327;;58929:4;58937:2;58929:10;58925:285;;;59063:8;59079:15;;59072:22;;:4;:22;:::i;:::-;59063:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;58990:105;;59000:11;59019;:18;;;;59012:4;:25;;;;:::i;:::-;59000:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;58991:47;;59000:38;;;;;;;;58991:6;:47;:::i;:::-;58990:105;;;;:::i;:::-;58960:135;;58925:285;;;59155:11;59174:18;;59167:25;;:4;:25;:::i;:::-;59155:38;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;59146:47;;59155:38;;;;;;;;59146:6;:47;:::i;:::-;59136:58;;58925:285;-1:-1:-1;59238:6:0;58264:988;-1:-1:-1;;;;;58264:988:0:o;46898:212::-;46953:6;46980:7;46976:1;:11;:30;;;;;47002:4;46991:7;:15;;46976:30;46972:98;;;-1:-1:-1;47030:28:0;;;;;;:11;:28;;;;;;;;;46898:212::o;46972:98::-;-1:-1:-1;47094:7:0;46898:212::o;25939:315::-;26096:28;26106:4;26112:2;26116:7;26096:9;:28::i;:::-;26143:48;26166:4;26172:2;26176:7;26185:5;26143:22;:48::i;:::-;26135:111;;;;-1:-1:-1;;;26135:111:0;;;;;;;:::i;59260:723::-;59316:13;59537:10;59533:53;;-1:-1:-1;;59564:10:0;;;;;;;;;;;;-1:-1:-1;;;59564:10:0;;;;;59260:723::o;59533:53::-;59611:5;59596:12;59652:78;59659:9;;59652:78;;59685:8;;;;:::i;:::-;;-1:-1:-1;59708:10:0;;-1:-1:-1;59716:2:0;59708:10;;:::i;:::-;;;59652:78;;;59740:19;59772:6;59762:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;59762:17:0;;59740:39;;59790:154;59797:10;;59790:154;;59824:11;59834:1;59824:11;;:::i;:::-;;-1:-1:-1;59893:10:0;59901:2;59893:5;:10;:::i;:::-;59880:24;;:2;:24;:::i;:::-;59867:39;;59850:6;59857;59850:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;59850:56:0;;;;;;;;-1:-1:-1;59921:11:0;59930:2;59921:11;;:::i;:::-;;;59790:154;;36385:589;-1:-1:-1;;;;;36591:18:0;;36587:187;;36626:40;36658:7;37801:10;:17;;37774:24;;;;:15;:24;;;;;:44;;;37829:24;;;;;;;;;;;;37697:164;36626:40;36587:187;;;36696:2;-1:-1:-1;;;;;36688:10:0;:4;-1:-1:-1;;;;;36688:10:0;;36684:90;;36715:47;36748:4;36754:7;36715:32;:47::i;:::-;-1:-1:-1;;;;;36788:16:0;;36784:183;;36821:45;36858:7;36821:36;:45::i;36784:183::-;36894:4;-1:-1:-1;;;;;36888:10:0;:2;-1:-1:-1;;;;;36888:10:0;;36884:83;;36915:40;36943:2;36947:7;36915:27;:40::i;27888:321::-;28018:18;28024:2;28028:7;28018:5;:18::i;:::-;28069:54;28100:1;28104:2;28108:7;28117:5;28069:22;:54::i;:::-;28047:154;;;;-1:-1:-1;;;28047:154:0;;;;;;;:::i;60346:1790::-;60444:11;;60404:13;;60470:8;60466:23;;-1:-1:-1;;60480:9:0;;;;;;;;;-1:-1:-1;60480:9:0;;;60346:1790;-1:-1:-1;60346:1790:0:o;60466:23::-;60541:18;60579:1;60568:7;:3;60574:1;60568:7;:::i;:::-;60567:13;;;;:::i;:::-;60562:19;;:1;:19;:::i;:::-;60541:40;-1:-1:-1;60639:19:0;60671:15;60541:40;60684:2;60671:15;:::i;:::-;60661:26;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;60661:26:0;;60639:48;;60700:18;60721:5;;;;;;;;;;;;;;;;;60700:26;;60790:1;60783:5;60779:13;60835:2;60827:6;60823:15;60886:1;60854:960;60909:3;60906:1;60903:10;60854:960;;;60964:1;61007:12;;;;;61001:19;61102:4;61090:2;61086:14;;;;;61068:40;;61062:47;61254:2;61250:14;;;61246:25;;61232:40;;61226:47;61444:1;61440:13;;;61436:24;;61422:39;;61416:46;61625:16;;;;61611:31;;61605:38;61138:1;61134:11;;;61275:4;61222:58;;;61170:129;61324:11;;61412:57;;;61360:128;;;;61513:11;;61601:49;;61549:120;61698:3;61694:13;61727:22;;61797:1;61782:17;;;;60957:9;60854:960;;;60858:44;61846:1;61841:3;61837:11;61867:1;61862:84;;;;61965:1;61960:82;;;;61830:212;;61862:84;-1:-1:-1;;;;;61895:17:0;;61888:43;61862:84;;61960:82;-1:-1:-1;;;;;61993:17:0;;61986:41;61830:212;-1:-1:-1;;;62058:26:0;;;62065:6;60346:1790;-1:-1:-1;;;;60346:1790:0:o;31288:799::-;31443:4;-1:-1:-1;;;;;31464:13:0;;8466:20;8514:8;31460:620;;31500:72;;-1:-1:-1;;;31500:72:0;;-1:-1:-1;;;;;31500:36:0;;;;;:72;;16177:10;;31551:4;;31557:7;;31566:5;;31500:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31500:72:0;;;;;;;;-1:-1:-1;;31500:72:0;;;;;;;;;;;;:::i;:::-;;;31496:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;31742:13:0;;31738:272;;31785:60;;-1:-1:-1;;;31785:60:0;;;;;;;:::i;31738:272::-;31960:6;31954:13;31945:6;31941:2;31937:15;31930:38;31496:529;-1:-1:-1;;;;;;31623:51:0;-1:-1:-1;;;31623:51:0;;-1:-1:-1;31616:58:0;;31460:620;-1:-1:-1;32064:4:0;31288:799;;;;;;:::o;38488:988::-;38754:22;38804:1;38779:22;38796:4;38779:16;:22::i;:::-;:26;;;;:::i;:::-;38816:18;38837:26;;;:17;:26;;;;;;38754:51;;-1:-1:-1;38970:28:0;;;38966:328;;-1:-1:-1;;;;;39037:18:0;;39015:19;39037:18;;;:12;:18;;;;;;;;:34;;;;;;;;;39088:30;;;;;;:44;;;39205:30;;:17;:30;;;;;:43;;;38966:328;-1:-1:-1;39390:26:0;;;;:17;:26;;;;;;;;39383:33;;;-1:-1:-1;;;;;39434:18:0;;;;;:12;:18;;;;;:34;;;;;;;39427:41;38488:988::o;39771:1079::-;40049:10;:17;40024:22;;40049:21;;40069:1;;40049:21;:::i;:::-;40081:18;40102:24;;;:15;:24;;;;;;40475:10;:26;;40024:46;;-1:-1:-1;40102:24:0;;40024:46;;40475:26;;;;;;:::i;:::-;;;;;;;;;40453:48;;40539:11;40514:10;40525;40514:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;40619:28;;;:15;:28;;;;;;;:41;;;40791:24;;;;;40784:31;40826:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;39842:1008;;;39771:1079;:::o;37275:221::-;37360:14;37377:20;37394:2;37377:16;:20::i;:::-;-1:-1:-1;;;;;37408:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;37453:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;37275:221:0:o;28545:382::-;-1:-1:-1;;;;;28625:16:0;;28617:61;;;;-1:-1:-1;;;28617:61:0;;24972:2:1;28617:61:0;;;24954:21:1;;;24991:18;;;24984:30;25050:34;25030:18;;;25023:62;25102:18;;28617:61:0;24770:356:1;28617:61:0;26632:4;26656:16;;;:7;:16;;;;;;-1:-1:-1;;;;;26656:16:0;:30;28689:58;;;;-1:-1:-1;;;28689:58:0;;22197:2:1;28689:58:0;;;22179:21:1;22236:2;22216:18;;;22209:30;22275;22255:18;;;22248:58;22323:18;;28689:58:0;21995:352:1;28689:58:0;28760:45;28789:1;28793:2;28797:7;28760:20;:45::i;:::-;-1:-1:-1;;;;;28818:13:0;;;;;;:9;:13;;;;;:18;;28835:1;;28818:13;:18;;28835:1;;28818:18;:::i;:::-;;;;-1:-1:-1;;28847:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;28847:21:0;-1:-1:-1;;;;;28847:21:0;;;;;;;;28886:33;;28847:16;;;28886:33;;28847:16;;28886:33;28545:382;;:::o;14:173:1:-;82:20;;-1:-1:-1;;;;;131:31:1;;121:42;;111:70;;177:1;174;167:12;192:160;257:20;;313:13;;306:21;296:32;;286:60;;342:1;339;332:12;357:186;416:6;469:2;457:9;448:7;444:23;440:32;437:52;;;485:1;482;475:12;437:52;508:29;527:9;508:29;:::i;548:260::-;616:6;624;677:2;665:9;656:7;652:23;648:32;645:52;;;693:1;690;683:12;645:52;716:29;735:9;716:29;:::i;:::-;706:39;;764:38;798:2;787:9;783:18;764:38;:::i;:::-;754:48;;548:260;;;;;:::o;813:328::-;890:6;898;906;959:2;947:9;938:7;934:23;930:32;927:52;;;975:1;972;965:12;927:52;998:29;1017:9;998:29;:::i;:::-;988:39;;1046:38;1080:2;1069:9;1065:18;1046:38;:::i;:::-;1036:48;;1131:2;1120:9;1116:18;1103:32;1093:42;;813:328;;;;;:::o;1146:1138::-;1241:6;1249;1257;1265;1318:3;1306:9;1297:7;1293:23;1289:33;1286:53;;;1335:1;1332;1325:12;1286:53;1358:29;1377:9;1358:29;:::i;:::-;1348:39;;1406:38;1440:2;1429:9;1425:18;1406:38;:::i;:::-;1396:48;;1491:2;1480:9;1476:18;1463:32;1453:42;;1546:2;1535:9;1531:18;1518:32;1569:18;1610:2;1602:6;1599:14;1596:34;;;1626:1;1623;1616:12;1596:34;1664:6;1653:9;1649:22;1639:32;;1709:7;1702:4;1698:2;1694:13;1690:27;1680:55;;1731:1;1728;1721:12;1680:55;1767:2;1754:16;1789:2;1785;1782:10;1779:36;;;1795:18;;:::i;:::-;1870:2;1864:9;1838:2;1924:13;;-1:-1:-1;;1920:22:1;;;1944:2;1916:31;1912:40;1900:53;;;1968:18;;;1988:22;;;1965:46;1962:72;;;2014:18;;:::i;:::-;2054:10;2050:2;2043:22;2089:2;2081:6;2074:18;2129:7;2124:2;2119;2115;2111:11;2107:20;2104:33;2101:53;;;2150:1;2147;2140:12;2101:53;2206:2;2201;2197;2193:11;2188:2;2180:6;2176:15;2163:46;2251:1;2246:2;2241;2233:6;2229:15;2225:24;2218:35;2272:6;2262:16;;;;;;;1146:1138;;;;;;;:::o;2289:254::-;2354:6;2362;2415:2;2403:9;2394:7;2390:23;2386:32;2383:52;;;2431:1;2428;2421:12;2383:52;2454:29;2473:9;2454:29;:::i;:::-;2444:39;;2502:35;2533:2;2522:9;2518:18;2502:35;:::i;2548:254::-;2616:6;2624;2677:2;2665:9;2656:7;2652:23;2648:32;2645:52;;;2693:1;2690;2683:12;2645:52;2716:29;2735:9;2716:29;:::i;:::-;2706:39;2792:2;2777:18;;;;2764:32;;-1:-1:-1;;;2548:254:1:o;2807:180::-;2863:6;2916:2;2904:9;2895:7;2891:23;2887:32;2884:52;;;2932:1;2929;2922:12;2884:52;2955:26;2971:9;2955:26;:::i;2992:245::-;3050:6;3103:2;3091:9;3082:7;3078:23;3074:32;3071:52;;;3119:1;3116;3109:12;3071:52;3158:9;3145:23;3177:30;3201:5;3177:30;:::i;3242:249::-;3311:6;3364:2;3352:9;3343:7;3339:23;3335:32;3332:52;;;3380:1;3377;3370:12;3332:52;3412:9;3406:16;3431:30;3455:5;3431:30;:::i;3496:272::-;3554:6;3607:2;3595:9;3586:7;3582:23;3578:32;3575:52;;;3623:1;3620;3613:12;3575:52;3662:9;3649:23;3712:6;3705:5;3701:18;3694:5;3691:29;3681:57;;3734:1;3731;3724:12;3773:180;3832:6;3885:2;3873:9;3864:7;3860:23;3856:32;3853:52;;;3901:1;3898;3891:12;3853:52;-1:-1:-1;3924:23:1;;3773:180;-1:-1:-1;3773:180:1:o;3958:248::-;4026:6;4034;4087:2;4075:9;4066:7;4062:23;4058:32;4055:52;;;4103:1;4100;4093:12;4055:52;-1:-1:-1;;4126:23:1;;;4196:2;4181:18;;;4168:32;;-1:-1:-1;3958:248:1:o;4211:316::-;4288:6;4296;4304;4357:2;4345:9;4336:7;4332:23;4328:32;4325:52;;;4373:1;4370;4363:12;4325:52;-1:-1:-1;;4396:23:1;;;4466:2;4451:18;;4438:32;;-1:-1:-1;4517:2:1;4502:18;;;4489:32;;4211:316;-1:-1:-1;4211:316:1:o;4532:257::-;4573:3;4611:5;4605:12;4638:6;4633:3;4626:19;4654:63;4710:6;4703:4;4698:3;4694:14;4687:4;4680:5;4676:16;4654:63;:::i;:::-;4771:2;4750:15;-1:-1:-1;;4746:29:1;4737:39;;;;4778:4;4733:50;;4532:257;-1:-1:-1;;4532:257:1:o;4794:185::-;4836:3;4874:5;4868:12;4889:52;4934:6;4929:3;4922:4;4915:5;4911:16;4889:52;:::i;:::-;4957:16;;;;;4794:185;-1:-1:-1;;4794:185:1:o;4984:973::-;5069:12;;5034:3;;5124:1;5144:18;;;;5197;;;;5224:61;;5278:4;5270:6;5266:17;5256:27;;5224:61;5304:2;5352;5344:6;5341:14;5321:18;5318:38;5315:161;;;5398:10;5393:3;5389:20;5386:1;5379:31;5433:4;5430:1;5423:15;5461:4;5458:1;5451:15;5315:161;5492:18;5519:104;;;;5637:1;5632:319;;;;5485:466;;5519:104;-1:-1:-1;;5552:24:1;;5540:37;;5597:16;;;;-1:-1:-1;5519:104:1;;5632:319;28906:1;28899:14;;;28943:4;28930:18;;5726:1;5740:165;5754:6;5751:1;5748:13;5740:165;;;5832:14;;5819:11;;;5812:35;5875:16;;;;5769:10;;5740:165;;;5744:3;;5934:6;5929:3;5925:16;5918:23;;5485:466;;;;;;;4984:973;;;;:::o;6094:1141::-;6560:3;6598:6;6592:13;6614:53;6660:6;6655:3;6648:4;6640:6;6636:17;6614:53;:::i;:::-;6730:13;;6689:16;;;;6752:57;6730:13;6689:16;6786:4;6774:17;;6752:57;:::i;:::-;6828:55;6873:8;6866:5;6862:20;6854:6;6828:55;:::i;:::-;6818:65;;;6914:6;6908:13;6930:54;6975:8;6971:2;6964:4;6956:6;6952:17;6930:54;:::i;:::-;7003:52;7045:8;7041:2;7037:17;7029:6;7003:52;:::i;:::-;6993:62;;;-1:-1:-1;;;7071:2:1;7064:15;7110:6;7104:13;7126:62;7179:8;7175:1;7171:2;7167:10;7160:4;7152:6;7148:17;7126:62;:::i;:::-;7208:17;7227:1;7204:25;;6094:1141;-1:-1:-1;;;;;;;;6094:1141:1:o;7240:886::-;7602:3;7640:6;7634:13;7656:53;7702:6;7697:3;7690:4;7682:6;7678:17;7656:53;:::i;:::-;7728:51;7771:6;7766:3;7762:16;7754:6;7728:51;:::i;:::-;7718:61;;7810:6;7804:13;7826:54;7871:8;7867:2;7860:4;7852:6;7848:17;7826:54;:::i;:::-;7899:52;7941:8;7937:2;7933:17;7925:6;7899:52;:::i;:::-;7889:62;;;7982:6;7976:13;7998:54;8043:8;8039:2;8032:4;8024:6;8020:17;7998:54;:::i;:::-;8068:52;8110:8;8106:2;8102:17;8094:6;8068:52;:::i;:::-;8061:59;7240:886;-1:-1:-1;;;;;;;;;;7240:886:1:o;8131:1008::-;8655:3;8693:6;8687:13;8709:53;8755:6;8750:3;8743:4;8735:6;8731:17;8709:53;:::i;:::-;-1:-1:-1;;;8784:16:1;;;8809:59;;;8887:49;8932:2;8921:14;;8913:6;8887:49;:::i;:::-;-1:-1:-1;;;8945:60:1;;8877:59;-1:-1:-1;9024:46:1;9066:2;9058:11;;9050:6;9024:46;:::i;:::-;-1:-1:-1;;;9079:28:1;;9131:1;9123:10;;8131:1008;-1:-1:-1;;;;;;8131:1008:1:o;9144:1598::-;9910:3;9948:6;9942:13;9964:53;10010:6;10005:3;9998:4;9990:6;9986:17;9964:53;:::i;:::-;-1:-1:-1;;;10039:16:1;;;10064:63;;;10146:49;10191:2;10180:14;;10172:6;10146:49;:::i;:::-;-1:-1:-1;;;10204:42:1;;10271:13;;10136:59;;-1:-1:-1;10293:62:1;10271:13;10342:1;10334:10;;10327:4;10315:17;;10293:62;:::i;:::-;-1:-1:-1;;;10415:1:1;10374:17;;;;10407:10;;;10400:34;10453:81;10487:46;10529:2;10521:11;;10513:6;10487:46;:::i;:::-;10479:6;10453:81;:::i;:::-;10443:91;;10565:6;10559:13;10581:54;10626:8;10622:2;10615:4;10607:6;10603:17;10581:54;:::i;:::-;-1:-1:-1;;;10657:17:1;;10683:24;;;10734:1;10723:13;;9144:1598;-1:-1:-1;;;;;;;;9144:1598:1:o;10747:449::-;10979:3;11017:6;11011:13;11033:53;11079:6;11074:3;11067:4;11059:6;11055:17;11033:53;:::i;:::-;-1:-1:-1;;;11108:16:1;;11133:27;;;-1:-1:-1;11187:2:1;11176:14;;10747:449;-1:-1:-1;10747:449:1:o;11201:1355::-;11731:3;11769:6;11763:13;11785:53;11831:6;11826:3;11819:4;11811:6;11807:17;11785:53;:::i;:::-;11869:6;11864:3;11860:16;11847:29;;11899:66;11892:5;11885:81;12009:20;12004:3;12000:30;11993:4;11986:5;11982:16;11975:56;12062:6;12056:13;12078:66;12135:8;12130:2;12123:5;12119:14;12112:4;12104:6;12100:17;12078:66;:::i;:::-;12212;12207:2;12163:20;;;;12199:11;;;12192:87;-1:-1:-1;;;12303:2:1;12295:11;;12288:45;12358:13;;12380:63;12358:13;12429:2;12421:11;;12414:4;12402:17;;12380:63;:::i;:::-;-1:-1:-1;;;12503:2:1;12462:17;;;;12495:11;;;12488:35;12547:2;12539:11;;11201:1355;-1:-1:-1;;;;;11201:1355:1:o;12561:1103::-;13088:3;13126:6;13120:13;13142:53;13188:6;13183:3;13176:4;13168:6;13164:17;13142:53;:::i;:::-;-1:-1:-1;;;13217:16:1;;;13242:70;;;13331:49;13376:2;13365:14;;13357:6;13331:49;:::i;:::-;-1:-1:-1;;;13389:50:1;;13464:13;;13321:59;;-1:-1:-1;13486:63:1;13464:13;13535:2;13527:11;;13520:4;13508:17;;13486:63;:::i;:::-;-1:-1:-1;;;13609:2:1;13568:17;;;;13601:11;;;13594:37;13655:2;13647:11;;12561:1103;-1:-1:-1;;;;;12561:1103:1:o;13669:444::-;13901:3;13939:6;13933:13;13955:53;14001:6;13996:3;13989:4;13981:6;13977:17;13955:53;:::i;:::-;-1:-1:-1;;;14030:16:1;;14055:23;;;-1:-1:-1;14105:1:1;14094:13;;13669:444;-1:-1:-1;13669:444:1:o;14118:2011::-;14999:3;15037:6;15031:13;15053:53;15099:6;15094:3;15087:4;15079:6;15075:17;15053:53;:::i;:::-;15137:6;15132:3;15128:16;15115:29;;15167:66;15160:5;15153:81;15277:26;15272:3;15268:36;15261:4;15254:5;15250:16;15243:62;15336:6;15330:13;15352:66;15409:8;15404:2;15397:5;15393:14;15386:4;15378:6;15374:17;15352:66;:::i;:::-;-1:-1:-1;;;15516:2:1;15437:20;;;;15508:11;;;15501:23;;;15553:66;15548:2;15540:11;;15533:87;-1:-1:-1;;;15644:2:1;15636:11;;15629:61;15715:13;;15737:63;15715:13;15786:2;15778:11;;15771:4;15759:17;;15737:63;:::i;:::-;15860:2;15819:17;;15852:11;;;15845:23;15897:66;15892:2;15884:11;;15877:87;-1:-1:-1;;;15988:3:1;15980:12;;15973:64;16053:70;16083:39;16117:3;16109:12;;16101:6;16083:39;:::i;:::-;-1:-1:-1;;;6027:29:1;;6081:1;6072:11;;5962:127;16053:70;16046:77;14118:2011;-1:-1:-1;;;;;;;14118:2011:1:o;16527:1704::-;-1:-1:-1;;;17176:55:1;;17254:13;;17158:3;;17276:62;17254:13;17326:2;17317:12;;17310:4;17298:17;;17276:62;:::i;:::-;17402:66;17397:2;17357:16;;;17389:11;;;17382:87;17498:34;17493:2;17485:11;;17478:55;17562:34;17557:2;17549:11;;17542:55;17627:66;17621:3;17613:12;;17606:88;17724:66;17718:3;17710:12;;17703:88;17816:13;;17838:64;17816:13;17887:3;17879:12;;17872:4;17860:17;;17838:64;:::i;:::-;-1:-1:-1;;;17962:3:1;17921:17;;;;17954:12;;;17947:68;18040:13;;18062:64;18040:13;18111:3;18103:12;;18096:4;18084:17;;18062:64;:::i;:::-;-1:-1:-1;;;18186:3:1;18145:17;;;;18178:12;;;18171:26;18221:3;18213:12;;16527:1704;-1:-1:-1;;;;;16527:1704:1:o;19187:448::-;19449:31;19444:3;19437:44;19419:3;19510:6;19504:13;19526:62;19581:6;19576:2;19571:3;19567:12;19560:4;19552:6;19548:17;19526:62;:::i;:::-;19608:16;;;;19626:2;19604:25;;19187:448;-1:-1:-1;;19187:448:1:o;19848:488::-;-1:-1:-1;;;;;20117:15:1;;;20099:34;;20169:15;;20164:2;20149:18;;20142:43;20216:2;20201:18;;20194:34;;;20264:3;20259:2;20244:18;;20237:31;;;20042:4;;20285:45;;20310:19;;20302:6;20285:45;:::i;:::-;20277:53;19848:488;-1:-1:-1;;;;;;19848:488:1:o;20533:219::-;20682:2;20671:9;20664:21;20645:4;20702:44;20742:2;20731:9;20727:18;20719:6;20702:44;:::i;21169:414::-;21371:2;21353:21;;;21410:2;21390:18;;;21383:30;21449:34;21444:2;21429:18;;21422:62;-1:-1:-1;;;21515:2:1;21500:18;;21493:48;21573:3;21558:19;;21169:414::o;25544:356::-;25746:2;25728:21;;;25765:18;;;25758:30;25824:34;25819:2;25804:18;;25797:62;25891:2;25876:18;;25544:356::o;27062:413::-;27264:2;27246:21;;;27303:2;27283:18;;;27276:30;27342:34;27337:2;27322:18;;27315:62;-1:-1:-1;;;27408:2:1;27393:18;;27386:47;27465:3;27450:19;;27062:413::o;28959:224::-;28998:3;29026:6;29059:2;29056:1;29052:10;29089:2;29086:1;29082:10;29120:3;29116:2;29112:12;29107:3;29104:21;29101:47;;;29128:18;;:::i;:::-;29164:13;;28959:224;-1:-1:-1;;;;28959:224:1:o;29188:128::-;29228:3;29259:1;29255:6;29252:1;29249:13;29246:39;;;29265:18;;:::i;:::-;-1:-1:-1;29301:9:1;;29188:128::o;29321:120::-;29361:1;29387;29377:35;;29392:18;;:::i;:::-;-1:-1:-1;29426:9:1;;29321:120::o;29446:422::-;29535:1;29578:5;29535:1;29592:270;29613:7;29603:8;29600:21;29592:270;;;29672:4;29668:1;29664:6;29660:17;29654:4;29651:27;29648:53;;;29681:18;;:::i;:::-;29731:7;29721:8;29717:22;29714:55;;;29751:16;;;;29714:55;29830:22;;;;29790:15;;;;29592:270;;;29596:3;29446:422;;;;;:::o;29873:131::-;29933:5;29962:36;29989:8;29983:4;30058:5;30088:8;30078:80;;-1:-1:-1;30129:1:1;30143:5;;30078:80;30177:4;30167:76;;-1:-1:-1;30214:1:1;30228:5;;30167:76;30259:4;30277:1;30272:59;;;;30345:1;30340:130;;;;30252:218;;30272:59;30302:1;30293:10;;30316:5;;;30340:130;30377:3;30367:8;30364:17;30361:43;;;30384:18;;:::i;:::-;-1:-1:-1;;30440:1:1;30426:16;;30455:5;;30252:218;;30554:2;30544:8;30541:16;30535:3;30529:4;30526:13;30522:36;30516:2;30506:8;30503:16;30498:2;30492:4;30489:12;30485:35;30482:77;30479:159;;;-1:-1:-1;30591:19:1;;;30623:5;;30479:159;30670:34;30695:8;30689:4;30670:34;:::i;:::-;30740:6;30736:1;30732:6;30728:19;30719:7;30716:32;30713:58;;;30751:18;;:::i;:::-;30789:20;;30009:806;-1:-1:-1;;;30009:806:1:o;30820:168::-;30860:7;30926:1;30922;30918:6;30914:14;30911:1;30908:21;30903:1;30896:9;30889:17;30885:45;30882:71;;;30933:18;;:::i;:::-;-1:-1:-1;30973:9:1;;30820:168::o;30993:125::-;31033:4;31061:1;31058;31055:8;31052:34;;;31066:18;;:::i;:::-;-1:-1:-1;31103:9:1;;30993:125::o;31123:258::-;31195:1;31205:113;31219:6;31216:1;31213:13;31205:113;;;31295:11;;;31289:18;31276:11;;;31269:39;31241:2;31234:10;31205:113;;;31336:6;31333:1;31330:13;31327:48;;;-1:-1:-1;;31371:1:1;31353:16;;31346:27;31123:258::o;31386:380::-;31465:1;31461:12;;;;31508;;;31529:61;;31583:4;31575:6;31571:17;31561:27;;31529:61;31636:2;31628:6;31625:14;31605:18;31602:38;31599:161;;;31682:10;31677:3;31673:20;31670:1;31663:31;31717:4;31714:1;31707:15;31745:4;31742:1;31735:15;31599:161;;31386:380;;;:::o;31771:135::-;31810:3;-1:-1:-1;;31831:17:1;;31828:43;;;31851:18;;:::i;:::-;-1:-1:-1;31898:1:1;31887:13;;31771:135::o;31911:112::-;31943:1;31969;31959:35;;31974:18;;:::i;:::-;-1:-1:-1;32008:9:1;;31911:112::o;32028:127::-;32089:10;32084:3;32080:20;32077:1;32070:31;32120:4;32117:1;32110:15;32144:4;32141:1;32134:15;32160:127;32221:10;32216:3;32212:20;32209:1;32202:31;32252:4;32249:1;32242:15;32276:4;32273:1;32266:15;32292:127;32353:10;32348:3;32344:20;32341:1;32334:31;32384:4;32381:1;32374:15;32408:4;32405:1;32398:15;32424:127;32485:10;32480:3;32476:20;32473:1;32466:31;32516:4;32513:1;32506:15;32540:4;32537:1;32530:15;32556:127;32617:10;32612:3;32608:20;32605:1;32598:31;32648:4;32645:1;32638:15;32672:4;32669:1;32662:15;32688:131;-1:-1:-1;;;;;;32762:32:1;;32752:43;;32742:71;;32809:1;32806;32799:12

Swarm Source

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