ETH Price: $3,871.81 (+0.07%)

Token

0xVampire (0xV)
 

Overview

Max Total Supply

9,861 0xV

Holders

4,446

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
flemwad222.eth
Balance
1 0xV
0x8ba08f0e54fbd2f5fa51424407ff13fd172c3f5a
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

9,999 0xVampires living on the Ethereum blockchain.

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
Vampire

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 19 of 19: Vampire.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./Ownable.sol";
import "./SafeMath.sol";
import "./Strings.sol";

import "./ContentMixin.sol";
import "./NativeMetaTransaction.sol";

/**
 * @title 0xVampire
 */
contract Vampire is
    ContextMixin,
    ERC721Enumerable,
    NativeMetaTransaction,
    Ownable
{
    using SafeMath for uint256;

    string public baseTokenURI;
    uint256 private _currentTokenId = 0;
    uint256 MAX_SUPPLY = 9999;
    uint256 public totalMint = 0;
    uint256 public totalPledge;

    uint256 public presaleTime = 1631718000;
    uint256 public presaleEndTime = 1631804400;
    uint256 public pledgeTime = 1699999999;
    uint256 public awakeningTime = 1699999999;

    mapping(address => bool) public whitelist;
    mapping(address => uint8) public presaleNumOfPlayer;
    mapping(address => uint8) public pledgeNumOfPlayer;
    mapping(address => uint8) public claimed;

    event WhitelistedAddressRemoved(address addr);
    event BloodThirster(uint256 indexed tokenId, address indexed luckyDog);
    event BloodRider(uint256 indexed tokenId, address indexed luckyDog);
    event GivenName(uint256 indexed tokenId, string name);
    event StoryOfVampire(uint256 indexed tokenId, string name);

    /**
     * @dev Throws if called by any account that's not whitelisted.
     */
    modifier onlyWhitelisted() {
        require(
            whitelist[msg.sender],
            "0xVampire: You're not on the whitelist."
        );
        _;
    }

    constructor(
        string memory _name,
        string memory _symbol,
        string memory _uri
    ) ERC721(_name, _symbol) {
        baseTokenURI = _uri;
        _initializeEIP712(_name);
    }

    /**
     * @dev Airdrop vampires to several addresses.
     * @param _recipients addresss of the future owner of the token
     */
    function mintTo(address[] memory _recipients) external onlyOwner {
        for (uint256 i = 0; i < _recipients.length; i++) {
            uint256 newTokenId = _getNextTokenId();
            _mint(_recipients[i], newTokenId);
            _incrementTokenId();
        }
        totalMint += _recipients.length;
    }

    /**
     * @dev Mint to msg.sender. Only whitelisted users can participate
     * @param _num Quantity to purchase
     */
    function presale(uint8 _num) external payable onlyWhitelisted {
        require(
            block.timestamp >= presaleTime && block.timestamp < presaleEndTime,
            "0xVampire: Presale has not yet started."
        );
        require(
            (_num + presaleNumOfPlayer[msg.sender]) <= 3,
            "0xVampire: Up to 3 0xVampires can be purchased."
        );
        require(
            msg.value == uint256(_num) * 6e16,
            "0xVampire: You need to pay the exact price."
        );
        _mintList(_num);
        presaleNumOfPlayer[msg.sender] = presaleNumOfPlayer[msg.sender] + _num;
        totalMint += uint256(_num);
    }

    /**
     * @dev Pledge for the purchase. Each address can only purchase up to 5 0xVampires.
     * @param _num Quantity to purchase
     */
    function bloodMark(uint8 _num) external payable {
        require(
            block.timestamp >= pledgeTime,
            "0xVampire: Pledge has not yet started."
        );
        require(
            (_num + pledgeNumOfPlayer[msg.sender] + claimed[msg.sender]) <= 5,
            "0xVampire: Each address can only purchase up to 5 0xVampires."
        );
        require(
            totalMint + uint256(_num) <= MAX_SUPPLY - totalPledge - 200,
            "0xVampire: Sorry, all 0xVampires are sold out."
        );
        require(
            msg.value == uint256(_num) * 6e16,
            "0xVampire: You need to pay the exact price."
        );
        pledgeNumOfPlayer[msg.sender] = pledgeNumOfPlayer[msg.sender] + _num;
        totalPledge += uint256(_num);
    }

    /**
     * @dev Your 0xVampires can only be claimed at the end of the sale.
     */
    function claim() external {
        require(
            block.timestamp >= pledgeTime,
            "0xVampire: Pledge has not yet started."
        );
        _mintList(pledgeNumOfPlayer[msg.sender]);
        claimed[msg.sender] += pledgeNumOfPlayer[msg.sender];
        pledgeNumOfPlayer[msg.sender] = 0;
    }

    /**
     * @dev Mint to msg.sender.
     * @param _num addresss of the future owner of the token
     */
    function mint(uint8 _num) external payable {
        require(
            block.timestamp >= awakeningTime,
            "0xVampire: Mint time has not yet arrived!"
        );
        require(
            totalMint + uint256(_num) <= MAX_SUPPLY - totalPledge - 200,
            "0xVampire: Sorry, all 0xVampires are sold out."
        );
        require(
            _num <= 5,
            "0xVampire: Up to 5 0xVampires can be minted in a tx."
        );
        require(
            msg.value == uint256(_num) * 6e16,
            "0xVampire: You need to pay the exact price."
        );
        _mintList(_num);
        totalMint += uint256(_num);
    }

    /**
     * @dev Every time the tokenId reaches a multiple of 100, a random 0xVampire gets a 10x mint price return.
     * For the 2500th, 5000th, 7500th and 9999th sales, 4 random vampires will be picked and be each gifted with a Harley Davidson motorcycle as their ride.
     */
    function _mintList(uint8 _num) private {
        for (uint8 i = 0; i < _num; i++) {
            uint256 newTokenId = _getNextTokenId();
            _mint(msg.sender, newTokenId);
            _incrementTokenId();
            if (newTokenId % 100 == 0) {
                uint256 amount = random() % 100;
                uint256 realId = newTokenId - amount;
                address luckyDog = ownerOf(realId);
                payable(luckyDog).transfer(6e17);
                emit BloodThirster(realId, luckyDog);
            }
            if (newTokenId % 2500 == 0 || newTokenId == MAX_SUPPLY) {
                uint256 randomNum = random() % 999;
                bytes32 randomHash = keccak256(
                    abi.encode(
                        ownerOf(newTokenId - randomNum - 100),
                        ownerOf(newTokenId - randomNum - 200),
                        ownerOf(newTokenId - randomNum - 300)
                    )
                );
                uint256 bloodRiderId = newTokenId -
                    (uint256(randomHash) % 2500);
                emit BloodRider(bloodRiderId, ownerOf(bloodRiderId));
            }
        }
    }

    /**
     * @dev calculates the next token ID based on value of _currentTokenId
     * @return uint256 for the next token ID
     */
    function _getNextTokenId() private view returns (uint256) {
        return _currentTokenId.add(1);
    }

    /**
     * @dev generates a random number based on block info
     */
    function random() private view returns (uint256) {
        bytes32 randomHash = keccak256(
            abi.encode(
                block.timestamp,
                block.difficulty,
                block.coinbase,
                msg.sender
            )
        );
        return uint256(randomHash);
    }

    /**
     * @dev increments the value of _currentTokenId
     */
    function _incrementTokenId() private {
        require(_currentTokenId < MAX_SUPPLY);
        _currentTokenId++;
    }

    /**
     * @dev change the baseTokenURI only by Admin
     */
    function setBaseUri(string memory _uri) external onlyOwner {
        baseTokenURI = _uri;
    }

    /**
     * @dev set the sale time only by Admin
     */
    function setAwakeningTime(uint256 _time) external onlyOwner {
        awakeningTime = _time;
    }

    /**
     * @dev set the presale and pledge time only by Admin
     */
    function setAllTime(
        uint256 _preSaleTime,
        uint256 _preSaleEndTime,
        uint256 _pledgeTime
    ) external onlyOwner {
        presaleTime = _preSaleTime;
        presaleEndTime = _preSaleEndTime;
        pledgeTime = _pledgeTime;
    }

    function setName(uint256 _tokenId, string memory _name) external {
        require(
            ownerOf(_tokenId) == msg.sender,
            "0xVampire: You don't own this 0xVampire!"
        );
        emit GivenName(_tokenId, _name);
    }

    function setStory(uint256 _tokenId, string memory _desc) external {
        require(
            ownerOf(_tokenId) == msg.sender,
            "0xVampire: You don't own this 0xVampire!"
        );
        emit StoryOfVampire(_tokenId, _desc);
    }

    function tokenURI(uint256 _tokenId)
        public
        view
        override
        returns (string memory)
    {
        return
            string(abi.encodePacked(baseTokenURI, Strings.toString(_tokenId)));
    }

    /**
     * This is used instead of msg.sender as transactions won't be sent by the original token owner, but by OpenSea.
     */
    function _msgSender() internal view override returns (address sender) {
        return ContextMixin.msgSender();
    }

    function recoverGodhead() external onlyOwner {
        payable(owner()).transfer(address(this).balance);
    }

    /**
     * @dev add addresses to the whitelist
     * @param addrs addresses
     */
    function addAddressesToWhitelist(address[] memory addrs) public onlyOwner {
        for (uint256 i = 0; i < addrs.length; i++) {
            whitelist[addrs[i]] = true;
        }
    }

    /**
     * @dev remove addresses from the whitelist
     * @param addrs addresses
     */
    function removeAddressesFromWhitelist(address[] memory addrs)
        public
        onlyOwner
    {
        for (uint256 i = 0; i < addrs.length; i++) {
            whitelist[addrs[i]] = false;
            emit WhitelistedAddressRemoved(addrs[i]);
        }
    }
}

File 1 of 19: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 2 of 19: ContentMixin.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

abstract contract ContextMixin {
    function msgSender() internal view returns (address payable sender) {
        if (msg.sender == address(this)) {
            bytes memory array = msg.data;
            uint256 index = msg.data.length;
            assembly {
                // Load the 32 bytes word from memory with the address on the lower 20 bytes, and mask those.
                sender := and(
                    mload(add(array, index)),
                    0xffffffffffffffffffffffffffffffffffffffff
                )
            }
        } else {
            sender = payable(msg.sender);
        }
        return sender;
    }
}

File 3 of 19: Context.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

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

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

File 4 of 19: EIP712Base.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import {Initializable} from "./Initializable.sol";

contract EIP712Base is Initializable {
    struct EIP712Domain {
        string name;
        string version;
        address verifyingContract;
        bytes32 salt;
    }

    string public constant ERC712_VERSION = "1";

    bytes32 internal constant EIP712_DOMAIN_TYPEHASH =
        keccak256(
            bytes(
                "EIP712Domain(string name,string version,address verifyingContract,bytes32 salt)"
            )
        );
    bytes32 internal domainSeperator;

    // supposed to be called once while initializing.
    // one of the contracts that inherits this contract follows proxy pattern
    // so it is not possible to do this in a constructor
    function _initializeEIP712(string memory name) internal initializer {
        _setDomainSeperator(name);
    }

    function _setDomainSeperator(string memory name) internal {
        domainSeperator = keccak256(
            abi.encode(
                EIP712_DOMAIN_TYPEHASH,
                keccak256(bytes(name)),
                keccak256(bytes(ERC712_VERSION)),
                address(this),
                bytes32(getChainId())
            )
        );
    }

    function getDomainSeperator() public view returns (bytes32) {
        return domainSeperator;
    }

    function getChainId() public view returns (uint256) {
        uint256 id;
        assembly {
            id := chainid()
        }
        return id;
    }

    /**
     * Accept message hash and returns hash message in EIP712 compatible form
     * So that it can be used to recover signer from signature signed using EIP712 formatted data
     * https://eips.ethereum.org/EIPS/eip-712
     * "\\x19" makes the encoding deterministic
     * "\\x01" is the version byte to make it compatible to EIP-191
     */
    function toTypedMessageHash(bytes32 messageHash)
        internal
        view
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked("\x19\x01", getDomainSeperator(), messageHash)
            );
    }
}

File 5 of 19: ERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./IERC165.sol";

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

File 6 of 19: ERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);
    }

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

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

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

File 7 of 19: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 8 of 19: IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

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

File 9 of 19: IERC721.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./IERC165.sol";

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

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

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

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

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

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

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

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

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

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

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

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

File 10 of 19: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./IERC721.sol";

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

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

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

File 11 of 19: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./IERC721.sol";

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

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

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

File 12 of 19: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

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

File 13 of 19: Initializable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

contract Initializable {
    bool inited = false;

    modifier initializer() {
        require(!inited, "already inited");
        _;
        inited = true;
    }
}

File 14 of 19: Migrations.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

contract Migrations {
    address public owner;
    uint256 public last_completed_migration;

    constructor() {
        owner = msg.sender;
    }

    modifier restricted() {
        if (msg.sender == owner) _;
    }

    function setCompleted(uint256 completed) public restricted {
        last_completed_migration = completed;
    }

    function upgrade(address new_address) public restricted {
        Migrations upgraded = Migrations(new_address);
        upgraded.setCompleted(last_completed_migration);
    }
}

File 15 of 19: NativeMetaTransaction.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import {SafeMath} from "./SafeMath.sol";
import {EIP712Base} from "./EIP712Base.sol";

contract NativeMetaTransaction is EIP712Base {
    using SafeMath for uint256;
    bytes32 private constant META_TRANSACTION_TYPEHASH =
        keccak256(
            bytes(
                "MetaTransaction(uint256 nonce,address from,bytes functionSignature)"
            )
        );
    event MetaTransactionExecuted(
        address userAddress,
        address payable relayerAddress,
        bytes functionSignature
    );
    mapping(address => uint256) nonces;

    /*
     * Meta transaction structure.
     * No point of including value field here as if user is doing value transfer then he has the funds to pay for gas
     * He should call the desired function directly in that case.
     */
    struct MetaTransaction {
        uint256 nonce;
        address from;
        bytes functionSignature;
    }

    function executeMetaTransaction(
        address userAddress,
        bytes memory functionSignature,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) public payable returns (bytes memory) {
        MetaTransaction memory metaTx = MetaTransaction({
            nonce: nonces[userAddress],
            from: userAddress,
            functionSignature: functionSignature
        });

        require(
            verify(userAddress, metaTx, sigR, sigS, sigV),
            "Signer and signature do not match"
        );

        // increase nonce for user (to avoid re-use)
        nonces[userAddress] = nonces[userAddress].add(1);

        emit MetaTransactionExecuted(
            userAddress,
            payable(msg.sender),
            functionSignature
        );

        // Append userAddress and relayer address at the end to extract it from calling context
        (bool success, bytes memory returnData) = address(this).call(
            abi.encodePacked(functionSignature, userAddress)
        );
        require(success, "Function call not successful");

        return returnData;
    }

    function hashMetaTransaction(MetaTransaction memory metaTx)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encode(
                    META_TRANSACTION_TYPEHASH,
                    metaTx.nonce,
                    metaTx.from,
                    keccak256(metaTx.functionSignature)
                )
            );
    }

    function getNonce(address user) public view returns (uint256 nonce) {
        nonce = nonces[user];
    }

    function verify(
        address signer,
        MetaTransaction memory metaTx,
        bytes32 sigR,
        bytes32 sigS,
        uint8 sigV
    ) internal view returns (bool) {
        require(signer != address(0), "NativeMetaTransaction: INVALID_SIGNER");
        return
            signer ==
            ecrecover(
                toTypedMessageHash(hashMetaTransaction(metaTx)),
                sigV,
                sigR,
                sigS
            );
    }
}

