ETH Price: $3,396.54 (+5.93%)
 

Overview

Max Total Supply

79 POT

Holders

42

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Filtered by Token Holder
dancube.eth
Balance
1 POT
0x40415c1c0e7a8ff3e184b51a94a2fc5b92df9434
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:
Potions

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
Yes with 800 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

        _;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

interface LootInterface {
    function ownerOf(uint256 tokenId) external view returns (address owner);
}

contract Potions is ERC721Enumerable, ReentrancyGuard, Ownable {
    
    uint256 public price = 30000000000000000; //0.03 ETH

    address public lootAddress = 0xFF9C1b15B16263C61d017ee9F65C50e4AE0113D7;
    LootInterface public lootContract = LootInterface(lootAddress);

    string[] private potions = [
        "Strength",
        "Invisibility",
        "Night VIsion",
        "Mind Control",
        "Lightning",
        "Poison",
        "Regeneration",
        "Health",
        "Flames",
        "Might",
        "Slowness"
    ];

    string[] private symbol1 = [
        "S",
        "I",
        "NV",
        "L",
        "P",
        "R",
        "H",
        "F",
        "M",
        "SN"
    ];
    
    string[] private strength = [
        "Strength 1",
        "Strength 2",
        "Strength 3",
        "Strength 4",
        "Strength 5",
        "Strength 6",
        "Strength 7",
        "Strength 8",
        "Strength 9",
        "Strength 10"
    ];

    string[] private invisibility = [
        "Invisibility 1",
        "Invisibility 2",
        "Invisibility 3",
        "Invisibility 4",
        "Invisibility 5",
        "Invisibility 6",
        "Invisibility 7",
        "Invisibility 8",
        "Invisibility 9",
        "Invisibility 10"
    ];
    
    string[] private poison = [
        "Poison 1",
        "Poison 2",
        "Poison 3",
        "Poison 4",
        "Poison 5",
        "Poison 6",
        "Poison 7",
        "Poison 8",
        "Poison 9",
        "Poison 10"
    ];
    
    string[] private regen = [
        "Regeneration 1",
        "Regeneration 2",
        "Regeneration 3",
        "Regeneration 4",
        "Regeneration 5",
        "Regeneration 6",
        "Regeneration 7",
        "Regeneration 8",
        "Regeneration 9",
        "Regeneration 10"
    ];
    
    string[] private mindcontrol = [
        "Mind Control 1",
        "Mind Control 2",
        "Mind Control 3",
        "Mind Control 4",
        "Mind Control 5",
        "Mind Control 6",
        "Mind Control 7",
        "Mind Control 8",
        "Mind Control 9",
        "Mind Control 10"
    ];
    
    string[] private health = [
        "Health 1",
        "Health 2",
        "Health 3",
        "Health 4",
        "Health 5",
        "Health 6",
        "Health 7",
        "Health 8",
        "Health 9",
        "Health 10"
    ];
    
    string[] private flames = [
        "Flames 1",
        "Flames 2",
        "Flames 3",
        "Flames 4",
        "Flames 5",
        "Flames 6",
        "Flames 7",
        "Flames 8",
        "Flames 9",
        "Flames 10"
    ];
    
    string[] private slowness = [
        "Slowness 1",
        "Slowness 2",
        "Slowness 3",
        "Slowness 4",
        "Slowness 5",
        "Slowness 6",
        "Slowness 7",
        "Slowness 8",
        "Slowness 9",
        "Slowness 10"
    ];
    
    string[] private suffixes = [
        "Power House",
        "Magician",
        "Hypnotizer",
        "Sky Whisperer",
        "Death Serum",
        "Magic Regenerator",
        "Magic Health Points",
        "One with elements",
        "Thors Might",
        "Snail Whisperer"
    ];

    string[] private namePrefixes = [
        "The Strong",
        "The Magician",
        "The Hypnotizer",
        "The Sky Whisperer",
        "The Faithful",
        "The Evil",
        "The Forgiving",
        "The God",
        "The Thor",
        "The Snail"
    ];

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

    function getType(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "POTIONS", potions);
    }

    function getStrength(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "STRENGTH", strength);
    }

    function getSlowness(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "SLOWNESS", slowness);
    }

    function getFlames(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "FLAMES", flames);
    }
    
    function getMindcontrol(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "Mind Control", mindcontrol);
    }
    
    function getInvisibility(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "INVISIBILITY", invisibility);
    }
    
    function getHealth(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "HEALTH", health);
    }
    
    function getPoison(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "POISON", poison);
    }
    
    function getSymbol(uint256 tokenId) public view returns (string memory) {
        return pluck(tokenId, "SYMBOL", symbol1);
    }
    
    function pluck(
        uint256 tokenId,
        string memory keyPrefix,
        string[] memory sourceArray
    ) internal view returns (string memory) {
        uint256 rand = random(string(abi.encodePacked(keyPrefix, toString(tokenId))));
        string memory output = sourceArray[rand % sourceArray.length];
        uint256 greatness = rand % 21;

        if (keccak256(abi.encodePacked(keyPrefix)) == keccak256("POTIONS") && greatness > 14) {
            output = string(abi.encodePacked(output, " ", suffixes[rand % suffixes.length]));
        }
        if (keccak256(abi.encodePacked(keyPrefix)) == keccak256("SYMBOL") && greatness >= 19) {
            string[1] memory name;
            name[0] = namePrefixes[rand % namePrefixes.length];
            output = string(abi.encodePacked(name[0], " ", output, " ", name[0]));
        }
        return output;
    }
    
    function tokenURI(uint256 tokenId) public view override returns (string memory) {
        string[17] memory parts;
        parts[
            0
        ] = '<svg xmlns="http://www.w3.org/2000/svg" preserveAspectRatio="xMinYMin meet" viewBox="0 0 350 350"><style>.base { fill: white; font-family: cursive; font-size: 24px; }</style><rect width="100%" height="100%" fill="black" /><text x="10" y="20" class="base">';

        parts[1] = getType(tokenId);

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

        parts[3] = getStrength(tokenId);

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

        parts[5] = getInvisibility(tokenId);

        parts[6] = '</text><text x="10" y="80" class="base">';
        
        parts[7] = getMindcontrol(tokenId);

        parts[8] = '</text><text x="10" y="100" class="base">';
        
        parts[9] = getPoison(tokenId);

        parts[10] = '</text><text x="10" y="120" class="base">';
        
        parts[11] = getHealth(tokenId);

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

        parts[13] = getFlames(tokenId);

        parts[14] = '</text><text x="10" y="160" class="base">';
        
        parts[15] = getSlowness(tokenId);
        
        parts[16] = '</text></svg>';

        string memory output = string(
            abi.encodePacked(parts[0], parts[1], parts[2], parts[3], parts[4], parts[5], parts[6], parts[7], parts[8])
        );
        output = string(
            abi.encodePacked(
                output,
                parts[9],
                parts[10],
                parts[11],
                parts[12],
                parts[13],
                parts[14],
                parts[15],
                parts[16]
            )
        );

        string memory json = Base64.encode(
            bytes(
                string(
                    abi.encodePacked(
                        '{"name": "Potion #',
                        toString(tokenId),
                        '", "description": "Potions are automatically generated on-chain. Inspired and compatible with Loot (for Adventurers)", "image": "data:image/svg+xml;base64,',
                        Base64.encode(bytes(output)),
                        '"}'
                    )
                )
            )
        );
        output = string(abi.encodePacked("data:application/json;base64,", json));

        return output;
    }

    function mint(uint256 tokenId) public payable nonReentrant {
        require(tokenId > 8000 && tokenId <= 10500, "Token ID invalid");
        require(price <= msg.value, "Ether value sent is not correct");
        _safeMint(_msgSender(), tokenId);
    }
    
    function multiMint(uint256[] memory tokenIds) public payable nonReentrant {
        require((price * tokenIds.length) <= msg.value, "Ether value sent is not correct");
        for (uint256 i = 0; i < tokenIds.length; i++) {
            require(tokenIds[i] > 8000 && tokenIds[i] < 10500, "Token ID invalid");
            _safeMint(msg.sender, tokenIds[i]);
        }
    }
    
    function mintWithLoot(uint256 lootId) public payable nonReentrant {
        require(lootId > 0 && lootId <= 8000, "Token ID invalid");
        require(lootContract.ownerOf(lootId) == msg.sender, "Not the owner of this loot");
        _safeMint(_msgSender(), lootId);
    }
    
    function multiMintWithLoot(uint256[] memory lootIds) public payable nonReentrant {
        for (uint256 i = 0; i < lootIds.length; i++) {
            require(lootContract.ownerOf(lootIds[i]) == msg.sender, "Not the owner of this loot");
            _safeMint(_msgSender(), lootIds[i]);
        }
    }
    
    function withdraw() public onlyOwner {
        payable(msg.sender).transfer(address(this).balance);
    }

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

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

    constructor() ERC721("Potions", "POT") Ownable() {}
}

library Base64 {
    bytes internal constant TABLE = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/";

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

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

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

        bytes memory table = TABLE;

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

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

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

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

                mstore(resultPtr, out)

                resultPtr := add(resultPtr, 4)
            }

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

            mstore(result, encodedLen)
        }

        return string(result);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getFlames","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getHealth","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getInvisibility","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getMindcontrol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getPoison","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSlowness","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getStrength","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getSymbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getType","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":"lootAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lootContract","outputs":[{"internalType":"contract LootInterface","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"lootId","type":"uint256"}],"name":"mintWithLoot","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"multiMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"lootIds","type":"uint256[]"}],"name":"multiMintWithLoot","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"price","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

666a94d74f430000600c908155600d80546001600160a01b031990811673ff9c1b15b16263c61d017ee9f65c50e4ae0113d71791829055600e80549091166001600160a01b039290921691909117905560086101e0818152670a6e8e4cadccee8d60c31b6102005260809081526102208381526b496e7669736962696c69747960a01b6102405260a0526102608381526b2734b3b43a102b24b9b4b7b760a11b6102805260c0526102a08381526b135a5b990810dbdb9d1c9bdb60a21b6102c05260e05260096102e0908152684c696768746e696e6760b81b61030052610100526006610320818152652837b4b9b7b760d11b61034052610120526103609384526b2932b3b2b732b930ba34b7b760a11b61038052610140939093526103a083815265090cac2d8e8d60d31b6103c052610160526103e092835265466c616d657360d01b6104005261018092909252600561042090815264135a59da1d60da1b610440526101a0526104a060405261046090815267536c6f776e65737360c01b610480526101c0526200019790600f90600b620012b4565b50604080516101808101825260016101408201818152605360f81b610160840152825282518084018452818152604960f81b6020828101919091528084019190915283518085018552600280825261272b60f11b828401528486019190915284518086018652838152601360fa1b81840152606085015284518086018652838152600560fc1b81840152608085015284518086018652838152602960f91b8184015260a085015284518086018652838152600960fb1b8184015260c085015284518086018652838152602360f91b8184015260e085015284518086018652928352604d60f81b8383015261010084019290925283518085019094529083526129a760f11b90830152610120810191909152620002b890601090600a62001318565b506040805161018081018252600a610140820181815269537472656e677468203160b01b6101608401528252825180840184528181526929ba3932b733ba34101960b11b602082810191909152808401919091528351808501855282815269537472656e677468203360b01b8183015283850152835180850185528281526914dd1c995b99dd1a080d60b21b8183015260608401528351808501855282815269537472656e677468203560b01b818301526080840152835180850185528281526929ba3932b733ba34101b60b11b8183015260a08401528351808501855282815269537472656e677468203760b01b8183015260c084015283518085018552828152690a6e8e4cadccee8d040760b31b8183015260e08401528351808501855282815269537472656e677468203960b01b818301526101008401528351808501909452600b84526a0537472656e6774682031360ac1b908401526101208201929092526200042a916011919062001318565b506040805161018081018252600e61014082018181526d496e7669736962696c697479203160901b6101608401528252825180840184528181526d24b73b34b9b4b134b634ba3c901960911b60208281019190915280840191909152835180850185528281526d496e7669736962696c697479203360901b8183015283850152835180850185528281526d125b9d9a5cda589a5b1a5d1e480d60921b818301526060840152835180850185528281526d496e7669736962696c697479203560901b818301526080840152835180850185528281526d24b73b34b9b4b134b634ba3c901b60911b8183015260a0840152835180850185528281526d496e7669736962696c697479203760901b8183015260c0840152835180850185528281526d092dcecd2e6d2c4d2d8d2e8f240760931b8183015260e0840152835180850185529182526d496e7669736962696c697479203960901b828201526101008301919091528251808401909352600f83526e0496e7669736962696c69747920313608c1b90830152610120810191909152620005c890601290600a62001318565b5060408051610180810182526008610140820181815267506f69736f6e203160c01b610160840152825282518084018452818152672837b4b9b7b7101960c11b602082810191909152808401919091528351808501855282815267506f69736f6e203360c01b81830152838501528351808501855282815267141bda5cdbdb880d60c21b8183015260608401528351808501855282815267506f69736f6e203560c01b81830152608084015283518085018552828152672837b4b9b7b7101b60c11b8183015260a08401528351808501855282815267506f69736f6e203760c01b8183015260c084015283518085018552828152670a0ded2e6dedc40760c31b8183015260e08401528351808501855291825267506f69736f6e203960c01b82820152610100830191909152825180840190935260098352680506f69736f6e2031360bc1b908301526101208101919091526200072a90601390600a62001318565b506040805161018081018252600e61014082018181526d526567656e65726174696f6e203160901b6101608401528252825180840184528181526d2932b3b2b732b930ba34b7b7101960911b60208281019190915280840191909152835180850185528281526d526567656e65726174696f6e203360901b8183015283850152835180850185528281526d149959d95b995c985d1a5bdb880d60921b818301526060840152835180850185528281526d526567656e65726174696f6e203560901b818301526080840152835180850185528281526d2932b3b2b732b930ba34b7b7101b60911b8183015260a0840152835180850185528281526d526567656e65726174696f6e203760901b8183015260c0840152835180850185528281526d0a4cacecadccae4c2e8d2dedc40760931b8183015260e0840152835180850185529182526d526567656e65726174696f6e203960901b828201526101008301919091528251808401909352600f83526e0526567656e65726174696f6e20313608c1b90830152610120810191909152620008c890601490600a62001318565b506040805161018081018252600e61014082018181526d4d696e6420436f6e74726f6c203160901b6101608401528252825180840184528181526d26b4b7321021b7b73a3937b6101960911b60208281019190915280840191909152835180850185528281526d4d696e6420436f6e74726f6c203360901b8183015283850152835180850185528281526d135a5b990810dbdb9d1c9bdb080d60921b818301526060840152835180850185528281526d4d696e6420436f6e74726f6c203560901b818301526080840152835180850185528281526d26b4b7321021b7b73a3937b6101b60911b8183015260a0840152835180850185528281526d4d696e6420436f6e74726f6c203760901b8183015260c0840152835180850185528281526d09ad2dcc84086dedce8e4ded840760931b8183015260e0840152835180850185529182526d4d696e6420436f6e74726f6c203960901b828201526101008301919091528251808401909352600f83526e04d696e6420436f6e74726f6c20313608c1b9083015261012081019190915262000a6690601590600a62001318565b50604080516101808101825260086101408201818152674865616c7468203160c01b610160840152825282518084018452818152672432b0b63a34101960c11b6020828101919091528084019190915283518085018552828152674865616c7468203360c01b818301528385015283518085018552828152671219585b1d1a080d60c21b81830152606084015283518085018552828152674865616c7468203560c01b81830152608084015283518085018552828152672432b0b63a34101b60c11b8183015260a084015283518085018552828152674865616c7468203760c01b8183015260c08401528351808501855282815267090cac2d8e8d040760c31b8183015260e084015283518085018552918252674865616c7468203960c01b828201526101008301919091528251808401909352600983526804865616c74682031360bc1b9083015261012081019190915262000bc890601690600a62001318565b5060408051610180810182526008610140820181815267466c616d6573203160c01b61016084015282528251808401845281815267233630b6b2b9901960c11b602082810191909152808401919091528351808501855282815267466c616d6573203360c01b81830152838501528351808501855282815267119b185b595cc80d60c21b8183015260608401528351808501855282815267466c616d6573203560c01b8183015260808401528351808501855282815267233630b6b2b9901b60c11b8183015260a08401528351808501855282815267466c616d6573203760c01b8183015260c0840152835180850185528281526708cd8c2dacae640760c31b8183015260e08401528351808501855291825267466c616d6573203960c01b82820152610100830191909152825180840190935260098352680466c616d65732031360bc1b9083015261012081019190915262000d2a90601790600a62001318565b506040805161018081018252600a610140820181815269536c6f776e657373203160b01b6101608401528252825180840184528181526929b637bbb732b9b9901960b11b602082810191909152808401919091528351808501855282815269536c6f776e657373203360b01b8183015283850152835180850185528281526914db1bdddb995cdcc80d60b21b8183015260608401528351808501855282815269536c6f776e657373203560b01b818301526080840152835180850185528281526929b637bbb732b9b9901b60b11b8183015260a08401528351808501855282815269536c6f776e657373203760b01b8183015260c084015283518085018552828152690a6d8deeedccae6e640760b31b8183015260e08401528351808501855282815269536c6f776e657373203960b01b818301526101008401528351808501909452600b84526a0536c6f776e6573732031360ac1b9084015261012082019290925262000e9c916018919062001318565b506040805161018081018252600b61014082018181526a506f77657220486f75736560a81b610160840152825282518084018452600881526726b0b3b4b1b4b0b760c11b6020828101919091528084019190915283518085018552600a80825269243cb83737ba34bd32b960b11b828401528486019190915284518086018652600d81526c29b5bc902bb434b9b832b932b960991b818401526060850152845180860186528381526a446561746820536572756d60a81b8184015260808501528451808601865260118082527026b0b3b4b1902932b3b2b732b930ba37b960791b8285015260a086019190915285518087018752601381527f4d61676963204865616c746820506f696e7473000000000000000000000000008185015260c086015285518087018752908152704f6e65207769746820656c656d656e747360781b8184015260e0850152845180860186529283526a151a1bdc9cc8135a59da1d60aa1b838301526101008401929092528351808501909452600f84526e29b730b4b6102bb434b9b832b932b960891b9084015261012082019290925262001047916019919062001318565b506040805161018081018252600a610140820181815269546865205374726f6e6760b01b610160840152825282518084018452600c8082526b2a34329026b0b3b4b1b4b0b760a11b6020838101919091528085019290925284518086018652600e81526d2a343290243cb83737ba34bd32b960911b81840152848601528451808601865260118152702a34329029b5bc902bb434b9b832b932b960791b818401526060850152845180860186529081526b151a194811985a5d1a199d5b60a21b81830152608084015283518085018552600880825267151a1948115d9a5b60c21b8284015260a085019190915284518086018652600d81526c54686520466f72676976696e6760981b8184015260c0850152845180860186526007815266151a194811dbd960ca1b8184015260e085015284518086018652908152672a3432902a3437b960c11b8183015261010084015283518085019094526009845268151a194814db985a5b60ba1b90840152610120820192909252620011cd91601a919062001318565b50348015620011db57600080fd5b506040805180820182526007815266506f74696f6e7360c81b6020808301918252835180850190945260038452621413d560ea1b90840152815191929162001226916000916200136a565b5080516200123c9060019060208401906200136a565b50506001600a555062001258620012526200125e565b62001262565b620014af565b3390565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b82805482825590600052602060002090810192821562001306579160200282015b82811115620013065782518051620012f59184916020909101906200136a565b5091602001919060010190620012d5565b5062001314929150620013f5565b5090565b82805482825590600052602060002090810192821562001306579160200282015b82811115620013065782518051620013599184916020909101906200136a565b509160200191906001019062001339565b828054620013789062001472565b90600052602060002090601f0160209004810192826200139c5760008555620013e7565b82601f10620013b757805160ff1916838001178555620013e7565b82800160010185558215620013e7579182015b82811115620013e7578251825591602001919060010190620013ca565b506200131492915062001416565b80821115620013145760006200140c82826200142d565b50600101620013f5565b5b8082111562001314576000815560010162001417565b5080546200143b9062001472565b6000825580601f106200144f57506200146f565b601f0160209004906000526020600020908101906200146f919062001416565b50565b6002810460018216806200148757607f821691505b60208210811415620014a957634e487b7160e01b600052602260045260246000fd5b50919050565b613b5380620014bf6000396000f3fe60806040526004361061024f5760003560e01c806370a0823111610138578063b88d4fde116100b0578063e321536a1161007f578063e985e9c511610064578063e985e9c514610629578063f2fde38b14610649578063fd12c968146106695761024f565b8063e321536a146105e9578063e53fbda6146106095761024f565b8063b88d4fde14610569578063bf9d517c14610589578063c87b56dd146105a9578063da363976146105c95761024f565b806395d89b4111610107578063a035b1fe116100ec578063a035b1fe14610521578063a0712d6814610536578063a22cb465146105495761024f565b806395d89b41146104f95780639a0e4ebb1461050e5761024f565b806370a082311461048f578063715018a6146104af5780637d493258146104c45780638da5cb5b146104e45761024f565b80633ccfd60b116101cb57806344353f311161019a5780636352211e1161017f5780636352211e1461043c5780636418413c1461045c57806367fd1a0f1461047c5761024f565b806344353f31146103fc5780634f6ccce71461041c5761024f565b80633ccfd60b146103875780633fc70f2c1461039c5780634036ab78146103bc57806342842e0e146103dc5761024f565b80630e4393261161022257806323b872dd1161020757806323b872dd146103325780632f745c591461035257806335b48afd146103725761024f565b80630e439326146102fb57806318160ddd146103105761024f565b806301ffc9a71461025457806306fdde031461028a578063081812fc146102ac578063095ea7b3146102d9575b600080fd5b34801561026057600080fd5b5061027461026f366004612c8c565b61067c565b60405161028191906130ea565b60405180910390f35b34801561029657600080fd5b5061029f6106a9565b60405161028191906130f5565b3480156102b857600080fd5b506102cc6102c7366004612cc4565b61073b565b604051610281919061309a565b3480156102e557600080fd5b506102f96102f4366004612bba565b610787565b005b34801561030757600080fd5b506102cc61081f565b34801561031c57600080fd5b5061032561082e565b604051610281919061371e565b34801561033e57600080fd5b506102f961034d366004612a8d565b610834565b34801561035e57600080fd5b5061032561036d366004612bba565b61086c565b34801561037e57600080fd5b506102cc6108be565b34801561039357600080fd5b506102f96108cd565b3480156103a857600080fd5b5061029f6103b7366004612cc4565b61093b565b3480156103c857600080fd5b5061029f6103d7366004612cc4565b610a4e565b3480156103e857600080fd5b506102f96103f7366004612a8d565b610b58565b34801561040857600080fd5b5061029f610417366004612cc4565b610b73565b34801561042857600080fd5b50610325610437366004612cc4565b610c7d565b34801561044857600080fd5b506102cc610457366004612cc4565b610cd8565b34801561046857600080fd5b5061029f610477366004612cc4565b610d0d565b6102f961048a366004612be5565b610e17565b34801561049b57600080fd5b506103256104aa366004612a16565b610f6f565b3480156104bb57600080fd5b506102f9610fb3565b3480156104d057600080fd5b5061029f6104df366004612cc4565b610ffe565b3480156104f057600080fd5b506102cc611108565b34801561050557600080fd5b5061029f611117565b6102f961051c366004612be5565b611126565b34801561052d57600080fd5b5061032561123a565b6102f9610544366004612cc4565b611240565b34801561055557600080fd5b506102f9610564366004612b89565b6112d2565b34801561057557600080fd5b506102f9610584366004612acd565b6113a0565b34801561059557600080fd5b5061029f6105a4366004612cc4565b6113df565b3480156105b557600080fd5b5061029f6105c4366004612cc4565b6114e9565b3480156105d557600080fd5b5061029f6105e4366004612cc4565b6117a1565b3480156105f557600080fd5b5061029f610604366004612cc4565b6118ab565b34801561061557600080fd5b5061029f610624366004612cc4565b6119b5565b34801561063557600080fd5b50610274610644366004612a55565b611abf565b34801561065557600080fd5b506102f9610664366004612a16565b611aed565b6102f9610677366004612cc4565b611b5b565b60006001600160e01b0319821663780e9d6360e01b14806106a157506106a182611c56565b90505b919050565b6060600080546106b8906137eb565b80601f01602080910402602001604051908101604052809291908181526020018280546106e4906137eb565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b5050505050905090565b600061074682611c96565b61076b5760405162461bcd60e51b8152600401610762906134d7565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061079282610cd8565b9050806001600160a01b0316836001600160a01b031614156107c65760405162461bcd60e51b8152600401610762906135ec565b806001600160a01b03166107d8611cb3565b6001600160a01b031614806107f457506107f481610644611cb3565b6108105760405162461bcd60e51b81526004016107629061338b565b61081a8383611cb7565b505050565b600d546001600160a01b031681565b60085490565b61084561083f611cb3565b82611d25565b6108615760405162461bcd60e51b81526004016107629061362d565b61081a838383611daa565b600061087783610f6f565b82106108955760405162461bcd60e51b815260040161076290613108565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600e546001600160a01b031681565b6108d5611cb3565b6001600160a01b03166108e6611108565b6001600160a01b03161461090c5760405162461bcd60e51b815260040161076290613523565b60405133904780156108fc02916000818181858888f19350505050158015610938573d6000803e3d6000fd5b50565b60606106a1826040518060400160405280600681526020017f4845414c544800000000000000000000000000000000000000000000000000008152506016805480602002602001604051908101604052809291908181526020016000905b82821015610a455783829060005260206000200180546109b8906137eb565b80601f01602080910402602001604051908101604052809291908181526020018280546109e4906137eb565b8015610a315780601f10610a0657610100808354040283529160200191610a31565b820191906000526020600020905b815481529060010190602001808311610a1457829003601f168201915b505050505081526020019060010190610999565b50505050611ed7565b60606106a1826040518060400160405280600781526020017f504f54494f4e5300000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610a45578382906000526020600020018054610acb906137eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610af7906137eb565b8015610b445780601f10610b1957610100808354040283529160200191610b44565b820191906000526020600020905b815481529060010190602001808311610b2757829003601f168201915b505050505081526020019060010190610aac565b61081a838383604051806020016040528060008152506113a0565b60606106a1826040518060400160405280600c81526020017f494e5649534942494c49545900000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015610a45578382906000526020600020018054610bf0906137eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1c906137eb565b8015610c695780601f10610c3e57610100808354040283529160200191610c69565b820191906000526020600020905b815481529060010190602001808311610c4c57829003601f168201915b505050505081526020019060010190610bd1565b6000610c8761082e565b8210610ca55760405162461bcd60e51b81526004016107629061368a565b60088281548110610cc657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806106a15760405162461bcd60e51b815260040161076290613445565b60606106a1826040518060400160405280600681526020017f53594d424f4c00000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b82821015610a45578382906000526020600020018054610d8a906137eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610db6906137eb565b8015610e035780601f10610dd857610100808354040283529160200191610e03565b820191906000526020600020905b815481529060010190602001808311610de657829003601f168201915b505050505081526020019060010190610d6b565b6002600a541415610e3a5760405162461bcd60e51b8152600401610762906136e7565b6002600a5560005b8151811015610f6657600e54825133916001600160a01b031690636352211e90859085908110610e8257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610ea6919061371e565b60206040518083038186803b158015610ebe57600080fd5b505afa158015610ed2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef69190612a39565b6001600160a01b031614610f1c5760405162461bcd60e51b815260040161076290613308565b610f54610f27611cb3565b838381518110610f4757634e487b7160e01b600052603260045260246000fd5b602002602001015161218e565b80610f5e81613826565b915050610e42565b50506001600a55565b60006001600160a01b038216610f975760405162461bcd60e51b8152600401610762906133e8565b506001600160a01b031660009081526003602052604090205490565b610fbb611cb3565b6001600160a01b0316610fcc611108565b6001600160a01b031614610ff25760405162461bcd60e51b815260040161076290613523565b610ffc60006121ac565b565b60606106a1826040518060400160405280600681526020017f464c414d455300000000000000000000000000000000000000000000000000008152506017805480602002602001604051908101604052809291908181526020016000905b82821015610a4557838290600052602060002001805461107b906137eb565b80601f01602080910402602001604051908101604052809291908181526020018280546110a7906137eb565b80156110f45780601f106110c9576101008083540402835291602001916110f4565b820191906000526020600020905b8154815290600101906020018083116110d757829003601f168201915b50505050508152602001906001019061105c565b600b546001600160a01b031690565b6060600180546106b8906137eb565b6002600a5414156111495760405162461bcd60e51b8152600401610762906136e7565b6002600a558051600c54349161115e91613789565b111561117c5760405162461bcd60e51b8152600401610762906132d1565b60005b8151811015610f6657611f408282815181106111ab57634e487b7160e01b600052603260045260246000fd5b60200260200101511180156111e857506129048282815181106111de57634e487b7160e01b600052603260045260246000fd5b6020026020010151105b6112045760405162461bcd60e51b815260040161076290613558565b61122833838381518110610f4757634e487b7160e01b600052603260045260246000fd5b8061123281613826565b91505061117f565b600c5481565b6002600a5414156112635760405162461bcd60e51b8152600401610762906136e7565b6002600a55611f408111801561127b57506129048111155b6112975760405162461bcd60e51b815260040161076290613558565b34600c5411156112b95760405162461bcd60e51b8152600401610762906132d1565b6112ca6112c4611cb3565b8261218e565b506001600a55565b6112da611cb3565b6001600160a01b0316826001600160a01b0316141561130b5760405162461bcd60e51b81526004016107629061329a565b8060056000611318611cb3565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561135c611cb3565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161139491906130ea565b60405180910390a35050565b6113b16113ab611cb3565b83611d25565b6113cd5760405162461bcd60e51b81526004016107629061362d565b6113d9848484846121fe565b50505050565b60606106a1826040518060400160405280600681526020017f504f49534f4e00000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b82821015610a4557838290600052602060002001805461145c906137eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611488906137eb565b80156114d55780601f106114aa576101008083540402835291602001916114d5565b820191906000526020600020905b8154815290600101906020018083116114b857829003601f168201915b50505050508152602001906001019061143d565b60606114f36129dc565b60405180610120016040528060ff81526020016139f760ff9139815261151883610a4e565b8160016020020181905250604051806060016040528060288152602001613af660289139604082015261154a836119b5565b60608083019190915260408051918201905260288082526138c36020830139608082015261157783610b73565b60a08201526040805160608101909152602880825261393d602083013960c08201526115a2836118ab565b60e08201526040805160608101909152602980825261396560208301396101008201526115ce836113df565b6101208201526040805160608101909152602980825261391460208301396101408201526115fb8361093b565b6101608201526040805160608101909152602980825261398e602083013961018082015261162883610ffe565b6101a0820152604080516060810190915260298082526138eb60208301396101c0820152611655836117a1565b6101e0820152604080518082018252600d81527f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000602080830191909152610200840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a6116d59a909101612d53565b60408051808303601f19018152908290526101208401516101408501516101608601516101808701516101a08801516101c08901516101e08a01516102008b0151979950611728988a9890602001612d53565b6040516020818303038152906040529050600061177561174786612231565b61175084612364565b604051602001611761929190612f2d565b604051602081830303815290604052612364565b9050806040516020016117889190613055565b60408051808303601f1901815291905295945050505050565b60606106a1826040518060400160405280600881526020017f534c4f574e4553530000000000000000000000000000000000000000000000008152506018805480602002602001604051908101604052809291908181526020016000905b82821015610a4557838290600052602060002001805461181e906137eb565b80601f016020809104026020016040519081016040528092919081815260200182805461184a906137eb565b80156118975780601f1061186c57610100808354040283529160200191611897565b820191906000526020600020905b81548152906001019060200180831161187a57829003601f168201915b5050505050815260200190600101906117ff565b60606106a1826040518060400160405280600c81526020017f4d696e6420436f6e74726f6c00000000000000000000000000000000000000008152506015805480602002602001604051908101604052809291908181526020016000905b82821015610a45578382906000526020600020018054611928906137eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611954906137eb565b80156119a15780601f10611976576101008083540402835291602001916119a1565b820191906000526020600020905b81548152906001019060200180831161198457829003601f168201915b505050505081526020019060010190611909565b60606106a1826040518060400160405280600881526020017f535452454e4754480000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b82821015610a45578382906000526020600020018054611a32906137eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5e906137eb565b8015611aab5780601f10611a8057610100808354040283529160200191611aab565b820191906000526020600020905b815481529060010190602001808311611a8e57829003601f168201915b505050505081526020019060010190611a13565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611af5611cb3565b6001600160a01b0316611b06611108565b6001600160a01b031614611b2c5760405162461bcd60e51b815260040161076290613523565b6001600160a01b038116611b525760405162461bcd60e51b8152600401610762906131c2565b610938816121ac565b6002600a541415611b7e5760405162461bcd60e51b8152600401610762906136e7565b6002600a558015801590611b945750611f408111155b611bb05760405162461bcd60e51b815260040161076290613558565b600e546040516331a9108f60e11b815233916001600160a01b031690636352211e90611be090859060040161371e565b60206040518083038186803b158015611bf857600080fd5b505afa158015611c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c309190612a39565b6001600160a01b0316146112b95760405162461bcd60e51b815260040161076290613308565b60006001600160e01b031982166380ac58cd60e01b1480611c8757506001600160e01b03198216635b5e139f60e01b145b806106a157506106a1826124d8565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611cec82610cd8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d3082611c96565b611d4c5760405162461bcd60e51b81526004016107629061333f565b6000611d5783610cd8565b9050806001600160a01b0316846001600160a01b03161480611d925750836001600160a01b0316611d878461073b565b6001600160a01b0316145b80611da25750611da28185611abf565b949350505050565b826001600160a01b0316611dbd82610cd8565b6001600160a01b031614611de35760405162461bcd60e51b81526004016107629061358f565b6001600160a01b038216611e095760405162461bcd60e51b815260040161076290613256565b611e148383836124f1565b611e1f600082611cb7565b6001600160a01b0383166000908152600360205260408120805460019290611e489084906137a8565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e7690849061375d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60606000611f0d84611ee887612231565b604051602001611ef9929190612d24565b60405160208183030381529060405261257a565b9050600083845183611f1f9190613841565b81518110611f3d57634e487b7160e01b600052603260045260246000fd5b602002602001015190506000601583611f569190613841565b90507ff210237285fb031d28df6380c208a69f21391504586bc22ab32af7cab98b20fb86604051602001611f8a9190612d08565b60405160208183030381529060405280519060200120148015611fad5750600e81115b1561200e5760198054839190611fc39086613841565b81548110611fe157634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001611ffc929190612e6e565b60405160208183030381529060405291505b7f649624ae0b7c137eebb6630d1048ad5216d6db6cc2e758ebc09aa368366896b4866040516020016120409190612d08565b60405160208183030381529060405280519060200120148015612064575060138110155b1561218457612071612a04565b601a805461207f9086613841565b8154811061209d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200180546120b2906137eb565b80601f01602080910402602001604051908101604052809291908181526020018280546120de906137eb565b801561212b5780601f106121005761010080835404028352916020019161212b565b820191906000526020600020905b81548152906001019060200180831161210e57829003601f168201915b50505050508160006001811061215157634e487b7160e01b600052603260045260246000fd5b602090810291909101919091528151604051612171928691839101612e14565b6040516020818303038152906040529250505b5095945050505050565b6121a88282604051806020016040528060008152506125ab565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612209848484611daa565b612215848484846125de565b6113d95760405162461bcd60e51b815260040161076290613165565b60608161225657506040805180820190915260018152600360fc1b60208201526106a4565b8160005b8115612280578061226a81613826565b91506122799050600a83613775565b915061225a565b60008167ffffffffffffffff8111156122a957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122d3576020820181803683370190505b5090505b8415611da2576122e86001836137a8565b91506122f5600a86613841565b61230090603061375d565b60f81b81838151811061232357634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061235d600a86613775565b94506122d7565b8051606090806123845750506040805160208101909152600081526106a4565b6000600361239383600261375d565b61239d9190613775565b6123a8906004613789565b905060006123b782602061375d565b67ffffffffffffffff8111156123dd57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612407576020820181803683370190505b50905060006040518060600160405280604081526020016139b7604091399050600181016020830160005b86811015612493576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612432565b5060038606600181146124ad57600281146124be576124ca565b613d3d60f01b6001198301526124ca565b603d60f81b6000198301525b505050918152949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b6124fc83838361081a565b6001600160a01b03831661251857612513816126f9565b61253b565b816001600160a01b0316836001600160a01b03161461253b5761253b838261273d565b6001600160a01b03821661255757612552816127da565b61081a565b826001600160a01b0316826001600160a01b03161461081a5761081a82826128b3565b60008160405160200161258d9190612d08565b60408051601f19818403018152919052805160209091012092915050565b6125b583836128f7565b6125c260008484846125de565b61081a5760405162461bcd60e51b815260040161076290613165565b60006125f2846001600160a01b03166129d6565b156126ee57836001600160a01b031663150b7a0261260e611cb3565b8786866040518563ffffffff1660e01b815260040161263094939291906130ae565b602060405180830381600087803b15801561264a57600080fd5b505af192505050801561267a575060408051601f3d908101601f1916820190925261267791810190612ca8565b60015b6126d4573d8080156126a8576040519150601f19603f3d011682016040523d82523d6000602084013e6126ad565b606091505b5080516126cc5760405162461bcd60e51b815260040161076290613165565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611da2565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161274a84610f6f565b61275491906137a8565b6000838152600760205260409020549091508082146127a7576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906127ec906001906137a8565b6000838152600960205260408120546008805493945090928490811061282257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061285157634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061289757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006128be83610f6f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661291d5760405162461bcd60e51b8152600401610762906134a2565b61292681611c96565b156129435760405162461bcd60e51b81526004016107629061321f565b61294f600083836124f1565b6001600160a01b038216600090815260036020526040812080546001929061297890849061375d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b6040518061022001604052806011905b60608152602001906001900390816129ec5790505090565b60408051602081019091526060815290565b600060208284031215612a27578081fd5b8135612a3281613897565b9392505050565b600060208284031215612a4a578081fd5b8151612a3281613897565b60008060408385031215612a67578081fd5b8235612a7281613897565b91506020830135612a8281613897565b809150509250929050565b600080600060608486031215612aa1578081fd5b8335612aac81613897565b92506020840135612abc81613897565b929592945050506040919091013590565b60008060008060808587031215612ae2578081fd5b8435612aed81613897565b9350602085810135612afe81613897565b935060408601359250606086013567ffffffffffffffff80821115612b21578384fd5b818801915088601f830112612b34578384fd5b813581811115612b4657612b46613881565b612b58601f8201601f19168501613727565b91508082528984828501011115612b6d578485fd5b8084840185840137810190920192909252939692955090935050565b60008060408385031215612b9b578182fd5b8235612ba681613897565b915060208301358015158114612a82578182fd5b60008060408385031215612bcc578182fd5b8235612bd781613897565b946020939093013593505050565b60006020808385031215612bf7578182fd5b823567ffffffffffffffff80821115612c0e578384fd5b818501915085601f830112612c21578384fd5b813581811115612c3357612c33613881565b8381029150612c43848301613727565b8181528481019084860184860187018a1015612c5d578788fd5b8795505b83861015612c7f578035835260019590950194918601918601612c61565b5098975050505050505050565b600060208284031215612c9d578081fd5b8135612a32816138ac565b600060208284031215612cb9578081fd5b8151612a32816138ac565b600060208284031215612cd5578081fd5b5035919050565b60008151808452612cf48160208601602086016137bf565b601f01601f19169290920160200192915050565b60008251612d1a8184602087016137bf565b9190910192915050565b60008351612d368184602088016137bf565b835190830190612d4a8183602088016137bf565b01949350505050565b60008a51612d65818460208f016137bf565b8a51612d778183860160208f016137bf565b8a519184010190612d8c818360208e016137bf565b8951612d9e8183850160208e016137bf565b8951929091010190612db4818360208c016137bf565b8751612dc68183850160208c016137bf565b8751929091010190612ddc818360208a016137bf565b8551612dee8183850160208a016137bf565b8551929091010190612e048183602088016137bf565b019b9a5050505050505050505050565b60008451612e268184602089016137bf565b8083019050600160fd1b8082528551612e46816001850160208a016137bf565b60019201918201528351612e618160028401602088016137bf565b0160020195945050505050565b600083516020612e8182858389016137bf565b600160fd1b918401918252845460019084906002810481841680612ea657607f821691505b858210811415612ec457634e487b7160e01b88526022600452602488fd5b808015612ed85760018114612eed57612f1d565b60ff1984168887015282880186019450612f1d565b612ef68b613751565b895b84811015612f135781548a8201890152908701908801612ef8565b5050858389010194505b50929a9950505050505050505050565b60007f7b226e616d65223a2022506f74696f6e2023000000000000000000000000000082528351612f658160128501602088016137bf565b7f222c20226465736372697074696f6e223a2022506f74696f6e732061726520616012918401918201527f75746f6d61746963616c6c792067656e657261746564206f6e2d636861696e2e60328201527f20496e73706972656420616e6420636f6d70617469626c652077697468204c6f60528201527f6f742028666f7220416476656e74757265727329222c2022696d616765223a2060728201527f22646174613a696d6167652f7376672b786d6c3b6261736536342c00000000006092820152835161303a8160ad8401602088016137bf565b61227d60f01b60ad929091019182015260af01949350505050565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008252825161308d81601d8501602087016137bf565b91909101601d0192915050565b6001600160a01b0391909116815260200190565b60006001600160a01b038087168352808616602084015250836040830152608060608301526130e06080830184612cdc565b9695505050505050565b901515815260200190565b600060208252612a326020830184612cdc565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201527f74206f6620626f756e6473000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527f63656976657220696d706c656d656e7465720000000000000000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252601a908201527f4e6f7420746865206f776e6572206f662074686973206c6f6f74000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560408201527f726f206164647265737300000000000000000000000000000000000000000000606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201527f546f6b656e20494420696e76616c696400000000000000000000000000000000604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201527f7574206f6620626f756e64730000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561374957613749613881565b604052919050565b60009081526020902090565b6000821982111561377057613770613855565b500190565b6000826137845761378461386b565b500490565b60008160001904831182151516156137a3576137a3613855565b500290565b6000828210156137ba576137ba613855565b500390565b60005b838110156137da5781810151838201526020016137c2565b838111156113d95750506000910152565b6002810460018216806137ff57607f821691505b6020821081141561382057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561383a5761383a613855565b5060010190565b6000826138505761385061386b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461093857600080fd5b6001600160e01b03198116811461093857600080fdfe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a20637572736976653b20666f6e742d73697a653a20323470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220d167d6948366c43cac202a944829dd7bd8177c3e748639063e2337b116688b8964736f6c63430008000033