File 16 of 19: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

import "./Context.sol";

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

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

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

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

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

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

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

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

File 17 of 19: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b)
        internal
        pure
        returns (bool, uint256)
    {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(
        uint256 a,
        uint256 b,
        string memory errorMessage
    ) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}

File 18 of 19: Strings.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.1;

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

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_uri","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"luckyDog","type":"address"}],"name":"BloodRider","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"luckyDog","type":"address"}],"name":"BloodThirster","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"GivenName","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"userAddress","type":"address"},{"indexed":false,"internalType":"address payable","name":"relayerAddress","type":"address"},{"indexed":false,"internalType":"bytes","name":"functionSignature","type":"bytes"}],"name":"MetaTransactionExecuted","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":"uint256","name":"tokenId","type":"uint256"},{"indexed":false,"internalType":"string","name":"name","type":"string"}],"name":"StoryOfVampire","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"addr","type":"address"}],"name":"WhitelistedAddressRemoved","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"addAddressesToWhitelist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"awakeningTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_num","type":"uint8"}],"name":"bloodMark","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"claim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"claimed","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"userAddress","type":"address"},{"internalType":"bytes","name":"functionSignature","type":"bytes"},{"internalType":"bytes32","name":"sigR","type":"bytes32"},{"internalType":"bytes32","name":"sigS","type":"bytes32"},{"internalType":"uint8","name":"sigV","type":"uint8"}],"name":"executeMetaTransaction","outputs":[{"internalType":"bytes","name":"","type":"bytes"}],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getChainId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getNonce","outputs":[{"internalType":"uint256","name":"nonce","type":"uint256"}],"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":[{"internalType":"uint8","name":"_num","type":"uint8"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_recipients","type":"address[]"}],"name":"mintTo","outputs":[],"stateMutability":"nonpayable","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":[{"internalType":"address","name":"","type":"address"}],"name":"pledgeNumOfPlayer","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pledgeTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"_num","type":"uint8"}],"name":"presale","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"presaleEndTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"presaleNumOfPlayer","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"presaleTime","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"recoverGodhead","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"addrs","type":"address[]"}],"name":"removeAddressesFromWhitelist","outputs":[],"stateMutability":"nonpayable","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":"uint256","name":"_preSaleTime","type":"uint256"},{"internalType":"uint256","name":"_preSaleEndTime","type":"uint256"},{"internalType":"uint256","name":"_pledgeTime","type":"uint256"}],"name":"setAllTime","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":"uint256","name":"_time","type":"uint256"}],"name":"setAwakeningTime","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_uri","type":"string"}],"name":"setBaseUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_name","type":"string"}],"name":"setName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_desc","type":"string"}],"name":"setStory","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":"totalMint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalPledge","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":[{"internalType":"address","name":"","type":"address"}],"name":"whitelist","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"}]