Deployed Bytecode

0x60806040526004361061024f5760003560e01c806370a0823111610138578063b88d4fde116100b0578063e321536a1161007f578063e985e9c511610064578063e985e9c514610629578063f2fde38b14610649578063fd12c968146106695761024f565b8063e321536a146105e9578063e53fbda6146106095761024f565b8063b88d4fde14610569578063bf9d517c14610589578063c87b56dd146105a9578063da363976146105c95761024f565b806395d89b4111610107578063a035b1fe116100ec578063a035b1fe14610521578063a0712d6814610536578063a22cb465146105495761024f565b806395d89b41146104f95780639a0e4ebb1461050e5761024f565b806370a082311461048f578063715018a6146104af5780637d493258146104c45780638da5cb5b146104e45761024f565b80633ccfd60b116101cb57806344353f311161019a5780636352211e1161017f5780636352211e1461043c5780636418413c1461045c57806367fd1a0f1461047c5761024f565b806344353f31146103fc5780634f6ccce71461041c5761024f565b80633ccfd60b146103875780633fc70f2c1461039c5780634036ab78146103bc57806342842e0e146103dc5761024f565b80630e4393261161022257806323b872dd1161020757806323b872dd146103325780632f745c591461035257806335b48afd146103725761024f565b80630e439326146102fb57806318160ddd146103105761024f565b806301ffc9a71461025457806306fdde031461028a578063081812fc146102ac578063095ea7b3146102d9575b600080fd5b34801561026057600080fd5b5061027461026f366004612c8c565b61067c565b60405161028191906130ea565b60405180910390f35b34801561029657600080fd5b5061029f6106a9565b60405161028191906130f5565b3480156102b857600080fd5b506102cc6102c7366004612cc4565b61073b565b604051610281919061309a565b3480156102e557600080fd5b506102f96102f4366004612bba565b610787565b005b34801561030757600080fd5b506102cc61081f565b34801561031c57600080fd5b5061032561082e565b604051610281919061371e565b34801561033e57600080fd5b506102f961034d366004612a8d565b610834565b34801561035e57600080fd5b5061032561036d366004612bba565b61086c565b34801561037e57600080fd5b506102cc6108be565b34801561039357600080fd5b506102f96108cd565b3480156103a857600080fd5b5061029f6103b7366004612cc4565b61093b565b3480156103c857600080fd5b5061029f6103d7366004612cc4565b610a4e565b3480156103e857600080fd5b506102f96103f7366004612a8d565b610b58565b34801561040857600080fd5b5061029f610417366004612cc4565b610b73565b34801561042857600080fd5b50610325610437366004612cc4565b610c7d565b34801561044857600080fd5b506102cc610457366004612cc4565b610cd8565b34801561046857600080fd5b5061029f610477366004612cc4565b610d0d565b6102f961048a366004612be5565b610e17565b34801561049b57600080fd5b506103256104aa366004612a16565b610f6f565b3480156104bb57600080fd5b506102f9610fb3565b3480156104d057600080fd5b5061029f6104df366004612cc4565b610ffe565b3480156104f057600080fd5b506102cc611108565b34801561050557600080fd5b5061029f611117565b6102f961051c366004612be5565b611126565b34801561052d57600080fd5b5061032561123a565b6102f9610544366004612cc4565b611240565b34801561055557600080fd5b506102f9610564366004612b89565b6112d2565b34801561057557600080fd5b506102f9610584366004612acd565b6113a0565b34801561059557600080fd5b5061029f6105a4366004612cc4565b6113df565b3480156105b557600080fd5b5061029f6105c4366004612cc4565b6114e9565b3480156105d557600080fd5b5061029f6105e4366004612cc4565b6117a1565b3480156105f557600080fd5b5061029f610604366004612cc4565b6118ab565b34801561061557600080fd5b5061029f610624366004612cc4565b6119b5565b34801561063557600080fd5b50610274610644366004612a55565b611abf565b34801561065557600080fd5b506102f9610664366004612a16565b611aed565b6102f9610677366004612cc4565b611b5b565b60006001600160e01b0319821663780e9d6360e01b14806106a157506106a182611c56565b90505b919050565b6060600080546106b8906137eb565b80601f01602080910402602001604051908101604052809291908181526020018280546106e4906137eb565b80156107315780601f1061070657610100808354040283529160200191610731565b820191906000526020600020905b81548152906001019060200180831161071457829003601f168201915b5050505050905090565b600061074682611c96565b61076b5760405162461bcd60e51b8152600401610762906134d7565b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061079282610cd8565b9050806001600160a01b0316836001600160a01b031614156107c65760405162461bcd60e51b8152600401610762906135ec565b806001600160a01b03166107d8611cb3565b6001600160a01b031614806107f457506107f481610644611cb3565b6108105760405162461bcd60e51b81526004016107629061338b565b61081a8383611cb7565b505050565b600d546001600160a01b031681565b60085490565b61084561083f611cb3565b82611d25565b6108615760405162461bcd60e51b81526004016107629061362d565b61081a838383611daa565b600061087783610f6f565b82106108955760405162461bcd60e51b815260040161076290613108565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b600e546001600160a01b031681565b6108d5611cb3565b6001600160a01b03166108e6611108565b6001600160a01b03161461090c5760405162461bcd60e51b815260040161076290613523565b60405133904780156108fc02916000818181858888f19350505050158015610938573d6000803e3d6000fd5b50565b60606106a1826040518060400160405280600681526020017f4845414c544800000000000000000000000000000000000000000000000000008152506016805480602002602001604051908101604052809291908181526020016000905b82821015610a455783829060005260206000200180546109b8906137eb565b80601f01602080910402602001604051908101604052809291908181526020018280546109e4906137eb565b8015610a315780601f10610a0657610100808354040283529160200191610a31565b820191906000526020600020905b815481529060010190602001808311610a1457829003601f168201915b505050505081526020019060010190610999565b50505050611ed7565b60606106a1826040518060400160405280600781526020017f504f54494f4e5300000000000000000000000000000000000000000000000000815250600f805480602002602001604051908101604052809291908181526020016000905b82821015610a45578382906000526020600020018054610acb906137eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610af7906137eb565b8015610b445780601f10610b1957610100808354040283529160200191610b44565b820191906000526020600020905b815481529060010190602001808311610b2757829003601f168201915b505050505081526020019060010190610aac565b61081a838383604051806020016040528060008152506113a0565b60606106a1826040518060400160405280600c81526020017f494e5649534942494c49545900000000000000000000000000000000000000008152506012805480602002602001604051908101604052809291908181526020016000905b82821015610a45578382906000526020600020018054610bf0906137eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610c1c906137eb565b8015610c695780601f10610c3e57610100808354040283529160200191610c69565b820191906000526020600020905b815481529060010190602001808311610c4c57829003601f168201915b505050505081526020019060010190610bd1565b6000610c8761082e565b8210610ca55760405162461bcd60e51b81526004016107629061368a565b60088281548110610cc657634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806106a15760405162461bcd60e51b815260040161076290613445565b60606106a1826040518060400160405280600681526020017f53594d424f4c00000000000000000000000000000000000000000000000000008152506010805480602002602001604051908101604052809291908181526020016000905b82821015610a45578382906000526020600020018054610d8a906137eb565b80601f0160208091040260200160405190810160405280929190818152602001828054610db6906137eb565b8015610e035780601f10610dd857610100808354040283529160200191610e03565b820191906000526020600020905b815481529060010190602001808311610de657829003601f168201915b505050505081526020019060010190610d6b565b6002600a541415610e3a5760405162461bcd60e51b8152600401610762906136e7565b6002600a5560005b8151811015610f6657600e54825133916001600160a01b031690636352211e90859085908110610e8257634e487b7160e01b600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b8152600401610ea6919061371e565b60206040518083038186803b158015610ebe57600080fd5b505afa158015610ed2573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610ef69190612a39565b6001600160a01b031614610f1c5760405162461bcd60e51b815260040161076290613308565b610f54610f27611cb3565b838381518110610f4757634e487b7160e01b600052603260045260246000fd5b602002602001015161218e565b80610f5e81613826565b915050610e42565b50506001600a55565b60006001600160a01b038216610f975760405162461bcd60e51b8152600401610762906133e8565b506001600160a01b031660009081526003602052604090205490565b610fbb611cb3565b6001600160a01b0316610fcc611108565b6001600160a01b031614610ff25760405162461bcd60e51b815260040161076290613523565b610ffc60006121ac565b565b60606106a1826040518060400160405280600681526020017f464c414d455300000000000000000000000000000000000000000000000000008152506017805480602002602001604051908101604052809291908181526020016000905b82821015610a4557838290600052602060002001805461107b906137eb565b80601f01602080910402602001604051908101604052809291908181526020018280546110a7906137eb565b80156110f45780601f106110c9576101008083540402835291602001916110f4565b820191906000526020600020905b8154815290600101906020018083116110d757829003601f168201915b50505050508152602001906001019061105c565b600b546001600160a01b031690565b6060600180546106b8906137eb565b6002600a5414156111495760405162461bcd60e51b8152600401610762906136e7565b6002600a558051600c54349161115e91613789565b111561117c5760405162461bcd60e51b8152600401610762906132d1565b60005b8151811015610f6657611f408282815181106111ab57634e487b7160e01b600052603260045260246000fd5b60200260200101511180156111e857506129048282815181106111de57634e487b7160e01b600052603260045260246000fd5b6020026020010151105b6112045760405162461bcd60e51b815260040161076290613558565b61122833838381518110610f4757634e487b7160e01b600052603260045260246000fd5b8061123281613826565b91505061117f565b600c5481565b6002600a5414156112635760405162461bcd60e51b8152600401610762906136e7565b6002600a55611f408111801561127b57506129048111155b6112975760405162461bcd60e51b815260040161076290613558565b34600c5411156112b95760405162461bcd60e51b8152600401610762906132d1565b6112ca6112c4611cb3565b8261218e565b506001600a55565b6112da611cb3565b6001600160a01b0316826001600160a01b0316141561130b5760405162461bcd60e51b81526004016107629061329a565b8060056000611318611cb3565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561135c611cb3565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161139491906130ea565b60405180910390a35050565b6113b16113ab611cb3565b83611d25565b6113cd5760405162461bcd60e51b81526004016107629061362d565b6113d9848484846121fe565b50505050565b60606106a1826040518060400160405280600681526020017f504f49534f4e00000000000000000000000000000000000000000000000000008152506013805480602002602001604051908101604052809291908181526020016000905b82821015610a4557838290600052602060002001805461145c906137eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611488906137eb565b80156114d55780601f106114aa576101008083540402835291602001916114d5565b820191906000526020600020905b8154815290600101906020018083116114b857829003601f168201915b50505050508152602001906001019061143d565b60606114f36129dc565b60405180610120016040528060ff81526020016139f760ff9139815261151883610a4e565b8160016020020181905250604051806060016040528060288152602001613af660289139604082015261154a836119b5565b60608083019190915260408051918201905260288082526138c36020830139608082015261157783610b73565b60a08201526040805160608101909152602880825261393d602083013960c08201526115a2836118ab565b60e08201526040805160608101909152602980825261396560208301396101008201526115ce836113df565b6101208201526040805160608101909152602980825261391460208301396101408201526115fb8361093b565b6101608201526040805160608101909152602980825261398e602083013961018082015261162883610ffe565b6101a0820152604080516060810190915260298082526138eb60208301396101c0820152611655836117a1565b6101e0820152604080518082018252600d81527f3c2f746578743e3c2f7376673e00000000000000000000000000000000000000602080830191909152610200840191909152825181840151838501516060860151608087015160a088015160c089015160e08a01516101008b0151995160009a6116d59a909101612d53565b60408051808303601f19018152908290526101208401516101408501516101608601516101808701516101a08801516101c08901516101e08a01516102008b0151979950611728988a9890602001612d53565b6040516020818303038152906040529050600061177561174786612231565b61175084612364565b604051602001611761929190612f2d565b604051602081830303815290604052612364565b9050806040516020016117889190613055565b60408051808303601f1901815291905295945050505050565b60606106a1826040518060400160405280600881526020017f534c4f574e4553530000000000000000000000000000000000000000000000008152506018805480602002602001604051908101604052809291908181526020016000905b82821015610a4557838290600052602060002001805461181e906137eb565b80601f016020809104026020016040519081016040528092919081815260200182805461184a906137eb565b80156118975780601f1061186c57610100808354040283529160200191611897565b820191906000526020600020905b81548152906001019060200180831161187a57829003601f168201915b5050505050815260200190600101906117ff565b60606106a1826040518060400160405280600c81526020017f4d696e6420436f6e74726f6c00000000000000000000000000000000000000008152506015805480602002602001604051908101604052809291908181526020016000905b82821015610a45578382906000526020600020018054611928906137eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611954906137eb565b80156119a15780601f10611976576101008083540402835291602001916119a1565b820191906000526020600020905b81548152906001019060200180831161198457829003601f168201915b505050505081526020019060010190611909565b60606106a1826040518060400160405280600881526020017f535452454e4754480000000000000000000000000000000000000000000000008152506011805480602002602001604051908101604052809291908181526020016000905b82821015610a45578382906000526020600020018054611a32906137eb565b80601f0160208091040260200160405190810160405280929190818152602001828054611a5e906137eb565b8015611aab5780601f10611a8057610100808354040283529160200191611aab565b820191906000526020600020905b815481529060010190602001808311611a8e57829003601f168201915b505050505081526020019060010190611a13565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b611af5611cb3565b6001600160a01b0316611b06611108565b6001600160a01b031614611b2c5760405162461bcd60e51b815260040161076290613523565b6001600160a01b038116611b525760405162461bcd60e51b8152600401610762906131c2565b610938816121ac565b6002600a541415611b7e5760405162461bcd60e51b8152600401610762906136e7565b6002600a558015801590611b945750611f408111155b611bb05760405162461bcd60e51b815260040161076290613558565b600e546040516331a9108f60e11b815233916001600160a01b031690636352211e90611be090859060040161371e565b60206040518083038186803b158015611bf857600080fd5b505afa158015611c0c573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611c309190612a39565b6001600160a01b0316146112b95760405162461bcd60e51b815260040161076290613308565b60006001600160e01b031982166380ac58cd60e01b1480611c8757506001600160e01b03198216635b5e139f60e01b145b806106a157506106a1826124d8565b6000908152600260205260409020546001600160a01b0316151590565b3390565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611cec82610cd8565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611d3082611c96565b611d4c5760405162461bcd60e51b81526004016107629061333f565b6000611d5783610cd8565b9050806001600160a01b0316846001600160a01b03161480611d925750836001600160a01b0316611d878461073b565b6001600160a01b0316145b80611da25750611da28185611abf565b949350505050565b826001600160a01b0316611dbd82610cd8565b6001600160a01b031614611de35760405162461bcd60e51b81526004016107629061358f565b6001600160a01b038216611e095760405162461bcd60e51b815260040161076290613256565b611e148383836124f1565b611e1f600082611cb7565b6001600160a01b0383166000908152600360205260408120805460019290611e489084906137a8565b90915550506001600160a01b0382166000908152600360205260408120805460019290611e7690849061375d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60606000611f0d84611ee887612231565b604051602001611ef9929190612d24565b60405160208183030381529060405261257a565b9050600083845183611f1f9190613841565b81518110611f3d57634e487b7160e01b600052603260045260246000fd5b602002602001015190506000601583611f569190613841565b90507ff210237285fb031d28df6380c208a69f21391504586bc22ab32af7cab98b20fb86604051602001611f8a9190612d08565b60405160208183030381529060405280519060200120148015611fad5750600e81115b1561200e5760198054839190611fc39086613841565b81548110611fe157634e487b7160e01b600052603260045260246000fd5b90600052602060002001604051602001611ffc929190612e6e565b60405160208183030381529060405291505b7f649624ae0b7c137eebb6630d1048ad5216d6db6cc2e758ebc09aa368366896b4866040516020016120409190612d08565b60405160208183030381529060405280519060200120148015612064575060138110155b1561218457612071612a04565b601a805461207f9086613841565b8154811061209d57634e487b7160e01b600052603260045260246000fd5b9060005260206000200180546120b2906137eb565b80601f01602080910402602001604051908101604052809291908181526020018280546120de906137eb565b801561212b5780601f106121005761010080835404028352916020019161212b565b820191906000526020600020905b81548152906001019060200180831161210e57829003601f168201915b50505050508160006001811061215157634e487b7160e01b600052603260045260246000fd5b602090810291909101919091528151604051612171928691839101612e14565b6040516020818303038152906040529250505b5095945050505050565b6121a88282604051806020016040528060008152506125ab565b5050565b600b80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b612209848484611daa565b612215848484846125de565b6113d95760405162461bcd60e51b815260040161076290613165565b60608161225657506040805180820190915260018152600360fc1b60208201526106a4565b8160005b8115612280578061226a81613826565b91506122799050600a83613775565b915061225a565b60008167ffffffffffffffff8111156122a957634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156122d3576020820181803683370190505b5090505b8415611da2576122e86001836137a8565b91506122f5600a86613841565b61230090603061375d565b60f81b81838151811061232357634e487b7160e01b600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535061235d600a86613775565b94506122d7565b8051606090806123845750506040805160208101909152600081526106a4565b6000600361239383600261375d565b61239d9190613775565b6123a8906004613789565b905060006123b782602061375d565b67ffffffffffffffff8111156123dd57634e487b7160e01b600052604160045260246000fd5b6040519080825280601f01601f191660200182016040528015612407576020820181803683370190505b50905060006040518060600160405280604081526020016139b7604091399050600181016020830160005b86811015612493576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612432565b5060038606600181146124ad57600281146124be576124ca565b613d3d60f01b6001198301526124ca565b603d60f81b6000198301525b505050918152949350505050565b6001600160e01b031981166301ffc9a760e01b14919050565b6124fc83838361081a565b6001600160a01b03831661251857612513816126f9565b61253b565b816001600160a01b0316836001600160a01b03161461253b5761253b838261273d565b6001600160a01b03821661255757612552816127da565b61081a565b826001600160a01b0316826001600160a01b03161461081a5761081a82826128b3565b60008160405160200161258d9190612d08565b60408051601f19818403018152919052805160209091012092915050565b6125b583836128f7565b6125c260008484846125de565b61081a5760405162461bcd60e51b815260040161076290613165565b60006125f2846001600160a01b03166129d6565b156126ee57836001600160a01b031663150b7a0261260e611cb3565b8786866040518563ffffffff1660e01b815260040161263094939291906130ae565b602060405180830381600087803b15801561264a57600080fd5b505af192505050801561267a575060408051601f3d908101601f1916820190925261267791810190612ca8565b60015b6126d4573d8080156126a8576040519150601f19603f3d011682016040523d82523d6000602084013e6126ad565b606091505b5080516126cc5760405162461bcd60e51b815260040161076290613165565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611da2565b506001949350505050565b600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6000600161274a84610f6f565b61275491906137a8565b6000838152600760205260409020549091508082146127a7576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b6008546000906127ec906001906137a8565b6000838152600960205260408120546008805493945090928490811061282257634e487b7160e01b600052603260045260246000fd5b90600052602060002001549050806008838154811061285157634e487b7160e01b600052603260045260246000fd5b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548061289757634e487b7160e01b600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b60006128be83610f6f565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b6001600160a01b03821661291d5760405162461bcd60e51b8152600401610762906134a2565b61292681611c96565b156129435760405162461bcd60e51b81526004016107629061321f565b61294f600083836124f1565b6001600160a01b038216600090815260036020526040812080546001929061297890849061375d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b3b151590565b6040518061022001604052806011905b60608152602001906001900390816129ec5790505090565b60408051602081019091526060815290565b600060208284031215612a27578081fd5b8135612a3281613897565b9392505050565b600060208284031215612a4a578081fd5b8151612a3281613897565b60008060408385031215612a67578081fd5b8235612a7281613897565b91506020830135612a8281613897565b809150509250929050565b600080600060608486031215612aa1578081fd5b8335612aac81613897565b92506020840135612abc81613897565b929592945050506040919091013590565b60008060008060808587031215612ae2578081fd5b8435612aed81613897565b9350602085810135612afe81613897565b935060408601359250606086013567ffffffffffffffff80821115612b21578384fd5b818801915088601f830112612b34578384fd5b813581811115612b4657612b46613881565b612b58601f8201601f19168501613727565b91508082528984828501011115612b6d578485fd5b8084840185840137810190920192909252939692955090935050565b60008060408385031215612b9b578182fd5b8235612ba681613897565b915060208301358015158114612a82578182fd5b60008060408385031215612bcc578182fd5b8235612bd781613897565b946020939093013593505050565b60006020808385031215612bf7578182fd5b823567ffffffffffffffff80821115612c0e578384fd5b818501915085601f830112612c21578384fd5b813581811115612c3357612c33613881565b8381029150612c43848301613727565b8181528481019084860184860187018a1015612c5d578788fd5b8795505b83861015612c7f578035835260019590950194918601918601612c61565b5098975050505050505050565b600060208284031215612c9d578081fd5b8135612a32816138ac565b600060208284031215612cb9578081fd5b8151612a32816138ac565b600060208284031215612cd5578081fd5b5035919050565b60008151808452612cf48160208601602086016137bf565b601f01601f19169290920160200192915050565b60008251612d1a8184602087016137bf565b9190910192915050565b60008351612d368184602088016137bf565b835190830190612d4a8183602088016137bf565b01949350505050565b60008a51612d65818460208f016137bf565b8a51612d778183860160208f016137bf565b8a519184010190612d8c818360208e016137bf565b8951612d9e8183850160208e016137bf565b8951929091010190612db4818360208c016137bf565b8751612dc68183850160208c016137bf565b8751929091010190612ddc818360208a016137bf565b8551612dee8183850160208a016137bf565b8551929091010190612e048183602088016137bf565b019b9a5050505050505050505050565b60008451612e268184602089016137bf565b8083019050600160fd1b8082528551612e46816001850160208a016137bf565b60019201918201528351612e618160028401602088016137bf565b0160020195945050505050565b600083516020612e8182858389016137bf565b600160fd1b918401918252845460019084906002810481841680612ea657607f821691505b858210811415612ec457634e487b7160e01b88526022600452602488fd5b808015612ed85760018114612eed57612f1d565b60ff1984168887015282880186019450612f1d565b612ef68b613751565b895b84811015612f135781548a8201890152908701908801612ef8565b5050858389010194505b50929a9950505050505050505050565b60007f7b226e616d65223a2022506f74696f6e2023000000000000000000000000000082528351612f658160128501602088016137bf565b7f222c20226465736372697074696f6e223a2022506f74696f6e732061726520616012918401918201527f75746f6d61746963616c6c792067656e657261746564206f6e2d636861696e2e60328201527f20496e73706972656420616e6420636f6d70617469626c652077697468204c6f60528201527f6f742028666f7220416476656e74757265727329222c2022696d616765223a2060728201527f22646174613a696d6167652f7376672b786d6c3b6261736536342c00000000006092820152835161303a8160ad8401602088016137bf565b61227d60f01b60ad929091019182015260af01949350505050565b60007f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008252825161308d81601d8501602087016137bf565b91909101601d0192915050565b6001600160a01b0391909116815260200190565b60006001600160a01b038087168352808616602084015250836040830152608060608301526130e06080830184612cdc565b9695505050505050565b901515815260200190565b600060208252612a326020830184612cdc565b6020808252602b908201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560408201527f74206f6620626f756e6473000000000000000000000000000000000000000000606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527f63656976657220696d706c656d656e7465720000000000000000000000000000606082015260800190565b60208082526026908201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160408201527f6464726573730000000000000000000000000000000000000000000000000000606082015260800190565b6020808252601c908201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604082015260600190565b60208082526024908201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646040820152637265737360e01b606082015260800190565b60208082526019908201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604082015260600190565b6020808252601f908201527f45746865722076616c75652073656e74206973206e6f7420636f727265637400604082015260600190565b6020808252601a908201527f4e6f7420746865206f776e6572206f662074686973206c6f6f74000000000000604082015260600190565b6020808252602c908201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b60208082526038908201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760408201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606082015260800190565b6020808252602a908201527f4552433732313a2062616c616e636520717565727920666f7220746865207a6560408201527f726f206164647265737300000000000000000000000000000000000000000000606082015260800190565b60208082526029908201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460408201527f656e7420746f6b656e0000000000000000000000000000000000000000000000606082015260800190565b6020808252818101527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604082015260600190565b6020808252602c908201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860408201526b34b9ba32b73a103a37b5b2b760a11b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526010908201527f546f6b656e20494420696e76616c696400000000000000000000000000000000604082015260600190565b60208082526029908201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960408201527f73206e6f74206f776e0000000000000000000000000000000000000000000000606082015260800190565b60208082526021908201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656040820152603960f91b606082015260800190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60408201527f776e6572206e6f7220617070726f766564000000000000000000000000000000606082015260800190565b6020808252602c908201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60408201527f7574206f6620626f756e64730000000000000000000000000000000000000000606082015260800190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b90815260200190565b60405181810167ffffffffffffffff8111828210171561374957613749613881565b604052919050565b60009081526020902090565b6000821982111561377057613770613855565b500190565b6000826137845761378461386b565b500490565b60008160001904831182151516156137a3576137a3613855565b500290565b6000828210156137ba576137ba613855565b500390565b60005b838110156137da5781810151838201526020016137c2565b838111156113d95750506000910152565b6002810460018216806137ff57607f821691505b6020821081141561382057634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561383a5761383a613855565b5060010190565b6000826138505761385061386b565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461093857600080fd5b6001600160e01b03198116811461093857600080fdfe3c2f746578743e3c7465787420783d2231302220793d2236302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223136302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223132302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2238302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223130302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d223134302220636c6173733d2262617365223e4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f3c73766720786d6c6e733d22687474703a2f2f7777772e77332e6f72672f323030302f73766722207072657365727665417370656374526174696f3d22784d696e594d696e206d656574222076696577426f783d223020302033353020333530223e3c7374796c653e2e62617365207b2066696c6c3a2077686974653b20666f6e742d66616d696c793a20637572736976653b20666f6e742d73697a653a20323470783b207d3c2f7374796c653e3c726563742077696474683d223130302522206865696768743d2231303025222066696c6c3d22626c61636b22202f3e3c7465787420783d2231302220793d2232302220636c6173733d2262617365223e3c2f746578743e3c7465787420783d2231302220793d2234302220636c6173733d2262617365223ea2646970667358221220d167d6948366c43cac202a944829dd7bd8177c3e748639063e2337b116688b8964736f6c63430008000033