6080604052600a805460ff191690556000600f81905561270f6010556011556361420a706013556361435bf0601455636553f0ff60158190556016553480156200004857600080fd5b5060405162003bcb38038062003bcb8339810160408190526200006b9162000411565b82518390839062000084906000906020850190620002b4565b5080516200009a906001906020840190620002b4565b505050620000b7620000b1620000e160201b60201c565b620000fd565b8051620000cc90600e906020840190620002b4565b50620000d8836200014f565b505050620004f5565b6000620000f8620001b360201b62001d2d1760201c565b905090565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a5460ff1615620001985760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015260640160405180910390fd5b620001a38162000212565b50600a805460ff19166001179055565b6000333014156200020c57600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b031691506200020f9050565b50335b90565b6040518060800160405280604f815260200162003b7c604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600b55565b828054620002c290620004a2565b90600052602060002090601f016020900481019282620002e6576000855562000331565b82601f106200030157805160ff191683800117855562000331565b8280016001018555821562000331579182015b828111156200033157825182559160200191906001019062000314565b506200033f92915062000343565b5090565b5b808211156200033f576000815560010162000344565b600082601f8301126200036c57600080fd5b81516001600160401b0380821115620003895762000389620004df565b604051601f8301601f19908116603f01168101908282118183101715620003b457620003b4620004df565b81604052838152602092508683858801011115620003d157600080fd5b600091505b83821015620003f55785820183015181830184015290820190620003d6565b83821115620004075760008385830101525b9695505050505050565b6000806000606084860312156200042757600080fd5b83516001600160401b03808211156200043f57600080fd5b6200044d878388016200035a565b945060208601519150808211156200046457600080fd5b62000472878388016200035a565b935060408601519150808211156200048957600080fd5b5062000498868287016200035a565b9150509250925092565b600181811c90821680620004b757607f821691505b60208210811415620004d957634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052604160045260246000fd5b61367780620005056000396000f3fe6080604052600436106102935760003560e01c8063753df86a1161015a578063c6e62e0b116100c1578063df92ca481161007a578063df92ca48146107c9578063e2ec6ec3146107e9578063e985e9c514610809578063f2fde38b14610852578063fc9589ba14610872578063fe55932a1461088557600080fd5b8063c6e62e0b14610718578063c87b56dd1461072e578063c884ef831461074e578063ce7c8b491461077e578063d547cfb71461079e578063d9bf1067146107b357600080fd5b8063a1ad62fc11610113578063a1ad62fc14610630578063a22cb46514610672578063aa3fbc8114610692578063b88d4fde146106b2578063bc545f5c146106d2578063c21a43e41461070257600080fd5b8063753df86a146105785780638da5cb5b1461058d57806395d89b41146105ab5780639b19251a146105c05780639c834c3e146105f0578063a0bcfc7f1461061057600080fd5b80632f745c59116101fe5780636352211e116101b75780636352211e146104e7578063650e6f19146105075780636d9f8ef11461051d5780636ecd23061461053057806370a0823114610543578063715018a61461056357600080fd5b80632f745c59146104495780633408e4701461046957806342842e0e1461047c5780634e71d92d1461049c5780634f6ccce7146104b157806359a7715a146104d157600080fd5b806318160ddd1161025057806318160ddd1461038957806320379ee5146103a857806323b872dd146103bd57806324953eaa146103dd578063249b7c19146103fd5780632d0335ab1461041357600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b3146103275780630c53c51c146103495780630f7e59701461035c575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612f39565b6108a5565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e26108d0565b6040516102c491906131fa565b3480156102fb57600080fd5b5061030f61030a366004612fa8565b610962565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b50610347610342366004612e5b565b6109fc565b005b6102e2610357366004612de9565b610b24565b34801561036857600080fd5b506102e2604051806040016040528060018152602001603160f81b81525081565b34801561039557600080fd5b506008545b6040519081526020016102c4565b3480156103b457600080fd5b50600b5461039a565b3480156103c957600080fd5b506103476103d8366004612d09565b610d0e565b3480156103e957600080fd5b506103476103f8366004612e85565b610d46565b34801561040957600080fd5b5061039a60145481565b34801561041f57600080fd5b5061039a61042e366004612cbb565b6001600160a01b03166000908152600c602052604090205490565b34801561045557600080fd5b5061039a610464366004612e5b565b610e67565b34801561047557600080fd5b504661039a565b34801561048857600080fd5b50610347610497366004612d09565b610efd565b3480156104a857600080fd5b50610347610f18565b3480156104bd57600080fd5b5061039a6104cc366004612fa8565b610fbc565b3480156104dd57600080fd5b5061039a60115481565b3480156104f357600080fd5b5061030f610502366004612fa8565b61104f565b34801561051357600080fd5b5061039a60165481565b61034761052b366004613034565b6110c6565b61034761053e366004613034565b6112c1565b34801561054f57600080fd5b5061039a61055e366004612cbb565b611431565b34801561056f57600080fd5b506103476114b8565b34801561058457600080fd5b5061034761150d565b34801561059957600080fd5b50600d546001600160a01b031661030f565b3480156105b757600080fd5b506102e2611592565b3480156105cc57600080fd5b506102b86105db366004612cbb565b60176020526000908152604090205460ff1681565b3480156105fc57600080fd5b5061034761060b366004613008565b6115a1565b34801561061c57600080fd5b5061034761062b366004612f73565b6115f8565b34801561063c57600080fd5b5061066061064b366004612cbb565b60186020526000908152604090205460ff1681565b60405160ff90911681526020016102c4565b34801561067e57600080fd5b5061034761068d366004612dad565b611654565b34801561069e57600080fd5b506103476106ad366004612fc1565b611756565b3480156106be57600080fd5b506103476106cd366004612d45565b6117c2565b3480156106de57600080fd5b506106606106ed366004612cbb565b60196020526000908152604090205460ff1681565b34801561070e57600080fd5b5061039a60125481565b34801561072457600080fd5b5061039a60135481565b34801561073a57600080fd5b506102e2610749366004612fa8565b611801565b34801561075a57600080fd5b50610660610769366004612cbb565b601a6020526000908152604090205460ff1681565b34801561078a57600080fd5b50610347610799366004612e85565b611835565b3480156107aa57600080fd5b506102e26118e8565b3480156107bf57600080fd5b5061039a60155481565b3480156107d557600080fd5b506103476107e4366004612fa8565b611976565b3480156107f557600080fd5b50610347610804366004612e85565b6119c4565b34801561081557600080fd5b506102b8610824366004612cd6565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561085e57600080fd5b5061034761086d366004612cbb565b611a75565b610347610880366004613034565b611b2c565b34801561089157600080fd5b506103476108a0366004612fc1565b611ccd565b60006001600160e01b0319821663780e9d6360e01b14806108ca57506108ca82611d8a565b92915050565b6060600080546108df906134f0565b80601f016020809104026020016040519081016040528092919081815260200182805461090b906134f0565b80156109585780601f1061092d57610100808354040283529160200191610958565b820191906000526020600020905b81548152906001019060200180831161093b57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109e05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a078261104f565b9050806001600160a01b0316836001600160a01b03161415610a755760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109d7565b806001600160a01b0316610a87611dda565b6001600160a01b03161480610aa35750610aa381610824611dda565b610b155760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109d7565b610b1f8383611de9565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610b628782878787611e57565b610bb85760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084016109d7565b6001600160a01b0387166000908152600c6020526040902054610bdc906001611f47565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610c2c90899033908a90613191565b60405180910390a1600080306001600160a01b0316888a604051602001610c549291906130b3565b60408051601f1981840301815290829052610c6e91613097565b6000604051808303816000865af19150503d8060008114610cab576040519150601f19603f3d011682016040523d82523d6000602084013e610cb0565b606091505b509150915081610d025760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c0000000060448201526064016109d7565b98975050505050505050565b610d1f610d19611dda565b82611f5a565b610d3b5760405162461bcd60e51b81526004016109d790613375565b610b1f838383612051565b610d4e611dda565b6001600160a01b0316610d69600d546001600160a01b031690565b6001600160a01b031614610d8f5760405162461bcd60e51b81526004016109d790613340565b60005b8151811015610e6357600060176000848481518110610db357610db36135bc565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a828281518110610e2557610e256135bc565b6020026020010151604051610e4991906001600160a01b0391909116815260200190565b60405180910390a180610e5b8161352b565b915050610d92565b5050565b6000610e7283611431565b8210610ed45760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109d7565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610b1f838383604051806020016040528060008152506117c2565b601554421015610f3a5760405162461bcd60e51b81526004016109d7906133c6565b33600090815260196020526040902054610f569060ff166121fc565b33600090815260196020908152604080832054601a9092528220805460ff928316939192610f8691859116613455565b825460ff9182166101009390930a928302919092021990911617905550336000908152601960205260409020805460ff19169055565b6000610fc760085490565b821061102a5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109d7565b6008828154811061103d5761103d6135bc565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806108ca5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109d7565b3360009081526017602052604090205460ff166111355760405162461bcd60e51b815260206004820152602760248201527f307856616d706972653a20596f75277265206e6f74206f6e20746865207768696044820152663a32b634b9ba1760c91b60648201526084016109d7565b6013544210158015611148575060145442105b6111a45760405162461bcd60e51b815260206004820152602760248201527f307856616d706972653a2050726573616c6520686173206e6f742079657420736044820152663a30b93a32b21760c91b60648201526084016109d7565b336000908152601860205260409020546003906111c49060ff1683613455565b60ff16111561122d5760405162461bcd60e51b815260206004820152602f60248201527f307856616d706972653a20557020746f203320307856616d706972657320636160448201526e3710313290383ab931b430b9b2b21760891b60648201526084016109d7565b61124160ff821666d529ae9e86000061348e565b341461125f5760405162461bcd60e51b81526004016109d79061320d565b611268816121fc565b3360009081526018602052604090205461128690829060ff16613455565b336000908152601860205260408120805460ff191660ff93841617905560118054928416929091906112b990849061343d565b909155505050565b6016544210156113255760405162461bcd60e51b815260206004820152602960248201527f307856616d706972653a204d696e742074696d6520686173206e6f742079657460448201526820617272697665642160b81b60648201526084016109d7565b60c860125460105461133791906134ad565b61134191906134ad565b8160ff16601154611352919061343d565b11156113705760405162461bcd60e51b81526004016109d7906132f2565b60058160ff1611156113e15760405162461bcd60e51b815260206004820152603460248201527f307856616d706972653a20557020746f203520307856616d7069726573206361604482015273371031329036b4b73a32b21034b71030903a3c1760611b60648201526084016109d7565b6113f560ff821666d529ae9e86000061348e565b34146114135760405162461bcd60e51b81526004016109d79061320d565b61141c816121fc565b8060ff16601160008282546112b9919061343d565b60006001600160a01b03821661149c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109d7565b506001600160a01b031660009081526003602052604090205490565b6114c0611dda565b6001600160a01b03166114db600d546001600160a01b031690565b6001600160a01b0316146115015760405162461bcd60e51b81526004016109d790613340565b61150b6000612473565b565b611515611dda565b6001600160a01b0316611530600d546001600160a01b031690565b6001600160a01b0316146115565760405162461bcd60e51b81526004016109d790613340565b600d546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561158f573d6000803e3d6000fd5b50565b6060600180546108df906134f0565b6115a9611dda565b6001600160a01b03166115c4600d546001600160a01b031690565b6001600160a01b0316146115ea5760405162461bcd60e51b81526004016109d790613340565b601392909255601455601555565b611600611dda565b6001600160a01b031661161b600d546001600160a01b031690565b6001600160a01b0316146116415760405162461bcd60e51b81526004016109d790613340565b8051610e6390600e906020840190612b85565b61165c611dda565b6001600160a01b0316826001600160a01b031614156116bd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109d7565b80600560006116ca611dda565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561170e611dda565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161174a911515815260200190565b60405180910390a35050565b336117608361104f565b6001600160a01b0316146117865760405162461bcd60e51b81526004016109d7906132aa565b817f4dc852b36b0f7dba5f79e2db9d0bfae500d274f13eb0f4bc69fcf8119eb35d23826040516117b691906131fa565b60405180910390a25050565b6117d36117cd611dda565b83611f5a565b6117ef5760405162461bcd60e51b81526004016109d790613375565b6117fb848484846124c5565b50505050565b6060600e61180e836124f8565b60405160200161181f9291906130ea565b6040516020818303038152906040529050919050565b61183d611dda565b6001600160a01b0316611858600d546001600160a01b031690565b6001600160a01b03161461187e5760405162461bcd60e51b81526004016109d790613340565b60005b81518110156118d45760006118946125f6565b90506118b98383815181106118ab576118ab6135bc565b602002602001015182612607565b6118c1612755565b50806118cc8161352b565b915050611881565b508051601160008282546112b9919061343d565b600e80546118f5906134f0565b80601f0160208091040260200160405190810160405280929190818152602001828054611921906134f0565b801561196e5780601f106119435761010080835404028352916020019161196e565b820191906000526020600020905b81548152906001019060200180831161195157829003601f168201915b505050505081565b61197e611dda565b6001600160a01b0316611999600d546001600160a01b031690565b6001600160a01b0316146119bf5760405162461bcd60e51b81526004016109d790613340565b601655565b6119cc611dda565b6001600160a01b03166119e7600d546001600160a01b031690565b6001600160a01b031614611a0d5760405162461bcd60e51b81526004016109d790613340565b60005b8151811015610e6357600160176000848481518110611a3157611a316135bc565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611a6d8161352b565b915050611a10565b611a7d611dda565b6001600160a01b0316611a98600d546001600160a01b031690565b6001600160a01b031614611abe5760405162461bcd60e51b81526004016109d790613340565b6001600160a01b038116611b235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109d7565b61158f81612473565b601554421015611b4e5760405162461bcd60e51b81526004016109d7906133c6565b336000908152601a602090815260408083205460199092529091205460059160ff90811691611b7e911684613455565b611b889190613455565b60ff161115611bff5760405162461bcd60e51b815260206004820152603d60248201527f307856616d706972653a204561636820616464726573732063616e206f6e6c7960448201527f20707572636861736520757020746f203520307856616d70697265732e00000060648201526084016109d7565b60c8601254601054611c1191906134ad565b611c1b91906134ad565b8160ff16601154611c2c919061343d565b1115611c4a5760405162461bcd60e51b81526004016109d7906132f2565b611c5e60ff821666d529ae9e86000061348e565b3414611c7c5760405162461bcd60e51b81526004016109d79061320d565b33600090815260196020526040902054611c9a90829060ff16613455565b336000908152601960205260408120805460ff191660ff93841617905560128054928416929091906112b990849061343d565b33611cd78361104f565b6001600160a01b031614611cfd5760405162461bcd60e51b81526004016109d7906132aa565b817f539503b73817fc44cc08681cf3e60ecdecbbdc3f8d0d541dc9e90747b9742a63826040516117b691906131fa565b600033301415611d8457600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150611d879050565b50335b90565b60006001600160e01b031982166380ac58cd60e01b1480611dbb57506001600160e01b03198216635b5e139f60e01b145b806108ca57506301ffc9a760e01b6001600160e01b03198316146108ca565b6000611de4611d2d565b905090565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e1e8261104f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616611ebd5760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b60648201526084016109d7565b6001611ed0611ecb8761277c565b6127f9565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611f1e573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000611f53828461343d565b9392505050565b6000818152600260205260408120546001600160a01b0316611fd35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109d7565b6000611fde8361104f565b9050806001600160a01b0316846001600160a01b031614806120195750836001600160a01b031661200e84610962565b6001600160a01b0316145b8061204957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166120648261104f565b6001600160a01b0316146120cc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109d7565b6001600160a01b03821661212e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109d7565b612139838383612829565b612144600082611de9565b6001600160a01b038316600090815260036020526040812080546001929061216d9084906134ad565b90915550506001600160a01b038216600090815260036020526040812080546001929061219b90849061343d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b8160ff168160ff161015610e635760006122176125f6565b90506122233382612607565b61222b612755565b612236606482613566565b61231a576000606461227e60408051426020808301919091524482840152416060830152336080808401919091528351808403909101815260a0909201909252805191012090565b6122889190613566565b9050600061229682846134ad565b905060006122a38261104f565b6040519091506001600160a01b03821690600090670853a0d2313c00009082818181858883f193505050501580156122df573d6000803e3d6000fd5b506040516001600160a01b0382169083907fd4d79b1d205660f68c1481ff04bd0f2a8a8099ce20974b18a58ae79bbbd5e89d90600090a35050505b6123266109c482613566565b1580612333575060105481145b156124605760006103e761237d60408051426020808301919091524482840152416060830152336080808401919091528351808403909101815260a0909201909252805191012090565b6123879190613566565b905060006123a4606461239a84866134ad565b61050291906134ad565b6123b360c861239a85876134ad565b6123c361012c61239a86886134ad565b604080516001600160a01b03948516602082015292841690830152909116606082015260800160408051601f198184030181529190528051602090910120905060006124116109c483613566565b61241b90856134ad565b90506124268161104f565b6001600160a01b0316817f33c7031b3f4084dbeee1112d428af05f68b81bfdcb39c2264451a2b4ce76818260405160405180910390a35050505b508061246b81613546565b9150506121ff565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6124d0848484612051565b6124dc848484846128e1565b6117fb5760405162461bcd60e51b81526004016109d790613258565b60608161251c5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561254657806125308161352b565b915061253f9050600a8361347a565b9150612520565b60008167ffffffffffffffff811115612561576125616135d2565b6040519080825280601f01601f19166020018201604052801561258b576020820181803683370190505b5090505b8415612049576125a06001836134ad565b91506125ad600a86613566565b6125b890603061343d565b60f81b8183815181106125cd576125cd6135bc565b60200101906001600160f81b031916908160001a9053506125ef600a8661347a565b945061258f565b600f54600090611de4906001611f47565b6001600160a01b03821661265d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109d7565b6000818152600260205260409020546001600160a01b0316156126c25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d7565b6126ce60008383612829565b6001600160a01b03821660009081526003602052604081208054600192906126f790849061343d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b601054600f541061276557600080fd5b600f80549060006127758361352b565b9190505550565b60006040518060800160405280604381526020016135ff60439139805160209182012083518483015160408087015180519086012090516127dc950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000612804600b5490565b60405161190160f01b60208201526022810191909152604281018390526062016127dc565b6001600160a01b0383166128845761287f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6128a7565b816001600160a01b0316836001600160a01b0316146128a7576128a783826129f5565b6001600160a01b0382166128be57610b1f81612a92565b826001600160a01b0316826001600160a01b031614610b1f57610b1f8282612b41565b60006001600160a01b0384163b156129ea57836001600160a01b031663150b7a0261290a611dda565b8786866040518563ffffffff1660e01b815260040161292c94939291906131bd565b602060405180830381600087803b15801561294657600080fd5b505af1925050508015612976575060408051601f3d908101601f1916820190925261297391810190612f56565b60015b6129d0573d8080156129a4576040519150601f19603f3d011682016040523d82523d6000602084013e6129a9565b606091505b5080516129c85760405162461bcd60e51b81526004016109d790613258565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612049565b506001949350505050565b60006001612a0284611431565b612a0c91906134ad565b600083815260076020526040902054909150808214612a5f576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612aa4906001906134ad565b60008381526009602052604081205460088054939450909284908110612acc57612acc6135bc565b906000526020600020015490508060088381548110612aed57612aed6135bc565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612b2557612b256135a6565b6001900381819060005260206000200160009055905550505050565b6000612b4c83611431565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612b91906134f0565b90600052602060002090601f016020900481019282612bb35760008555612bf9565b82601f10612bcc57805160ff1916838001178555612bf9565b82800160010185558215612bf9579182015b82811115612bf9578251825591602001919060010190612bde565b50612c05929150612c09565b5090565b5b80821115612c055760008155600101612c0a565b80356001600160a01b0381168114612c3557600080fd5b919050565b600082601f830112612c4b57600080fd5b813567ffffffffffffffff811115612c6557612c656135d2565b612c78601f8201601f191660200161340c565b818152846020838601011115612c8d57600080fd5b816020850160208301376000918101602001919091529392505050565b803560ff81168114612c3557600080fd5b600060208284031215612ccd57600080fd5b611f5382612c1e565b60008060408385031215612ce957600080fd5b612cf283612c1e565b9150612d0060208401612c1e565b90509250929050565b600080600060608486031215612d1e57600080fd5b612d2784612c1e565b9250612d3560208501612c1e565b9150604084013590509250925092565b60008060008060808587031215612d5b57600080fd5b612d6485612c1e565b9350612d7260208601612c1e565b925060408501359150606085013567ffffffffffffffff811115612d9557600080fd5b612da187828801612c3a565b91505092959194509250565b60008060408385031215612dc057600080fd5b612dc983612c1e565b915060208301358015158114612dde57600080fd5b809150509250929050565b600080600080600060a08688031215612e0157600080fd5b612e0a86612c1e565b9450602086013567ffffffffffffffff811115612e2657600080fd5b612e3288828901612c3a565b9450506040860135925060608601359150612e4f60808701612caa565b90509295509295909350565b60008060408385031215612e6e57600080fd5b612e7783612c1e565b946020939093013593505050565b60006020808385031215612e9857600080fd5b823567ffffffffffffffff80821115612eb057600080fd5b818501915085601f830112612ec457600080fd5b813581811115612ed657612ed66135d2565b8060051b9150612ee784830161340c565b8181528481019084860184860187018a1015612f0257600080fd5b600095505b83861015612f2c57612f1881612c1e565b835260019590950194918601918601612f07565b5098975050505050505050565b600060208284031215612f4b57600080fd5b8135611f53816135e8565b600060208284031215612f6857600080fd5b8151611f53816135e8565b600060208284031215612f8557600080fd5b813567ffffffffffffffff811115612f9c57600080fd5b61204984828501612c3a565b600060208284031215612fba57600080fd5b5035919050565b60008060408385031215612fd457600080fd5b82359150602083013567ffffffffffffffff811115612ff257600080fd5b612ffe85828601612c3a565b9150509250929050565b60008060006060848603121561301d57600080fd5b505081359360208301359350604090920135919050565b60006020828403121561304657600080fd5b611f5382612caa565b600081518084526130678160208601602086016134c4565b601f01601f19169290920160200192915050565b6000815161308d8185602086016134c4565b9290920192915050565b600082516130a98184602087016134c4565b9190910192915050565b600083516130c58184602088016134c4565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b600080845481600182811c91508083168061310657607f831692505b602080841082141561312657634e487b7160e01b86526022600452602486fd5b81801561313a576001811461314b57613178565b60ff19861689528489019650613178565b60008b81526020902060005b868110156131705781548b820152908501908301613157565b505084890196505b505050505050613188818561307b565b95945050505050565b6001600160a01b038481168252831660208201526060604082018190526000906131889083018461304f565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131f09083018461304f565b9695505050505050565b602081526000611f53602083018461304f565b6020808252602b908201527f307856616d706972653a20596f75206e65656420746f2070617920746865206560408201526a3c30b1ba10383934b1b29760a91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526028908201527f307856616d706972653a20596f7520646f6e2774206f776e207468697320307860408201526756616d706972652160c01b606082015260800190565b6020808252602e908201527f307856616d706972653a20536f7272792c20616c6c20307856616d706972657360408201526d1030b9329039b7b6321037baba1760911b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526026908201527f307856616d706972653a20506c6564676520686173206e6f742079657420737460408201526530b93a32b21760d11b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613435576134356135d2565b604052919050565b600082198211156134505761345061357a565b500190565b600060ff821660ff84168060ff038211156134725761347261357a565b019392505050565b60008261348957613489613590565b500490565b60008160001904831182151516156134a8576134a861357a565b500290565b6000828210156134bf576134bf61357a565b500390565b60005b838110156134df5781810151838201526020016134c7565b838111156117fb5750506000910152565b600181811c9082168061350457607f821691505b6020821081141561352557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561353f5761353f61357a565b5060010190565b600060ff821660ff81141561355d5761355d61357a565b60010192915050565b60008261357557613575613590565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461158f57600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220a40c31ebfdea46f8e87ea405514d6c7c53fa12c875fb4241b2b17112037e113464736f6c63430008070033454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000009307856616d70697265000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033078560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002868747470733a2f2f7572692e6f7876616d706972652e636f6d2f6170692f307876616d706972652f000000000000000000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102935760003560e01c8063753df86a1161015a578063c6e62e0b116100c1578063df92ca481161007a578063df92ca48146107c9578063e2ec6ec3146107e9578063e985e9c514610809578063f2fde38b14610852578063fc9589ba14610872578063fe55932a1461088557600080fd5b8063c6e62e0b14610718578063c87b56dd1461072e578063c884ef831461074e578063ce7c8b491461077e578063d547cfb71461079e578063d9bf1067146107b357600080fd5b8063a1ad62fc11610113578063a1ad62fc14610630578063a22cb46514610672578063aa3fbc8114610692578063b88d4fde146106b2578063bc545f5c146106d2578063c21a43e41461070257600080fd5b8063753df86a146105785780638da5cb5b1461058d57806395d89b41146105ab5780639b19251a146105c05780639c834c3e146105f0578063a0bcfc7f1461061057600080fd5b80632f745c59116101fe5780636352211e116101b75780636352211e146104e7578063650e6f19146105075780636d9f8ef11461051d5780636ecd23061461053057806370a0823114610543578063715018a61461056357600080fd5b80632f745c59146104495780633408e4701461046957806342842e0e1461047c5780634e71d92d1461049c5780634f6ccce7146104b157806359a7715a146104d157600080fd5b806318160ddd1161025057806318160ddd1461038957806320379ee5146103a857806323b872dd146103bd57806324953eaa146103dd578063249b7c19146103fd5780632d0335ab1461041357600080fd5b806301ffc9a71461029857806306fdde03146102cd578063081812fc146102ef578063095ea7b3146103275780630c53c51c146103495780630f7e59701461035c575b600080fd5b3480156102a457600080fd5b506102b86102b3366004612f39565b6108a5565b60405190151581526020015b60405180910390f35b3480156102d957600080fd5b506102e26108d0565b6040516102c491906131fa565b3480156102fb57600080fd5b5061030f61030a366004612fa8565b610962565b6040516001600160a01b0390911681526020016102c4565b34801561033357600080fd5b50610347610342366004612e5b565b6109fc565b005b6102e2610357366004612de9565b610b24565b34801561036857600080fd5b506102e2604051806040016040528060018152602001603160f81b81525081565b34801561039557600080fd5b506008545b6040519081526020016102c4565b3480156103b457600080fd5b50600b5461039a565b3480156103c957600080fd5b506103476103d8366004612d09565b610d0e565b3480156103e957600080fd5b506103476103f8366004612e85565b610d46565b34801561040957600080fd5b5061039a60145481565b34801561041f57600080fd5b5061039a61042e366004612cbb565b6001600160a01b03166000908152600c602052604090205490565b34801561045557600080fd5b5061039a610464366004612e5b565b610e67565b34801561047557600080fd5b504661039a565b34801561048857600080fd5b50610347610497366004612d09565b610efd565b3480156104a857600080fd5b50610347610f18565b3480156104bd57600080fd5b5061039a6104cc366004612fa8565b610fbc565b3480156104dd57600080fd5b5061039a60115481565b3480156104f357600080fd5b5061030f610502366004612fa8565b61104f565b34801561051357600080fd5b5061039a60165481565b61034761052b366004613034565b6110c6565b61034761053e366004613034565b6112c1565b34801561054f57600080fd5b5061039a61055e366004612cbb565b611431565b34801561056f57600080fd5b506103476114b8565b34801561058457600080fd5b5061034761150d565b34801561059957600080fd5b50600d546001600160a01b031661030f565b3480156105b757600080fd5b506102e2611592565b3480156105cc57600080fd5b506102b86105db366004612cbb565b60176020526000908152604090205460ff1681565b3480156105fc57600080fd5b5061034761060b366004613008565b6115a1565b34801561061c57600080fd5b5061034761062b366004612f73565b6115f8565b34801561063c57600080fd5b5061066061064b366004612cbb565b60186020526000908152604090205460ff1681565b60405160ff90911681526020016102c4565b34801561067e57600080fd5b5061034761068d366004612dad565b611654565b34801561069e57600080fd5b506103476106ad366004612fc1565b611756565b3480156106be57600080fd5b506103476106cd366004612d45565b6117c2565b3480156106de57600080fd5b506106606106ed366004612cbb565b60196020526000908152604090205460ff1681565b34801561070e57600080fd5b5061039a60125481565b34801561072457600080fd5b5061039a60135481565b34801561073a57600080fd5b506102e2610749366004612fa8565b611801565b34801561075a57600080fd5b50610660610769366004612cbb565b601a6020526000908152604090205460ff1681565b34801561078a57600080fd5b50610347610799366004612e85565b611835565b3480156107aa57600080fd5b506102e26118e8565b3480156107bf57600080fd5b5061039a60155481565b3480156107d557600080fd5b506103476107e4366004612fa8565b611976565b3480156107f557600080fd5b50610347610804366004612e85565b6119c4565b34801561081557600080fd5b506102b8610824366004612cd6565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b34801561085e57600080fd5b5061034761086d366004612cbb565b611a75565b610347610880366004613034565b611b2c565b34801561089157600080fd5b506103476108a0366004612fc1565b611ccd565b60006001600160e01b0319821663780e9d6360e01b14806108ca57506108ca82611d8a565b92915050565b6060600080546108df906134f0565b80601f016020809104026020016040519081016040528092919081815260200182805461090b906134f0565b80156109585780601f1061092d57610100808354040283529160200191610958565b820191906000526020600020905b81548152906001019060200180831161093b57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109e05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a078261104f565b9050806001600160a01b0316836001600160a01b03161415610a755760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109d7565b806001600160a01b0316610a87611dda565b6001600160a01b03161480610aa35750610aa381610824611dda565b610b155760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109d7565b610b1f8383611de9565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610b628782878787611e57565b610bb85760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084016109d7565b6001600160a01b0387166000908152600c6020526040902054610bdc906001611f47565b6001600160a01b0388166000908152600c60205260409081902091909155517f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b90610c2c90899033908a90613191565b60405180910390a1600080306001600160a01b0316888a604051602001610c549291906130b3565b60408051601f1981840301815290829052610c6e91613097565b6000604051808303816000865af19150503d8060008114610cab576040519150601f19603f3d011682016040523d82523d6000602084013e610cb0565b606091505b509150915081610d025760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c0000000060448201526064016109d7565b98975050505050505050565b610d1f610d19611dda565b82611f5a565b610d3b5760405162461bcd60e51b81526004016109d790613375565b610b1f838383612051565b610d4e611dda565b6001600160a01b0316610d69600d546001600160a01b031690565b6001600160a01b031614610d8f5760405162461bcd60e51b81526004016109d790613340565b60005b8151811015610e6357600060176000848481518110610db357610db36135bc565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff0219169083151502179055507ff1abf01a1043b7c244d128e8595cf0c1d10743b022b03a02dffd8ca3bf729f5a828281518110610e2557610e256135bc565b6020026020010151604051610e4991906001600160a01b0391909116815260200190565b60405180910390a180610e5b8161352b565b915050610d92565b5050565b6000610e7283611431565b8210610ed45760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109d7565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610b1f838383604051806020016040528060008152506117c2565b601554421015610f3a5760405162461bcd60e51b81526004016109d7906133c6565b33600090815260196020526040902054610f569060ff166121fc565b33600090815260196020908152604080832054601a9092528220805460ff928316939192610f8691859116613455565b825460ff9182166101009390930a928302919092021990911617905550336000908152601960205260409020805460ff19169055565b6000610fc760085490565b821061102a5760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109d7565b6008828154811061103d5761103d6135bc565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806108ca5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109d7565b3360009081526017602052604090205460ff166111355760405162461bcd60e51b815260206004820152602760248201527f307856616d706972653a20596f75277265206e6f74206f6e20746865207768696044820152663a32b634b9ba1760c91b60648201526084016109d7565b6013544210158015611148575060145442105b6111a45760405162461bcd60e51b815260206004820152602760248201527f307856616d706972653a2050726573616c6520686173206e6f742079657420736044820152663a30b93a32b21760c91b60648201526084016109d7565b336000908152601860205260409020546003906111c49060ff1683613455565b60ff16111561122d5760405162461bcd60e51b815260206004820152602f60248201527f307856616d706972653a20557020746f203320307856616d706972657320636160448201526e3710313290383ab931b430b9b2b21760891b60648201526084016109d7565b61124160ff821666d529ae9e86000061348e565b341461125f5760405162461bcd60e51b81526004016109d79061320d565b611268816121fc565b3360009081526018602052604090205461128690829060ff16613455565b336000908152601860205260408120805460ff191660ff93841617905560118054928416929091906112b990849061343d565b909155505050565b6016544210156113255760405162461bcd60e51b815260206004820152602960248201527f307856616d706972653a204d696e742074696d6520686173206e6f742079657460448201526820617272697665642160b81b60648201526084016109d7565b60c860125460105461133791906134ad565b61134191906134ad565b8160ff16601154611352919061343d565b11156113705760405162461bcd60e51b81526004016109d7906132f2565b60058160ff1611156113e15760405162461bcd60e51b815260206004820152603460248201527f307856616d706972653a20557020746f203520307856616d7069726573206361604482015273371031329036b4b73a32b21034b71030903a3c1760611b60648201526084016109d7565b6113f560ff821666d529ae9e86000061348e565b34146114135760405162461bcd60e51b81526004016109d79061320d565b61141c816121fc565b8060ff16601160008282546112b9919061343d565b60006001600160a01b03821661149c5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109d7565b506001600160a01b031660009081526003602052604090205490565b6114c0611dda565b6001600160a01b03166114db600d546001600160a01b031690565b6001600160a01b0316146115015760405162461bcd60e51b81526004016109d790613340565b61150b6000612473565b565b611515611dda565b6001600160a01b0316611530600d546001600160a01b031690565b6001600160a01b0316146115565760405162461bcd60e51b81526004016109d790613340565b600d546040516001600160a01b03909116904780156108fc02916000818181858888f1935050505015801561158f573d6000803e3d6000fd5b50565b6060600180546108df906134f0565b6115a9611dda565b6001600160a01b03166115c4600d546001600160a01b031690565b6001600160a01b0316146115ea5760405162461bcd60e51b81526004016109d790613340565b601392909255601455601555565b611600611dda565b6001600160a01b031661161b600d546001600160a01b031690565b6001600160a01b0316146116415760405162461bcd60e51b81526004016109d790613340565b8051610e6390600e906020840190612b85565b61165c611dda565b6001600160a01b0316826001600160a01b031614156116bd5760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109d7565b80600560006116ca611dda565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff19169215159290921790915561170e611dda565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161174a911515815260200190565b60405180910390a35050565b336117608361104f565b6001600160a01b0316146117865760405162461bcd60e51b81526004016109d7906132aa565b817f4dc852b36b0f7dba5f79e2db9d0bfae500d274f13eb0f4bc69fcf8119eb35d23826040516117b691906131fa565b60405180910390a25050565b6117d36117cd611dda565b83611f5a565b6117ef5760405162461bcd60e51b81526004016109d790613375565b6117fb848484846124c5565b50505050565b6060600e61180e836124f8565b60405160200161181f9291906130ea565b6040516020818303038152906040529050919050565b61183d611dda565b6001600160a01b0316611858600d546001600160a01b031690565b6001600160a01b03161461187e5760405162461bcd60e51b81526004016109d790613340565b60005b81518110156118d45760006118946125f6565b90506118b98383815181106118ab576118ab6135bc565b602002602001015182612607565b6118c1612755565b50806118cc8161352b565b915050611881565b508051601160008282546112b9919061343d565b600e80546118f5906134f0565b80601f0160208091040260200160405190810160405280929190818152602001828054611921906134f0565b801561196e5780601f106119435761010080835404028352916020019161196e565b820191906000526020600020905b81548152906001019060200180831161195157829003601f168201915b505050505081565b61197e611dda565b6001600160a01b0316611999600d546001600160a01b031690565b6001600160a01b0316146119bf5760405162461bcd60e51b81526004016109d790613340565b601655565b6119cc611dda565b6001600160a01b03166119e7600d546001600160a01b031690565b6001600160a01b031614611a0d5760405162461bcd60e51b81526004016109d790613340565b60005b8151811015610e6357600160176000848481518110611a3157611a316135bc565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580611a6d8161352b565b915050611a10565b611a7d611dda565b6001600160a01b0316611a98600d546001600160a01b031690565b6001600160a01b031614611abe5760405162461bcd60e51b81526004016109d790613340565b6001600160a01b038116611b235760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109d7565b61158f81612473565b601554421015611b4e5760405162461bcd60e51b81526004016109d7906133c6565b336000908152601a602090815260408083205460199092529091205460059160ff90811691611b7e911684613455565b611b889190613455565b60ff161115611bff5760405162461bcd60e51b815260206004820152603d60248201527f307856616d706972653a204561636820616464726573732063616e206f6e6c7960448201527f20707572636861736520757020746f203520307856616d70697265732e00000060648201526084016109d7565b60c8601254601054611c1191906134ad565b611c1b91906134ad565b8160ff16601154611c2c919061343d565b1115611c4a5760405162461bcd60e51b81526004016109d7906132f2565b611c5e60ff821666d529ae9e86000061348e565b3414611c7c5760405162461bcd60e51b81526004016109d79061320d565b33600090815260196020526040902054611c9a90829060ff16613455565b336000908152601960205260408120805460ff191660ff93841617905560128054928416929091906112b990849061343d565b33611cd78361104f565b6001600160a01b031614611cfd5760405162461bcd60e51b81526004016109d7906132aa565b817f539503b73817fc44cc08681cf3e60ecdecbbdc3f8d0d541dc9e90747b9742a63826040516117b691906131fa565b600033301415611d8457600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150611d879050565b50335b90565b60006001600160e01b031982166380ac58cd60e01b1480611dbb57506001600160e01b03198216635b5e139f60e01b145b806108ca57506301ffc9a760e01b6001600160e01b03198316146108ca565b6000611de4611d2d565b905090565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611e1e8261104f565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616611ebd5760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b60648201526084016109d7565b6001611ed0611ecb8761277c565b6127f9565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015611f1e573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b6000611f53828461343d565b9392505050565b6000818152600260205260408120546001600160a01b0316611fd35760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109d7565b6000611fde8361104f565b9050806001600160a01b0316846001600160a01b031614806120195750836001600160a01b031661200e84610962565b6001600160a01b0316145b8061204957506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b03166120648261104f565b6001600160a01b0316146120cc5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109d7565b6001600160a01b03821661212e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109d7565b612139838383612829565b612144600082611de9565b6001600160a01b038316600090815260036020526040812080546001929061216d9084906134ad565b90915550506001600160a01b038216600090815260036020526040812080546001929061219b90849061343d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60005b8160ff168160ff161015610e635760006122176125f6565b90506122233382612607565b61222b612755565b612236606482613566565b61231a576000606461227e60408051426020808301919091524482840152416060830152336080808401919091528351808403909101815260a0909201909252805191012090565b6122889190613566565b9050600061229682846134ad565b905060006122a38261104f565b6040519091506001600160a01b03821690600090670853a0d2313c00009082818181858883f193505050501580156122df573d6000803e3d6000fd5b506040516001600160a01b0382169083907fd4d79b1d205660f68c1481ff04bd0f2a8a8099ce20974b18a58ae79bbbd5e89d90600090a35050505b6123266109c482613566565b1580612333575060105481145b156124605760006103e761237d60408051426020808301919091524482840152416060830152336080808401919091528351808403909101815260a0909201909252805191012090565b6123879190613566565b905060006123a4606461239a84866134ad565b61050291906134ad565b6123b360c861239a85876134ad565b6123c361012c61239a86886134ad565b604080516001600160a01b03948516602082015292841690830152909116606082015260800160408051601f198184030181529190528051602090910120905060006124116109c483613566565b61241b90856134ad565b90506124268161104f565b6001600160a01b0316817f33c7031b3f4084dbeee1112d428af05f68b81bfdcb39c2264451a2b4ce76818260405160405180910390a35050505b508061246b81613546565b9150506121ff565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6124d0848484612051565b6124dc848484846128e1565b6117fb5760405162461bcd60e51b81526004016109d790613258565b60608161251c5750506040805180820190915260018152600360fc1b602082015290565b8160005b811561254657806125308161352b565b915061253f9050600a8361347a565b9150612520565b60008167ffffffffffffffff811115612561576125616135d2565b6040519080825280601f01601f19166020018201604052801561258b576020820181803683370190505b5090505b8415612049576125a06001836134ad565b91506125ad600a86613566565b6125b890603061343d565b60f81b8183815181106125cd576125cd6135bc565b60200101906001600160f81b031916908160001a9053506125ef600a8661347a565b945061258f565b600f54600090611de4906001611f47565b6001600160a01b03821661265d5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109d7565b6000818152600260205260409020546001600160a01b0316156126c25760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109d7565b6126ce60008383612829565b6001600160a01b03821660009081526003602052604081208054600192906126f790849061343d565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b601054600f541061276557600080fd5b600f80549060006127758361352b565b9190505550565b60006040518060800160405280604381526020016135ff60439139805160209182012083518483015160408087015180519086012090516127dc950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b6000612804600b5490565b60405161190160f01b60208201526022810191909152604281018390526062016127dc565b6001600160a01b0383166128845761287f81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6128a7565b816001600160a01b0316836001600160a01b0316146128a7576128a783826129f5565b6001600160a01b0382166128be57610b1f81612a92565b826001600160a01b0316826001600160a01b031614610b1f57610b1f8282612b41565b60006001600160a01b0384163b156129ea57836001600160a01b031663150b7a0261290a611dda565b8786866040518563ffffffff1660e01b815260040161292c94939291906131bd565b602060405180830381600087803b15801561294657600080fd5b505af1925050508015612976575060408051601f3d908101601f1916820190925261297391810190612f56565b60015b6129d0573d8080156129a4576040519150601f19603f3d011682016040523d82523d6000602084013e6129a9565b606091505b5080516129c85760405162461bcd60e51b81526004016109d790613258565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050612049565b506001949350505050565b60006001612a0284611431565b612a0c91906134ad565b600083815260076020526040902054909150808214612a5f576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612aa4906001906134ad565b60008381526009602052604081205460088054939450909284908110612acc57612acc6135bc565b906000526020600020015490508060088381548110612aed57612aed6135bc565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612b2557612b256135a6565b6001900381819060005260206000200160009055905550505050565b6000612b4c83611431565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612b91906134f0565b90600052602060002090601f016020900481019282612bb35760008555612bf9565b82601f10612bcc57805160ff1916838001178555612bf9565b82800160010185558215612bf9579182015b82811115612bf9578251825591602001919060010190612bde565b50612c05929150612c09565b5090565b5b80821115612c055760008155600101612c0a565b80356001600160a01b0381168114612c3557600080fd5b919050565b600082601f830112612c4b57600080fd5b813567ffffffffffffffff811115612c6557612c656135d2565b612c78601f8201601f191660200161340c565b818152846020838601011115612c8d57600080fd5b816020850160208301376000918101602001919091529392505050565b803560ff81168114612c3557600080fd5b600060208284031215612ccd57600080fd5b611f5382612c1e565b60008060408385031215612ce957600080fd5b612cf283612c1e565b9150612d0060208401612c1e565b90509250929050565b600080600060608486031215612d1e57600080fd5b612d2784612c1e565b9250612d3560208501612c1e565b9150604084013590509250925092565b60008060008060808587031215612d5b57600080fd5b612d6485612c1e565b9350612d7260208601612c1e565b925060408501359150606085013567ffffffffffffffff811115612d9557600080fd5b612da187828801612c3a565b91505092959194509250565b60008060408385031215612dc057600080fd5b612dc983612c1e565b915060208301358015158114612dde57600080fd5b809150509250929050565b600080600080600060a08688031215612e0157600080fd5b612e0a86612c1e565b9450602086013567ffffffffffffffff811115612e2657600080fd5b612e3288828901612c3a565b9450506040860135925060608601359150612e4f60808701612caa565b90509295509295909350565b60008060408385031215612e6e57600080fd5b612e7783612c1e565b946020939093013593505050565b60006020808385031215612e9857600080fd5b823567ffffffffffffffff80821115612eb057600080fd5b818501915085601f830112612ec457600080fd5b813581811115612ed657612ed66135d2565b8060051b9150612ee784830161340c565b8181528481019084860184860187018a1015612f0257600080fd5b600095505b83861015612f2c57612f1881612c1e565b835260019590950194918601918601612f07565b5098975050505050505050565b600060208284031215612f4b57600080fd5b8135611f53816135e8565b600060208284031215612f6857600080fd5b8151611f53816135e8565b600060208284031215612f8557600080fd5b813567ffffffffffffffff811115612f9c57600080fd5b61204984828501612c3a565b600060208284031215612fba57600080fd5b5035919050565b60008060408385031215612fd457600080fd5b82359150602083013567ffffffffffffffff811115612ff257600080fd5b612ffe85828601612c3a565b9150509250929050565b60008060006060848603121561301d57600080fd5b505081359360208301359350604090920135919050565b60006020828403121561304657600080fd5b611f5382612caa565b600081518084526130678160208601602086016134c4565b601f01601f19169290920160200192915050565b6000815161308d8185602086016134c4565b9290920192915050565b600082516130a98184602087016134c4565b9190910192915050565b600083516130c58184602088016134c4565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b600080845481600182811c91508083168061310657607f831692505b602080841082141561312657634e487b7160e01b86526022600452602486fd5b81801561313a576001811461314b57613178565b60ff19861689528489019650613178565b60008b81526020902060005b868110156131705781548b820152908501908301613157565b505084890196505b505050505050613188818561307b565b95945050505050565b6001600160a01b038481168252831660208201526060604082018190526000906131889083018461304f565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906131f09083018461304f565b9695505050505050565b602081526000611f53602083018461304f565b6020808252602b908201527f307856616d706972653a20596f75206e65656420746f2070617920746865206560408201526a3c30b1ba10383934b1b29760a91b606082015260800190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b60208082526028908201527f307856616d706972653a20596f7520646f6e2774206f776e207468697320307860408201526756616d706972652160c01b606082015260800190565b6020808252602e908201527f307856616d706972653a20536f7272792c20616c6c20307856616d706972657360408201526d1030b9329039b7b6321037baba1760911b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b60208082526026908201527f307856616d706972653a20506c6564676520686173206e6f742079657420737460408201526530b93a32b21760d11b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613435576134356135d2565b604052919050565b600082198211156134505761345061357a565b500190565b600060ff821660ff84168060ff038211156134725761347261357a565b019392505050565b60008261348957613489613590565b500490565b60008160001904831182151516156134a8576134a861357a565b500290565b6000828210156134bf576134bf61357a565b500390565b60005b838110156134df5781810151838201526020016134c7565b838111156117fb5750506000910152565b600181811c9082168061350457607f821691505b6020821081141561352557634e487b7160e01b600052602260045260246000fd5b50919050565b600060001982141561353f5761353f61357a565b5060010190565b600060ff821660ff81141561355d5761355d61357a565b60010192915050565b60008261357557613575613590565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461158f57600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e617475726529a2646970667358221220a40c31ebfdea46f8e87ea405514d6c7c53fa12c875fb4241b2b17112037e113464736f6c63430008070033

Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000009307856616d70697265000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000033078560000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002868747470733a2f2f7572692e6f7876616d706972652e636f6d2f6170692f307876616d706972652f000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): 0xVampire
Arg [1] : _symbol (string): 0xV
Arg [2] : _uri (string): https://uri.oxvampire.com/api/0xvampire/