Deployed Bytecode Sourcemap

44488:10667:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38230:224;;;;;;;;;;-1:-1:-1;38230:224:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25358:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;26917:221::-;;;;;;;;;;-1:-1:-1;26917:221:0;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;26440:411::-;;;;;;;;;;-1:-1:-1;26440:411:0;;;;;:::i;:::-;;:::i;:::-;;44624:71;;;;;;;;;;;;;:::i;38870:113::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;27807:339::-;;;;;;;;;;-1:-1:-1;27807:339:0;;;;;:::i;:::-;;:::i;38538:256::-;;;;;;;;;;-1:-1:-1;38538:256:0;;;;;:::i;:::-;;:::i;44702:62::-;;;;;;;;;;;;;:::i;54255:107::-;;;;;;;;;;;;;:::i;49156:130::-;;;;;;;;;;-1:-1:-1;49156:130:0;;;;;:::i;:::-;;:::i;48270:::-;;;;;;;;;;-1:-1:-1;48270:130:0;;;;;:::i;:::-;;:::i;28217:185::-;;;;;;;;;;-1:-1:-1;28217:185:0;;;;;:::i;:::-;;:::i;48996:148::-;;;;;;;;;;-1:-1:-1;48996:148:0;;;;;:::i;:::-;;:::i;39060:233::-;;;;;;;;;;-1:-1:-1;39060:233:0;;;;;:::i;:::-;;:::i;25052:239::-;;;;;;;;;;-1:-1:-1;25052:239:0;;;;;:::i;:::-;;:::i;49440:131::-;;;;;;;;;;-1:-1:-1;49440:131:0;;;;;:::i;:::-;;:::i;53937:306::-;;;;;;:::i;:::-;;:::i;24782:208::-;;;;;;;;;;-1:-1:-1;24782:208:0;;;;;:::i;:::-;;:::i;9818:94::-;;;;;;;;;;;;;:::i;48696:130::-;;;;;;;;;;-1:-1:-1;48696:130:0;;;;;:::i;:::-;;:::i;9167:87::-;;;;;;;;;;;;;:::i;25527:104::-;;;;;;;;;;;;;:::i;53260:377::-;;;;;;:::i;:::-;;:::i;44564:40::-;;;;;;;;;;;;;:::i;52991:257::-;;;;;;:::i;:::-;;:::i;27210:295::-;;;;;;;;;;-1:-1:-1;27210:295:0;;;;;:::i;:::-;;:::i;28473:328::-;;;;;;;;;;-1:-1:-1;28473:328:0;;;;;:::i;:::-;;:::i;49298:130::-;;;;;;;;;;-1:-1:-1;49298:130:0;;;;;:::i;:::-;;:::i;50483:2500::-;;;;;;;;;;-1:-1:-1;50483:2500:0;;;;;:::i;:::-;;:::i;48552:136::-;;;;;;;;;;-1:-1:-1;48552:136:0;;;;;:::i;:::-;;:::i;48838:146::-;;;;;;;;;;-1:-1:-1;48838:146:0;;;;;:::i;:::-;;:::i;48408:136::-;;;;;;;;;;-1:-1:-1;48408:136:0;;;;;:::i;:::-;;:::i;27576:164::-;;;;;;;;;;-1:-1:-1;27576:164:0;;;;;:::i;:::-;;:::i;10067:192::-;;;;;;;;;;-1:-1:-1;10067:192:0;;;;;:::i;:::-;;:::i;53649:276::-;;;;;;:::i;:::-;;:::i;38230:224::-;38332:4;-1:-1:-1;;;;;;38356:50:0;;-1:-1:-1;;;38356:50:0;;:90;;;38410:36;38434:11;38410:23;:36::i;:::-;38349:97;;38230:224;;;;:::o;25358:100::-;25412:13;25445:5;25438:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;25358:100;:::o;26917:221::-;26993:7;27021:16;27029:7;27021;:16::i;:::-;27013:73;;;;-1:-1:-1;;;27013:73:0;;;;;;;:::i;:::-;;;;;;;;;-1:-1:-1;27106:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;27106:24:0;;26917:221::o;26440:411::-;26521:13;26537:23;26552:7;26537:14;:23::i;:::-;26521:39;;26585:5;-1:-1:-1;;;;;26579:11:0;:2;-1:-1:-1;;;;;26579:11:0;;;26571:57;;;;-1:-1:-1;;;26571:57:0;;;;;;;:::i;:::-;26679:5;-1:-1:-1;;;;;26663:21:0;:12;:10;:12::i;:::-;-1:-1:-1;;;;;26663:21:0;;:62;;;;26688:37;26705:5;26712:12;:10;:12::i;26688:37::-;26641:168;;;;-1:-1:-1;;;26641:168:0;;;;;;;:::i;:::-;26822:21;26831:2;26835:7;26822:8;:21::i;:::-;26440:411;;;:::o;44624:71::-;;;-1:-1:-1;;;;;44624:71:0;;:::o;38870:113::-;38958:10;:17;38870:113;:::o;27807:339::-;28002:41;28021:12;:10;:12::i;:::-;28035:7;28002:18;:41::i;:::-;27994:103;;;;-1:-1:-1;;;27994:103:0;;;;;;;:::i;:::-;28110:28;28120:4;28126:2;28130:7;28110:9;:28::i;38538:256::-;38635:7;38671:23;38688:5;38671:16;:23::i;:::-;38663:5;:31;38655:87;;;;-1:-1:-1;;;38655:87:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;38760:19:0;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;38538:256::o;44702:62::-;;;-1:-1:-1;;;;;44702:62:0;;:::o;54255:107::-;9398:12;:10;:12::i;:::-;-1:-1:-1;;;;;9387:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;9387:23:0;;9379:68;;;;-1:-1:-1;;;9379:68:0;;;;;;;:::i;:::-;54303:51:::1;::::0;54311:10:::1;::::0;54332:21:::1;54303:51:::0;::::1;;;::::0;::::1;::::0;;;54332:21;54311:10;54303:51;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;54255:107::o:0;49156:130::-;49213:13;49246:32;49252:7;49246:32;;;;;;;;;;;;;;;;;49271:6;49246:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:5;:32::i;48270:130::-;48325:13;48358:34;48364:7;48358:34;;;;;;;;;;;;;;;;;48384:7;48358:34;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;28217:185;28355:39;28372:4;28378:2;28382:7;28355:39;;;;;;;;;;;;:16;:39::i;48996:148::-;49059:13;49092:44;49098:7;49092:44;;;;;;;;;;;;;;;;;49123:12;49092:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;39060:233;39135:7;39171:30;:28;:30::i;:::-;39163:5;:38;39155:95;;;;-1:-1:-1;;;39155:95:0;;;;;;;:::i;:::-;39268:10;39279:5;39268:17;;;;;;-1:-1:-1;;;39268:17:0;;;;;;;;;;;;;;;;;39261:24;;39060:233;;;:::o;25052:239::-;25124:7;25160:16;;;:7;:16;;;;;;-1:-1:-1;;;;;25160:16:0;25195:19;25187:73;;;;-1:-1:-1;;;25187:73:0;;;;;;;:::i;49440:131::-;49497:13;49530:33;49536:7;49530:33;;;;;;;;;;;;;;;;;49555:7;49530:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53937:306;12098:1;12694:7;;:19;;12686:63;;;;-1:-1:-1;;;12686:63:0;;;;;;;:::i;:::-;12098:1;12827:7;:18;54034:9:::1;54029:207;54053:7;:14;54049:1;:18;54029:207;;;54097:12;::::0;54118:10;;54133::::1;::::0;-1:-1:-1;;;;;54097:12:0::1;::::0;:20:::1;::::0;54118:7;;54126:1;;54118:10;::::1;;;-1:-1:-1::0;;;54118:10:0::1;;;;;;;;;;;;;;;54097:32;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;54097:46:0::1;;54089:85;;;;-1:-1:-1::0;;;54089:85:0::1;;;;;;;:::i;:::-;54189:35;54199:12;:10;:12::i;:::-;54213:7;54221:1;54213:10;;;;;;-1:-1:-1::0;;;54213:10:0::1;;;;;;;;;;;;;;;54189:9;:35::i;:::-;54069:3:::0;::::1;::::0;::::1;:::i;:::-;;;;54029:207;;;-1:-1:-1::0;;12054:1:0;13006:7;:22;53937:306::o;24782:208::-;24854:7;-1:-1:-1;;;;;24882:19:0;;24874:74;;;;-1:-1:-1;;;24874:74:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;;24966:16:0;;;;;:9;:16;;;;;;;24782:208::o;9818:94::-;9398:12;:10;:12::i;:::-;-1:-1:-1;;;;;9387:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;9387:23:0;;9379:68;;;;-1:-1:-1;;;9379:68:0;;;;;;;:::i;:::-;9883:21:::1;9901:1;9883:9;:21::i;:::-;9818:94::o:0;48696:130::-;48753:13;48786:32;48792:7;48786:32;;;;;;;;;;;;;;;;;48811:6;48786:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;9167:87;9240:6;;-1:-1:-1;;;;;9240:6:0;9167:87;:::o;25527:104::-;25583:13;25616:7;25609:14;;;;;:::i;53260:377::-;12098:1;12694:7;;:19;;12686:63;;;;-1:-1:-1;;;12686:63:0;;;;;;;:::i;:::-;12098:1;12827:7;:18;53362:15;;53354:5:::1;::::0;53382:9:::1;::::0;53354:23:::1;::::0;::::1;:::i;:::-;53353:38;;53345:82;;;;-1:-1:-1::0;;;53345:82:0::1;;;;;;;:::i;:::-;53443:9;53438:192;53462:8;:15;53458:1;:19;53438:192;;;53521:4;53507:8;53516:1;53507:11;;;;;;-1:-1:-1::0;;;53507:11:0::1;;;;;;;;;;;;;;;:18;:41;;;;;53543:5;53529:8;53538:1;53529:11;;;;;;-1:-1:-1::0;;;53529:11:0::1;;;;;;;;;;;;;;;:19;53507:41;53499:70;;;;-1:-1:-1::0;;;53499:70:0::1;;;;;;;:::i;:::-;53584:34;53594:10;53606:8;53615:1;53606:11;;;;;;-1:-1:-1::0;;;53606:11:0::1;;;;;;;;53584:34;53479:3:::0;::::1;::::0;::::1;:::i;:::-;;;;53438:192;;44564:40:::0;;;;:::o;52991:257::-;12098:1;12694:7;;:19;;12686:63;;;;-1:-1:-1;;;12686:63:0;;;;;;;:::i;:::-;12098:1;12827:7;:18;53079:4:::1;53069:14:::0;::::1;:34:::0;::::1;;;;53098:5;53087:7;:16;;53069:34;53061:63;;;;-1:-1:-1::0;;;53061:63:0::1;;;;;;;:::i;:::-;53152:9;53143:5;;:18;;53135:62;;;;-1:-1:-1::0;;;53135:62:0::1;;;;;;;:::i;:::-;53208:32;53218:12;:10;:12::i;:::-;53232:7;53208:9;:32::i;:::-;-1:-1:-1::0;12054:1:0;13006:7;:22;52991:257::o;27210:295::-;27325:12;:10;:12::i;:::-;-1:-1:-1;;;;;27313:24:0;:8;-1:-1:-1;;;;;27313:24:0;;;27305:62;;;;-1:-1:-1;;;27305:62:0;;;;;;;:::i;:::-;27425:8;27380:18;:32;27399:12;:10;:12::i;:::-;-1:-1:-1;;;;;27380:32:0;;;;;;;;;;;;;;;;;-1:-1:-1;27380:32:0;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;27380:53:0;;;;;;;;;;;27464:12;:10;:12::i;:::-;-1:-1:-1;;;;;27449:48:0;;27488:8;27449:48;;;;;;:::i;:::-;;;;;;;;27210:295;;:::o;28473:328::-;28648:41;28667:12;:10;:12::i;:::-;28681:7;28648:18;:41::i;:::-;28640:103;;;;-1:-1:-1;;;28640:103:0;;;;;;;:::i;:::-;28754:39;28768:4;28774:2;28778:7;28787:5;28754:13;:39::i;:::-;28473:328;;;;:::o;49298:130::-;49355:13;49388:32;49394:7;49388:32;;;;;;;;;;;;;;;;;49413:6;49388:32;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50483:2500;50548:13;50574:23;;:::i;:::-;50608:292;;;;;;;;;;;;;;;;;;;50924:16;50932:7;50924;:16::i;:::-;50913:5;50919:1;50913:8;;;:27;;;;50953:53;;;;;;;;;;;;;;;;;:8;;;:53;51030:20;51042:7;51030:11;:20::i;:::-;51019:8;;;;:31;;;;51063:53;;;;;;;;;;;;;51019:8;51063:53;;;:8;;;:53;51140:24;51156:7;51140:15;:24::i;:::-;51129:8;;;:35;51177:53;;;;;;;;;;;;;;51129:8;51177:53;;;:8;;;:53;51262:23;51277:7;51262:14;:23::i;:::-;51251:8;;;:34;51298:54;;;;;;;;;;;;;;51251:8;51298:54;;;:8;;;:54;51384:18;51394:7;51384:9;:18::i;:::-;51373:8;;;:29;51415:55;;;;;;;;;;;;;;51373:8;51415:55;;;:9;;;:55;51503:18;51513:7;51503:9;:18::i;:::-;51491:9;;;:30;51534:55;;;;;;;;;;;;;;51491:9;51534:55;;;:9;;;:55;51614:18;51624:7;51614:9;:18::i;:::-;51602:9;;;:30;51645:55;;;;;;;;;;;;;;51602:9;51645:55;;;:9;;;:55;51733:20;51745:7;51733:11;:20::i;:::-;51721:9;;;:32;51774:27;;;;;;;;;;;;51721:9;51774:27;;;;;;;:9;;;:27;;;;51875:8;;51885;;;;51895;;;;51905;;;;51915;;;;51925;;;;51935;;;;51945;;;;51955;;;;51858:106;;-1:-1:-1;;51858:106:0;;51955:8;;51858:106;;:::i;:::-;;;;;;;-1:-1:-1;;51858:106:0;;;;;;;52076:8;;;;52103:9;;;;52131;;;;52159;;;;52187;;;;52215;;;;52243;;;;52271;;;;51858:106;;-1:-1:-1;52016:279:0;;51858:106;;52271:9;52076:8;52016:279;;:::i;:::-;;;;;;;;;;;;;51986:320;;52319:18;52340:526;52511:17;52520:7;52511:8;:17::i;:::-;52739:28;52759:6;52739:13;:28::i;:::-;52421:400;;;;;;;;;:::i;:::-;;;;;;;;;;;;;52340:13;:526::i;:::-;52319:547;;52943:4;52893:55;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1;;52893:55:0;;;;;;;50483:2500;-1:-1:-1;;;;;50483:2500:0:o;48552:136::-;48611:13;48644:36;48650:7;48644:36;;;;;;;;;;;;;;;;;48671:8;48644:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48838:146;48900:13;48933:43;48939:7;48933:43;;;;;;;;;;;;;;;;;48964:11;48933:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48408:136;48467:13;48500:36;48506:7;48500:36;;;;;;;;;;;;;;;;;48527:8;48500:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;27576:164;-1:-1:-1;;;;;27697:25:0;;;27673:4;27697:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;27576:164::o;10067:192::-;9398:12;:10;:12::i;:::-;-1:-1:-1;;;;;9387:23:0;:7;:5;:7::i;:::-;-1:-1:-1;;;;;9387:23:0;;9379:68;;;;-1:-1:-1;;;9379:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10156:22:0;::::1;10148:73;;;;-1:-1:-1::0;;;10148:73:0::1;;;;;;;:::i;:::-;10232:19;10242:8;10232:9;:19::i;53649:276::-:0;12098:1;12694:7;;:19;;12686:63;;;;-1:-1:-1;;;12686:63:0;;;;;;;:::i;:::-;12098:1;12827:7;:18;53734:10;;;;;:28:::1;;;53758:4;53748:6;:14;;53734:28;53726:57;;;;-1:-1:-1::0;;;53726:57:0::1;;;;;;;:::i;:::-;53802:12;::::0;:28:::1;::::0;-1:-1:-1;;;53802:28:0;;53834:10:::1;::::0;-1:-1:-1;;;;;53802:12:0::1;::::0;:20:::1;::::0;:28:::1;::::0;53823:6;;53802:28:::1;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1::0;;;;;53802:42:0::1;;53794:81;;;;-1:-1:-1::0;;;53794:81:0::1;;;;;;;:::i;24413:305::-:0;24515:4;-1:-1:-1;;;;;;24552:40:0;;-1:-1:-1;;;24552:40:0;;:105;;-1:-1:-1;;;;;;;24609:48:0;;-1:-1:-1;;;24609:48:0;24552:105;:158;;;;24674:36;24698:11;24674:23;:36::i;30311:127::-;30376:4;30400:16;;;:7;:16;;;;;;-1:-1:-1;;;;;30400:16:0;:30;;;30311:127::o;8043:98::-;8123:10;8043:98;:::o;34293:174::-;34368:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;34368:29:0;-1:-1:-1;;;;;34368:29:0;;;;;;;;:24;;34422:23;34368:24;34422:14;:23::i;:::-;-1:-1:-1;;;;;34413:46:0;;;;;;;;;;;34293:174;;:::o;30605:348::-;30698:4;30723:16;30731:7;30723;:16::i;:::-;30715:73;;;;-1:-1:-1;;;30715:73:0;;;;;;;:::i;:::-;30799:13;30815:23;30830:7;30815:14;:23::i;:::-;30799:39;;30868:5;-1:-1:-1;;;;;30857:16:0;:7;-1:-1:-1;;;;;30857:16:0;;:51;;;;30901:7;-1:-1:-1;;;;;30877:31:0;:20;30889:7;30877:11;:20::i;:::-;-1:-1:-1;;;;;30877:31:0;;30857:51;:87;;;;30912:32;30929:5;30936:7;30912:16;:32::i;:::-;30849:96;30605:348;-1:-1:-1;;;;30605:348:0:o;33597:578::-;33756:4;-1:-1:-1;;;;;33729:31:0;:23;33744:7;33729:14;:23::i;:::-;-1:-1:-1;;;;;33729:31:0;;33721:85;;;;-1:-1:-1;;;33721:85:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;33825:16:0;;33817:65;;;;-1:-1:-1;;;33817:65:0;;;;;;;:::i;:::-;33895:39;33916:4;33922:2;33926:7;33895:20;:39::i;:::-;33999:29;34016:1;34020:7;33999:8;:29::i;:::-;-1:-1:-1;;;;;34041:15:0;;;;;;:9;:15;;;;;:20;;34060:1;;34041:15;:20;;34060:1;;34041:20;:::i;:::-;;;;-1:-1:-1;;;;;;;34072:13:0;;;;;;:9;:13;;;;;:18;;34089:1;;34072:13;:18;;34089:1;;34072:18;:::i;:::-;;;;-1:-1:-1;;34101:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;34101:21:0;-1:-1:-1;;;;;34101:21:0;;;;;;;;;34140:27;;34101:16;;34140:27;;;;;;;33597:578;;;:::o;49583:888::-;49726:13;49752:12;49767:62;49798:9;49809:17;49818:7;49809:8;:17::i;:::-;49781:46;;;;;;;;;:::i;:::-;;;;;;;;;;;;;49767:6;:62::i;:::-;49752:77;;49840:20;49863:11;49882;:18;49875:4;:25;;;;:::i;:::-;49863:38;;;;;;-1:-1:-1;;;49863:38:0;;;;;;;;;;;;;;;49840:61;;49912:17;49939:2;49932:4;:9;;;;:::i;:::-;49912:29;;50000:20;49985:9;49968:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;49958:38;;;;;;:62;:80;;;;;50036:2;50024:9;:14;49958:80;49954:193;;;50101:8;50117:15;;50088:6;;50101:8;50110:22;;:4;:22;:::i;:::-;50101:32;;;;;;-1:-1:-1;;;50101:32:0;;;;;;;;;;;;;;;;50071:63;;;;;;;;;:::i;:::-;;;;;;;;;;;;;50055:80;;49954:193;50203:19;50188:9;50171:27;;;;;;;;:::i;:::-;;;;;;;;;;;;;50161:38;;;;;;:61;:80;;;;;50239:2;50226:9;:15;;50161:80;50157:283;;;50258:21;;:::i;:::-;50304:12;50324:19;;50317:26;;:4;:26;:::i;:::-;50304:40;;;;;;-1:-1:-1;;;50304:40:0;;;;;;;;;;;;;;;;50294:50;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:4;50299:1;50294:7;;;;;-1:-1:-1;;;50294:7:0;;;;;;;;;;;;;;;;;:50;;;;50392:7;;50375:52;;;;50406:6;;50392:7;;50375:52;;:::i;:::-;;;;;;;;;;;;;50359:69;;50157:283;;-1:-1:-1;50457:6:0;49583:888;-1:-1:-1;;;;;49583:888:0:o;31295:110::-;31371:26;31381:2;31385:7;31371:26;;;;;;;;;;;;:9;:26::i;:::-;31295:110;;:::o;10267:173::-;10342:6;;;-1:-1:-1;;;;;10359:17:0;;;-1:-1:-1;;;;;;10359:17:0;;;;;;;10392:40;;10342:6;;;10359:17;10342:6;;10392:40;;10323:16;;10392:40;10267:173;;:::o;29683:315::-;29840:28;29850:4;29856:2;29860:7;29840:9;:28::i;:::-;29887:48;29910:4;29916:2;29920:7;29929:5;29887:22;:48::i;:::-;29879:111;;;;-1:-1:-1;;;29879:111:0;;;;;;;:::i;54370:723::-;54426:13;54647:10;54643:53;;-1:-1:-1;54674:10:0;;;;;;;;;;;;-1:-1:-1;;;54674:10:0;;;;;;54643:53;54721:5;54706:12;54762:78;54769:9;;54762:78;;54795:8;;;;:::i;:::-;;-1:-1:-1;54818:10:0;;-1:-1:-1;54826:2:0;54818:10;;:::i;:::-;;;54762:78;;;54850:19;54882:6;54872:17;;;;;;-1:-1:-1;;;54872:17:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;54872:17:0;;54850:39;;54900:154;54907:10;;54900:154;;54934:11;54944:1;54934:11;;:::i;:::-;;-1:-1:-1;55003:10:0;55011:2;55003:5;:10;:::i;:::-;54990:24;;:2;:24;:::i;:::-;54977:39;;54960:6;54967;54960:14;;;;;;-1:-1:-1;;;54960:14:0;;;;;;;;;;;;:56;;;;;;;;;;-1:-1:-1;55031:11:0;55040:2;55031:11;;:::i;:::-;;;54900:154;;55353:1607;55451:11;;55411:13;;55477:8;55473:23;;-1:-1:-1;;55487:9:0;;;;;;;;;-1:-1:-1;55487:9:0;;;;55473:23;55548:18;55586:1;55575:7;:3;55581:1;55575:7;:::i;:::-;55574:13;;;;:::i;:::-;55569:19;;:1;:19;:::i;:::-;55548:40;-1:-1:-1;55646:19:0;55678:15;55548:40;55691:2;55678:15;:::i;:::-;55668:26;;;;;;-1:-1:-1;;;55668:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55668:26:0;;55646:48;;55707:18;55728:5;;;;;;;;;;;;;;;;;55707:26;;55797:1;55790:5;55786:13;55842:2;55834:6;55830:15;55893:1;55861:777;55916:3;55913:1;55910:10;55861:777;;;55971:1;56014:12;;;;;56008:19;56109:4;56097:2;56093:14;;;;;56075:40;;56069:47;56218:2;56214:14;;;56210:25;;56196:40;;56190:47;56347:1;56343:13;;;56339:24;;56325:39;;56319:46;56467:16;;;;56453:31;;56447:38;56145:1;56141:11;;;56239:4;56186:58;;;56177:68;56270:11;;56315:57;;;56306:67;;;;56398:11;;56443:49;;56434:59;56522:3;56518:13;56551:22;;56621:1;56606:17;;;;55964:9;55861:777;;;55865:44;56670:1;56665:3;56661:11;56691:1;56686:84;;;;56789:1;56784:82;;;;56654:212;;56686:84;-1:-1:-1;;;;;56719:17:0;;56712:43;56686:84;;56784:82;-1:-1:-1;;;;;56817:17:0;;56810:41;56654:212;-1:-1:-1;;;56882:26:0;;;;55353:1607;-1:-1:-1;;;;55353:1607:0:o;23022:157::-;-1:-1:-1;;;;;;23131:40:0;;-1:-1:-1;;;23131:40:0;23022:157;;;:::o;39906:589::-;40050:45;40077:4;40083:2;40087:7;40050:26;:45::i;:::-;-1:-1:-1;;;;;40112:18:0;;40108:187;;40147:40;40179:7;40147:31;:40::i;:::-;40108:187;;;40217:2;-1:-1:-1;;;;;40209:10:0;:4;-1:-1:-1;;;;;40209:10:0;;40205:90;;40236:47;40269:4;40275:7;40236:32;:47::i;:::-;-1:-1:-1;;;;;40309:16:0;;40305:183;;40342:45;40379:7;40342:36;:45::i;:::-;40305:183;;;40415:4;-1:-1:-1;;;;;40409:10:0;:2;-1:-1:-1;;;;;40409:10:0;;40405:83;;40436:40;40464:2;40468:7;40436:27;:40::i;48124:138::-;48184:7;48246:5;48229:23;;;;;;;;:::i;:::-;;;;-1:-1:-1;;48229:23:0;;;;;;;;;48219:34;;48229:23;48219:34;;;;;48124:138;-1:-1:-1;;48124:138:0:o;31632:321::-;31762:18;31768:2;31772:7;31762:5;:18::i;:::-;31813:54;31844:1;31848:2;31852:7;31861:5;31813:22;:54::i;:::-;31791:154;;;;-1:-1:-1;;;31791:154:0;;;;;;;:::i;35032:803::-;35187:4;35208:15;:2;-1:-1:-1;;;;;35208:13:0;;:15::i;:::-;35204:624;;;35260:2;-1:-1:-1;;;;;35244:36:0;;35281:12;:10;:12::i;:::-;35295:4;35301:7;35310:5;35244:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35244:72:0;;;;;;;;-1:-1:-1;;35244:72:0;;;;;;;;;;;;:::i;:::-;;;35240:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;35490:13:0;;35486:272;;35533:60;;-1:-1:-1;;;35533:60:0;;;;;;;:::i;35486:272::-;35708:6;35702:13;35693:6;35689:2;35685:15;35678:38;35240:533;-1:-1:-1;;;;;;35367:55:0;-1:-1:-1;;;35367:55:0;;-1:-1:-1;35360:62:0;;35204:624;-1:-1:-1;35812:4:0;35032:803;;;;;;:::o;41218:164::-;41322:10;:17;;41295:24;;;;:15;:24;;;;;:44;;;41350:24;;;;;;;;;;;;41218:164::o;42009:988::-;42275:22;42325:1;42300:22;42317:4;42300:16;:22::i;:::-;:26;;;;:::i;:::-;42337:18;42358:26;;;:17;:26;;;;;;42275:51;;-1:-1:-1;42491:28:0;;;42487:328;;-1:-1:-1;;;;;42558:18:0;;42536:19;42558:18;;;:12;:18;;;;;;;;:34;;;;;;;;;42609:30;;;;;;:44;;;42726:30;;:17;:30;;;;;:43;;;42487:328;-1:-1:-1;42911:26:0;;;;:17;:26;;;;;;;;42904:33;;;-1:-1:-1;;;;;42955:18:0;;;;;:12;:18;;;;;:34;;;;;;;42948:41;42009:988::o;43292:1079::-;43570:10;:17;43545:22;;43570:21;;43590:1;;43570:21;:::i;:::-;43602:18;43623:24;;;:15;:24;;;;;;43996:10;:26;;43545:46;;-1:-1:-1;43623:24:0;;43545:46;;43996:26;;;;-1:-1:-1;;;43996:26:0;;;;;;;;;;;;;;;;;43974:48;;44060:11;44035:10;44046;44035:22;;;;;;-1:-1:-1;;;44035:22:0;;;;;;;;;;;;;;;;;;;;:36;;;;44140:28;;;:15;:28;;;;;;;:41;;;44312:24;;;;;44305:31;44347:10;:16;;;;;-1:-1:-1;;;44347:16:0;;;;;;;;;;;;;;;;;;;;;;;;;;43292:1079;;;;:::o;40796:221::-;40881:14;40898:20;40915:2;40898:16;:20::i;:::-;-1:-1:-1;;;;;40929:16:0;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;40974:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;40796:221:0:o;32289:382::-;-1:-1:-1;;;;;32369:16:0;;32361:61;;;;-1:-1:-1;;;32361:61:0;;;;;;;:::i;:::-;32442:16;32450:7;32442;:16::i;:::-;32441:17;32433:58;;;;-1:-1:-1;;;32433:58:0;;;;;;;:::i;:::-;32504:45;32533:1;32537:2;32541:7;32504:20;:45::i;:::-;-1:-1:-1;;;;;32562:13:0;;;;;;:9;:13;;;;;:18;;32579:1;;32562:13;:18;;32579:1;;32562:18;:::i;:::-;;;;-1:-1:-1;;32591:16:0;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;32591:21:0;-1:-1:-1;;;;;32591:21:0;;;;;;;;32630:33;;32591:16;;;32630:33;;32591:16;;32630:33;32289:382;;:::o;15206:387::-;15529:20;15577:8;;;15206:387::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;:::o;14:259:1:-;;126:2;114:9;105:7;101:23;97:32;94:2;;;147:6;139;132:22;94:2;191:9;178:23;210:33;237:5;210:33;:::i;:::-;262:5;84:189;-1:-1:-1;;;84:189:1:o;278:263::-;;401:2;389:9;380:7;376:23;372:32;369:2;;;422:6;414;407:22;369:2;459:9;453:16;478:33;505:5;478:33;:::i;546:402::-;;;675:2;663:9;654:7;650:23;646:32;643:2;;;696:6;688;681:22;643:2;740:9;727:23;759:33;786:5;759:33;:::i;:::-;811:5;-1:-1:-1;868:2:1;853:18;;840:32;881:35;840:32;881:35;:::i;:::-;935:7;925:17;;;633:315;;;;;:::o;953:470::-;;;;1099:2;1087:9;1078:7;1074:23;1070:32;1067:2;;;1120:6;1112;1105:22;1067:2;1164:9;1151:23;1183:33;1210:5;1183:33;:::i;:::-;1235:5;-1:-1:-1;1292:2:1;1277:18;;1264:32;1305:35;1264:32;1305:35;:::i;:::-;1057:366;;1359:7;;-1:-1:-1;;;1413:2:1;1398:18;;;;1385:32;;1057:366::o;1428:1156::-;;;;;1600:3;1588:9;1579:7;1575:23;1571:33;1568:2;;;1622:6;1614;1607:22;1568:2;1666:9;1653:23;1685:33;1712:5;1685:33;:::i;:::-;1737:5;-1:-1:-1;1761:2:1;1800:18;;;1787:32;1828:35;1787:32;1828:35;:::i;:::-;1882:7;-1:-1:-1;1936:2:1;1921:18;;1908:32;;-1:-1:-1;1991:2:1;1976:18;;1963:32;2014:18;2044:14;;;2041:2;;;2076:6;2068;2061:22;2041:2;2119:6;2108:9;2104:22;2094:32;;2164:7;2157:4;2153:2;2149:13;2145:27;2135:2;;2191:6;2183;2176:22;2135:2;2232;2219:16;2254:2;2250;2247:10;2244:2;;;2260:18;;:::i;:::-;2302:52;2344:2;2325:13;;-1:-1:-1;;2321:27:1;2317:36;;2302:52;:::i;:::-;2289:65;;2377:2;2370:5;2363:17;2417:7;2412:2;2407;2403;2399:11;2395:20;2392:33;2389:2;;;2443:6;2435;2428:22;2389:2;2503;2498;2494;2490:11;2485:2;2478:5;2474:14;2461:45;2526:14;;2522:23;;;2515:39;;;;1558:1026;;;;-1:-1:-1;1558:1026:1;;-1:-1:-1;;1558:1026:1:o;2589:438::-;;;2715:2;2703:9;2694:7;2690:23;2686:32;2683:2;;;2736:6;2728;2721:22;2683:2;2780:9;2767:23;2799:33;2826:5;2799:33;:::i;:::-;2851:5;-1:-1:-1;2908:2:1;2893:18;;2880:32;2950:15;;2943:23;2931:36;;2921:2;;2986:6;2978;2971:22;3032:327;;;3161:2;3149:9;3140:7;3136:23;3132:32;3129:2;;;3182:6;3174;3167:22;3129:2;3226:9;3213:23;3245:33;3272:5;3245:33;:::i;:::-;3297:5;3349:2;3334:18;;;;3321:32;;-1:-1:-1;;;3119:240:1:o;3364:1002::-;;3479:2;3522;3510:9;3501:7;3497:23;3493:32;3490:2;;;3543:6;3535;3528:22;3490:2;3588:9;3575:23;3617:18;3658:2;3650:6;3647:14;3644:2;;;3679:6;3671;3664:22;3644:2;3722:6;3711:9;3707:22;3697:32;;3767:7;3760:4;3756:2;3752:13;3748:27;3738:2;;3794:6;3786;3779:22;3738:2;3835;3822:16;3857:2;3853;3850:10;3847:2;;;3863:18;;:::i;:::-;3910:2;3906;3902:11;3892:21;;3933:27;3956:2;3952;3948:11;3933:27;:::i;:::-;3994:15;;;4025:12;;;;4057:11;;;4087;;;4083:20;;4080:33;-1:-1:-1;4077:2:1;;;4131:6;4123;4116:22;4077:2;4158:6;4149:15;;4173:163;4187:2;4184:1;4181:9;4173:163;;;4244:17;;4232:30;;4205:1;4198:9;;;;;4282:12;;;;4314;;4173:163;;;-1:-1:-1;4355:5:1;3459:907;-1:-1:-1;;;;;;;;3459:907:1:o;4371:257::-;;4482:2;4470:9;4461:7;4457:23;4453:32;4450:2;;;4503:6;4495;4488:22;4450:2;4547:9;4534:23;4566:32;4592:5;4566:32;:::i;4633:261::-;;4755:2;4743:9;4734:7;4730:23;4726:32;4723:2;;;4776:6;4768;4761:22;4723:2;4813:9;4807:16;4832:32;4858:5;4832:32;:::i;4899:190::-;;5011:2;4999:9;4990:7;4986:23;4982:32;4979:2;;;5032:6;5024;5017:22;4979:2;-1:-1:-1;5060:23:1;;4969:120;-1:-1:-1;4969:120:1:o;5094:259::-;;5175:5;5169:12;5202:6;5197:3;5190:19;5218:63;5274:6;5267:4;5262:3;5258:14;5251:4;5244:5;5240:16;5218:63;:::i;:::-;5335:2;5314:15;-1:-1:-1;;5310:29:1;5301:39;;;;5342:4;5297:50;;5145:208;-1:-1:-1;;5145:208:1:o;5358:276::-;;5527:6;5521:13;5543:53;5589:6;5584:3;5577:4;5569:6;5565:17;5543:53;:::i;:::-;5612:16;;;;;5497:137;-1:-1:-1;;5497:137:1:o;5639:470::-;;5856:6;5850:13;5872:53;5918:6;5913:3;5906:4;5898:6;5894:17;5872:53;:::i;:::-;5988:13;;5947:16;;;;6010:57;5988:13;5947:16;6044:4;6032:17;;6010:57;:::i;:::-;6083:20;;5826:283;-1:-1:-1;;;;5826:283:1:o;6114:1767::-;;6667:6;6661:13;6683:53;6729:6;6724:3;6717:4;6709:6;6705:17;6683:53;:::i;:::-;6767:6;6761:13;6783:68;6842:8;6833:6;6828:3;6824:16;6817:4;6809:6;6805:17;6783:68;:::i;:::-;6929:13;;6877:16;;;6873:31;;6951:57;6929:13;6873:31;6985:4;6973:17;;6951:57;:::i;:::-;7039:6;7033:13;7055:72;7118:8;7107;7100:5;7096:20;7089:4;7081:6;7077:17;7055:72;:::i;:::-;7209:13;;7153:20;;;;7149:35;;7231:57;7209:13;7149:35;7265:4;7253:17;;7231:57;:::i;:::-;7319:6;7313:13;7335:72;7398:8;7387;7380:5;7376:20;7369:4;7361:6;7357:17;7335:72;:::i;:::-;7489:13;;7433:20;;;;7429:35;;7511:57;7489:13;7429:35;7545:4;7533:17;;7511:57;:::i;:::-;7599:6;7593:13;7615:72;7678:8;7667;7660:5;7656:20;7649:4;7641:6;7637:17;7615:72;:::i;:::-;7766:13;;7710:20;;;;7706:35;;7788:54;7766:13;7706:35;7822:4;7810:17;;7788:54;:::i;:::-;7858:17;;6637:1244;-1:-1:-1;;;;;;;;;;;6637:1244:1:o;7886:960::-;;8353:6;8347:13;8369:53;8415:6;8410:3;8403:4;8395:6;8391:17;8369:53;:::i;:::-;8453:6;8448:3;8444:16;8431:29;;-1:-1:-1;;;8505:2:1;8498:5;8491:17;8539:6;8533:13;8555:65;8611:8;8607:1;8600:5;8596:13;8589:4;8581:6;8577:17;8555:65;:::i;:::-;8683:1;8639:20;;8675:10;;;8668:22;8715:13;;8737:62;8715:13;8786:1;8778:10;;8771:4;8759:17;;8737:62;:::i;:::-;8819:17;8838:1;8815:25;;8323:523;-1:-1:-1;;;;;8323:523:1:o;8851:1504::-;;9166:6;9160:13;9192:4;9205:51;9249:6;9244:3;9239:2;9231:6;9227:15;9205:51;:::i;:::-;-1:-1:-1;;;9278:16:1;;;9303:18;;;9390:13;;9340:1;;9361:3;;9467:1;9452:17;;9504:18;;;;9531:2;;9609:4;9599:8;9595:19;9583:31;;9531:2;9672;9662:8;9659:16;9639:18;9636:40;9633:2;;;-1:-1:-1;;;9699:33:1;;9755:4;9752:1;9745:15;9785:4;9706:3;9773:17;9633:2;9816:18;9843:128;;;;9985:1;9980:350;;;;9809:521;;9843:128;-1:-1:-1;;9887:24:1;;9871:14;;;9864:48;9936:20;;;9932:29;;;-1:-1:-1;9843:128:1;;9980:350;10016:39;10048:6;10016:39;:::i;:::-;10077:3;10093:178;10107:8;10104:1;10101:15;10093:178;;;10198:14;;10178:13;;;10174:22;;10167:46;10241:16;;;;10124:10;;10093:178;;;10097:3;;10317:2;10306:8;10299:5;10295:20;10291:29;10284:36;;9809:521;-1:-1:-1;10346:3:1;;9136:1219;-1:-1:-1;;;;;;;;;;9136:1219:1:o;10360:1365::-;;10872:66;10867:3;10860:79;10968:6;10962:13;10984:62;11039:6;11034:2;11029:3;11025:12;11018:4;11010:6;11006:17;10984:62;:::i;:::-;11110:66;11105:2;11065:16;;;11097:11;;;11090:87;11206:34;11201:2;11193:11;;11186:55;11270:34;11265:2;11257:11;;11250:55;11335:66;11329:3;11321:12;;11314:88;11432:66;11426:3;11418:12;;11411:88;11524:13;;11546:64;11524:13;11595:3;11587:12;;11580:4;11568:17;;11546:64;:::i;:::-;-1:-1:-1;;;11670:3:1;11629:17;;;;11662:12;;;11655:36;11715:3;11707:12;;10850:875;-1:-1:-1;;;;10850:875:1:o;11730:448::-;;11992:31;11987:3;11980:44;12053:6;12047:13;12069:62;12124:6;12119:2;12114:3;12110:12;12103:4;12095:6;12091:17;12069:62;:::i;:::-;12151:16;;;;12169:2;12147:25;;11970:208;-1:-1:-1;;11970:208:1:o;12183:226::-;-1:-1:-1;;;;;12347:55:1;;;;12329:74;;12317:2;12302:18;;12284:125::o;12414:513::-;;-1:-1:-1;;;;;12718:2:1;12710:6;12706:15;12695:9;12688:34;12770:2;12762:6;12758:15;12753:2;12742:9;12738:18;12731:43;;12810:6;12805:2;12794:9;12790:18;12783:34;12853:3;12848:2;12837:9;12833:18;12826:31;12874:47;12916:3;12905:9;12901:19;12893:6;12874:47;:::i;:::-;12866:55;12617:310;-1:-1:-1;;;;;;12617:310:1:o;12932:187::-;13097:14;;13090:22;13072:41;;13060:2;13045:18;;13027:92::o;13377:221::-;;13526:2;13515:9;13508:21;13546:46;13588:2;13577:9;13573:18;13565:6;13546:46;:::i;13603:407::-;13805:2;13787:21;;;13844:2;13824:18;;;13817:30;13883:34;13878:2;13863:18;;13856:62;13954:13;13949:2;13934:18;;13927:41;14000:3;13985:19;;13777:233::o;14015:414::-;14217:2;14199:21;;;14256:2;14236:18;;;14229:30;14295:34;14290:2;14275:18;;14268:62;14366:20;14361:2;14346:18;;14339:48;14419:3;14404:19;;14189:240::o;14434:402::-;14636:2;14618:21;;;14675:2;14655:18;;;14648:30;14714:34;14709:2;14694:18;;14687:62;14785:8;14780:2;14765:18;;14758:36;14826:3;14811:19;;14608:228::o;14841:352::-;15043:2;15025:21;;;15082:2;15062:18;;;15055:30;15121;15116:2;15101:18;;15094:58;15184:2;15169:18;;15015:178::o;15198:400::-;15400:2;15382:21;;;15439:2;15419:18;;;15412:30;15478:34;15473:2;15458:18;;15451:62;-1:-1:-1;;;15544:2:1;15529:18;;15522:34;15588:3;15573:19;;15372:226::o;15603:349::-;15805:2;15787:21;;;15844:2;15824:18;;;15817:30;15883:27;15878:2;15863:18;;15856:55;15943:2;15928:18;;15777:175::o;15957:355::-;16159:2;16141:21;;;16198:2;16178:18;;;16171:30;16237:33;16232:2;16217:18;;16210:61;16303:2;16288:18;;16131:181::o;16317:350::-;16519:2;16501:21;;;16558:2;16538:18;;;16531:30;16597:28;16592:2;16577:18;;16570:56;16658:2;16643:18;;16491:176::o;16672:408::-;16874:2;16856:21;;;16913:2;16893:18;;;16886:30;16952:34;16947:2;16932:18;;16925:62;-1:-1:-1;;;17018:2:1;17003:18;;16996:42;17070:3;17055:19;;16846:234::o;17085:420::-;17287:2;17269:21;;;17326:2;17306:18;;;17299:30;17365:34;17360:2;17345:18;;17338:62;17436:26;17431:2;17416:18;;17409:54;17495:3;17480:19;;17259:246::o;17510:406::-;17712:2;17694:21;;;17751:2;17731:18;;;17724:30;17790:34;17785:2;17770:18;;17763:62;17861:12;17856:2;17841:18;;17834:40;17906:3;17891:19;;17684:232::o;17921:405::-;18123:2;18105:21;;;18162:2;18142:18;;;18135:30;18201:34;18196:2;18181:18;;18174:62;18272:11;18267:2;18252:18;;18245:39;18316:3;18301:19;;18095:231::o;18331:356::-;18533:2;18515:21;;;18552:18;;;18545:30;18611:34;18606:2;18591:18;;18584:62;18678:2;18663:18;;18505:182::o;18692:408::-;18894:2;18876:21;;;18933:2;18913:18;;;18906:30;18972:34;18967:2;18952:18;;18945:62;-1:-1:-1;;;19038:2:1;19023:18;;19016:42;19090:3;19075:19;;18866:234::o;19105:356::-;19307:2;19289:21;;;19326:18;;;19319:30;19385:34;19380:2;19365:18;;19358:62;19452:2;19437:18;;19279:182::o;19466:340::-;19668:2;19650:21;;;19707:2;19687:18;;;19680:30;19746:18;19741:2;19726:18;;19719:46;19797:2;19782:18;;19640:166::o;19811:405::-;20013:2;19995:21;;;20052:2;20032:18;;;20025:30;20091:34;20086:2;20071:18;;20064:62;20162:11;20157:2;20142:18;;20135:39;20206:3;20191:19;;19985:231::o;20221:397::-;20423:2;20405:21;;;20462:2;20442:18;;;20435:30;20501:34;20496:2;20481:18;;20474:62;-1:-1:-1;;;20567:2:1;20552:18;;20545:31;20608:3;20593:19;;20395:223::o;20623:413::-;20825:2;20807:21;;;20864:2;20844:18;;;20837:30;20903:34;20898:2;20883:18;;20876:62;20974:19;20969:2;20954:18;;20947:47;21026:3;21011:19;;20797:239::o;21041:408::-;21243:2;21225:21;;;21282:2;21262:18;;;21255:30;21321:34;21316:2;21301:18;;21294:62;21392:14;21387:2;21372:18;;21365:42;21439:3;21424:19;;21215:234::o;21454:355::-;21656:2;21638:21;;;21695:2;21675:18;;;21668:30;21734:33;21729:2;21714:18;;21707:61;21800:2;21785:18;;21628:181::o;21814:177::-;21960:25;;;21948:2;21933:18;;21915:76::o;21996:251::-;22066:2;22060:9;22096:17;;;22143:18;22128:34;;22164:22;;;22125:62;22122:2;;;22190:18;;:::i;:::-;22226:2;22219:22;22040:207;;-1:-1:-1;22040:207:1:o;22252:129::-;;22320:17;;;22370:4;22354:21;;;22310:71::o;22386:128::-;;22457:1;22453:6;22450:1;22447:13;22444:2;;;22463:18;;:::i;:::-;-1:-1:-1;22499:9:1;;22434:80::o;22519:120::-;;22585:1;22575:2;;22590:18;;:::i;:::-;-1:-1:-1;22624:9:1;;22565:74::o;22644:168::-;;22750:1;22746;22742:6;22738:14;22735:1;22732:21;22727:1;22720:9;22713:17;22709:45;22706:2;;;22757:18;;:::i;:::-;-1:-1:-1;22797:9:1;;22696:116::o;22817:125::-;;22885:1;22882;22879:8;22876:2;;;22890:18;;:::i;:::-;-1:-1:-1;22927:9:1;;22866:76::o;22947:258::-;23019:1;23029:113;23043:6;23040:1;23037:13;23029:113;;;23119:11;;;23113:18;23100:11;;;23093:39;23065:2;23058:10;23029:113;;;23160:6;23157:1;23154:13;23151:2;;;-1:-1:-1;;23195:1:1;23177:16;;23170:27;23000:205::o;23210:380::-;23295:1;23285:12;;23342:1;23332:12;;;23353:2;;23407:4;23399:6;23395:17;23385:27;;23353:2;23460;23452:6;23449:14;23429:18;23426:38;23423:2;;;23506:10;23501:3;23497:20;23494:1;23487:31;23541:4;23538:1;23531:15;23569:4;23566:1;23559:15;23423:2;;23265:325;;;:::o;23595:135::-;;-1:-1:-1;;23655:17:1;;23652:2;;;23675:18;;:::i;:::-;-1:-1:-1;23722:1:1;23711:13;;23642:88::o;23735:112::-;;23793:1;23783:2;;23798:18;;:::i;:::-;-1:-1:-1;23832:9:1;;23773:74::o;23852:127::-;23913:10;23908:3;23904:20;23901:1;23894:31;23944:4;23941:1;23934:15;23968:4;23965:1;23958:15;23984:127;24045:10;24040:3;24036:20;24033:1;24026:31;24076:4;24073:1;24066:15;24100:4;24097:1;24090:15;24116:127;24177:10;24172:3;24168:20;24165:1;24158:31;24208:4;24205:1;24198:15;24232:4;24229:1;24222:15;24248:156;-1:-1:-1;;;;;24329:5:1;24325:54;24318:5;24315:65;24305:2;;24394:1;24391;24384:12;24409:133;-1:-1:-1;;;;;;24485:32:1;;24475:43;;24465:2;;24532:1;24529;24522:12

Swarm Source

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