-----Encoded View---------------
10 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000009
Arg [4] : 307856616d706972650000000000000000000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000003
Arg [6] : 3078560000000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000028
Arg [8] : 68747470733a2f2f7572692e6f7876616d706972652e636f6d2f6170692f3078
Arg [9] : 76616d706972652f000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

284:9498:18:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;909:290:6;;;;;;;;;;-1:-1:-1;909:290:6;;;;;:::i;:::-;;:::i;:::-;;;10771:14:19;;10764:22;10746:41;;10734:2;10719:18;909:290:6;;;;;;;;2549:98:5;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4182:295::-;;;;;;;;;;-1:-1:-1;4182:295:5;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;9222:32:19;;;9204:51;;9192:2;9177:18;4182:295:5;9058:203:19;3720:401:5;;;;;;;;;;-1:-1:-1;3720:401:5;;;;;:::i;:::-;;:::i;:::-;;966:1117:14;;;;;;:::i;:::-;;:::i;288:43:3:-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;288:43:3;;;;;1680:111:6;;;;;;;;;;-1:-1:-1;1767:10:6;:17;1680:111;;;10944:25:19;;;10932:2;10917:18;1680:111:6;10798:177:19;1254:99:3;;;;;;;;;;-1:-1:-1;1331:15:3;;1254:99;;5196:364:5;;;;;;;;;;-1:-1:-1;5196:364:5;;;;;:::i;:::-;;:::i;9516:264:18:-;;;;;;;;;;-1:-1:-1;9516:264:18;;;;;:::i;:::-;;:::i;638:42::-;;;;;;;;;;;;;;;;2491:105:14;;;;;;;;;;-1:-1:-1;2491:105:14;;;;;:::i;:::-;-1:-1:-1;;;;;2577:12:14;2544:13;2577:12;;;:6;:12;;;;;;;2491:105;1278:331:6;;;;;;;;;;-1:-1:-1;1278:331:6;;;;;:::i;:::-;;:::i;1359:155:3:-;;;;;;;;;;-1:-1:-1;1470:9:3;1359:155;;5626:179:5;;;;;;;;;;-1:-1:-1;5626:179:5;;;;;:::i;:::-;;:::i;4018:312:18:-;;;;;;;;;;;;;:::i;1863:308:6:-;;;;;;;;;;-1:-1:-1;1863:308:6;;;;;:::i;:::-;;:::i;526:28:18:-;;;;;;;;;;;;;;;;2174:313:5;;;;;;;;;;-1:-1:-1;2174:313:5;;;;;:::i;:::-;;:::i;730:41:18:-;;;;;;;;;;;;;;;;2348:653;;;;;;:::i;:::-;;:::i;4445:654::-;;;;;;:::i;:::-;;:::i;1834:283:5:-;;;;;;;;;;-1:-1:-1;1834:283:5;;;;;:::i;:::-;;:::i;1620:92:15:-;;;;;;;;;;;;;:::i;9027:110:18:-;;;;;;;;;;;;;:::i;988:85:15:-;;;;;;;;;;-1:-1:-1;1060:6:15;;-1:-1:-1;;;;;1060:6:15;988:85;;2711:102:5;;;;;;;;;;;;;:::i;778:41:18:-;;;;;;;;;;-1:-1:-1;778:41:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;7783:256;;;;;;;;;;-1:-1:-1;7783:256:18;;;;;:::i;:::-;;:::i;7444:95::-;;;;;;;;;;-1:-1:-1;7444:95:18;;;;;:::i;:::-;;:::i;825:51::-;;;;;;;;;;-1:-1:-1;825:51:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;25187:4:19;25175:17;;;25157:36;;25145:2;25130:18;825:51:18;25015:184:19;4544:318:5;;;;;;;;;;-1:-1:-1;4544:318:5;;;;;:::i;:::-;;:::i;8292:247:18:-;;;;;;;;;;-1:-1:-1;8292:247:18;;;;;:::i;:::-;;:::i;5871:354:5:-;;;;;;;;;;-1:-1:-1;5871:354:5;;;;;:::i;:::-;;:::i;882:50:18:-;;;;;;;;;;-1:-1:-1;882:50:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;560:26;;;;;;;;;;;;;;;;593:39;;;;;;;;;;;;;;;;8545:219;;;;;;;;;;-1:-1:-1;8545:219:18;;;;;:::i;:::-;;:::i;938:40::-;;;;;;;;;;-1:-1:-1;938:40:18;;;;;:::i;:::-;;;;;;;;;;;;;;;;1901:314;;;;;;;;;;-1:-1:-1;1901:314:18;;;;;:::i;:::-;;:::i;422:26::-;;;;;;;;;;;;;:::i;686:38::-;;;;;;;;;;;;;;;;7605:98;;;;;;;;;;-1:-1:-1;7605:98:18;;;;;:::i;:::-;;:::i;9232:184::-;;;;;;;;;;-1:-1:-1;9232:184:18;;;;;:::i;:::-;;:::i;4928:206:5:-;;;;;;;;;;-1:-1:-1;4928:206:5;;;;;:::i;:::-;-1:-1:-1;;;;;5092:25:5;;;5065:4;5092:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4928:206;1861:223:15;;;;;;;;;;-1:-1:-1;1861:223:15;;;;;:::i;:::-;;:::i;3151:773:18:-;;;;;;:::i;:::-;;:::i;8045:241::-;;;;;;;;;;-1:-1:-1;8045:241:18;;;;;:::i;:::-;;:::i;909:290:6:-;1051:4;-1:-1:-1;;;;;;1090:50:6;;-1:-1:-1;;;1090:50:6;;:102;;;1156:36;1180:11;1156:23;:36::i;:::-;1071:121;909:290;-1:-1:-1;;909:290:6:o;2549:98:5:-;2603:13;2635:5;2628:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2549:98;:::o;4182:295::-;4298:7;7819:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7819:16:5;4321:107;;;;-1:-1:-1;;;4321:107:5;;20510:2:19;4321:107:5;;;20492:21:19;20549:2;20529:18;;;20522:30;20588:34;20568:18;;;20561:62;-1:-1:-1;;;20639:18:19;;;20632:42;20691:19;;4321:107:5;;;;;;;;;-1:-1:-1;4446:24:5;;;;:15;:24;;;;;;-1:-1:-1;;;;;4446:24:5;;4182:295::o;3720:401::-;3800:13;3816:23;3831:7;3816:14;:23::i;:::-;3800:39;;3863:5;-1:-1:-1;;;;;3857:11:5;:2;-1:-1:-1;;;;;3857:11:5;;;3849:57;;;;-1:-1:-1;;;3849:57:5;;22096:2:19;3849:57:5;;;22078:21:19;22135:2;22115:18;;;22108:30;22174:34;22154:18;;;22147:62;-1:-1:-1;;;22225:18:19;;;22218:31;22266:19;;3849:57:5;21894:397:19;3849:57:5;3954:5;-1:-1:-1;;;;;3938:21:5;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3938:21:5;;:62;;;;3963:37;3980:5;3987:12;:10;:12::i;3963:37::-;3917:165;;;;-1:-1:-1;;;3917:165:5;;18058:2:19;3917:165:5;;;18040:21:19;18097:2;18077:18;;;18070:30;18136:34;18116:18;;;18109:62;18207:26;18187:18;;;18180:54;18251:19;;3917:165:5;17856:420:19;3917:165:5;4093:21;4102:2;4106:7;4093:8;:21::i;:::-;3790:331;3720:401;;:::o;966:1117:14:-;1217:148;;;1161:12;1217:148;;;;;-1:-1:-1;;;;;1254:19:14;;1185:29;1254:19;;;:6;:19;;;;;;;;;1217:148;;;;;;;;;;;1397:45;1261:11;1217:148;1425:4;1431;1437;1397:6;:45::i;:::-;1376:125;;;;-1:-1:-1;;;1376:125:14;;21694:2:19;1376:125:14;;;21676:21:19;21733:2;21713:18;;;21706:30;21772:34;21752:18;;;21745:62;-1:-1:-1;;;21823:18:19;;;21816:31;21864:19;;1376:125:14;21492:397:19;1376:125:14;-1:-1:-1;;;;;1587:19:14;;;;;;:6;:19;;;;;;:26;;1611:1;1587:23;:26::i;:::-;-1:-1:-1;;;;;1565:19:14;;;;;;:6;:19;;;;;;;:48;;;;1629:122;;;;;1572:11;;1699:10;;1724:17;;1629:122;:::i;:::-;;;;;;;;1859:12;1873:23;1908:4;-1:-1:-1;;;;;1900:18:14;1949:17;1968:11;1932:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1932:48:14;;;;;;;;;;1900:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1858:132;;;;2008:7;2000:48;;;;-1:-1:-1;;;2000:48:14;;14541:2:19;2000:48:14;;;14523:21:19;14580:2;14560:18;;;14553:30;14619;14599:18;;;14592:58;14667:18;;2000:48:14;14339:352:19;2000:48:14;2066:10;966:1117;-1:-1:-1;;;;;;;;966:1117:14:o;5196:364:5:-;5398:41;5417:12;:10;:12::i;:::-;5431:7;5398:18;:41::i;:::-;5377:137;;;;-1:-1:-1;;;5377:137:5;;;;;;;:::i;:::-;5525:28;5535:4;5541:2;5545:7;5525:9;:28::i;9516:264:18:-;1211:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:15;:7;1060:6;;-1:-1:-1;;;;;1060:6:15;;988:85;1200:7;-1:-1:-1;;;;;1200:23:15;;1192:68;;;;-1:-1:-1;;;1192:68:15;;;;;;;:::i;:::-;9630:9:18::1;9625:149;9649:5;:12;9645:1;:16;9625:149;;;9704:5;9682:9;:19;9692:5;9698:1;9692:8;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;9682:19:18::1;-1:-1:-1::0;;;;;9682:19:18::1;;;;;;;;;;;;;:27;;;;;;;;;;;;;;;;;;9728:35;9754:5;9760:1;9754:8;;;;;;;;:::i;:::-;;;;;;;9728:35;;;;;-1:-1:-1::0;;;;;9222:32:19;;;;9204:51;;9192:2;9177:18;;9058:203;9728:35:18::1;;;;;;;;9663:3:::0;::::1;::::0;::::1;:::i;:::-;;;;9625:149;;;;9516:264:::0;:::o;1278:331:6:-;1415:7;1467:23;1484:5;1467:16;:23::i;:::-;1459:5;:31;1438:121;;;;-1:-1:-1;;;1438:121:6;;13303:2:19;1438:121:6;;;13285:21:19;13342:2;13322:18;;;13315:30;13381:34;13361:18;;;13354:62;-1:-1:-1;;;13432:18:19;;;13425:41;13483:19;;1438:121:6;13101:407:19;1438:121:6;-1:-1:-1;;;;;;1576:19:6;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1278:331::o;5626:179:5:-;5759:39;5776:4;5782:2;5786:7;5759:39;;;;;;;;;;;;:16;:39::i;4018:312:18:-;4094:10;;4075:15;:29;;4054:114;;;;-1:-1:-1;;;4054:114:18;;;;;;;:::i;:::-;4206:10;4188:29;;;;:17;:29;;;;;;4178:40;;4188:29;;4178:9;:40::i;:::-;4269:10;4251:29;;;;:17;:29;;;;;;;;;4228:7;:19;;;;;:52;;4251:29;;;;;4228:19;;:52;;4251:29;;4228:52;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4308:10:18;-1:-1:-1;4290:29:18;;;:17;:29;;;;;:33;;-1:-1:-1;;4290:33:18;;;4018:312::o;1863:308:6:-;1978:7;2030:30;1767:10;:17;;1680:111;2030:30;2022:5;:38;2001:129;;;;-1:-1:-1;;;2001:129:6;;23747:2:19;2001:129:6;;;23729:21:19;23786:2;23766:18;;;23759:30;23825:34;23805:18;;;23798:62;-1:-1:-1;;;23876:18:19;;;23869:42;23928:19;;2001:129:6;23545:408:19;2001:129:6;2147:10;2158:5;2147:17;;;;;;;;:::i;:::-;;;;;;;;;2140:24;;1863:308;;;:::o;2174:313:5:-;2286:7;2325:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2325:16:5;2372:19;2351:107;;;;-1:-1:-1;;;2351:107:5;;18894:2:19;2351:107:5;;;18876:21:19;18933:2;18913:18;;;18906:30;18972:34;18952:18;;;18945:62;-1:-1:-1;;;19023:18:19;;;19016:39;19072:19;;2351:107:5;18692:405:19;2348:653:18;1461:10;1451:21;;;;:9;:21;;;;;;;;1430:107;;;;-1:-1:-1;;;1430:107:18;;15255:2:19;1430:107:18;;;15237:21:19;15294:2;15274:18;;;15267:30;15333:34;15313:18;;;15306:62;-1:-1:-1;;;15384:18:19;;;15377:37;15431:19;;1430:107:18;15053:403:19;1430:107:18;2460:11:::1;;2441:15;:30;;:66;;;;;2493:14;;2475:15;:32;2441:66;2420:152;;;::::0;-1:-1:-1;;;2420:152:18;;16831:2:19;2420:152:18::1;::::0;::::1;16813:21:19::0;16870:2;16850:18;;;16843:30;16909:34;16889:18;;;16882:62;-1:-1:-1;;;16960:18:19;;;16953:37;17007:19;;2420:152:18::1;16629:403:19::0;2420:152:18::1;2630:10;2611:30;::::0;;;:18:::1;:30;::::0;;;;;2646:1:::1;::::0;2604:37:::1;::::0;2611:30:::1;;2604:4:::0;:37:::1;:::i;:::-;2603:44;;;;2582:138;;;::::0;-1:-1:-1;;;2582:138:18;;12887:2:19;2582:138:18::1;::::0;::::1;12869:21:19::0;12926:2;12906:18;;;12899:30;12965:34;12945:18;;;12938:62;-1:-1:-1;;;13016:18:19;;;13009:45;13071:19;;2582:138:18::1;12685:411:19::0;2582:138:18::1;2764:20;:13;::::0;::::1;2780:4;2764:20;:::i;:::-;2751:9;:33;2730:123;;;;-1:-1:-1::0;;;2730:123:18::1;;;;;;;:::i;:::-;2863:15;2873:4;2863:9;:15::i;:::-;2940:10;2921:30;::::0;;;:18:::1;:30;::::0;;;;;:37:::1;::::0;2954:4;;2921:30:::1;;:37;:::i;:::-;2907:10;2888:30;::::0;;;:18:::1;:30;::::0;;;;:70;;-1:-1:-1;;2888:70:18::1;;::::0;;::::1;;::::0;;2968:9:::1;:26:::0;;2981:13;;::::1;::::0;2968:9;;2888:30;2968:26:::1;::::0;2981:13;;2968:26:::1;:::i;:::-;::::0;;;-1:-1:-1;;;2348:653:18:o;4445:654::-;4538:13;;4519:15;:32;;4498:120;;;;-1:-1:-1;;;4498:120:18;;22498:2:19;4498:120:18;;;22480:21:19;22537:2;22517:18;;;22510:30;22576:34;22556:18;;;22549:62;-1:-1:-1;;;22627:18:19;;;22620:39;22676:19;;4498:120:18;22296:405:19;4498:120:18;4705:3;4691:11;;4678:10;;:24;;;;:::i;:::-;:30;;;;:::i;:::-;4669:4;4661:13;;4649:9;;:25;;;;:::i;:::-;:59;;4628:152;;;;-1:-1:-1;;;4628:152:18;;;;;;;:::i;:::-;4819:1;4811:4;:9;;;;4790:108;;;;-1:-1:-1;;;4790:108:18;;23326:2:19;4790:108:18;;;23308:21:19;23365:2;23345:18;;;23338:30;23404:34;23384:18;;;23377:62;-1:-1:-1;;;23455:18:19;;;23448:50;23515:19;;4790:108:18;23124:416:19;4790:108:18;4942:20;:13;;;4958:4;4942:20;:::i;:::-;4929:9;:33;4908:123;;;;-1:-1:-1;;;4908:123:18;;;;;;;:::i;:::-;5041:15;5051:4;5041:9;:15::i;:::-;5087:4;5079:13;;5066:9;;:26;;;;;;;:::i;1834:283:5:-;1946:7;-1:-1:-1;;;;;1990:19:5;;1969:108;;;;-1:-1:-1;;;1969:108:5;;18483:2:19;1969:108:5;;;18465:21:19;18522:2;18502:18;;;18495:30;18561:34;18541:18;;;18534:62;-1:-1:-1;;;18612:18:19;;;18605:40;18662:19;;1969:108:5;18281:406:19;1969:108:5;-1:-1:-1;;;;;;2094:16:5;;;;;:9;:16;;;;;;;1834:283::o;1620:92:15:-;1211:12;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:15;:7;1060:6;;-1:-1:-1;;;;;1060:6:15;;988:85;1200:7;-1:-1:-1;;;;;1200:23:15;;1192:68;;;;-1:-1:-1;;;1192:68:15;;;;;;;:::i;:::-;1684:21:::1;1702:1;1684:9;:21::i;:::-;1620:92::o:0;9027:110:18:-;1211:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:15;:7;1060:6;;-1:-1:-1;;;;;1060:6:15;;988:85;1200:7;-1:-1:-1;;;;;1200:23:15;;1192:68;;;;-1:-1:-1;;;1192:68:15;;;;;;;:::i;:::-;1060:6;;9082:48:18::1;::::0;-1:-1:-1;;;;;1060:6:15;;;;9108:21:18::1;9082:48:::0;::::1;;;::::0;::::1;::::0;;;9108:21;1060:6:15;9082:48:18;::::1;;;;;;;;;;;;;::::0;::::1;;;;;;9027:110::o:0;2711:102:5:-;2767:13;2799:7;2792:14;;;;;:::i;7783:256:18:-;1211:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:15;:7;1060:6;;-1:-1:-1;;;;;1060:6:15;;988:85;1200:7;-1:-1:-1;;;;;1200:23:15;;1192:68;;;;-1:-1:-1;;;1192:68:15;;;;;;;:::i;:::-;7930:11:18::1;:26:::0;;;;7966:14:::1;:32:::0;8008:10:::1;:24:::0;7783:256::o;7444:95::-;1211:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:15;:7;1060:6;;-1:-1:-1;;;;;1060:6:15;;988:85;1200:7;-1:-1:-1;;;;;1200:23:15;;1192:68;;;;-1:-1:-1;;;1192:68:15;;;;;;;:::i;:::-;7513:19:18;;::::1;::::0;:12:::1;::::0;:19:::1;::::0;::::1;::::0;::::1;:::i;4544:318:5:-:0;4686:12;:10;:12::i;:::-;-1:-1:-1;;;;;4674:24:5;:8;-1:-1:-1;;;;;4674:24:5;;;4666:62;;;;-1:-1:-1;;;4666:62:5;;16068:2:19;4666:62:5;;;16050:21:19;16107:2;16087:18;;;16080:30;16146:27;16126:18;;;16119:55;16191:18;;4666:62:5;15866:349:19;4666:62:5;4784:8;4739:18;:32;4758:12;:10;:12::i;:::-;-1:-1:-1;;;;;4739:32:5;;;;;;;;;;;;;;;;;-1:-1:-1;4739:32:5;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;4739:53:5;;;;;;;;;;;4822:12;:10;:12::i;:::-;-1:-1:-1;;;;;4807:48:5;;4846:8;4807:48;;;;10771:14:19;10764:22;10746:41;;10734:2;10719:18;;10606:187;4807:48:5;;;;;;;;4544:318;;:::o;8292:247:18:-;8410:10;8389:17;8397:8;8389:7;:17::i;:::-;-1:-1:-1;;;;;8389:31:18;;8368:118;;;;-1:-1:-1;;;8368:118:18;;;;;;;:::i;:::-;8516:8;8501:31;8526:5;8501:31;;;;;;:::i;:::-;;;;;;;;8292:247;;:::o;5871:354:5:-;6053:41;6072:12;:10;:12::i;:::-;6086:7;6053:18;:41::i;:::-;6032:137;;;;-1:-1:-1;;;6032:137:5;;;;;;;:::i;:::-;6179:39;6193:4;6199:2;6203:7;6212:5;6179:13;:39::i;:::-;5871:354;;;;:::o;8545:219:18:-;8643:13;8715:12;8729:26;8746:8;8729:16;:26::i;:::-;8698:58;;;;;;;;;:::i;:::-;;;;;;;;;;;;;8672:85;;8545:219;;;:::o;1901:314::-;1211:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:15;:7;1060:6;;-1:-1:-1;;;;;1060:6:15;;988:85;1200:7;-1:-1:-1;;;;;1200:23:15;;1192:68;;;;-1:-1:-1;;;1192:68:15;;;;;;;:::i;:::-;1981:9:18::1;1976:192;2000:11;:18;1996:1;:22;1976:192;;;2039:18;2060:17;:15;:17::i;:::-;2039:38;;2091:33;2097:11;2109:1;2097:14;;;;;;;;:::i;:::-;;;;;;;2113:10;2091:5;:33::i;:::-;2138:19;:17;:19::i;:::-;-1:-1:-1::0;2020:3:18;::::1;::::0;::::1;:::i;:::-;;;;1976:192;;;;2190:11;:18;2177:9;;:31;;;;;;;:::i;422:26::-:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;7605:98::-;1211:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:15;:7;1060:6;;-1:-1:-1;;;;;1060:6:15;;988:85;1200:7;-1:-1:-1;;;;;1200:23:15;;1192:68;;;;-1:-1:-1;;;1192:68:15;;;;;;;:::i;:::-;7675:13:18::1;:21:::0;7605:98::o;9232:184::-;1211:12:15;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:15;:7;1060:6;;-1:-1:-1;;;;;1060:6:15;;988:85;1200:7;-1:-1:-1;;;;;1200:23:15;;1192:68;;;;-1:-1:-1;;;1192:68:15;;;;;;;:::i;:::-;9321:9:18::1;9316:94;9340:5;:12;9336:1;:16;9316:94;;;9395:4;9373:9;:19;9383:5;9389:1;9383:8;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;9373:19:18::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;9373:19:18;:26;;-1:-1:-1;;9373:26:18::1;::::0;::::1;;::::0;;;::::1;::::0;;9354:3;::::1;::::0;::::1;:::i;:::-;;;;9316:94;;1861:223:15::0;1211:12;:10;:12::i;:::-;-1:-1:-1;;;;;1200:23:15;:7;1060:6;;-1:-1:-1;;;;;1060:6:15;;988:85;1200:7;-1:-1:-1;;;;;1200:23:15;;1192:68;;;;-1:-1:-1;;;1192:68:15;;;;;;;:::i;:::-;-1:-1:-1;;;;;1962:22:15;::::1;1941:107;;;::::0;-1:-1:-1;;;1941:107:15;;14134:2:19;1941:107:15::1;::::0;::::1;14116:21:19::0;14173:2;14153:18;;;14146:30;14212:34;14192:18;;;14185:62;-1:-1:-1;;;14263:18:19;;;14256:36;14309:19;;1941:107:15::1;13932:402:19::0;1941:107:15::1;2058:19;2068:8;2058:9;:19::i;3151:773:18:-:0;3249:10;;3230:15;:29;;3209:114;;;;-1:-1:-1;;;3209:114:18;;;;;;;:::i;:::-;3402:10;3394:19;;;;:7;:19;;;;;;;;;3362:17;:29;;;;;;;3418:1;;3394:19;;;;;3355:36;;3362:29;3355:4;:36;:::i;:::-;:58;;;;:::i;:::-;3354:65;;;;3333:173;;;;-1:-1:-1;;;3333:173:18;;19304:2:19;3333:173:18;;;19286:21:19;19343:2;19323:18;;;19316:30;19382:34;19362:18;;;19355:62;19453:31;19433:18;;;19426:59;19502:19;;3333:173:18;19102:425:19;3333:173:18;3593:3;3579:11;;3566:10;;:24;;;;:::i;:::-;:30;;;;:::i;:::-;3557:4;3549:13;;3537:9;;:25;;;;:::i;:::-;:59;;3516:152;;;;-1:-1:-1;;;3516:152:18;;;;;;;:::i;:::-;3712:20;:13;;;3728:4;3712:20;:::i;:::-;3699:9;:33;3678:123;;;;-1:-1:-1;;;3678:123:18;;;;;;;:::i;:::-;3861:10;3843:29;;;;:17;:29;;;;;;:36;;3875:4;;3843:29;;:36;:::i;:::-;3829:10;3811:29;;;;:17;:29;;;;;:68;;-1:-1:-1;;3811:68:18;;;;;;;;3889:11;:28;;3904:13;;;;3889:11;;3811:29;3889:28;;3904:13;;3889:28;:::i;8045:241::-;8162:10;8141:17;8149:8;8141:7;:17::i;:::-;-1:-1:-1;;;;;8141:31:18;;8120:118;;;;-1:-1:-1;;;8120:118:18;;;;;;;:::i;:::-;8263:8;8253:26;8273:5;8253:26;;;;;;:::i;95:603:1:-;139:22;177:10;199:4;177:27;173:496;;;220:18;241:8;;220:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;279:8:1;486:17;480:24;-1:-1:-1;;;;;455:131:1;;-1:-1:-1;173:496:1;;-1:-1:-1;173:496:1;;-1:-1:-1;647:10:1;173:496;95:603;:::o;1431:344:5:-;1573:4;-1:-1:-1;;;;;;1612:40:5;;-1:-1:-1;;;1612:40:5;;:104;;-1:-1:-1;;;;;;;1668:48:5;;-1:-1:-1;;;1668:48:5;1612:104;:156;;;-1:-1:-1;;;;;;;;;;915:40:4;;;1732:36:5;763:199:4;8903:118:18;8957:14;8990:24;:22;:24::i;:::-;8983:31;;8903:118;:::o;11710:171:5:-;11784:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11784:29:5;-1:-1:-1;;;;;11784:29:5;;;;;;;;:24;;11837:23;11784:24;11837:14;:23::i;:::-;-1:-1:-1;;;;;11828:46:5;;;;;;;;;;;11710:171;;:::o;2602:470:14:-;2774:4;-1:-1:-1;;;;;2798:20:14;;2790:70;;;;-1:-1:-1;;;2790:70:14;;17652:2:19;2790:70:14;;;17634:21:19;17691:2;17671:18;;;17664:30;17730:34;17710:18;;;17703:62;-1:-1:-1;;;17781:18:19;;;17774:35;17826:19;;2790:70:14;17450:401:19;2790:70:14;2911:154;2938:47;2957:27;2977:6;2957:19;:27::i;:::-;2938:18;:47::i;:::-;2911:154;;;;;;;;;;;;11629:25:19;;;;11702:4;11690:17;;11670:18;;;11663:45;11724:18;;;11717:34;;;11767:18;;;11760:34;;;11601:19;;2911:154:14;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2889:176:14;:6;-1:-1:-1;;;;;2889:176:14;;2870:195;;2602:470;;;;;;;:::o;2812:96:16:-;2870:7;2896:5;2900:1;2896;:5;:::i;:::-;2889:12;2812:96;-1:-1:-1;;;2812:96:16:o;8014:438:5:-;8139:4;7819:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7819:16:5;8159:107;;;;-1:-1:-1;;;8159:107:5;;17239:2:19;8159:107:5;;;17221:21:19;17278:2;17258:18;;;17251:30;17317:34;17297:18;;;17290:62;-1:-1:-1;;;17368:18:19;;;17361:42;17420:19;;8159:107:5;17037:408:19;8159:107:5;8276:13;8292:23;8307:7;8292:14;:23::i;:::-;8276:39;;8344:5;-1:-1:-1;;;;;8333:16:5;:7;-1:-1:-1;;;;;8333:16:5;;:63;;;;8389:7;-1:-1:-1;;;;;8365:31:5;:20;8377:7;8365:11;:20::i;:::-;-1:-1:-1;;;;;8365:31:5;;8333:63;:111;;;-1:-1:-1;;;;;;5092:25:5;;;5065:4;5092:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;8412:32;8325:120;8014:438;-1:-1:-1;;;;8014:438:5:o;11005:594::-;11172:4;-1:-1:-1;;;;;11145:31:5;:23;11160:7;11145:14;:23::i;:::-;-1:-1:-1;;;;;11145:31:5;;11124:119;;;;-1:-1:-1;;;11124:119:5;;21284:2:19;11124:119:5;;;21266:21:19;21323:2;21303:18;;;21296:30;21362:34;21342:18;;;21335:62;-1:-1:-1;;;21413:18:19;;;21406:39;21462:19;;11124:119:5;21082:405:19;11124:119:5;-1:-1:-1;;;;;11261:16:5;;11253:65;;;;-1:-1:-1;;;11253:65:5;;15663:2:19;11253:65:5;;;15645:21:19;15702:2;15682:18;;;15675:30;15741:34;15721:18;;;15714:62;-1:-1:-1;;;15792:18:19;;;15785:34;15836:19;;11253:65:5;15461:400:19;11253:65:5;11329:39;11350:4;11356:2;11360:7;11329:20;:39::i;:::-;11430:29;11447:1;11451:7;11430:8;:29::i;:::-;-1:-1:-1;;;;;11470:15:5;;;;;;:9;:15;;;;;:20;;11489:1;;11470:15;:20;;11489:1;;11470:20;:::i;:::-;;;;-1:-1:-1;;;;;;;11500:13:5;;;;;;:9;:13;;;;;:18;;11517:1;;11500:13;:18;;11517:1;;11500:18;:::i;:::-;;;;-1:-1:-1;;11528:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;11528:21:5;-1:-1:-1;;;;;11528:21:5;;;;;;;;;11565:27;;11528:16;;11565:27;;;;;;;11005:594;;;:::o;5389:1158:18:-;5443:7;5438:1103;5460:4;5456:8;;:1;:8;;;5438:1103;;;5485:18;5506:17;:15;:17::i;:::-;5485:38;;5537:29;5543:10;5555;5537:5;:29::i;:::-;5580:19;:17;:19::i;:::-;5617:16;5630:3;5617:10;:16;:::i;:::-;5613:301;;5658:14;5686:3;5675:8;6976:151;;;7004:15;6976:151;;;;24794:25:19;;;;7037:16:18;24835:18:19;;;24828:34;7071:14:18;24916:18:19;;;24909:43;7103:10:18;24968:18:19;;;;24961:43;;;;6976:151:18;;;;;;;;;;24766:19:19;;;;6976:151:18;;;6953:184;;;;;;6873:307;5675:8;:14;;;;:::i;:::-;5658:31;-1:-1:-1;5707:14:18;5724:19;5658:31;5724:10;:19;:::i;:::-;5707:36;;5761:16;5780:15;5788:6;5780:7;:15::i;:::-;5813:32;;5761:34;;-1:-1:-1;;;;;;5813:26:18;;;:32;;5840:4;;5813:32;;;;5840:4;5813:26;:32;;;;;;;;;;;;;;;;;;;;-1:-1:-1;5868:31:18;;-1:-1:-1;;;;;5868:31:18;;;5882:6;;5868:31;;;;;5640:274;;;5613:301;5931:17;5944:4;5931:10;:17;:::i;:::-;:22;;:50;;;5971:10;;5957;:24;5931:50;5927:604;;;6001:17;6032:3;6021:8;6976:151;;;7004:15;6976:151;;;;24794:25:19;;;;7037:16:18;24835:18:19;;;24828:34;7071:14:18;24916:18:19;;;24909:43;7103:10:18;24968:18:19;;;;24961:43;;;;6976:151:18;;;;;;;;;;24766:19:19;;;;6976:151:18;;;6953:184;;;;;;6873:307;6021:8;:14;;;;:::i;:::-;6001:34;-1:-1:-1;6053:18:18;6141:37;6174:3;6149:22;6001:34;6149:10;:22;:::i;:::-;:28;;;;:::i;6141:37::-;6204;6237:3;6212:22;6225:9;6212:10;:22;:::i;6204:37::-;6267;6300:3;6275:22;6288:9;6275:10;:22;:::i;6267:37::-;6105:221;;;-1:-1:-1;;;;;9971:15:19;;;6105:221:18;;;9953:34:19;10023:15;;;10003:18;;;9996:43;10075:15;;;10055:18;;;10048:43;9888:18;;6105:221:18;;;-1:-1:-1;;6105:221:18;;;;;;;;;6074:270;;6105:221;6074:270;;;;;-1:-1:-1;6362:20:18;6419:26;6441:4;6074:270;6419:26;:::i;:::-;6385:61;;:10;:61;:::i;:::-;6362:84;;6494:21;6502:12;6494:7;:21::i;:::-;-1:-1:-1;;;;;6469:47:18;6480:12;6469:47;;;;;;;;;;5983:548;;;5927:604;-1:-1:-1;5466:3:18;;;;:::i;:::-;;;;5438:1103;;2090:169:15;2164:6;;;-1:-1:-1;;;;;2180:17:15;;;-1:-1:-1;;;;;;2180:17:15;;;;;;;2212:40;;2164:6;;;2180:17;2164:6;;2212:40;;2145:16;;2212:40;2135:124;2090:169;:::o;7087:341:5:-;7238:28;7248:4;7254:2;7258:7;7238:9;:28::i;:::-;7297:48;7320:4;7326:2;7330:7;7339:5;7297:22;:48::i;:::-;7276:145;;;;-1:-1:-1;;;7276:145:5;;;;;;;:::i;275:703:17:-;331:13;548:10;544:51;;-1:-1:-1;;574:10:17;;;;;;;;;;;;-1:-1:-1;;;574:10:17;;;;;275:703::o;544:51::-;619:5;604:12;658:75;665:9;;658:75;;690:8;;;;:::i;:::-;;-1:-1:-1;712:10:17;;-1:-1:-1;720:2:17;712:10;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:17:17;;742:39;;791:150;798:10;;791:150;;824:11;834:1;824:11;;:::i;:::-;;-1:-1:-1;892:10:17;900:2;892:5;:10;:::i;:::-;879:24;;:2;:24;:::i;:::-;866:39;;849:6;856;849:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;849:56:17;;;;;;;;-1:-1:-1;919:11:17;928:2;919:11;;:::i;:::-;;;791:150;;6689:104:18;6764:15;;6738:7;;6764:22;;6784:1;6764:19;:22::i;9744:372:5:-;-1:-1:-1;;;;;9823:16:5;;9815:61;;;;-1:-1:-1;;;9815:61:5;;19734:2:19;9815:61:5;;;19716:21:19;;;19753:18;;;19746:30;19812:34;19792:18;;;19785:62;19864:18;;9815:61:5;19532:356:19;9815:61:5;7796:4;7819:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7819:16:5;:30;9886:58;;;;-1:-1:-1;;;9886:58:5;;14898:2:19;9886:58:5;;;14880:21:19;14937:2;14917:18;;;14910:30;14976;14956:18;;;14949:58;15024:18;;9886:58:5;14696:352:19;9886:58:5;9955:45;9984:1;9988:2;9992:7;9955:20;:45::i;:::-;-1:-1:-1;;;;;10011:13:5;;;;;;:9;:13;;;;;:18;;10028:1;;10011:13;:18;;10028:1;;10011:18;:::i;:::-;;;;-1:-1:-1;;10039:16:5;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10039:21:5;-1:-1:-1;;;;;10039:21:5;;;;;;;;10076:33;;10039:16;;;10076:33;;10039:16;;10076:33;9744:372;;:::o;7254:118:18:-;7327:10;;7309:15;;:28;7301:37;;;;;;7348:15;:17;;;:15;:17;;;:::i;:::-;;;;;;7254:118::o;2089:396:14:-;2196:7;312:106;;;;;;;;;;;;;;;;;289:139;;;;;;;2344:12;;2378:11;;;;2421:24;;;;;2411:35;;;;;;2265:199;;;;;11211:25:19;;;11267:2;11252:18;;11245:34;;;;-1:-1:-1;;;;;11315:32:19;11310:2;11295:18;;11288:60;11379:2;11364:18;;11357:34;11198:3;11183:19;;10980:417;2265:199:14;;;;;;;;;;;;;2238:240;;;;;;2219:259;;2089:396;;;:::o;1874:249:3:-;1970:7;2068:20;1331:15;;;1254:99;2068:20;2039:63;;-1:-1:-1;;;2039:63:3;;;8919:27:19;8962:11;;;8955:27;;;;8998:12;;;8991:28;;;9035:12;;2039:63:3;8661:392:19;2767:572:6;-1:-1:-1;;;;;2966:18:6;;2962:183;;3000:40;3032:7;4148:10;:17;;4121:24;;;;:15;:24;;;;;:44;;;4175:24;;;;;;;;;;;;4045:161;3000:40;2962:183;;;3069:2;-1:-1:-1;;;;;3061:10:6;:4;-1:-1:-1;;;;;3061:10:6;;3057:88;;3087:47;3120:4;3126:7;3087:32;:47::i;:::-;-1:-1:-1;;;;;3158:16:6;;3154:179;;3190:45;3227:7;3190:36;:45::i;3154:179::-;3262:4;-1:-1:-1;;;;;3256:10:6;:2;-1:-1:-1;;;;;3256:10:6;;3252:81;;3282:40;3310:2;3314:7;3282:27;:40::i;12434:950:5:-;12584:4;-1:-1:-1;;;;;12604:13:5;;1034:20:0;1080:8;12600:778:5;;12671:2;-1:-1:-1;;;;;12655:36:5;;12713:12;:10;:12::i;:::-;12747:4;12773:7;12802:5;12655:170;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12655:170:5;;;;;;;;-1:-1:-1;;12655:170:5;;;;;;;;;;;;:::i;:::-;;;12635:691;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13004:13:5;;13000:312;;13046:106;;-1:-1:-1;;;13046:106:5;;;;;;;:::i;13000:312::-;13264:6;13258:13;13249:6;13245:2;13241:15;13234:38;12635:691;-1:-1:-1;;;;;;12887:51:5;-1:-1:-1;;;12887:51:5;;-1:-1:-1;12880:58:5;;12600:778;-1:-1:-1;13363:4:5;12434:950;;;;;;:::o;4823:982:6:-;5097:22;5147:1;5122:22;5139:4;5122:16;:22::i;:::-;:26;;;;:::i;:::-;5158:18;5179:26;;;:17;:26;;;;;;5097:51;;-1:-1:-1;5309:28:6;;;5305:323;;-1:-1:-1;;;;;5375:18:6;;5353:19;5375:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5424:30;;;;;;:44;;;5540:30;;:17;:30;;;;;:43;;;5305:323;-1:-1:-1;5721:26:6;;;;:17;:26;;;;;;;;5714:33;;;-1:-1:-1;;;;;5764:18:6;;;;;:12;:18;;;;;:34;;;;;;;5757:41;4823:982::o;6093:1061::-;6367:10;:17;6342:22;;6367:21;;6387:1;;6367:21;:::i;:::-;6398:18;6419:24;;;:15;:24;;;;;;6787:10;:26;;6342:46;;-1:-1:-1;6419:24:6;;6342:46;;6787:26;;;;;;:::i;:::-;;;;;;;;;6765:48;;6849:11;6824:10;6835;6824:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6928:28;;;:15;:28;;;;;;;:41;;;7097:24;;;;;7090:31;7131:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;6164:990;;;6093:1061;:::o;3633:217::-;3717:14;3734:20;3751:2;3734:16;:20::i;:::-;-1:-1:-1;;;;;3764:16:6;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3808:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3633:217:6:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:173:19;82:20;;-1:-1:-1;;;;;131:31:19;;121:42;;111:70;;177:1;174;167:12;111:70;14:173;;;:::o;192:530::-;234:5;287:3;280:4;272:6;268:17;264:27;254:55;;305:1;302;295:12;254:55;341:6;328:20;367:18;363:2;360:26;357:52;;;389:18;;:::i;:::-;433:55;476:2;457:13;;-1:-1:-1;;453:27:19;482:4;449:38;433:55;:::i;:::-;513:2;504:7;497:19;559:3;552:4;547:2;539:6;535:15;531:26;528:35;525:55;;;576:1;573;566:12;525:55;641:2;634:4;626:6;622:17;615:4;606:7;602:18;589:55;689:1;664:16;;;682:4;660:27;653:38;;;;668:7;192:530;-1:-1:-1;;;192:530:19:o;727:156::-;793:20;;853:4;842:16;;832:27;;822:55;;873:1;870;863:12;888:186;947:6;1000:2;988:9;979:7;975:23;971:32;968:52;;;1016:1;1013;1006:12;968:52;1039:29;1058:9;1039:29;:::i;1079:260::-;1147:6;1155;1208:2;1196:9;1187:7;1183:23;1179:32;1176:52;;;1224:1;1221;1214:12;1176:52;1247:29;1266:9;1247:29;:::i;:::-;1237:39;;1295:38;1329:2;1318:9;1314:18;1295:38;:::i;:::-;1285:48;;1079:260;;;;;:::o;1344:328::-;1421:6;1429;1437;1490:2;1478:9;1469:7;1465:23;1461:32;1458:52;;;1506:1;1503;1496:12;1458:52;1529:29;1548:9;1529:29;:::i;:::-;1519:39;;1577:38;1611:2;1600:9;1596:18;1577:38;:::i;:::-;1567:48;;1662:2;1651:9;1647:18;1634:32;1624:42;;1344:328;;;;;:::o;1677:537::-;1772:6;1780;1788;1796;1849:3;1837:9;1828:7;1824:23;1820:33;1817:53;;;1866:1;1863;1856:12;1817:53;1889:29;1908:9;1889:29;:::i;:::-;1879:39;;1937:38;1971:2;1960:9;1956:18;1937:38;:::i;:::-;1927:48;;2022:2;2011:9;2007:18;1994:32;1984:42;;2077:2;2066:9;2062:18;2049:32;2104:18;2096:6;2093:30;2090:50;;;2136:1;2133;2126:12;2090:50;2159:49;2200:7;2191:6;2180:9;2176:22;2159:49;:::i;:::-;2149:59;;;1677:537;;;;;;;:::o;2219:347::-;2284:6;2292;2345:2;2333:9;2324:7;2320:23;2316:32;2313:52;;;2361:1;2358;2351:12;2313:52;2384:29;2403:9;2384:29;:::i;:::-;2374:39;;2463:2;2452:9;2448:18;2435:32;2510:5;2503:13;2496:21;2489:5;2486:32;2476:60;;2532:1;2529;2522:12;2476:60;2555:5;2545:15;;;2219:347;;;;;:::o;2571:602::-;2673:6;2681;2689;2697;2705;2758:3;2746:9;2737:7;2733:23;2729:33;2726:53;;;2775:1;2772;2765:12;2726:53;2798:29;2817:9;2798:29;:::i;:::-;2788:39;;2878:2;2867:9;2863:18;2850:32;2905:18;2897:6;2894:30;2891:50;;;2937:1;2934;2927:12;2891:50;2960:49;3001:7;2992:6;2981:9;2977:22;2960:49;:::i;:::-;2950:59;;;3056:2;3045:9;3041:18;3028:32;3018:42;;3107:2;3096:9;3092:18;3079:32;3069:42;;3130:37;3162:3;3151:9;3147:19;3130:37;:::i;:::-;3120:47;;2571:602;;;;;;;;:::o;3178:254::-;3246:6;3254;3307:2;3295:9;3286:7;3282:23;3278:32;3275:52;;;3323:1;3320;3313:12;3275:52;3346:29;3365:9;3346:29;:::i;:::-;3336:39;3422:2;3407:18;;;;3394:32;;-1:-1:-1;;;3178:254:19:o;3437:963::-;3521:6;3552:2;3595;3583:9;3574:7;3570:23;3566:32;3563:52;;;3611:1;3608;3601:12;3563:52;3651:9;3638:23;3680:18;3721:2;3713:6;3710:14;3707:34;;;3737:1;3734;3727:12;3707:34;3775:6;3764:9;3760:22;3750:32;;3820:7;3813:4;3809:2;3805:13;3801:27;3791:55;;3842:1;3839;3832:12;3791:55;3878:2;3865:16;3900:2;3896;3893:10;3890:36;;;3906:18;;:::i;:::-;3952:2;3949:1;3945:10;3935:20;;3975:28;3999:2;3995;3991:11;3975:28;:::i;:::-;4037:15;;;4068:12;;;;4100:11;;;4130;;;4126:20;;4123:33;-1:-1:-1;4120:53:19;;;4169:1;4166;4159:12;4120:53;4191:1;4182:10;;4201:169;4215:2;4212:1;4209:9;4201:169;;;4272:23;4291:3;4272:23;:::i;:::-;4260:36;;4233:1;4226:9;;;;;4316:12;;;;4348;;4201:169;;;-1:-1:-1;4389:5:19;3437:963;-1:-1:-1;;;;;;;;3437:963:19:o;4405:245::-;4463:6;4516:2;4504:9;4495:7;4491:23;4487:32;4484:52;;;4532:1;4529;4522:12;4484:52;4571:9;4558:23;4590:30;4614:5;4590:30;:::i;4655:249::-;4724:6;4777:2;4765:9;4756:7;4752:23;4748:32;4745:52;;;4793:1;4790;4783:12;4745:52;4825:9;4819:16;4844:30;4868:5;4844:30;:::i;4909:321::-;4978:6;5031:2;5019:9;5010:7;5006:23;5002:32;4999:52;;;5047:1;5044;5037:12;4999:52;5087:9;5074:23;5120:18;5112:6;5109:30;5106:50;;;5152:1;5149;5142:12;5106:50;5175:49;5216:7;5207:6;5196:9;5192:22;5175:49;:::i;5235:180::-;5294:6;5347:2;5335:9;5326:7;5322:23;5318:32;5315:52;;;5363:1;5360;5353:12;5315:52;-1:-1:-1;5386:23:19;;5235:180;-1:-1:-1;5235:180:19:o;5420:389::-;5498:6;5506;5559:2;5547:9;5538:7;5534:23;5530:32;5527:52;;;5575:1;5572;5565:12;5527:52;5611:9;5598:23;5588:33;;5672:2;5661:9;5657:18;5644:32;5699:18;5691:6;5688:30;5685:50;;;5731:1;5728;5721:12;5685:50;5754:49;5795:7;5786:6;5775:9;5771:22;5754:49;:::i;:::-;5744:59;;;5420:389;;;;;:::o;5814:316::-;5891:6;5899;5907;5960:2;5948:9;5939:7;5935:23;5931:32;5928:52;;;5976:1;5973;5966:12;5928:52;-1:-1:-1;;5999:23:19;;;6069:2;6054:18;;6041:32;;-1:-1:-1;6120:2:19;6105:18;;;6092:32;;5814:316;-1:-1:-1;5814:316:19:o;6135:182::-;6192:6;6245:2;6233:9;6224:7;6220:23;6216:32;6213:52;;;6261:1;6258;6251:12;6213:52;6284:27;6301:9;6284:27;:::i;6322:268::-;6374:3;6412:5;6406:12;6439:6;6434:3;6427:19;6455:63;6511:6;6504:4;6499:3;6495:14;6488:4;6481:5;6477:16;6455:63;:::i;:::-;6572:2;6551:15;-1:-1:-1;;6547:29:19;6538:39;;;;6579:4;6534:50;;6322:268;-1:-1:-1;;6322:268:19:o;6595:184::-;6636:3;6674:5;6668:12;6689:52;6734:6;6729:3;6722:4;6715:5;6711:16;6689:52;:::i;:::-;6757:16;;;;;6595:184;-1:-1:-1;;6595:184:19:o;6784:274::-;6913:3;6951:6;6945:13;6967:53;7013:6;7008:3;7001:4;6993:6;6989:17;6967:53;:::i;:::-;7036:16;;;;;6784:274;-1:-1:-1;;6784:274:19:o;7063:415::-;7220:3;7258:6;7252:13;7274:53;7320:6;7315:3;7308:4;7300:6;7296:17;7274:53;:::i;:::-;7396:2;7392:15;;;;-1:-1:-1;;7388:53:19;7349:16;;;;7374:68;;;7469:2;7458:14;;7063:415;-1:-1:-1;;7063:415:19:o;7483:1173::-;7659:3;7688:1;7721:6;7715:13;7751:3;7773:1;7801:9;7797:2;7793:18;7783:28;;7861:2;7850:9;7846:18;7883;7873:61;;7927:4;7919:6;7915:17;7905:27;;7873:61;7953:2;8001;7993:6;7990:14;7970:18;7967:38;7964:165;;;-1:-1:-1;;;8028:33:19;;8084:4;8081:1;8074:15;8114:4;8035:3;8102:17;7964:165;8145:18;8172:104;;;;8290:1;8285:320;;;;8138:467;;8172:104;-1:-1:-1;;8205:24:19;;8193:37;;8250:16;;;;-1:-1:-1;8172:104:19;;8285:320;25557:1;25550:14;;;25594:4;25581:18;;8380:1;8394:165;8408:6;8405:1;8402:13;8394:165;;;8486:14;;8473:11;;;8466:35;8529:16;;;;8423:10;;8394:165;;;8398:3;;8588:6;8583:3;8579:16;8572:23;;8138:467;;;;;;;8621:29;8646:3;8638:6;8621:29;:::i;:::-;8614:36;7483:1173;-1:-1:-1;;;;;7483:1173:19:o;9266:442::-;-1:-1:-1;;;;;9523:15:19;;;9505:34;;9575:15;;9570:2;9555:18;;9548:43;9627:2;9622;9607:18;;9600:30;;;9448:4;;9647:55;;9683:18;;9675:6;9647:55;:::i;10102:499::-;-1:-1:-1;;;;;10371:15:19;;;10353:34;;10423:15;;10418:2;10403:18;;10396:43;10470:2;10455:18;;10448:34;;;10518:3;10513:2;10498:18;;10491:31;;;10296:4;;10539:56;;10575:19;;10567:6;10539:56;:::i;:::-;10531:64;10102:499;-1:-1:-1;;;;;;10102:499:19:o;11805:228::-;11952:2;11941:9;11934:21;11915:4;11972:55;12023:2;12012:9;12008:18;12000:6;11972:55;:::i;12273:407::-;12475:2;12457:21;;;12514:2;12494:18;;;12487:30;12553:34;12548:2;12533:18;;12526:62;-1:-1:-1;;;12619:2:19;12604:18;;12597:41;12670:3;12655:19;;12273:407::o;13513:414::-;13715:2;13697:21;;;13754:2;13734:18;;;13727:30;13793:34;13788:2;13773:18;;13766:62;-1:-1:-1;;;13859:2:19;13844:18;;13837:48;13917:3;13902:19;;13513:414::o;16220:404::-;16422:2;16404:21;;;16461:2;16441:18;;;16434:30;16500:34;16495:2;16480:18;;16473:62;-1:-1:-1;;;16566:2:19;16551:18;;16544:38;16614:3;16599:19;;16220:404::o;19893:410::-;20095:2;20077:21;;;20134:2;20114:18;;;20107:30;20173:34;20168:2;20153:18;;20146:62;-1:-1:-1;;;20239:2:19;20224:18;;20217:44;20293:3;20278:19;;19893:410::o;20721:356::-;20923:2;20905:21;;;20942:18;;;20935:30;21001:34;20996:2;20981:18;;20974:62;21068:2;21053:18;;20721:356::o;22706:413::-;22908:2;22890:21;;;22947:2;22927:18;;;22920:30;22986:34;22981:2;22966:18;;22959:62;-1:-1:-1;;;23052:2:19;23037:18;;23030:47;23109:3;23094:19;;22706:413::o;23958:402::-;24160:2;24142:21;;;24199:2;24179:18;;;24172:30;24238:34;24233:2;24218:18;;24211:62;-1:-1:-1;;;24304:2:19;24289:18;;24282:36;24350:3;24335:19;;23958:402::o;25204:275::-;25275:2;25269:9;25340:2;25321:13;;-1:-1:-1;;25317:27:19;25305:40;;25375:18;25360:34;;25396:22;;;25357:62;25354:88;;;25422:18;;:::i;:::-;25458:2;25451:22;25204:275;;-1:-1:-1;25204:275:19:o;25610:128::-;25650:3;25681:1;25677:6;25674:1;25671:13;25668:39;;;25687:18;;:::i;:::-;-1:-1:-1;25723:9:19;;25610:128::o;25743:204::-;25781:3;25817:4;25814:1;25810:12;25849:4;25846:1;25842:12;25884:3;25878:4;25874:14;25869:3;25866:23;25863:49;;;25892:18;;:::i;:::-;25928:13;;25743:204;-1:-1:-1;;;25743:204:19:o;25952:120::-;25992:1;26018;26008:35;;26023:18;;:::i;:::-;-1:-1:-1;26057:9:19;;25952:120::o;26077:168::-;26117:7;26183:1;26179;26175:6;26171:14;26168:1;26165:21;26160:1;26153:9;26146:17;26142:45;26139:71;;;26190:18;;:::i;:::-;-1:-1:-1;26230:9:19;;26077:168::o;26250:125::-;26290:4;26318:1;26315;26312:8;26309:34;;;26323:18;;:::i;:::-;-1:-1:-1;26360:9:19;;26250:125::o;26380:258::-;26452:1;26462:113;26476:6;26473:1;26470:13;26462:113;;;26552:11;;;26546:18;26533:11;;;26526:39;26498:2;26491:10;26462:113;;;26593:6;26590:1;26587:13;26584:48;;;-1:-1:-1;;26628:1:19;26610:16;;26603:27;26380:258::o;26643:380::-;26722:1;26718:12;;;;26765;;;26786:61;;26840:4;26832:6;26828:17;26818:27;;26786:61;26893:2;26885:6;26882:14;26862:18;26859:38;26856:161;;;26939:10;26934:3;26930:20;26927:1;26920:31;26974:4;26971:1;26964:15;27002:4;26999:1;26992:15;26856:161;;26643:380;;;:::o;27028:135::-;27067:3;-1:-1:-1;;27088:17:19;;27085:43;;;27108:18;;:::i;:::-;-1:-1:-1;27155:1:19;27144:13;;27028:135::o;27168:175::-;27205:3;27249:4;27242:5;27238:16;27278:4;27269:7;27266:17;27263:43;;;27286:18;;:::i;:::-;27335:1;27322:15;;27168:175;-1:-1:-1;;27168:175:19:o;27348:112::-;27380:1;27406;27396:35;;27411:18;;:::i;:::-;-1:-1:-1;27445:9:19;;27348:112::o;27465:127::-;27526:10;27521:3;27517:20;27514:1;27507:31;27557:4;27554:1;27547:15;27581:4;27578:1;27571:15;27597:127;27658:10;27653:3;27649:20;27646:1;27639:31;27689:4;27686:1;27679:15;27713:4;27710:1;27703:15;27729:127;27790:10;27785:3;27781:20;27778:1;27771:31;27821:4;27818:1;27811:15;27845:4;27842:1;27835:15;27861:127;27922:10;27917:3;27913:20;27910:1;27903:31;27953:4;27950:1;27943:15;27977:4;27974:1;27967:15;27993:127;28054:10;28049:3;28045:20;28042:1;28035:31;28085:4;28082:1;28075:15;28109:4;28106:1;28099:15;28125:131;-1:-1:-1;;;;;;28199:32:19;;28189:43;;28179:71;;28246:1;28243;28236:12

Swarm Source

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