ETH Price: $3,470.38 (+2.34%)
Gas: 7 Gwei

Token

UNIQLY COLLECTIONS (UNIQ-COL)
 

Overview

Max Total Supply

2,287 UNIQ-COL

Holders

1,253

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
rendertimes.eth
Balance
2 UNIQ-COL
0xC091A0A9E4bb4F620342bdc540b8ea327760b1C5
Loading...
Loading
Loading...
Loading
Loading...
Loading

OVERVIEW

Uniqly Collections is a merge of exclusive Uniqly NFTs created in collaboration with our partners, or as a reward for the community members for various activities. Each Uniqly NFT is redeemable for the physical item with full Proof of Authenticity. Check more: https://www.uniqly.io

# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
UniqCollections

Compiler Version
v0.8.6+commit.11564f7e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license
File 1 of 19 : UniqCollections.sol
// SPDX-License-Identifier: MIT

pragma solidity 0.8.6;

import "./utils/ERC721/ERC721Claimable.sol";
import "./utils/libs/IERC20.sol";

contract UniqCollections is ERC721Claimable {
    // ----- VARIABLES ----- //
    uint256 internal _tokenNum;
    mapping(address => bool) internal _isPrizeCollectedForAddress;
    address internal _vestingAddress;
    address internal _vestingAddress2;
    address internal _tokenAddress;

    // ----- MODIFIERS ----- //
    modifier notZeroAddress(address a) {
        require(a != address(0), "ZERO address can not be used");
        _;
    }

    // ----- EVENTS ----- //
    event MintedFromVesting(address _minter, uint256 _tokenId, uint256 _type);
    event MintedFromVesting2(address _minter, uint256 _tokenId, uint256 _type);

    // ----- CONSTRUCTOR ----- //
    constructor(
        address _proxyRegistryAddress,
        string memory _name,
        string memory _symbol,
        string memory _ttokenUri,
        address _vestingAddr,
        address _vestingAddr2,
        address _tokenAddr,
        address _claimingAddr,
        uint _royaltyFee
    )
        notZeroAddress(_proxyRegistryAddress)
        ERC721Claimable(_name, _symbol, _ttokenUri, _proxyRegistryAddress, _claimingAddr, _royaltyFee)
    {
        _vestingAddress = _vestingAddr;
        _vestingAddress2 = _vestingAddr2;
        _tokenAddress = _tokenAddr;
        _initialMint();
    }

    // ----- VIEWS ----- //
    function isPrizeCollectedForAddress(address _address)
        external
        view
        returns (bool)
    {
        return _isPrizeCollectedForAddress[_address];
    }

    function tokenAddress() external view returns (address) {
        return _tokenAddress;
    }

    function contractURI() public pure returns (string memory) {
        return "https://uniqly.io/api/nft-collections/";
    }

    // ----- PRIVATE METHODS ----- //
    function _initialMint() internal onlyOwner{
        address _addr1 = 0x553b6C7321bE6c7C8C6A9dC68E241F50c2eDec20;
        address _addr2 = 0x3DBE4C57da3919760dAB85Ff484d3a14B604f1F4;
        address _addr3 = 0xDAE6cA75bB2aFD213E5887513D8b1789122EaAea;
        _isPrizeCollectedForAddress[_addr1] = true;
        _safeMint(_addr1, 0);
        emit MintedFromVesting(_addr1, 0, 1);
        _isPrizeCollectedForAddress[_addr2] = true;
        _safeMint(_addr2, 1);
        emit MintedFromVesting(_addr2, 1, 1);
        _isPrizeCollectedForAddress[_addr3] = true;
        _safeMint(_addr3, 2);
        emit MintedFromVesting(_addr3, 2, 1);
        _tokenNum = 3;
    }
    
    // ----- PUBLIC METHODS ----- //
    function mintSelectedIdFor(
        uint256 _id,
        uint256 _price,
        bytes memory _signature,
        address _receiver
    ) external {
        require(verifySignature(_id, _price, _signature), "Signature mismatch");
        require(
            IERC20(_tokenAddress).transferFrom(
                msg.sender,
                address(this),
                _price
            )
        );
        _safeMint(_receiver, _id);
    }

    function mintFromVesting() external {
        require(
            !_isPrizeCollectedForAddress[msg.sender],
            "Prize is already collected"
        );
        uint256 bonus = Vesting(_vestingAddress).bonus(msg.sender);
        uint256 bonus2 = Vesting(_vestingAddress2).bonus(msg.sender);
        require(bonus > 0 || bonus2 > 0, "Bonus not found");
        _isPrizeCollectedForAddress[msg.sender] = true;
        if (bonus > 0) {
            _safeMint(msg.sender, _tokenNum);
            emit MintedFromVesting(msg.sender, _tokenNum, bonus);
            _tokenNum++;
        }
        if (bonus2 > 0) {
            _safeMint(msg.sender, _tokenNum);
            emit MintedFromVesting2(msg.sender, _tokenNum, bonus2);
            _tokenNum++;
        }
    }

    // ----- MESSAGE SIGNATURE ----- //
    /// @dev not test for functions related to signature
    function getMessageHash(uint256 _tokenId, uint256 _price)
        public
        pure
        returns (bytes32)
    {
        return keccak256(abi.encodePacked(_tokenId, _price));
    }

    function getEthSignedMessageHash(bytes32 _messageHash)
        internal
        pure
        returns (bytes32)
    {
        return
            keccak256(
                abi.encodePacked(
                    "\x19Ethereum Signed Message:\n32",
                    _messageHash
                )
            );
    }

    /// @dev not test for functions related to signature
    function verifySignature(
        uint256 _tokenId,
        uint256 _price,
        bytes memory _signature
    ) internal view returns (bool) {
        bytes32 messageHash = getMessageHash(_tokenId, _price);
        bytes32 ethSignedMessageHash = getEthSignedMessageHash(messageHash);
        return recoverSigner(ethSignedMessageHash, _signature) == owner();
    }

    /// @dev not test for functions related to signature
    function recoverSigner(
        bytes32 _ethSignedMessageHash,
        bytes memory _signature
    ) internal pure returns (address) {
        require(_signature.length == 65, "invalid signature length");
        bytes32 r;
        bytes32 s;
        uint8 v;
        assembly {
            r := mload(add(_signature, 32))
            s := mload(add(_signature, 64))
            v := byte(0, mload(add(_signature, 96)))
        }
        return ecrecover(_ethSignedMessageHash, v, r, s);
    }

    // ----- OWNERS METHODS ----- //
    function mintAsOwner(uint256 _tokenNumber, address _receiver)
        external
        onlyOwner
    {
        _safeMint(_receiver, _tokenNumber);
    }

    function editRoyaltyFee(uint256 _newFee) external onlyOwner {
        ROYALTY_FEE = _newFee;
    }

    function editTokenAddress(address _newTokenAddress) external onlyOwner {
        _tokenAddress = _newTokenAddress;
    }

    function batchMintAsOwner(
        uint256 _tokenNumber,
        uint256 _elements,
        address _receiver
    ) external onlyOwner {
        uint256 i = 0;
        for (i = 0; i < _elements; i++) {
            _safeMint(_receiver, _tokenNumber + i);
        }
    }

     function batchMintSelectedIds(
        uint[] memory _ids,
        address[] memory _addresses
    ) external onlyOwner {
        uint len = _ids.length;
        require(len == _addresses.length, "Arrays length");
        uint256 i = 0;
        for (i = 0; i < len; i++) {
            _safeMint(_addresses[i], _ids[i]);
        }
    }

    function editTokenUri(string memory _ttokenUri) external onlyOwner {
        _token_uri = _ttokenUri;
    }

    function recoverERC20(address token) external onlyOwner {
        uint256 val = IERC20(token).balanceOf(address(this));
        require(val > 0, "Nothing to recover");
        // use interface that not return value (USDT case)
        Ierc20(token).transfer(owner(), val);
    }
}

interface Ierc20 {
    function transfer(address, uint256) external;
}

interface Vesting {
    function bonus(address user) external view returns (uint256);
}

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

pragma solidity ^0.8.6;

import "@openzeppelin/contracts/token/ERC721/ERC721.sol";
import "@openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol";
import "@openzeppelin/contracts/access/Ownable.sol";
import "@openzeppelin/contracts/utils/Strings.sol";

import "../common/meta-transactions/ContentMixin.sol";
import "../common/meta-transactions/NativeMetaTransaction.sol";

contract OwnableDelegateProxy {}

contract ProxyRegistry {
    mapping(address => OwnableDelegateProxy) public proxies;
}

abstract contract ERC721Claimable is
    ContextMixin,
    ERC721Enumerable,
    NativeMetaTransaction,
    Ownable
{
    // ----- VARIABLES ----- //
    address proxyRegistryAddress;
    string internal _token_uri;
    address internal _claimingAddress;
    string public METADATA_PROVENANCE_HASH;
    uint256 public ROYALTY_FEE;

    // ----- EVENTS ----- //
    event ReceivedRoyalties(
        address indexed _royaltyRecipient,
        address indexed _buyer,
        uint256 indexed _tokenId,
        address _tokenPaid,
        uint256 _amount
    );

    // ----- CONSTRUCTOR ----- //
    constructor(
        string memory _name,
        string memory _symbol,
        string memory _uri,
        address _proxyRegistryAddress,
        address _claimingContractAddress,
        uint256 _royaltyFee
    ) ERC721(_name, _symbol) {
        proxyRegistryAddress = _proxyRegistryAddress;
        _token_uri = _uri;
        _initializeEIP712(_name);
        _claimingAddress = _claimingContractAddress;
        ROYALTY_FEE = _royaltyFee;
    }

    // ----- VIEWS ----- //
    function baseTokenURI() public view virtual returns (string memory){
        return _token_uri;
    }

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

    function getClaimerAddress() external view returns (address) {
        return _claimingAddress;
    }

    function royaltyInfo(uint256)
        external
        view
        returns (address receiver, uint256 amount)
    {
        return (owner(), ROYALTY_FEE);
    }

    function isApprovedForAll(address owner, address operator)
        public
        view
        override
        returns (bool)
    {
        ProxyRegistry proxyRegistry = ProxyRegistry(proxyRegistryAddress);
        if (address(proxyRegistry.proxies(owner)) == operator) {
            return true;
        }

        return super.isApprovedForAll(owner, operator);
    }

    function _msgSender() internal view override returns (address sender) {
        return ContextMixin.msgSender();
    }

    function tokensOfOwner(address _owner)
        external
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            // Return an empty array
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }

    // ----- PUBLIC METHODS ----- //
    function burn(uint256 _tokenId) external {
        if (msg.sender != _claimingAddress) {
            require(
                _isApprovedOrOwner(msg.sender, _tokenId),
                "Ownership or approval required"
            );
        }
        _burn(_tokenId);
    }

    function receivedRoyalties(
        address,
        address _buyer,
        uint256 _tokenId,
        address _tokenPaid,
        uint256 _amount
    ) external {
        emit ReceivedRoyalties(owner(), _buyer, _tokenId, _tokenPaid, _amount);
    }

    // ----- OWNERS METHODS ----- //
    function editClaimingAdress(address _newAddress) external onlyOwner {
        _claimingAddress = _newAddress;
    }

    function setProvenanceHash(string memory _hash) external onlyOwner {
        METADATA_PROVENANCE_HASH = _hash;
    }
}

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

pragma solidity ^0.8.0;

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 4 of 19 : NativeMetaTransaction.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./EIP712Base.sol";

contract NativeMetaTransaction is EIP712Base {
    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]++;

        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 5 of 19 : EIP712Base.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

    string constant public 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 6 of 19 : Initializable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

contract Initializable {
    bool inited = false;

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

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

pragma solidity ^0.8.0;

/**
 * @dev Interface of the ERC20 standard as defined in the EIP.
 */
interface IERC20 {
    /**
     * @dev Returns the amount of tokens in existence.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns the amount of tokens owned by `account`.
     */
    function balanceOf(address account) external view returns (uint256);

    /**
     * @dev Moves `amount` tokens from the caller's account to `recipient`.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transfer(address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Returns the remaining number of tokens that `spender` will be
     * allowed to spend on behalf of `owner` through {transferFrom}. This is
     * zero by default.
     *
     * This value changes when {approve} or {transferFrom} are called.
     */
    function allowance(address owner, address spender) external view returns (uint256);

    /**
     * @dev Sets `amount` as the allowance of `spender` over the caller's tokens.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * IMPORTANT: Beware that changing an allowance with this method brings the risk
     * that someone may use both the old and the new allowance by unfortunate
     * transaction ordering. One possible solution to mitigate this race
     * condition is to first reduce the spender's allowance to 0 and set the
     * desired value afterwards:
     * https://github.com/ethereum/EIPs/issues/20#issuecomment-263524729
     *
     * Emits an {Approval} event.
     */
    function approve(address spender, uint256 amount) external returns (bool);

    /**
     * @dev Moves `amount` tokens from `sender` to `recipient` using the
     * allowance mechanism. `amount` is then deducted from the caller's
     * allowance.
     *
     * Returns a boolean value indicating whether the operation succeeded.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(address sender, address recipient, uint256 amount) external returns (bool);

    /**
     * @dev Emitted when `value` tokens are moved from one account (`from`) to
     * another (`to`).
     *
     * Note that `value` may be zero.
     */
    event Transfer(address indexed from, address indexed to, uint256 value);

    /**
     * @dev Emitted when the allowance of a `spender` for an `owner` is set by
     * a call to {approve}. `value` is the new allowance.
     */
    event Approval(address indexed owner, address indexed spender, uint256 value);
}

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

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./extensions/IERC721Metadata.sol";
import "../../utils/Address.sol";
import "../../utils/Context.sol";
import "../../utils/Strings.sol";
import "../../utils/introspection/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(to).onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

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

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

pragma solidity ^0.8.0;

import "../../utils/introspection/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 : IERC165.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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

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

pragma solidity ^0.8.0;

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 13 of 19 : Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

pragma solidity ^0.8.0;

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

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

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

pragma solidity ^0.8.0;

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

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

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

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

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

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

pragma solidity ^0.8.0;

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 17 of 19 : ERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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 18 of 19 : IERC721Enumerable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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 19 of 19 : Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "../utils/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);
    }
}

Settings
{
  "metadata": {
    "useLiteralContent": true
  },
  "optimizer": {
    "enabled": true,
    "runs": 200
  },
  "outputSelection": {
    "*": {
      "*": [
        "evm.bytecode",
        "evm.deployedBytecode",
        "abi"
      ]
    }
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_proxyRegistryAddress","type":"address"},{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"},{"internalType":"string","name":"_ttokenUri","type":"string"},{"internalType":"address","name":"_vestingAddr","type":"address"},{"internalType":"address","name":"_vestingAddr2","type":"address"},{"internalType":"address","name":"_tokenAddr","type":"address"},{"internalType":"address","name":"_claimingAddr","type":"address"},{"internalType":"uint256","name":"_royaltyFee","type":"uint256"}],"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":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":false,"internalType":"address","name":"_minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_type","type":"uint256"}],"name":"MintedFromVesting","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"_minter","type":"address"},{"indexed":false,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_type","type":"uint256"}],"name":"MintedFromVesting2","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_royaltyRecipient","type":"address"},{"indexed":true,"internalType":"address","name":"_buyer","type":"address"},{"indexed":true,"internalType":"uint256","name":"_tokenId","type":"uint256"},{"indexed":false,"internalType":"address","name":"_tokenPaid","type":"address"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"ReceivedRoyalties","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ERC712_VERSION","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"METADATA_PROVENANCE_HASH","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ROYALTY_FEE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseTokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenNumber","type":"uint256"},{"internalType":"uint256","name":"_elements","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"batchMintAsOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"batchMintSelectedIds","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"_newAddress","type":"address"}],"name":"editClaimingAdress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newFee","type":"uint256"}],"name":"editRoyaltyFee","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_newTokenAddress","type":"address"}],"name":"editTokenAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_ttokenUri","type":"string"}],"name":"editTokenUri","outputs":[],"stateMutability":"nonpayable","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":"getClaimerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getDomainSeperator","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"}],"name":"getMessageHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"pure","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":"address","name":"_address","type":"address"}],"name":"isPrizeCollectedForAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenNumber","type":"uint256"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintAsOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"mintFromVesting","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_price","type":"uint256"},{"internalType":"bytes","name":"_signature","type":"bytes"},{"internalType":"address","name":"_receiver","type":"address"}],"name":"mintSelectedIdFor","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"},{"internalType":"address","name":"_buyer","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"address","name":"_tokenPaid","type":"address"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"receivedRoyalties","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"token","type":"address"}],"name":"recoverERC20","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"amount","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":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_hash","type":"string"}],"name":"setProvenanceHash","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":[],"name":"tokenAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"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":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","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"}]

6080604052600a805460ff191690553480156200001b57600080fd5b5060405162004784380380620047848339810160408190526200003e9162000d65565b8787878b8585858581600090805190602001906200005e92919062000c11565b5080516200007490600190602084019062000c11565b505050620000916200008b620001a160201b60201c565b620001bd565b600e80546001600160a01b0319166001600160a01b0385161790558351620000c190600f90602087019062000c11565b50620000cd866200020f565b601080546001600160a01b0319166001600160a01b039384161790556012558d94508416151592506200014a9150505760405162461bcd60e51b815260206004820152601c60248201527f5a45524f20616464726573732063616e206e6f7420626520757365640000000060448201526064015b60405180910390fd5b601580546001600160a01b038089166001600160a01b0319928316179092556016805488841690831617905560178054928716929091169190911790556200019162000270565b5050505050505050505062000fe5565b6000620001b86200048760201b62001e0c1760201c565b905090565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600a5460ff1615620002555760405162461bcd60e51b815260206004820152600e60248201526d185b1c9958591e481a5b9a5d195960921b604482015260640162000141565b6200026081620004e6565b50600a805460ff19166001179055565b6200027a620001a1565b6001600160a01b031662000296600d546001600160a01b031690565b6001600160a01b031614620002ee5760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604482015260640162000141565b73553b6c7321be6c7c8c6a9dc68e241f50c2edec20600081815260146020527f6e16ad35bc82376a0692bf6c9c1e4af5d3c50094a8b77ea5aad82339af9463dc805460ff19166001179055733dbe4c57da3919760dab85ff484d3a14b604f1f49073dae6ca75bb2afd213e5887513d8b1789122eaaea906200037290849062000588565b604080516001600160a01b0385168152600060208201526001818301529051600080516020620047648339815191529181900360600190a16001600160a01b0382166000908152601460205260409020805460ff19166001908117909155620003dd90839062000588565b604080516001600160a01b0384168152600160208201819052818301529051600080516020620047648339815191529181900360600190a16001600160a01b0381166000908152601460205260409020805460ff191660011790556200044581600262000588565b604080516001600160a01b0383168152600260208201526001818301529051600080516020620047648339815191529181900360600190a15050600360135550565b600033301415620004e057600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150620004e39050565b50335b90565b6040518060800160405280604f815260200162004715604f9139805160209182012082519282019290922060408051808201825260018152603160f81b90840152805180840194909452838101919091527fc89efdaa54c0f20c7adf612882df0950f5a951637e0307cdcb4c672f298b8bc660608401523060808401524660a0808501919091528151808503909101815260c090930190528151910120600b55565b620005aa828260405180602001604052806000815250620005ae60201b60201c565b5050565b620005ba838362000626565b620005c960008484846200077c565b620006215760405162461bcd60e51b81526020600482015260326024820152600080516020620046f583398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840162000141565b505050565b6001600160a01b0382166200067e5760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640162000141565b6000818152600260205260409020546001600160a01b031615620006e55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640162000141565b620006f360008383620008ee565b6001600160a01b03821660009081526003602052604081208054600192906200071e90849062000ee8565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006200079d846001600160a01b0316620009ca60201b62001e691760201c565b15620008e2576001600160a01b03841663150b7a02620007bc620001a1565b8786866040518563ffffffff1660e01b8152600401620007e0949392919062000e92565b602060405180830381600087803b158015620007fb57600080fd5b505af19250505080156200082e575060408051601f3d908101601f191682019092526200082b9181019062000e5f565b60015b620008c7573d8080156200085f576040519150601f19603f3d011682016040523d82523d6000602084013e62000864565b606091505b508051620008bf5760405162461bcd60e51b81526020600482015260326024820152600080516020620046f583398151915260448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606482015260840162000141565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050620008e6565b5060015b949350505050565b620009068383836200062160201b62000b2f1760201c565b6001600160a01b03831662000964576200095e81600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6200098a565b816001600160a01b0316836001600160a01b0316146200098a576200098a8382620009d0565b6001600160a01b038216620009a457620006218162000a7d565b826001600160a01b0316826001600160a01b031614620006215762000621828262000b37565b3b151590565b60006001620009ea8462000b8860201b6200118c1760201c565b620009f6919062000f03565b60008381526007602052604090205490915080821462000a4a576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b60085460009062000a919060019062000f03565b6000838152600960205260408120546008805493945090928490811062000abc5762000abc62000fb9565b90600052602060002001549050806008838154811062000ae05762000ae062000fb9565b600091825260208083209091019290925582815260099091526040808220849055858252812055600880548062000b1b5762000b1b62000fa3565b6001900381819060005260206000200160009055905550505050565b600062000b4f8362000b8860201b6200118c1760201c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b60006001600160a01b03821662000bf55760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840162000141565b506001600160a01b031660009081526003602052604090205490565b82805462000c1f9062000f50565b90600052602060002090601f01602090048101928262000c43576000855562000c8e565b82601f1062000c5e57805160ff191683800117855562000c8e565b8280016001018555821562000c8e579182015b8281111562000c8e57825182559160200191906001019062000c71565b5062000c9c92915062000ca0565b5090565b5b8082111562000c9c576000815560010162000ca1565b80516001600160a01b038116811462000ccf57600080fd5b919050565b600082601f83011262000ce657600080fd5b81516001600160401b038082111562000d035762000d0362000fcf565b604051601f8301601f19908116603f0116810190828211818310171562000d2e5762000d2e62000fcf565b8160405283815286602085880101111562000d4857600080fd5b62000d5b84602083016020890162000f1d565b9695505050505050565b60008060008060008060008060006101208a8c03121562000d8557600080fd5b62000d908a62000cb7565b60208b01519099506001600160401b038082111562000dae57600080fd5b62000dbc8d838e0162000cd4565b995060408c015191508082111562000dd357600080fd5b62000de18d838e0162000cd4565b985060608c015191508082111562000df857600080fd5b5062000e078c828d0162000cd4565b96505062000e1860808b0162000cb7565b945062000e2860a08b0162000cb7565b935062000e3860c08b0162000cb7565b925062000e4860e08b0162000cb7565b91506101008a015190509295985092959850929598565b60006020828403121562000e7257600080fd5b81516001600160e01b03198116811462000e8b57600080fd5b9392505050565b600060018060a01b03808716835280861660208401525083604083015260806060830152825180608084015262000ed18160a085016020870162000f1d565b601f01601f19169190910160a00195945050505050565b6000821982111562000efe5762000efe62000f8d565b500190565b60008282101562000f185762000f1862000f8d565b500390565b60005b8381101562000f3a57818101518382015260200162000f20565b8381111562000f4a576000848401525b50505050565b600181811c9082168062000f6557607f821691505b6020821081141562000f8757634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6137008062000ff56000396000f3fe6080604052600436106102885760003560e01c806370a082311161015a578063b3db8147116100c1578063e08da02e1161007a578063e08da02e14610816578063e8a3d48514610836578063e985e9c51461084b578063edc9723c1461086b578063f0c9dc6014610880578063f2fde38b1461089557600080fd5b8063b3db814714610742578063b88d4fde14610762578063c87b56dd14610782578063cef6d368146107a2578063d547cfb7146107e1578063d955ec55146107f657600080fd5b80638da5cb5b116101135780638da5cb5b1461069157806395d89b41146106af5780639d76ea58146106c45780639e8c708e146106e2578063a22cb46514610702578063a56cb03a1461072257600080fd5b806370a08231146105a8578063715018a6146105c8578063734e6308146105dd578063742af72b146106245780638462151c146106445780638589ff451461067157600080fd5b80632d0335ab116101fe57806342966c68116101b757806342966c68146104d15780634f6ccce7146104f15780635d69776b146105115780636352211e1461054a578063652489d41461056a578063661b1d2c1461058a57600080fd5b80632d0335ab146104125780632f745c5914610448578063335477fc146104685780633408e4701461047e57806341f6524b1461049157806342842e0e146104b157600080fd5b80630f7e5970116102505780630f7e5970146103515780630fac06101461037e578063109695231461039e57806318160ddd146103be57806320379ee5146103dd57806323b872dd146103f257600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c5780630c53c51c1461033e575b600080fd5b34801561029957600080fd5b506102ad6102a836600461308e565b6108b5565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d76108e0565b6040516102b991906133a7565b3480156102f057600080fd5b506103046102ff36600461312e565b610972565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c610337366004612f85565b610a0c565b005b6102d761034c366004612f07565b610b34565b34801561035d57600080fd5b506102d7604051806040016040528060018152602001603160f81b81525081565b34801561038a57600080fd5b5061033c610399366004612fb1565b610d06565b3480156103aa57600080fd5b5061033c6103b93660046130e5565b610df0565b3480156103ca57600080fd5b506008545b6040519081526020016102b9565b3480156103e957600080fd5b50600b546103cf565b3480156103fe57600080fd5b5061033c61040d366004612dd1565b610e50565b34801561041e57600080fd5b506103cf61042d366004612d7b565b6001600160a01b03166000908152600c602052604090205490565b34801561045457600080fd5b506103cf610463366004612f85565b610e88565b34801561047457600080fd5b506103cf60125481565b34801561048a57600080fd5b50466103cf565b34801561049d57600080fd5b5061033c6104ac3660046131a7565b610f1e565b3480156104bd57600080fd5b5061033c6104cc366004612dd1565b610f97565b3480156104dd57600080fd5b5061033c6104ec36600461312e565b610fb2565b3480156104fd57600080fd5b506103cf61050c36600461312e565b611026565b34801561051d57600080fd5b506102ad61052c366004612d7b565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561055657600080fd5b5061030461056536600461312e565b6110b9565b34801561057657600080fd5b5061033c6105853660046130e5565b611130565b34801561059657600080fd5b506010546001600160a01b0316610304565b3480156105b457600080fd5b506103cf6105c3366004612d7b565b61118c565b3480156105d457600080fd5b5061033c611213565b3480156105e957600080fd5b506103cf6105f8366004613185565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b34801561063057600080fd5b5061033c61063f36600461312e565b611268565b34801561065057600080fd5b5061066461065f366004612d7b565b6112b6565b6040516102b99190613363565b34801561067d57600080fd5b5061033c61068c366004612e12565b611375565b34801561069d57600080fd5b50600d546001600160a01b0316610304565b3480156106bb57600080fd5b506102d76113e1565b3480156106d057600080fd5b506017546001600160a01b0316610304565b3480156106ee57600080fd5b5061033c6106fd366004612d7b565b6113f0565b34801561070e57600080fd5b5061033c61071d366004612ed9565b61157f565b34801561072e57600080fd5b5061033c61073d366004613160565b611681565b34801561074e57600080fd5b5061033c61075d3660046131e0565b6116d4565b34801561076e57600080fd5b5061033c61077d366004612e6d565b6117bd565b34801561078e57600080fd5b506102d761079d36600461312e565b6117f6565b3480156107ae57600080fd5b506107c26107bd36600461312e565b611830565b604080516001600160a01b0390931683526020830191909152016102b9565b3480156107ed57600080fd5b506102d7611851565b34801561080257600080fd5b5061033c610811366004612d7b565b611860565b34801561082257600080fd5b5061033c610831366004612d7b565b6118cb565b34801561084257600080fd5b506102d7611936565b34801561085757600080fd5b506102ad610866366004612d98565b611956565b34801561087757600080fd5b5061033c611a26565b34801561088c57600080fd5b506102d7611cc7565b3480156108a157600080fd5b5061033c6108b0366004612d7b565b611d55565b60006001600160e01b0319821663780e9d6360e01b14806108da57506108da82611e6f565b92915050565b6060600080546108ef90613556565b80601f016020809104026020016040519081016040528092919081815260200182805461091b90613556565b80156109685780601f1061093d57610100808354040283529160200191610968565b820191906000526020600020905b81548152906001019060200180831161094b57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109f05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a17826110b9565b9050806001600160a01b0316836001600160a01b03161415610a855760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109e7565b806001600160a01b0316610a97611ebf565b6001600160a01b03161480610ab35750610ab381610866611ebf565b610b255760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109e7565b610b2f8383611ece565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610b728782878787611f3c565b610bc85760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084016109e7565b6001600160a01b0387166000908152600c60205260408120805491610bec8361358b565b91905055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610c24939291906132f1565b60405180910390a1600080306001600160a01b0316888a604051602001610c4c92919061328b565b60408051601f1981840301815290829052610c669161326f565b6000604051808303816000865af19150503d8060008114610ca3576040519150601f19603f3d011682016040523d82523d6000602084013e610ca8565b606091505b509150915081610cfa5760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c0000000060448201526064016109e7565b98975050505050505050565b610d0e611ebf565b6001600160a01b0316610d29600d546001600160a01b031690565b6001600160a01b031614610d4f5760405162461bcd60e51b81526004016109e79061340c565b815181518114610d915760405162461bcd60e51b815260206004820152600d60248201526c082e4e4c2f2e640d8cadccee8d609b1b60448201526064016109e7565b60005b81811015610dea57610dd8838281518110610db157610db16135fc565b6020026020010151858381518110610dcb57610dcb6135fc565b602002602001015161202c565b80610de28161358b565b915050610d94565b50505050565b610df8611ebf565b6001600160a01b0316610e13600d546001600160a01b031690565b6001600160a01b031614610e395760405162461bcd60e51b81526004016109e79061340c565b8051610e4c906011906020840190612be8565b5050565b610e61610e5b611ebf565b82612046565b610e7d5760405162461bcd60e51b81526004016109e790613441565b610b2f838383612115565b6000610e938361118c565b8210610ef55760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109e7565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610f26611ebf565b6001600160a01b0316610f41600d546001600160a01b031690565b6001600160a01b031614610f675760405162461bcd60e51b81526004016109e79061340c565b60005b82811015610dea57610f8582610f8083876134e7565b61202c565b80610f8f8161358b565b915050610f6a565b610b2f838383604051806020016040528060008152506117bd565b6010546001600160a01b0316331461101a57610fce3382612046565b61101a5760405162461bcd60e51b815260206004820152601e60248201527f4f776e657273686970206f7220617070726f76616c207265717569726564000060448201526064016109e7565b611023816122c0565b50565b600061103160085490565b82106110945760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109e7565b600882815481106110a7576110a76135fc565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806108da5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109e7565b611138611ebf565b6001600160a01b0316611153600d546001600160a01b031690565b6001600160a01b0316146111795760405162461bcd60e51b81526004016109e79061340c565b8051610e4c90600f906020840190612be8565b60006001600160a01b0382166111f75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109e7565b506001600160a01b031660009081526003602052604090205490565b61121b611ebf565b6001600160a01b0316611236600d546001600160a01b031690565b6001600160a01b03161461125c5760405162461bcd60e51b81526004016109e79061340c565b6112666000612367565b565b611270611ebf565b6001600160a01b031661128b600d546001600160a01b031690565b6001600160a01b0316146112b15760405162461bcd60e51b81526004016109e79061340c565b601255565b606060006112c38361118c565b9050806112e45760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156112ff576112ff613612565b604051908082528060200260200182016040528015611328578160200160208202803683370190505b50905060005b828110156112dc576113408582610e88565b828281518110611352576113526135fc565b6020908102919091010152806113678161358b565b91505061132e565b50919050565b82846001600160a01b0316611392600d546001600160a01b031690565b604080516001600160a01b0387811682526020820187905292909216917f096a55ec842afaa98cb78cb0352921e73c0d1caa9136309fa9c07f13f4a39a60910160405180910390a45050505050565b6060600180546108ef90613556565b6113f8611ebf565b6001600160a01b0316611413600d546001600160a01b031690565b6001600160a01b0316146114395760405162461bcd60e51b81526004016109e79061340c565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561147b57600080fd5b505afa15801561148f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b39190613147565b9050600081116114fa5760405162461bcd60e51b81526020600482015260126024820152712737ba3434b733903a37903932b1b7bb32b960711b60448201526064016109e7565b816001600160a01b031663a9059cbb61151b600d546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b15801561156357600080fd5b505af1158015611577573d6000803e3d6000fd5b505050505050565b611587611ebf565b6001600160a01b0316826001600160a01b031614156115e85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109e7565b80600560006115f5611ebf565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611639611ebf565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611675911515815260200190565b60405180910390a35050565b611689611ebf565b6001600160a01b03166116a4600d546001600160a01b031690565b6001600160a01b0316146116ca5760405162461bcd60e51b81526004016109e79061340c565b610e4c818361202c565b6116df8484846123b9565b6117205760405162461bcd60e51b81526020600482015260126024820152710a6d2cedcc2e8eae4ca40dad2e6dac2e8c6d60731b60448201526064016109e7565b6017546040516323b872dd60e01b8152336004820152306024820152604481018590526001600160a01b03909116906323b872dd90606401602060405180830381600087803b15801561177257600080fd5b505af1158015611786573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117aa9190613071565b6117b357600080fd5b610dea818561202c565b6117ce6117c8611ebf565b83612046565b6117ea5760405162461bcd60e51b81526004016109e790613441565b610dea8484848461242a565b6060611800611851565b6118098361245d565b60405160200161181a9291906132c2565b6040516020818303038152906040529050919050565b600080611845600d546001600160a01b031690565b60125491509150915091565b6060600f80546108ef90613556565b611868611ebf565b6001600160a01b0316611883600d546001600160a01b031690565b6001600160a01b0316146118a95760405162461bcd60e51b81526004016109e79061340c565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6118d3611ebf565b6001600160a01b03166118ee600d546001600160a01b031690565b6001600160a01b0316146119145760405162461bcd60e51b81526004016109e79061340c565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b60606040518060600160405280602681526020016136a560269139905090565b600e5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b1580156119a357600080fd5b505afa1580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db91906130c8565b6001600160a01b031614156119f45760019150506108da565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b3360009081526014602052604090205460ff1615611a865760405162461bcd60e51b815260206004820152601a60248201527f5072697a6520697320616c726561647920636f6c6c656374656400000000000060448201526064016109e7565b60155460405163d8cb4aa360e01b81523360048201526000916001600160a01b03169063d8cb4aa39060240160206040518083038186803b158015611aca57600080fd5b505afa158015611ade573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b029190613147565b60165460405163d8cb4aa360e01b81523360048201529192506000916001600160a01b039091169063d8cb4aa39060240160206040518083038186803b158015611b4b57600080fd5b505afa158015611b5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b839190613147565b90506000821180611b945750600081115b611bd25760405162461bcd60e51b815260206004820152600f60248201526e109bdb9d5cc81b9bdd08199bdd5b99608a1b60448201526064016109e7565b336000908152601460205260409020805460ff191660011790558115611c5857611bfe3360135461202c565b60135460408051338152602081019290925281018390527fb059ce866cc3957914925b1bf6e387eb36399a51b71965e113c910b3cc9d79099060600160405180910390a160138054906000611c528361358b565b91905055505b8015610e4c57611c6a3360135461202c565b60135460408051338152602081019290925281018290527f316127681a8f5dafceea19230674171726a2695117f5e55ff8a73c8e6b9e4c729060600160405180910390a160138054906000611cbe8361358b565b91905055505050565b60118054611cd490613556565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0090613556565b8015611d4d5780601f10611d2257610100808354040283529160200191611d4d565b820191906000526020600020905b815481529060010190602001808311611d3057829003601f168201915b505050505081565b611d5d611ebf565b6001600160a01b0316611d78600d546001600160a01b031690565b6001600160a01b031614611d9e5760405162461bcd60e51b81526004016109e79061340c565b6001600160a01b038116611e035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e7565b61102381612367565b600033301415611e6357600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150611e669050565b50335b90565b3b151590565b60006001600160e01b031982166380ac58cd60e01b1480611ea057506001600160e01b03198216635b5e139f60e01b145b806108da57506301ffc9a760e01b6001600160e01b03198316146108da565b6000611ec9611e0c565b905090565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f03826110b9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616611fa25760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b60648201526084016109e7565b6001611fb5611fb08761255b565b6125d8565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612003573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b610e4c828260405180602001604052806000815250612608565b6000818152600260205260408120546001600160a01b03166120bf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109e7565b60006120ca836110b9565b9050806001600160a01b0316846001600160a01b031614806121055750836001600160a01b03166120fa84610972565b6001600160a01b0316145b80611a1e5750611a1e8185611956565b826001600160a01b0316612128826110b9565b6001600160a01b0316146121905760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109e7565b6001600160a01b0382166121f25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109e7565b6121fd83838361263b565b612208600082611ece565b6001600160a01b0383166000908152600360205260408120805460019290612231908490613513565b90915550506001600160a01b038216600090815260036020526040812080546001929061225f9084906134e7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006122cb826110b9565b90506122d98160008461263b565b6122e4600083611ece565b6001600160a01b038116600090815260036020526040812080546001929061230d908490613513565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160208082018690528183018590528251808303840181526060909201909252805191012060009060006123ef826126f3565b9050612403600d546001600160a01b031690565b6001600160a01b0316612416828661272e565b6001600160a01b0316149695505050505050565b612435848484612115565b612441848484846127f6565b610dea5760405162461bcd60e51b81526004016109e7906133ba565b6060816124815750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124ab57806124958161358b565b91506124a49050600a836134ff565b9150612485565b60008167ffffffffffffffff8111156124c6576124c6613612565b6040519080825280601f01601f1916602001820160405280156124f0576020820181803683370190505b5090505b8415611a1e57612505600183613513565b9150612512600a866135a6565b61251d9060306134e7565b60f81b818381518110612532576125326135fc565b60200101906001600160f81b031916908160001a905350612554600a866134ff565b94506124f4565b600060405180608001604052806043815260200161366260439139805160209182012083518483015160408087015180519086012090516125bb950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006125e3600b5490565b60405161190160f01b60208201526022810191909152604281018390526062016125bb565b612612838361290a565b61261f60008484846127f6565b610b2f5760405162461bcd60e51b81526004016109e7906133ba565b6001600160a01b0383166126965761269181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6126b9565b816001600160a01b0316836001600160a01b0316146126b9576126b98382612a58565b6001600160a01b0382166126d057610b2f81612af5565b826001600160a01b0316826001600160a01b031614610b2f57610b2f8282612ba4565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c016125bb565b600081516041146127815760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016109e7565b602082810151604080850151606080870151835160008082529681018086528a9052951a928501839052840183905260808401819052919260019060a0016020604051602081039080840390855afa1580156127e1573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b60006001600160a01b0384163b156128ff57836001600160a01b031663150b7a0261281f611ebf565b8786866040518563ffffffff1660e01b81526004016128419493929190613326565b602060405180830381600087803b15801561285b57600080fd5b505af192505050801561288b575060408051601f3d908101601f19168201909252612888918101906130ab565b60015b6128e5573d8080156128b9576040519150601f19603f3d011682016040523d82523d6000602084013e6128be565b606091505b5080516128dd5760405162461bcd60e51b81526004016109e7906133ba565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a1e565b506001949350505050565b6001600160a01b0382166129605760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109e7565b6000818152600260205260409020546001600160a01b0316156129c55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109e7565b6129d16000838361263b565b6001600160a01b03821660009081526003602052604081208054600192906129fa9084906134e7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612a658461118c565b612a6f9190613513565b600083815260076020526040902054909150808214612ac2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612b0790600190613513565b60008381526009602052604081205460088054939450909284908110612b2f57612b2f6135fc565b906000526020600020015490508060088381548110612b5057612b506135fc565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612b8857612b886135e6565b6001900381819060005260206000200160009055905550505050565b6000612baf8361118c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612bf490613556565b90600052602060002090601f016020900481019282612c165760008555612c5c565b82601f10612c2f57805160ff1916838001178555612c5c565b82800160010185558215612c5c579182015b82811115612c5c578251825591602001919060010190612c41565b50612c68929150612c6c565b5090565b5b80821115612c685760008155600101612c6d565b600067ffffffffffffffff831115612c9b57612c9b613612565b612cae601f8401601f1916602001613492565b9050828152838383011115612cc257600080fd5b828260208301376000602084830101529392505050565b600082601f830112612cea57600080fd5b81356020612cff612cfa836134c3565b613492565b80838252828201915082860187848660051b8901011115612d1f57600080fd5b60005b85811015612d47578135612d3581613628565b84529284019290840190600101612d22565b5090979650505050505050565b600082601f830112612d6557600080fd5b612d7483833560208501612c81565b9392505050565b600060208284031215612d8d57600080fd5b8135612d7481613628565b60008060408385031215612dab57600080fd5b8235612db681613628565b91506020830135612dc681613628565b809150509250929050565b600080600060608486031215612de657600080fd5b8335612df181613628565b92506020840135612e0181613628565b929592945050506040919091013590565b600080600080600060a08688031215612e2a57600080fd5b8535612e3581613628565b94506020860135612e4581613628565b9350604086013592506060860135612e5c81613628565b949793965091946080013592915050565b60008060008060808587031215612e8357600080fd5b8435612e8e81613628565b93506020850135612e9e81613628565b925060408501359150606085013567ffffffffffffffff811115612ec157600080fd5b612ecd87828801612d54565b91505092959194509250565b60008060408385031215612eec57600080fd5b8235612ef781613628565b91506020830135612dc68161363d565b600080600080600060a08688031215612f1f57600080fd5b8535612f2a81613628565b9450602086013567ffffffffffffffff811115612f4657600080fd5b612f5288828901612d54565b9450506040860135925060608601359150608086013560ff81168114612f7757600080fd5b809150509295509295909350565b60008060408385031215612f9857600080fd5b8235612fa381613628565b946020939093013593505050565b60008060408385031215612fc457600080fd5b823567ffffffffffffffff80821115612fdc57600080fd5b818501915085601f830112612ff057600080fd5b81356020613000612cfa836134c3565b8083825282820191508286018a848660051b890101111561302057600080fd5b600096505b84871015613043578035835260019690960195918301918301613025565b509650508601359250508082111561305a57600080fd5b5061306785828601612cd9565b9150509250929050565b60006020828403121561308357600080fd5b8151612d748161363d565b6000602082840312156130a057600080fd5b8135612d748161364b565b6000602082840312156130bd57600080fd5b8151612d748161364b565b6000602082840312156130da57600080fd5b8151612d7481613628565b6000602082840312156130f757600080fd5b813567ffffffffffffffff81111561310e57600080fd5b8201601f8101841361311f57600080fd5b611a1e84823560208401612c81565b60006020828403121561314057600080fd5b5035919050565b60006020828403121561315957600080fd5b5051919050565b6000806040838503121561317357600080fd5b823591506020830135612dc681613628565b6000806040838503121561319857600080fd5b50508035926020909101359150565b6000806000606084860312156131bc57600080fd5b833592506020840135915060408401356131d581613628565b809150509250925092565b600080600080608085870312156131f657600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561321b57600080fd5b61322787828801612d54565b925050606085013561323881613628565b939692955090935050565b6000815180845261325b81602086016020860161352a565b601f01601f19169290920160200192915050565b6000825161328181846020870161352a565b9190910192915050565b6000835161329d81846020880161352a565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b600083516132d481846020880161352a565b8351908301906132e881836020880161352a565b01949350505050565b6001600160a01b0384811682528316602082015260606040820181905260009061331d90830184613243565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061335990830184613243565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561339b5783518352928401929184019160010161337f565b50909695505050505050565b602081526000612d746020830184613243565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156134bb576134bb613612565b604052919050565b600067ffffffffffffffff8211156134dd576134dd613612565b5060051b60200190565b600082198211156134fa576134fa6135ba565b500190565b60008261350e5761350e6135d0565b500490565b600082821015613525576135256135ba565b500390565b60005b8381101561354557818101518382015260200161352d565b83811115610dea5750506000910152565b600181811c9082168061356a57607f821691505b6020821081141561136f57634e487b7160e01b600052602260045260246000fd5b600060001982141561359f5761359f6135ba565b5060010190565b6000826135b5576135b56135d0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461102357600080fd5b801515811461102357600080fd5b6001600160e01b03198116811461102357600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e61747572652968747470733a2f2f756e69716c792e696f2f6170692f6e66742d636f6c6c656374696f6e732fa26469706673582212207c5374a94fe8617404eb7bb050d912efd1c4fb70844524190f216c4664d049f564736f6c634300080600334552433732313a207472616e7366657220746f206e6f6e204552433732315265454950373132446f6d61696e28737472696e67206e616d652c737472696e672076657273696f6e2c6164647265737320766572696679696e67436f6e74726163742c627974657333322073616c7429b059ce866cc3957914925b1bf6e387eb36399a51b71965e113c910b3cc9d7909000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000923be051f75b4f5494d45e2ce2dda6abb6c1713b000000000000000000000000ff73ec9d9ec853cc27a3bc6c175fd6cc10664f6c0000000000000000000000003758e00b100876c854636ef8db61988931bb802500000000000000000000000024648df47d9015215c8d7851b8e90151a0451d0500000000000000000000000000000000000000000000000000000000000b71b00000000000000000000000000000000000000000000000000000000000000012554e49514c5920434f4c4c454354494f4e5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008554e49512d434f4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f7777772e756e69716c792e696f2f6170692f6d657461646174612f636f6c6c656374696f6e732f0000000000000000000000000000000000

Deployed Bytecode

0x6080604052600436106102885760003560e01c806370a082311161015a578063b3db8147116100c1578063e08da02e1161007a578063e08da02e14610816578063e8a3d48514610836578063e985e9c51461084b578063edc9723c1461086b578063f0c9dc6014610880578063f2fde38b1461089557600080fd5b8063b3db814714610742578063b88d4fde14610762578063c87b56dd14610782578063cef6d368146107a2578063d547cfb7146107e1578063d955ec55146107f657600080fd5b80638da5cb5b116101135780638da5cb5b1461069157806395d89b41146106af5780639d76ea58146106c45780639e8c708e146106e2578063a22cb46514610702578063a56cb03a1461072257600080fd5b806370a08231146105a8578063715018a6146105c8578063734e6308146105dd578063742af72b146106245780638462151c146106445780638589ff451461067157600080fd5b80632d0335ab116101fe57806342966c68116101b757806342966c68146104d15780634f6ccce7146104f15780635d69776b146105115780636352211e1461054a578063652489d41461056a578063661b1d2c1461058a57600080fd5b80632d0335ab146104125780632f745c5914610448578063335477fc146104685780633408e4701461047e57806341f6524b1461049157806342842e0e146104b157600080fd5b80630f7e5970116102505780630f7e5970146103515780630fac06101461037e578063109695231461039e57806318160ddd146103be57806320379ee5146103dd57806323b872dd146103f257600080fd5b806301ffc9a71461028d57806306fdde03146102c2578063081812fc146102e4578063095ea7b31461031c5780630c53c51c1461033e575b600080fd5b34801561029957600080fd5b506102ad6102a836600461308e565b6108b5565b60405190151581526020015b60405180910390f35b3480156102ce57600080fd5b506102d76108e0565b6040516102b991906133a7565b3480156102f057600080fd5b506103046102ff36600461312e565b610972565b6040516001600160a01b0390911681526020016102b9565b34801561032857600080fd5b5061033c610337366004612f85565b610a0c565b005b6102d761034c366004612f07565b610b34565b34801561035d57600080fd5b506102d7604051806040016040528060018152602001603160f81b81525081565b34801561038a57600080fd5b5061033c610399366004612fb1565b610d06565b3480156103aa57600080fd5b5061033c6103b93660046130e5565b610df0565b3480156103ca57600080fd5b506008545b6040519081526020016102b9565b3480156103e957600080fd5b50600b546103cf565b3480156103fe57600080fd5b5061033c61040d366004612dd1565b610e50565b34801561041e57600080fd5b506103cf61042d366004612d7b565b6001600160a01b03166000908152600c602052604090205490565b34801561045457600080fd5b506103cf610463366004612f85565b610e88565b34801561047457600080fd5b506103cf60125481565b34801561048a57600080fd5b50466103cf565b34801561049d57600080fd5b5061033c6104ac3660046131a7565b610f1e565b3480156104bd57600080fd5b5061033c6104cc366004612dd1565b610f97565b3480156104dd57600080fd5b5061033c6104ec36600461312e565b610fb2565b3480156104fd57600080fd5b506103cf61050c36600461312e565b611026565b34801561051d57600080fd5b506102ad61052c366004612d7b565b6001600160a01b031660009081526014602052604090205460ff1690565b34801561055657600080fd5b5061030461056536600461312e565b6110b9565b34801561057657600080fd5b5061033c6105853660046130e5565b611130565b34801561059657600080fd5b506010546001600160a01b0316610304565b3480156105b457600080fd5b506103cf6105c3366004612d7b565b61118c565b3480156105d457600080fd5b5061033c611213565b3480156105e957600080fd5b506103cf6105f8366004613185565b604080516020808201949094528082019290925280518083038201815260609092019052805191012090565b34801561063057600080fd5b5061033c61063f36600461312e565b611268565b34801561065057600080fd5b5061066461065f366004612d7b565b6112b6565b6040516102b99190613363565b34801561067d57600080fd5b5061033c61068c366004612e12565b611375565b34801561069d57600080fd5b50600d546001600160a01b0316610304565b3480156106bb57600080fd5b506102d76113e1565b3480156106d057600080fd5b506017546001600160a01b0316610304565b3480156106ee57600080fd5b5061033c6106fd366004612d7b565b6113f0565b34801561070e57600080fd5b5061033c61071d366004612ed9565b61157f565b34801561072e57600080fd5b5061033c61073d366004613160565b611681565b34801561074e57600080fd5b5061033c61075d3660046131e0565b6116d4565b34801561076e57600080fd5b5061033c61077d366004612e6d565b6117bd565b34801561078e57600080fd5b506102d761079d36600461312e565b6117f6565b3480156107ae57600080fd5b506107c26107bd36600461312e565b611830565b604080516001600160a01b0390931683526020830191909152016102b9565b3480156107ed57600080fd5b506102d7611851565b34801561080257600080fd5b5061033c610811366004612d7b565b611860565b34801561082257600080fd5b5061033c610831366004612d7b565b6118cb565b34801561084257600080fd5b506102d7611936565b34801561085757600080fd5b506102ad610866366004612d98565b611956565b34801561087757600080fd5b5061033c611a26565b34801561088c57600080fd5b506102d7611cc7565b3480156108a157600080fd5b5061033c6108b0366004612d7b565b611d55565b60006001600160e01b0319821663780e9d6360e01b14806108da57506108da82611e6f565b92915050565b6060600080546108ef90613556565b80601f016020809104026020016040519081016040528092919081815260200182805461091b90613556565b80156109685780601f1061093d57610100808354040283529160200191610968565b820191906000526020600020905b81548152906001019060200180831161094b57829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109f05760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b6000610a17826110b9565b9050806001600160a01b0316836001600160a01b03161415610a855760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084016109e7565b806001600160a01b0316610a97611ebf565b6001600160a01b03161480610ab35750610ab381610866611ebf565b610b255760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c000000000000000060648201526084016109e7565b610b2f8383611ece565b505050565b60408051606081810183526001600160a01b0388166000818152600c602090815290859020548452830152918101869052610b728782878787611f3c565b610bc85760405162461bcd60e51b815260206004820152602160248201527f5369676e657220616e64207369676e617475726520646f206e6f74206d6174636044820152600d60fb1b60648201526084016109e7565b6001600160a01b0387166000908152600c60205260408120805491610bec8361358b565b91905055507f5845892132946850460bff5a0083f71031bc5bf9aadcd40f1de79423eac9b10b873388604051610c24939291906132f1565b60405180910390a1600080306001600160a01b0316888a604051602001610c4c92919061328b565b60408051601f1981840301815290829052610c669161326f565b6000604051808303816000865af19150503d8060008114610ca3576040519150601f19603f3d011682016040523d82523d6000602084013e610ca8565b606091505b509150915081610cfa5760405162461bcd60e51b815260206004820152601c60248201527f46756e6374696f6e2063616c6c206e6f74207375636365737366756c0000000060448201526064016109e7565b98975050505050505050565b610d0e611ebf565b6001600160a01b0316610d29600d546001600160a01b031690565b6001600160a01b031614610d4f5760405162461bcd60e51b81526004016109e79061340c565b815181518114610d915760405162461bcd60e51b815260206004820152600d60248201526c082e4e4c2f2e640d8cadccee8d609b1b60448201526064016109e7565b60005b81811015610dea57610dd8838281518110610db157610db16135fc565b6020026020010151858381518110610dcb57610dcb6135fc565b602002602001015161202c565b80610de28161358b565b915050610d94565b50505050565b610df8611ebf565b6001600160a01b0316610e13600d546001600160a01b031690565b6001600160a01b031614610e395760405162461bcd60e51b81526004016109e79061340c565b8051610e4c906011906020840190612be8565b5050565b610e61610e5b611ebf565b82612046565b610e7d5760405162461bcd60e51b81526004016109e790613441565b610b2f838383612115565b6000610e938361118c565b8210610ef55760405162461bcd60e51b815260206004820152602b60248201527f455243373231456e756d657261626c653a206f776e657220696e646578206f7560448201526a74206f6620626f756e647360a81b60648201526084016109e7565b506001600160a01b03919091166000908152600660209081526040808320938352929052205490565b610f26611ebf565b6001600160a01b0316610f41600d546001600160a01b031690565b6001600160a01b031614610f675760405162461bcd60e51b81526004016109e79061340c565b60005b82811015610dea57610f8582610f8083876134e7565b61202c565b80610f8f8161358b565b915050610f6a565b610b2f838383604051806020016040528060008152506117bd565b6010546001600160a01b0316331461101a57610fce3382612046565b61101a5760405162461bcd60e51b815260206004820152601e60248201527f4f776e657273686970206f7220617070726f76616c207265717569726564000060448201526064016109e7565b611023816122c0565b50565b600061103160085490565b82106110945760405162461bcd60e51b815260206004820152602c60248201527f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60448201526b7574206f6620626f756e647360a01b60648201526084016109e7565b600882815481106110a7576110a76135fc565b90600052602060002001549050919050565b6000818152600260205260408120546001600160a01b0316806108da5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b60648201526084016109e7565b611138611ebf565b6001600160a01b0316611153600d546001600160a01b031690565b6001600160a01b0316146111795760405162461bcd60e51b81526004016109e79061340c565b8051610e4c90600f906020840190612be8565b60006001600160a01b0382166111f75760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b60648201526084016109e7565b506001600160a01b031660009081526003602052604090205490565b61121b611ebf565b6001600160a01b0316611236600d546001600160a01b031690565b6001600160a01b03161461125c5760405162461bcd60e51b81526004016109e79061340c565b6112666000612367565b565b611270611ebf565b6001600160a01b031661128b600d546001600160a01b031690565b6001600160a01b0316146112b15760405162461bcd60e51b81526004016109e79061340c565b601255565b606060006112c38361118c565b9050806112e45760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156112ff576112ff613612565b604051908082528060200260200182016040528015611328578160200160208202803683370190505b50905060005b828110156112dc576113408582610e88565b828281518110611352576113526135fc565b6020908102919091010152806113678161358b565b91505061132e565b50919050565b82846001600160a01b0316611392600d546001600160a01b031690565b604080516001600160a01b0387811682526020820187905292909216917f096a55ec842afaa98cb78cb0352921e73c0d1caa9136309fa9c07f13f4a39a60910160405180910390a45050505050565b6060600180546108ef90613556565b6113f8611ebf565b6001600160a01b0316611413600d546001600160a01b031690565b6001600160a01b0316146114395760405162461bcd60e51b81526004016109e79061340c565b6040516370a0823160e01b81523060048201526000906001600160a01b038316906370a082319060240160206040518083038186803b15801561147b57600080fd5b505afa15801561148f573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906114b39190613147565b9050600081116114fa5760405162461bcd60e51b81526020600482015260126024820152712737ba3434b733903a37903932b1b7bb32b960711b60448201526064016109e7565b816001600160a01b031663a9059cbb61151b600d546001600160a01b031690565b6040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260248101849052604401600060405180830381600087803b15801561156357600080fd5b505af1158015611577573d6000803e3d6000fd5b505050505050565b611587611ebf565b6001600160a01b0316826001600160a01b031614156115e85760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c65720000000000000060448201526064016109e7565b80600560006115f5611ebf565b6001600160a01b03908116825260208083019390935260409182016000908120918716808252919093529120805460ff191692151592909217909155611639611ebf565b6001600160a01b03167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611675911515815260200190565b60405180910390a35050565b611689611ebf565b6001600160a01b03166116a4600d546001600160a01b031690565b6001600160a01b0316146116ca5760405162461bcd60e51b81526004016109e79061340c565b610e4c818361202c565b6116df8484846123b9565b6117205760405162461bcd60e51b81526020600482015260126024820152710a6d2cedcc2e8eae4ca40dad2e6dac2e8c6d60731b60448201526064016109e7565b6017546040516323b872dd60e01b8152336004820152306024820152604481018590526001600160a01b03909116906323b872dd90606401602060405180830381600087803b15801561177257600080fd5b505af1158015611786573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906117aa9190613071565b6117b357600080fd5b610dea818561202c565b6117ce6117c8611ebf565b83612046565b6117ea5760405162461bcd60e51b81526004016109e790613441565b610dea8484848461242a565b6060611800611851565b6118098361245d565b60405160200161181a9291906132c2565b6040516020818303038152906040529050919050565b600080611845600d546001600160a01b031690565b60125491509150915091565b6060600f80546108ef90613556565b611868611ebf565b6001600160a01b0316611883600d546001600160a01b031690565b6001600160a01b0316146118a95760405162461bcd60e51b81526004016109e79061340c565b601080546001600160a01b0319166001600160a01b0392909216919091179055565b6118d3611ebf565b6001600160a01b03166118ee600d546001600160a01b031690565b6001600160a01b0316146119145760405162461bcd60e51b81526004016109e79061340c565b601780546001600160a01b0319166001600160a01b0392909216919091179055565b60606040518060600160405280602681526020016136a560269139905090565b600e5460405163c455279160e01b81526001600160a01b03848116600483015260009281169190841690829063c45527919060240160206040518083038186803b1580156119a357600080fd5b505afa1580156119b7573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906119db91906130c8565b6001600160a01b031614156119f45760019150506108da565b6001600160a01b0380851660009081526005602090815260408083209387168352929052205460ff165b949350505050565b3360009081526014602052604090205460ff1615611a865760405162461bcd60e51b815260206004820152601a60248201527f5072697a6520697320616c726561647920636f6c6c656374656400000000000060448201526064016109e7565b60155460405163d8cb4aa360e01b81523360048201526000916001600160a01b03169063d8cb4aa39060240160206040518083038186803b158015611aca57600080fd5b505afa158015611ade573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b029190613147565b60165460405163d8cb4aa360e01b81523360048201529192506000916001600160a01b039091169063d8cb4aa39060240160206040518083038186803b158015611b4b57600080fd5b505afa158015611b5f573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611b839190613147565b90506000821180611b945750600081115b611bd25760405162461bcd60e51b815260206004820152600f60248201526e109bdb9d5cc81b9bdd08199bdd5b99608a1b60448201526064016109e7565b336000908152601460205260409020805460ff191660011790558115611c5857611bfe3360135461202c565b60135460408051338152602081019290925281018390527fb059ce866cc3957914925b1bf6e387eb36399a51b71965e113c910b3cc9d79099060600160405180910390a160138054906000611c528361358b565b91905055505b8015610e4c57611c6a3360135461202c565b60135460408051338152602081019290925281018290527f316127681a8f5dafceea19230674171726a2695117f5e55ff8a73c8e6b9e4c729060600160405180910390a160138054906000611cbe8361358b565b91905055505050565b60118054611cd490613556565b80601f0160208091040260200160405190810160405280929190818152602001828054611d0090613556565b8015611d4d5780601f10611d2257610100808354040283529160200191611d4d565b820191906000526020600020905b815481529060010190602001808311611d3057829003601f168201915b505050505081565b611d5d611ebf565b6001600160a01b0316611d78600d546001600160a01b031690565b6001600160a01b031614611d9e5760405162461bcd60e51b81526004016109e79061340c565b6001600160a01b038116611e035760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016109e7565b61102381612367565b600033301415611e6357600080368080601f0160208091040260200160405190810160405280939291908181526020018383808284376000920191909152505050503601516001600160a01b03169150611e669050565b50335b90565b3b151590565b60006001600160e01b031982166380ac58cd60e01b1480611ea057506001600160e01b03198216635b5e139f60e01b145b806108da57506301ffc9a760e01b6001600160e01b03198316146108da565b6000611ec9611e0c565b905090565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611f03826110b9565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006001600160a01b038616611fa25760405162461bcd60e51b815260206004820152602560248201527f4e61746976654d6574615472616e73616374696f6e3a20494e56414c49445f5360448201526424a3a722a960d91b60648201526084016109e7565b6001611fb5611fb08761255b565b6125d8565b6040805160008152602081018083529290925260ff851690820152606081018690526080810185905260a0016020604051602081039080840390855afa158015612003573d6000803e3d6000fd5b505050602060405103516001600160a01b0316866001600160a01b031614905095945050505050565b610e4c828260405180602001604052806000815250612608565b6000818152600260205260408120546001600160a01b03166120bf5760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084016109e7565b60006120ca836110b9565b9050806001600160a01b0316846001600160a01b031614806121055750836001600160a01b03166120fa84610972565b6001600160a01b0316145b80611a1e5750611a1e8185611956565b826001600160a01b0316612128826110b9565b6001600160a01b0316146121905760405162461bcd60e51b815260206004820152602960248201527f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960448201526839903737ba1037bbb760b91b60648201526084016109e7565b6001600160a01b0382166121f25760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b60648201526084016109e7565b6121fd83838361263b565b612208600082611ece565b6001600160a01b0383166000908152600360205260408120805460019290612231908490613513565b90915550506001600160a01b038216600090815260036020526040812080546001929061225f9084906134e7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006122cb826110b9565b90506122d98160008461263b565b6122e4600083611ece565b6001600160a01b038116600090815260036020526040812080546001929061230d908490613513565b909155505060008281526002602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b600d80546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6040805160208082018690528183018590528251808303840181526060909201909252805191012060009060006123ef826126f3565b9050612403600d546001600160a01b031690565b6001600160a01b0316612416828661272e565b6001600160a01b0316149695505050505050565b612435848484612115565b612441848484846127f6565b610dea5760405162461bcd60e51b81526004016109e7906133ba565b6060816124815750506040805180820190915260018152600360fc1b602082015290565b8160005b81156124ab57806124958161358b565b91506124a49050600a836134ff565b9150612485565b60008167ffffffffffffffff8111156124c6576124c6613612565b6040519080825280601f01601f1916602001820160405280156124f0576020820181803683370190505b5090505b8415611a1e57612505600183613513565b9150612512600a866135a6565b61251d9060306134e7565b60f81b818381518110612532576125326135fc565b60200101906001600160f81b031916908160001a905350612554600a866134ff565b94506124f4565b600060405180608001604052806043815260200161366260439139805160209182012083518483015160408087015180519086012090516125bb950193845260208401929092526001600160a01b03166040830152606082015260800190565b604051602081830303815290604052805190602001209050919050565b60006125e3600b5490565b60405161190160f01b60208201526022810191909152604281018390526062016125bb565b612612838361290a565b61261f60008484846127f6565b610b2f5760405162461bcd60e51b81526004016109e7906133ba565b6001600160a01b0383166126965761269181600880546000838152600960205260408120829055600182018355919091527ff3f7a9fe364faab93b216da50a3214154f22a0a2b415b23a84c8169e8b636ee30155565b6126b9565b816001600160a01b0316836001600160a01b0316146126b9576126b98382612a58565b6001600160a01b0382166126d057610b2f81612af5565b826001600160a01b0316826001600160a01b031614610b2f57610b2f8282612ba4565b6040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c016125bb565b600081516041146127815760405162461bcd60e51b815260206004820152601860248201527f696e76616c6964207369676e6174757265206c656e677468000000000000000060448201526064016109e7565b602082810151604080850151606080870151835160008082529681018086528a9052951a928501839052840183905260808401819052919260019060a0016020604051602081039080840390855afa1580156127e1573d6000803e3d6000fd5b5050604051601f190151979650505050505050565b60006001600160a01b0384163b156128ff57836001600160a01b031663150b7a0261281f611ebf565b8786866040518563ffffffff1660e01b81526004016128419493929190613326565b602060405180830381600087803b15801561285b57600080fd5b505af192505050801561288b575060408051601f3d908101601f19168201909252612888918101906130ab565b60015b6128e5573d8080156128b9576040519150601f19603f3d011682016040523d82523d6000602084013e6128be565b606091505b5080516128dd5760405162461bcd60e51b81526004016109e7906133ba565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611a1e565b506001949350505050565b6001600160a01b0382166129605760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f206164647265737360448201526064016109e7565b6000818152600260205260409020546001600160a01b0316156129c55760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e7465640000000060448201526064016109e7565b6129d16000838361263b565b6001600160a01b03821660009081526003602052604081208054600192906129fa9084906134e7565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b60006001612a658461118c565b612a6f9190613513565b600083815260076020526040902054909150808214612ac2576001600160a01b03841660009081526006602090815260408083208584528252808320548484528184208190558352600790915290208190555b5060009182526007602090815260408084208490556001600160a01b039094168352600681528383209183525290812055565b600854600090612b0790600190613513565b60008381526009602052604081205460088054939450909284908110612b2f57612b2f6135fc565b906000526020600020015490508060088381548110612b5057612b506135fc565b6000918252602080832090910192909255828152600990915260408082208490558582528120556008805480612b8857612b886135e6565b6001900381819060005260206000200160009055905550505050565b6000612baf8361118c565b6001600160a01b039093166000908152600660209081526040808320868452825280832085905593825260079052919091209190915550565b828054612bf490613556565b90600052602060002090601f016020900481019282612c165760008555612c5c565b82601f10612c2f57805160ff1916838001178555612c5c565b82800160010185558215612c5c579182015b82811115612c5c578251825591602001919060010190612c41565b50612c68929150612c6c565b5090565b5b80821115612c685760008155600101612c6d565b600067ffffffffffffffff831115612c9b57612c9b613612565b612cae601f8401601f1916602001613492565b9050828152838383011115612cc257600080fd5b828260208301376000602084830101529392505050565b600082601f830112612cea57600080fd5b81356020612cff612cfa836134c3565b613492565b80838252828201915082860187848660051b8901011115612d1f57600080fd5b60005b85811015612d47578135612d3581613628565b84529284019290840190600101612d22565b5090979650505050505050565b600082601f830112612d6557600080fd5b612d7483833560208501612c81565b9392505050565b600060208284031215612d8d57600080fd5b8135612d7481613628565b60008060408385031215612dab57600080fd5b8235612db681613628565b91506020830135612dc681613628565b809150509250929050565b600080600060608486031215612de657600080fd5b8335612df181613628565b92506020840135612e0181613628565b929592945050506040919091013590565b600080600080600060a08688031215612e2a57600080fd5b8535612e3581613628565b94506020860135612e4581613628565b9350604086013592506060860135612e5c81613628565b949793965091946080013592915050565b60008060008060808587031215612e8357600080fd5b8435612e8e81613628565b93506020850135612e9e81613628565b925060408501359150606085013567ffffffffffffffff811115612ec157600080fd5b612ecd87828801612d54565b91505092959194509250565b60008060408385031215612eec57600080fd5b8235612ef781613628565b91506020830135612dc68161363d565b600080600080600060a08688031215612f1f57600080fd5b8535612f2a81613628565b9450602086013567ffffffffffffffff811115612f4657600080fd5b612f5288828901612d54565b9450506040860135925060608601359150608086013560ff81168114612f7757600080fd5b809150509295509295909350565b60008060408385031215612f9857600080fd5b8235612fa381613628565b946020939093013593505050565b60008060408385031215612fc457600080fd5b823567ffffffffffffffff80821115612fdc57600080fd5b818501915085601f830112612ff057600080fd5b81356020613000612cfa836134c3565b8083825282820191508286018a848660051b890101111561302057600080fd5b600096505b84871015613043578035835260019690960195918301918301613025565b509650508601359250508082111561305a57600080fd5b5061306785828601612cd9565b9150509250929050565b60006020828403121561308357600080fd5b8151612d748161363d565b6000602082840312156130a057600080fd5b8135612d748161364b565b6000602082840312156130bd57600080fd5b8151612d748161364b565b6000602082840312156130da57600080fd5b8151612d7481613628565b6000602082840312156130f757600080fd5b813567ffffffffffffffff81111561310e57600080fd5b8201601f8101841361311f57600080fd5b611a1e84823560208401612c81565b60006020828403121561314057600080fd5b5035919050565b60006020828403121561315957600080fd5b5051919050565b6000806040838503121561317357600080fd5b823591506020830135612dc681613628565b6000806040838503121561319857600080fd5b50508035926020909101359150565b6000806000606084860312156131bc57600080fd5b833592506020840135915060408401356131d581613628565b809150509250925092565b600080600080608085870312156131f657600080fd5b8435935060208501359250604085013567ffffffffffffffff81111561321b57600080fd5b61322787828801612d54565b925050606085013561323881613628565b939692955090935050565b6000815180845261325b81602086016020860161352a565b601f01601f19169290920160200192915050565b6000825161328181846020870161352a565b9190910192915050565b6000835161329d81846020880161352a565b60609390931b6bffffffffffffffffffffffff19169190920190815260140192915050565b600083516132d481846020880161352a565b8351908301906132e881836020880161352a565b01949350505050565b6001600160a01b0384811682528316602082015260606040820181905260009061331d90830184613243565b95945050505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061335990830184613243565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b8181101561339b5783518352928401929184019160010161337f565b50909695505050505050565b602081526000612d746020830184613243565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff811182821017156134bb576134bb613612565b604052919050565b600067ffffffffffffffff8211156134dd576134dd613612565b5060051b60200190565b600082198211156134fa576134fa6135ba565b500190565b60008261350e5761350e6135d0565b500490565b600082821015613525576135256135ba565b500390565b60005b8381101561354557818101518382015260200161352d565b83811115610dea5750506000910152565b600181811c9082168061356a57607f821691505b6020821081141561136f57634e487b7160e01b600052602260045260246000fd5b600060001982141561359f5761359f6135ba565b5060010190565b6000826135b5576135b56135d0565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603160045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160a01b038116811461102357600080fd5b801515811461102357600080fd5b6001600160e01b03198116811461102357600080fdfe4d6574615472616e73616374696f6e2875696e74323536206e6f6e63652c616464726573732066726f6d2c62797465732066756e6374696f6e5369676e61747572652968747470733a2f2f756e69716c792e696f2f6170692f6e66742d636f6c6c656374696f6e732fa26469706673582212207c5374a94fe8617404eb7bb050d912efd1c4fb70844524190f216c4664d049f564736f6c63430008060033

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

000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c10000000000000000000000000000000000000000000000000000000000000120000000000000000000000000000000000000000000000000000000000000016000000000000000000000000000000000000000000000000000000000000001a0000000000000000000000000923be051f75b4f5494d45e2ce2dda6abb6c1713b000000000000000000000000ff73ec9d9ec853cc27a3bc6c175fd6cc10664f6c0000000000000000000000003758e00b100876c854636ef8db61988931bb802500000000000000000000000024648df47d9015215c8d7851b8e90151a0451d0500000000000000000000000000000000000000000000000000000000000b71b00000000000000000000000000000000000000000000000000000000000000012554e49514c5920434f4c4c454354494f4e5300000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008554e49512d434f4c000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002f68747470733a2f2f7777772e756e69716c792e696f2f6170692f6d657461646174612f636f6c6c656374696f6e732f0000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _proxyRegistryAddress (address): 0xa5409ec958C83C3f309868babACA7c86DCB077c1
Arg [1] : _name (string): UNIQLY COLLECTIONS
Arg [2] : _symbol (string): UNIQ-COL
Arg [3] : _ttokenUri (string): https://www.uniqly.io/api/metadata/collections/
Arg [4] : _vestingAddr (address): 0x923be051F75b4F5494D45e2Ce2Dda6aBb6C1713B
Arg [5] : _vestingAddr2 (address): 0xfF73ec9D9eC853Cc27A3BC6c175fD6Cc10664f6c
Arg [6] : _tokenAddr (address): 0x3758e00b100876C854636eF8Db61988931BB8025
Arg [7] : _claimingAddr (address): 0x24648df47D9015215C8d7851b8E90151A0451D05
Arg [8] : _royaltyFee (uint256): 750000

-----Encoded View---------------
16 Constructor Arguments found :
Arg [0] : 000000000000000000000000a5409ec958c83c3f309868babaca7c86dcb077c1
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000120
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000160
Arg [3] : 00000000000000000000000000000000000000000000000000000000000001a0
Arg [4] : 000000000000000000000000923be051f75b4f5494d45e2ce2dda6abb6c1713b
Arg [5] : 000000000000000000000000ff73ec9d9ec853cc27a3bc6c175fd6cc10664f6c
Arg [6] : 0000000000000000000000003758e00b100876c854636ef8db61988931bb8025
Arg [7] : 00000000000000000000000024648df47d9015215c8d7851b8e90151a0451d05
Arg [8] : 00000000000000000000000000000000000000000000000000000000000b71b0
Arg [9] : 0000000000000000000000000000000000000000000000000000000000000012
Arg [10] : 554e49514c5920434f4c4c454354494f4e530000000000000000000000000000
Arg [11] : 0000000000000000000000000000000000000000000000000000000000000008
Arg [12] : 554e49512d434f4c000000000000000000000000000000000000000000000000
Arg [13] : 000000000000000000000000000000000000000000000000000000000000002f
Arg [14] : 68747470733a2f2f7777772e756e69716c792e696f2f6170692f6d6574616461
Arg [15] : 74612f636f6c6c656374696f6e732f0000000000000000000000000000000000


Deployed Bytecode Sourcemap

137:6714:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;910:222:11;;;;;;;;;;-1:-1:-1;910:222:11;;;;;:::i;:::-;;:::i;:::-;;;15320:14:19;;15313:22;15295:41;;15283:2;15268:18;910:222:11;;;;;;;;2414:98:8;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;3925:217::-;;;;;;;;;;-1:-1:-1;3925:217:8;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;12536:32:19;;;12518:51;;12506:2;12491:18;3925:217:8;12473:102:19;3463:401:8;;;;;;;;;;-1:-1:-1;3463:401:8;;;;;:::i;:::-;;:::i;:::-;;875:1090:5;;;;;;:::i;:::-;;:::i;288:43:3:-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;288:43:3;;;;;6117:335:0;;;;;;;;;;-1:-1:-1;6117:335:0;;;;;:::i;:::-;;:::i;4051:116:1:-;;;;;;;;;;-1:-1:-1;4051:116:1;;;;;:::i;:::-;;:::i;1535:111:11:-;;;;;;;;;;-1:-1:-1;1622:10:11;:17;1535:111;;;15493:25:19;;;15481:2;15466:18;1535:111:11;15448:76:19;1264:99:3;;;;;;;;;;-1:-1:-1;1341:15:3;;1264:99;;4789:330:8;;;;;;;;;;-1:-1:-1;4789:330:8;;;;;:::i;:::-;;:::i;2373:105:5:-;;;;;;;;;;-1:-1:-1;2373:105:5;;;;;:::i;:::-;-1:-1:-1;;;;;2459:12:5;2426:13;2459:12;;;:6;:12;;;;;;;2373:105;1211:253:11;;;;;;;;;;-1:-1:-1;1211:253:11;;;;;:::i;:::-;;:::i;847:26:1:-;;;;;;;;;;;;;;;;1369:155:3;;;;;;;;;;-1:-1:-1;1480:9:3;1369:155;;5841:269:0;;;;;;;;;;-1:-1:-1;5841:269:0;;;;;:::i;:::-;;:::i;5185:179:8:-;;;;;;;;;;-1:-1:-1;5185:179:8;;;;;:::i;:::-;;:::i;3360:272:1:-;;;;;;;;;;-1:-1:-1;3360:272:1;;;;;:::i;:::-;;:::i;1718:230:11:-;;;;;;;;;;-1:-1:-1;1718:230:11;;;;;:::i;:::-;;:::i;1445:172:0:-;;;;;;;;;;-1:-1:-1;1445:172:0;;;;;:::i;:::-;-1:-1:-1;;;;;1573:37:0;1546:4;1573:37;;;:27;:37;;;;;;;;;1445:172;2117:235:8;;;;;;;;;;-1:-1:-1;2117:235:8;;;;;:::i;:::-;;:::i;6458:107:0:-;;;;;;;;;;-1:-1:-1;6458:107:0;;;;;:::i;:::-;;:::i;1988:101:1:-;;;;;;;;;;-1:-1:-1;2066:16:1;;-1:-1:-1;;;;;2066:16:1;1988:101;;1855:205:8;;;;;;;;;;-1:-1:-1;1855:205:8;;;;;:::i;:::-;;:::i;1605:92:7:-;;;;;;;;;;;;;:::i;3918:185:0:-;;;;;;;;;;-1:-1:-1;3918:185:0;;;;;:::i;:::-;4061:34;;;;;;;12277:19:19;;;;12312:12;;;12305:28;;;;4061:34:0;;;;;;;;;12349:12:19;;;;4061:34:0;;4051:45;;;;;;3918:185;5611:98;;;;;;;;;;-1:-1:-1;5611:98:0;;;;;:::i;:::-;;:::i;2762:555:1:-;;;;;;;;;;-1:-1:-1;2762:555:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;3638:249::-;;;;;;;;;;-1:-1:-1;3638:249:1;;;;;:::i;:::-;;:::i;973:85:7:-;;;;;;;;;;-1:-1:-1;1045:6:7;;-1:-1:-1;;;;;1045:6:7;973:85;;2576:102:8;;;;;;;;;;;;;:::i;1623:93:0:-;;;;;;;;;;-1:-1:-1;1696:13:0;;-1:-1:-1;;;;;1696:13:0;1623:93;;6571:278;;;;;;;;;;-1:-1:-1;6571:278:0;;;;;:::i;:::-;;:::i;4209:290:8:-;;;;;;;;;;-1:-1:-1;4209:290:8;;;;;:::i;:::-;;:::i;5453:152:0:-;;;;;;;;;;-1:-1:-1;5453:152:0;;;;;:::i;:::-;;:::i;2599:442::-;;;;;;;;;;-1:-1:-1;2599:442:0;;;;;:::i;:::-;;:::i;5430:320:8:-;;;;;;;;;;-1:-1:-1;5430:320:8;;;;;:::i;:::-;;:::i;1731:251:1:-;;;;;;;;;;-1:-1:-1;1731:251:1;;;;;:::i;:::-;;:::i;2095:161::-;;;;;;;;;;-1:-1:-1;2095:161:1;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;14081:32:19;;;14063:51;;14145:2;14130:18;;14123:34;;;;14036:18;2095:161:1;14018:145:19;1624:101:1;;;;;;;;;;;;;:::i;3930:115::-;;;;;;;;;;-1:-1:-1;3930:115:1;;;;;:::i;:::-;;:::i;5715:120:0:-;;;;;;;;;;-1:-1:-1;5715:120:0;;;;;:::i;:::-;;:::i;1722:123::-;;;;;;;;;;;;;:::i;2262:370:1:-;;;;;;;;;;-1:-1:-1;2262:370:1;;;;;:::i;:::-;;:::i;3047:768:0:-;;;;;;;;;;;;;:::i;803:38:1:-;;;;;;;;;;;;;:::i;1846:189:7:-;;;;;;;;;;-1:-1:-1;1846:189:7;;;;;:::i;:::-;;:::i;910:222:11:-;1012:4;-1:-1:-1;;;;;;1035:50:11;;-1:-1:-1;;;1035:50:11;;:90;;;1089:36;1113:11;1089:23;:36::i;:::-;1028:97;910:222;-1:-1:-1;;910:222:11:o;2414:98:8:-;2468:13;2500:5;2493:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2414:98;:::o;3925:217::-;4001:7;7310:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7310:16:8;4020:73;;;;-1:-1:-1;;;4020:73:8;;24233:2:19;4020:73:8;;;24215:21:19;24272:2;24252:18;;;24245:30;24311:34;24291:18;;;24284:62;-1:-1:-1;;;24362:18:19;;;24355:42;24414:19;;4020:73:8;;;;;;;;;-1:-1:-1;4111:24:8;;;;:15;:24;;;;;;-1:-1:-1;;;;;4111:24:8;;3925:217::o;3463:401::-;3543:13;3559:23;3574:7;3559:14;:23::i;:::-;3543:39;;3606:5;-1:-1:-1;;;;;3600:11:8;:2;-1:-1:-1;;;;;3600:11:8;;;3592:57;;;;-1:-1:-1;;;3592:57:8;;25819:2:19;3592:57:8;;;25801:21:19;25858:2;25838:18;;;25831:30;25897:34;25877:18;;;25870:62;-1:-1:-1;;;25948:18:19;;;25941:31;25989:19;;3592:57:8;25791:223:19;3592:57:8;3697:5;-1:-1:-1;;;;;3681:21:8;:12;:10;:12::i;:::-;-1:-1:-1;;;;;3681:21:8;;:62;;;;3706:37;3723:5;3730:12;:10;:12::i;3706:37::-;3660:165;;;;-1:-1:-1;;;3660:165:8;;21920:2:19;3660:165:8;;;21902:21:19;21959:2;21939:18;;;21932:30;21998:34;21978:18;;;21971:62;22069:26;22049:18;;;22042:54;22113:19;;3660:165:8;21892:246:19;3660:165:8;3836:21;3845:2;3849:7;3836:8;:21::i;:::-;3533:331;3463:401;;:::o;875:1090:5:-;1126:148;;;1070:12;1126:148;;;;;-1:-1:-1;;;;;1163:19:5;;1094:29;1163:19;;;:6;:19;;;;;;;;;1126:148;;;;;;;;;;;1306:45;1170:11;1126:148;1334:4;1340;1346;1306:6;:45::i;:::-;1285:125;;;;-1:-1:-1;;;1285:125:5;;25417:2:19;1285:125:5;;;25399:21:19;25456:2;25436:18;;;25429:30;25495:34;25475:18;;;25468:62;-1:-1:-1;;;25546:18:19;;;25539:31;25587:19;;1285:125:5;25389:223:19;1285:125:5;-1:-1:-1;;;;;1474:19:5;;;;;;:6;:19;;;;;:21;;;;;;:::i;:::-;;;;;;1511:122;1548:11;1581:10;1606:17;1511:122;;;;;;;;:::i;:::-;;;;;;;;1741:12;1755:23;1790:4;-1:-1:-1;;;;;1782:18:5;1831:17;1850:11;1814:48;;;;;;;;;:::i;:::-;;;;-1:-1:-1;;1814:48:5;;;;;;;;;;1782:90;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1740:132;;;;1890:7;1882:48;;;;-1:-1:-1;;;1882:48:5;;18587:2:19;1882:48:5;;;18569:21:19;18626:2;18606:18;;;18599:30;18665;18645:18;;;18638:58;18713:18;;1882:48:5;18559:178:19;1882:48:5;1948:10;875:1090;-1:-1:-1;;;;;;;;875:1090:5:o;6117:335:0:-;1196:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1185:23:7;:7;1045:6;;-1:-1:-1;;;;;1045:6:7;;973:85;1185:7;-1:-1:-1;;;;;1185:23:7;;1177:68;;;;-1:-1:-1;;;1177:68:7;;;;;;;:::i;:::-;6258:11:0;;6294:17;;6287:24;::::1;6279:50;;;::::0;-1:-1:-1;;;6279:50:0;;21172:2:19;6279:50:0::1;::::0;::::1;21154:21:19::0;21211:2;21191:18;;;21184:30;-1:-1:-1;;;21230:18:19;;;21223:43;21283:18;;6279:50:0::1;21144:163:19::0;6279:50:0::1;6339:9;6362:84;6378:3;6374:1;:7;6362:84;;;6402:33;6412:10;6423:1;6412:13;;;;;;;;:::i;:::-;;;;;;;6427:4;6432:1;6427:7;;;;;;;;:::i;:::-;;;;;;;6402:9;:33::i;:::-;6383:3:::0;::::1;::::0;::::1;:::i;:::-;;;;6362:84;;;6237:215;;6117:335:::0;;:::o;4051:116:1:-;1196:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1185:23:7;:7;1045:6;;-1:-1:-1;;;;;1045:6:7;;973:85;1185:7;-1:-1:-1;;;;;1185:23:7;;1177:68;;;;-1:-1:-1;;;1177:68:7;;;;;;;:::i;:::-;4128:32:1;;::::1;::::0;:24:::1;::::0;:32:::1;::::0;::::1;::::0;::::1;:::i;:::-;;4051:116:::0;:::o;4789:330:8:-;4978:41;4997:12;:10;:12::i;:::-;5011:7;4978:18;:41::i;:::-;4970:103;;;;-1:-1:-1;;;4970:103:8;;;;;;;:::i;:::-;5084:28;5094:4;5100:2;5104:7;5084:9;:28::i;1211:253:11:-;1308:7;1343:23;1360:5;1343:16;:23::i;:::-;1335:5;:31;1327:87;;;;-1:-1:-1;;;1327:87:11;;17349:2:19;1327:87:11;;;17331:21:19;17388:2;17368:18;;;17361:30;17427:34;17407:18;;;17400:62;-1:-1:-1;;;17478:18:19;;;17471:41;17529:19;;1327:87:11;17321:233:19;1327:87:11;-1:-1:-1;;;;;;1431:19:11;;;;;;;;:12;:19;;;;;;;;:26;;;;;;;;;1211:253::o;5841:269:0:-;1196:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1185:23:7;:7;1045:6;;-1:-1:-1;;;;;1045:6:7;;973:85;1185:7;-1:-1:-1;;;;;1185:23:7;;1177:68;;;;-1:-1:-1;;;1177:68:7;;;;;;;:::i;:::-;5986:9:0::1;6009:95;6025:9;6021:1;:13;6009:95;;;6055:38;6065:9:::0;6076:16:::1;6091:1:::0;6076:12;:16:::1;:::i;:::-;6055:9;:38::i;:::-;6036:3:::0;::::1;::::0;::::1;:::i;:::-;;;;6009:95;;5185:179:8::0;5318:39;5335:4;5341:2;5345:7;5318:39;;;;;;;;;;;;:16;:39::i;3360:272:1:-;3429:16;;-1:-1:-1;;;;;3429:16:1;3415:10;:30;3411:190;;3486:40;3505:10;3517:8;3486:18;:40::i;:::-;3461:129;;;;-1:-1:-1;;;3461:129:1;;23166:2:19;3461:129:1;;;23148:21:19;23205:2;23185:18;;;23178:30;23244:32;23224:18;;;23217:60;23294:18;;3461:129:1;23138:180:19;3461:129:1;3610:15;3616:8;3610:5;:15::i;:::-;3360:272;:::o;1718:230:11:-;1793:7;1828:30;1622:10;:17;;1535:111;1828:30;1820:5;:38;1812:95;;;;-1:-1:-1;;;1812:95:11;;26639:2:19;1812:95:11;;;26621:21:19;26678:2;26658:18;;;26651:30;26717:34;26697:18;;;26690:62;-1:-1:-1;;;26768:18:19;;;26761:42;26820:19;;1812:95:11;26611:234:19;1812:95:11;1924:10;1935:5;1924:17;;;;;;;;:::i;:::-;;;;;;;;;1917:24;;1718:230;;;:::o;2117:235:8:-;2189:7;2224:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2224:16:8;2258:19;2250:73;;;;-1:-1:-1;;;2250:73:8;;22756:2:19;2250:73:8;;;22738:21:19;22795:2;22775:18;;;22768:30;22834:34;22814:18;;;22807:62;-1:-1:-1;;;22885:18:19;;;22878:39;22934:19;;2250:73:8;22728:231:19;6458:107:0;1196:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1185:23:7;:7;1045:6;;-1:-1:-1;;;;;1045:6:7;;973:85;1185:7;-1:-1:-1;;;;;1185:23:7;;1177:68;;;;-1:-1:-1;;;1177:68:7;;;;;;;:::i;:::-;6535:23:0;;::::1;::::0;:10:::1;::::0;:23:::1;::::0;::::1;::::0;::::1;:::i;1855:205:8:-:0;1927:7;-1:-1:-1;;;;;1954:19:8;;1946:74;;;;-1:-1:-1;;;1946:74:8;;22345:2:19;1946:74:8;;;22327:21:19;22384:2;22364:18;;;22357:30;22423:34;22403:18;;;22396:62;-1:-1:-1;;;22474:18:19;;;22467:40;22524:19;;1946:74:8;22317:232:19;1946:74:8;-1:-1:-1;;;;;;2037:16:8;;;;;:9;:16;;;;;;;1855:205::o;1605:92:7:-;1196:12;:10;:12::i;:::-;-1:-1:-1;;;;;1185:23:7;:7;1045:6;;-1:-1:-1;;;;;1045:6:7;;973:85;1185:7;-1:-1:-1;;;;;1185:23:7;;1177:68;;;;-1:-1:-1;;;1177:68:7;;;;;;;:::i;:::-;1669:21:::1;1687:1;1669:9;:21::i;:::-;1605:92::o:0;5611:98:0:-;1196:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1185:23:7;:7;1045:6;;-1:-1:-1;;;;;1045:6:7;;973:85;1185:7;-1:-1:-1;;;;;1185:23:7;;1177:68;;;;-1:-1:-1;;;1177:68:7;;;;;;;:::i;:::-;5681:11:0::1;:21:::0;5611:98::o;2762:555:1:-;2848:16;2880:18;2901:17;2911:6;2901:9;:17::i;:::-;2880:38;-1:-1:-1;2932:15:1;2928:383;;3007:16;;;3021:1;3007:16;;;;;;;;;;;-1:-1:-1;3000:23:1;2762:555;-1:-1:-1;;;2762:555:1:o;2928:383::-;3054:23;3094:10;3080:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3080:25:1;;3054:51;;3119:13;3146:128;3170:10;3162:5;:18;3146:128;;;3225:34;3245:6;3253:5;3225:19;:34::i;:::-;3209:6;3216:5;3209:13;;;;;;;;:::i;:::-;;;;;;;;;;:50;3182:7;;;;:::i;:::-;;;;3146:128;;2928:383;2870:447;2762:555;;;:::o;3638:249::-;3850:8;3842:6;-1:-1:-1;;;;;3815:65:1;3833:7;1045:6:7;;-1:-1:-1;;;;;1045:6:7;;973:85;3833:7:1;3815:65;;;-1:-1:-1;;;;;14081:32:19;;;14063:51;;14145:2;14130:18;;14123:34;;;3815:65:1;;;;;;;14036:18:19;3815:65:1;;;;;;;3638:249;;;;;:::o;2576:102:8:-;2632:13;2664:7;2657:14;;;;;:::i;6571:278:0:-;1196:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1185:23:7;:7;1045:6;;-1:-1:-1;;;;;1045:6:7;;973:85;1185:7;-1:-1:-1;;;;;1185:23:7;;1177:68;;;;-1:-1:-1;;;1177:68:7;;;;;;;:::i;:::-;6651:38:0::1;::::0;-1:-1:-1;;;6651:38:0;;6683:4:::1;6651:38;::::0;::::1;12518:51:19::0;6637:11:0::1;::::0;-1:-1:-1;;;;;6651:23:0;::::1;::::0;::::1;::::0;12491:18:19;;6651:38:0::1;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;6637:52;;6713:1;6707:3;:7;6699:38;;;::::0;-1:-1:-1;;;6699:38:0;;17002:2:19;6699:38:0::1;::::0;::::1;16984:21:19::0;17041:2;17021:18;;;17014:30;-1:-1:-1;;;17060:18:19;;;17053:48;17118:18;;6699:38:0::1;16974:168:19::0;6699:38:0::1;6813:5;-1:-1:-1::0;;;;;6806:22:0::1;;6829:7;1045:6:7::0;;-1:-1:-1;;;;;1045:6:7;;973:85;6829:7:0::1;6806:36;::::0;-1:-1:-1;;;;;;6806:36:0::1;::::0;;;;;;-1:-1:-1;;;;;14081:32:19;;;6806:36:0::1;::::0;::::1;14063:51:19::0;14130:18;;;14123:34;;;14036:18;;6806:36:0::1;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;6627:222;6571:278:::0;:::o;4209:290:8:-;4323:12;:10;:12::i;:::-;-1:-1:-1;;;;;4311:24:8;:8;-1:-1:-1;;;;;4311:24:8;;;4303:62;;;;-1:-1:-1;;;4303:62:8;;20405:2:19;4303:62:8;;;20387:21:19;20444:2;20424:18;;;20417:30;20483:27;20463:18;;;20456:55;20528:18;;4303:62:8;20377:175:19;4303:62:8;4421:8;4376:18;:32;4395:12;:10;:12::i;:::-;-1:-1:-1;;;;;4376:32:8;;;;;;;;;;;;;;;;;-1:-1:-1;4376:32:8;;;:42;;;;;;;;;;;;:53;;-1:-1:-1;;4376:53:8;;;;;;;;;;;4459:12;:10;:12::i;:::-;-1:-1:-1;;;;;4444:48:8;;4483:8;4444:48;;;;15320:14:19;15313:22;15295:41;;15283:2;15268:18;;15250:92;4444:48:8;;;;;;;;4209:290;;:::o;5453:152:0:-;1196:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1185:23:7;:7;1045:6;;-1:-1:-1;;;;;1045:6:7;;973:85;1185:7;-1:-1:-1;;;;;1185:23:7;;1177:68;;;;-1:-1:-1;;;1177:68:7;;;;;;;:::i;:::-;5564:34:0::1;5574:9;5585:12;5564:9;:34::i;2599:442::-:0;2764:40;2780:3;2785:6;2793:10;2764:15;:40::i;:::-;2756:71;;;;-1:-1:-1;;;2756:71:0;;23886:2:19;2756:71:0;;;23868:21:19;23925:2;23905:18;;;23898:30;-1:-1:-1;;;23944:18:19;;;23937:48;24002:18;;2756:71:0;23858:168:19;2756:71:0;2865:13;;2858:131;;-1:-1:-1;;;2858:131:0;;2910:10;2858:131;;;13256:34:19;2946:4:0;13306:18:19;;;13299:43;13358:18;;;13351:34;;;-1:-1:-1;;;;;2865:13:0;;;;2858:34;;13191:18:19;;2858:131:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2837:162;;;;;;3009:25;3019:9;3030:3;3009:9;:25::i;5430:320:8:-;5599:41;5618:12;:10;:12::i;:::-;5632:7;5599:18;:41::i;:::-;5591:103;;;;-1:-1:-1;;;5591:103:8;;;;;;;:::i;:::-;5704:39;5718:4;5724:2;5728:7;5737:5;5704:13;:39::i;1731:251:1:-;1829:13;1918:14;:12;:14::i;:::-;1934:26;1951:8;1934:16;:26::i;:::-;1901:60;;;;;;;;;:::i;:::-;;;;;;;;;;;;;1858:117;;1731:251;;;:::o;2095:161::-;2172:16;2190:14;2228:7;1045:6:7;;-1:-1:-1;;;;;1045:6:7;;973:85;2228:7:1;2237:11;;2220:29;;;;2095:161;;;:::o;1624:101::-;1677:13;1708:10;1701:17;;;;;:::i;3930:115::-;1196:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1185:23:7;:7;1045:6;;-1:-1:-1;;;;;1045:6:7;;973:85;1185:7;-1:-1:-1;;;;;1185:23:7;;1177:68;;;;-1:-1:-1;;;1177:68:7;;;;;;;:::i;:::-;4008:16:1::1;:30:::0;;-1:-1:-1;;;;;;4008:30:1::1;-1:-1:-1::0;;;;;4008:30:1;;;::::1;::::0;;;::::1;::::0;;3930:115::o;5715:120:0:-;1196:12:7;:10;:12::i;:::-;-1:-1:-1;;;;;1185:23:7;:7;1045:6;;-1:-1:-1;;;;;1045:6:7;;973:85;1185:7;-1:-1:-1;;;;;1185:23:7;;1177:68;;;;-1:-1:-1;;;1177:68:7;;;;;;;:::i;:::-;5796:13:0::1;:32:::0;;-1:-1:-1;;;;;;5796:32:0::1;-1:-1:-1::0;;;;;5796:32:0;;;::::1;::::0;;;::::1;::::0;;5715:120::o;1722:123::-;1766:13;1791:47;;;;;;;;;;;;;;;;;;;1722:123;:::o;2262:370:1:-;2447:20;;2490:28;;-1:-1:-1;;;2490:28:1;;-1:-1:-1;;;;;12536:32:19;;;2490:28:1;;;12518:51:19;2383:4:1;;2447:20;;;2482:49;;;;2447:20;;2490:21;;12491:18:19;;2490:28:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;-1:-1:-1;;;;;2482:49:1;;2478:91;;;2554:4;2547:11;;;;;2478:91;-1:-1:-1;;;;;4685:25:8;;;4662:4;4685:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;2586:39:1;2579:46;2262:370;-1:-1:-1;;;;2262:370:1:o;3047:768:0:-;3143:10;3115:39;;;;:27;:39;;;;;;;;3114:40;3093:113;;;;-1:-1:-1;;;3093:113:0;;19301:2:19;3093:113:0;;;19283:21:19;19340:2;19320:18;;;19313:30;19379:28;19359:18;;;19352:56;19425:18;;3093:113:0;19273:176:19;3093:113:0;3240:15;;3232:42;;-1:-1:-1;;;3232:42:0;;3263:10;3232:42;;;12518:51:19;3216:13:0;;-1:-1:-1;;;;;3240:15:0;;3232:30;;12491:18:19;;3232:42:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3309:16;;3301:43;;-1:-1:-1;;;3301:43:0;;3333:10;3301:43;;;12518:51:19;3216:58:0;;-1:-1:-1;3284:14:0;;-1:-1:-1;;;;;3309:16:0;;;;3301:31;;12491:18:19;;3301:43:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;3284:60;;3370:1;3362:5;:9;:23;;;;3384:1;3375:6;:10;3362:23;3354:51;;;;-1:-1:-1;;;3354:51:0;;19656:2:19;3354:51:0;;;19638:21:19;19695:2;19675:18;;;19668:30;-1:-1:-1;;;19714:18:19;;;19707:45;19769:18;;3354:51:0;19628:165:19;3354:51:0;3443:10;3415:39;;;;:27;:39;;;;;:46;;-1:-1:-1;;3415:46:0;3457:4;3415:46;;;3475:9;;3471:163;;3500:32;3510:10;3522:9;;3500;:32::i;:::-;3581:9;;3551:47;;;3569:10;14370:51:19;;14452:2;14437:18;;14430:34;;;;14480:18;;14473:34;;;3551:47:0;;14358:2:19;14343:18;3551:47:0;;;;;;;3612:9;:11;;;:9;:11;;;:::i;:::-;;;;;;3471:163;3647:10;;3643:166;;3673:32;3683:10;3695:9;;3673;:32::i;:::-;3755:9;;3724:49;;;3743:10;14370:51:19;;14452:2;14437:18;;14430:34;;;;14480:18;;14473:34;;;3724:49:0;;14358:2:19;14343:18;3724:49:0;;;;;;;3787:9;:11;;;:9;:11;;;:::i;:::-;;;;;;3083:732;;3047:768::o;803:38:1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;1846:189:7:-;1196:12;:10;:12::i;:::-;-1:-1:-1;;;;;1185:23:7;:7;1045:6;;-1:-1:-1;;;;;1045:6:7;;973:85;1185:7;-1:-1:-1;;;;;1185:23:7;;1177:68;;;;-1:-1:-1;;;1177:68:7;;;;;;;:::i;:::-;-1:-1:-1;;;;;1934:22:7;::::1;1926:73;;;::::0;-1:-1:-1;;;1926:73:7;;18180:2:19;1926:73:7::1;::::0;::::1;18162:21:19::0;18219:2;18199:18;;;18192:30;18258:34;18238:18;;;18231:62;-1:-1:-1;;;18309:18:19;;;18302:36;18355:19;;1926:73:7::1;18152:228:19::0;1926:73:7::1;2009:19;2019:8;2009:9;:19::i;95:631:2:-:0;163:22;205:10;227:4;205:27;201:496;;;248:18;269:8;;248:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;307:8:2;514:17;508:24;-1:-1:-1;;;;;483:131:2;;-1:-1:-1;201:496:2;;-1:-1:-1;201:496:2;;-1:-1:-1;675:10:2;201:496;95:631;:::o;718:377:14:-;1034:20;1080:8;;;718:377::o;1496:300:8:-;1598:4;-1:-1:-1;;;;;;1633:40:8;;-1:-1:-1;;;1633:40:8;;:104;;-1:-1:-1;;;;;;;1689:48:8;;-1:-1:-1;;;1689:48:8;1633:104;:156;;;-1:-1:-1;;;;;;;;;;871:40:17;;;1753:36:8;763:155:17;2638:118:1;2692:14;2725:24;:22;:24::i;:::-;2718:31;;2638:118;:::o;11073:171:8:-;11147:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11147:29:8;-1:-1:-1;;;;;11147:29:8;;;;;;;;:24;;11200:23;11147:24;11200:14;:23::i;:::-;-1:-1:-1;;;;;11191:46:8;;;;;;;;;;;11073:171;;:::o;2484:470:5:-;2656:4;-1:-1:-1;;;;;2680:20:5;;2672:70;;;;-1:-1:-1;;;2672:70:5;;21514:2:19;2672:70:5;;;21496:21:19;21553:2;21533:18;;;21526:30;21592:34;21572:18;;;21565:62;-1:-1:-1;;;21643:18:19;;;21636:35;21688:19;;2672:70:5;21486:227:19;2672:70:5;2793:154;2820:47;2839:27;2859:6;2839:19;:27::i;:::-;2820:18;:47::i;:::-;2793:154;;;;;;;;;;;;16178:25:19;;;;16251:4;16239:17;;16219:18;;;16212:45;16273:18;;;16266:34;;;16316:18;;;16309:34;;;16150:19;;2793:154:5;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;2771:176:5;:6;-1:-1:-1;;;;;2771:176:5;;2752:195;;2484:470;;;;;;;:::o;8179:108:8:-;8254:26;8264:2;8268:7;8254:26;;;;;;;;;;;;:9;:26::i;7505:344::-;7598:4;7310:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7310:16:8;7614:73;;;;-1:-1:-1;;;7614:73:8;;20759:2:19;7614:73:8;;;20741:21:19;20798:2;20778:18;;;20771:30;20837:34;20817:18;;;20810:62;-1:-1:-1;;;20888:18:19;;;20881:42;20940:19;;7614:73:8;20731:234:19;7614:73:8;7697:13;7713:23;7728:7;7713:14;:23::i;:::-;7697:39;;7765:5;-1:-1:-1;;;;;7754:16:8;:7;-1:-1:-1;;;;;7754:16:8;;:51;;;;7798:7;-1:-1:-1;;;;;7774:31:8;:20;7786:7;7774:11;:20::i;:::-;-1:-1:-1;;;;;7774:31:8;;7754:51;:87;;;;7809:32;7826:5;7833:7;7809:16;:32::i;10402:560::-;10556:4;-1:-1:-1;;;;;10529:31:8;:23;10544:7;10529:14;:23::i;:::-;-1:-1:-1;;;;;10529:31:8;;10521:85;;;;-1:-1:-1;;;10521:85:8;;25007:2:19;10521:85:8;;;24989:21:19;25046:2;25026:18;;;25019:30;25085:34;25065:18;;;25058:62;-1:-1:-1;;;25136:18:19;;;25129:39;25185:19;;10521:85:8;24979:231:19;10521:85:8;-1:-1:-1;;;;;10624:16:8;;10616:65;;;;-1:-1:-1;;;10616:65:8;;20000:2:19;10616:65:8;;;19982:21:19;20039:2;20019:18;;;20012:30;20078:34;20058:18;;;20051:62;-1:-1:-1;;;20129:18:19;;;20122:34;20173:19;;10616:65:8;19972:226:19;10616:65:8;10692:39;10713:4;10719:2;10723:7;10692:20;:39::i;:::-;10793:29;10810:1;10814:7;10793:8;:29::i;:::-;-1:-1:-1;;;;;10833:15:8;;;;;;:9;:15;;;;;:20;;10852:1;;10833:15;:20;;10852:1;;10833:20;:::i;:::-;;;;-1:-1:-1;;;;;;;10863:13:8;;;;;;:9;:13;;;;;:18;;10880:1;;10863:13;:18;;10880:1;;10863:18;:::i;:::-;;;;-1:-1:-1;;10891:16:8;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10891:21:8;-1:-1:-1;;;;;10891:21:8;;;;;;;;;10928:27;;10891:16;;10928:27;;;;;;;10402:560;;;:::o;9730:348::-;9789:13;9805:23;9820:7;9805:14;:23::i;:::-;9789:39;;9839:48;9860:5;9875:1;9879:7;9839:20;:48::i;:::-;9925:29;9942:1;9946:7;9925:8;:29::i;:::-;-1:-1:-1;;;;;9965:16:8;;;;;;:9;:16;;;;;:21;;9985:1;;9965:16;:21;;9985:1;;9965:21;:::i;:::-;;;;-1:-1:-1;;10003:16:8;;;;:7;:16;;;;;;9996:23;;-1:-1:-1;;;;;;9996:23:8;;;10035:36;10011:7;;10003:16;-1:-1:-1;;;;;10035:36:8;;;;;10003:16;;10035:36;9779:299;9730:348;:::o;2041:169:7:-;2115:6;;;-1:-1:-1;;;;;2131:17:7;;;-1:-1:-1;;;;;;2131:17:7;;;;;;;2163:40;;2115:6;;;2131:17;2115:6;;2163:40;;2096:16;;2163:40;2086:124;2041:169;:::o;4488:366:0:-;4061:34;;;;;;;12277:19:19;;;12312:12;;;12305:28;;;4061:34:0;;;;;;;;;12349:12:19;;;;4061:34:0;;;4051:45;;;;;4625:4;;4705:28;4736:36;4760:11;4736:23;:36::i;:::-;4705:67;;4840:7;1045:6:7;;-1:-1:-1;;;;;1045:6:7;;973:85;4840:7:0;-1:-1:-1;;;;;4789:58:0;:47;4803:20;4825:10;4789:13;:47::i;:::-;-1:-1:-1;;;;;4789:58:0;;;4488:366;-1:-1:-1;;;;;;4488:366:0:o;6612:307:8:-;6763:28;6773:4;6779:2;6783:7;6763:9;:28::i;:::-;6809:48;6832:4;6838:2;6842:7;6851:5;6809:22;:48::i;:::-;6801:111;;;;-1:-1:-1;;;6801:111:8;;;;;;;:::i;275:703:16:-;331:13;548:10;544:51;;-1:-1:-1;;574:10:16;;;;;;;;;;;;-1:-1:-1;;;574:10:16;;;;;275:703::o;544:51::-;619:5;604:12;658:75;665:9;;658:75;;690:8;;;;:::i;:::-;;-1:-1:-1;712:10:16;;-1:-1:-1;720:2:16;712:10;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:17:16;;742:39;;791:150;798:10;;791:150;;824:11;834:1;824:11;;:::i;:::-;;-1:-1:-1;892:10:16;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:16;;;;;;;;-1:-1:-1;919:11:16;928:2;919:11;;:::i;:::-;;;791:150;;1971:396:5;2078:7;221:106;;;;;;;;;;;;;;;;;198:139;;;;;;;2226:12;;2260:11;;;;2303:24;;;;;2293:35;;;;;;2147:199;;;;;15760:25:19;;;15816:2;15801:18;;15794:34;;;;-1:-1:-1;;;;;15864:32:19;15859:2;15844:18;;15837:60;15928:2;15913:18;;15906:34;15747:3;15732:19;;15714:232;2147:199:5;;;;;;;;;;;;;2120:240;;;;;;2101:259;;1971:396;;;:::o;1884:249:3:-;1980:7;2078:20;1341:15;;;1264:99;2078:20;2049:63;;-1:-1:-1;;;2049:63:3;;;11981:27:19;12024:11;;;12017:27;;;;12060:12;;;12053:28;;;12097:12;;2049:63:3;11971:144:19;8508:311:8;8633:18;8639:2;8643:7;8633:5;:18::i;:::-;8682:54;8713:1;8717:2;8721:7;8730:5;8682:22;:54::i;:::-;8661:151;;;;-1:-1:-1;;;8661:151:8;;;;;;;:::i;2544:572:11:-;-1:-1:-1;;;;;2743:18:11;;2739:183;;2777:40;2809:7;3925:10;:17;;3898:24;;;;:15;:24;;;;;:44;;;3952:24;;;;;;;;;;;;3822:161;2777:40;2739:183;;;2846:2;-1:-1:-1;;;;;2838:10:11;:4;-1:-1:-1;;;;;2838:10:11;;2834:88;;2864:47;2897:4;2903:7;2864:32;:47::i;:::-;-1:-1:-1;;;;;2935:16:11;;2931:179;;2967:45;3004:7;2967:36;:45::i;2931:179::-;3039:4;-1:-1:-1;;;;;3033:10:11;:2;-1:-1:-1;;;;;3033:10:11;;3029:81;;3059:40;3087:2;3091:7;3059:27;:40::i;4109:316:0:-;4280:124;;11580:66:19;4280:124:0;;;11568:79:19;11663:12;;;11656:28;;;4211:7:0;;11700:12:19;;4280:124:0;11558:160:19;4917:493:0;5041:7;5068:10;:17;5089:2;5068:23;5060:60;;;;-1:-1:-1;;;5060:60:0;;27052:2:19;5060:60:0;;;27034:21:19;27091:2;27071:18;;;27064:30;27130:26;27110:18;;;27103:54;27174:18;;5060:60:0;27024:174:19;5060:60:0;5235:2;5219:19;;;5213:26;5279:2;5263:19;;;5257:26;5331:2;5315:19;;;5309:26;5362:41;;5130:9;5362:41;;;;;;;;;16178:25:19;;;5301:35:0;;16219:18:19;;;16212:45;;;16273:18;;16266:34;;;16316:18;;;16309:34;;;5213:26:0;;5362:41;;16150:19:19;;5362:41:0;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;5362:41:0;;-1:-1:-1;;5362:41:0;;;4917:493;-1:-1:-1;;;;;;;4917:493:0:o;11797:782:8:-;11947:4;-1:-1:-1;;;;;11967:13:8;;1034:20:14;1080:8;11963:610:8;;12018:2;-1:-1:-1;;;;;12002:36:8;;12039:12;:10;:12::i;:::-;12053:4;12059:7;12068:5;12002:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12002:72:8;;;;;;;;-1:-1:-1;;12002:72:8;;;;;;;;;;;;:::i;:::-;;;11998:523;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;12245:13:8;;12241:266;;12287:60;;-1:-1:-1;;;12287:60:8;;;;;;;:::i;12241:266::-;12459:6;12453:13;12444:6;12440:2;12436:15;12429:38;11998:523;-1:-1:-1;;;;;;12124:55:8;-1:-1:-1;;;12124:55:8;;-1:-1:-1;12117:62:8;;11963:610;-1:-1:-1;12558:4:8;11797:782;;;;;;:::o;9141:372::-;-1:-1:-1;;;;;9220:16:8;;9212:61;;;;-1:-1:-1;;;9212:61:8;;23525:2:19;9212:61:8;;;23507:21:19;;;23544:18;;;23537:30;23603:34;23583:18;;;23576:62;23655:18;;9212:61:8;23497:182:19;9212:61:8;7287:4;7310:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7310:16:8;:30;9283:58;;;;-1:-1:-1;;;9283:58:8;;18944:2:19;9283:58:8;;;18926:21:19;18983:2;18963:18;;;18956:30;19022;19002:18;;;18995:58;19070:18;;9283:58:8;18916:178:19;9283:58:8;9352:45;9381:1;9385:2;9389:7;9352:20;:45::i;:::-;-1:-1:-1;;;;;9408:13:8;;;;;;:9;:13;;;;;:18;;9425:1;;9408:13;:18;;9425:1;;9408:18;:::i;:::-;;;;-1:-1:-1;;9436:16:8;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;9436:21:8;-1:-1:-1;;;;;9436:21:8;;;;;;;;9473:33;;9436:16;;;9473:33;;9436:16;;9473:33;9141:372;;:::o;4600:970:11:-;4862:22;4912:1;4887:22;4904:4;4887:16;:22::i;:::-;:26;;;;:::i;:::-;4923:18;4944:26;;;:17;:26;;;;;;4862:51;;-1:-1:-1;5074:28:11;;;5070:323;;-1:-1:-1;;;;;5140:18:11;;5118:19;5140:18;;;:12;:18;;;;;;;;:34;;;;;;;;;5189:30;;;;;;:44;;;5305:30;;:17;:30;;;;;:43;;;5070:323;-1:-1:-1;5486:26:11;;;;:17;:26;;;;;;;;5479:33;;;-1:-1:-1;;;;;5529:18:11;;;;;:12;:18;;;;;:34;;;;;;;5522:41;4600:970::o;5858:1061::-;6132:10;:17;6107:22;;6132:21;;6152:1;;6132:21;:::i;:::-;6163:18;6184:24;;;:15;:24;;;;;;6552:10;:26;;6107:46;;-1:-1:-1;6184:24:11;;6107:46;;6552:26;;;;;;:::i;:::-;;;;;;;;;6530:48;;6614:11;6589:10;6600;6589:22;;;;;;;;:::i;:::-;;;;;;;;;;;;:36;;;;6693:28;;;:15;:28;;;;;;;:41;;;6862:24;;;;;6855:31;6896:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;5929:990;;;5858:1061;:::o;3410:217::-;3494:14;3511:20;3528:2;3511:16;:20::i;:::-;-1:-1:-1;;;;;3541:16:11;;;;;;;:12;:16;;;;;;;;:24;;;;;;;;:34;;;3585:26;;;:17;:26;;;;;;:35;;;;-1:-1:-1;3410:217:11:o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:19;78:5;112:18;104:6;101:30;98:2;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:19;223:4;188:40;172:57;:::i;:::-;163:66;;252:6;245:5;238:21;292:3;283:6;278:3;274:16;271:25;268:2;;;309:1;306;299:12;268:2;358:6;353:3;346:4;339:5;335:16;322:43;412:1;405:4;396:6;389:5;385:18;381:29;374:40;88:332;;;;;:::o;425:748::-;479:5;532:3;525:4;517:6;513:17;509:27;499:2;;550:1;547;540:12;499:2;586:6;573:20;612:4;636:60;652:43;692:2;652:43;:::i;:::-;636:60;:::i;:::-;718:3;742:2;737:3;730:15;770:2;765:3;761:12;754:19;;805:2;797:6;793:15;857:3;852:2;846;843:1;839:10;831:6;827:23;823:32;820:41;817:2;;;874:1;871;864:12;817:2;896:1;906:238;920:2;917:1;914:9;906:238;;;991:3;978:17;1008:31;1033:5;1008:31;:::i;:::-;1052:18;;1090:12;;;;1122;;;;938:1;931:9;906:238;;;-1:-1:-1;1162:5:19;;489:684;-1:-1:-1;;;;;;;489:684:19:o;1178:220::-;1220:5;1273:3;1266:4;1258:6;1254:17;1250:27;1240:2;;1291:1;1288;1281:12;1240:2;1313:79;1388:3;1379:6;1366:20;1359:4;1351:6;1347:17;1313:79;:::i;:::-;1304:88;1230:168;-1:-1:-1;;;1230:168:19:o;1403:247::-;1462:6;1515:2;1503:9;1494:7;1490:23;1486:32;1483:2;;;1531:1;1528;1521:12;1483:2;1570:9;1557:23;1589:31;1614:5;1589:31;:::i;1655:388::-;1723:6;1731;1784:2;1772:9;1763:7;1759:23;1755:32;1752:2;;;1800:1;1797;1790:12;1752:2;1839:9;1826:23;1858:31;1883:5;1858:31;:::i;:::-;1908:5;-1:-1:-1;1965:2:19;1950:18;;1937:32;1978:33;1937:32;1978:33;:::i;:::-;2030:7;2020:17;;;1742:301;;;;;:::o;2048:456::-;2125:6;2133;2141;2194:2;2182:9;2173:7;2169:23;2165:32;2162:2;;;2210:1;2207;2200:12;2162:2;2249:9;2236:23;2268:31;2293:5;2268:31;:::i;:::-;2318:5;-1:-1:-1;2375:2:19;2360:18;;2347:32;2388:33;2347:32;2388:33;:::i;:::-;2152:352;;2440:7;;-1:-1:-1;;;2494:2:19;2479:18;;;;2466:32;;2152:352::o;2509:667::-;2604:6;2612;2620;2628;2636;2689:3;2677:9;2668:7;2664:23;2660:33;2657:2;;;2706:1;2703;2696:12;2657:2;2745:9;2732:23;2764:31;2789:5;2764:31;:::i;:::-;2814:5;-1:-1:-1;2871:2:19;2856:18;;2843:32;2884:33;2843:32;2884:33;:::i;:::-;2936:7;-1:-1:-1;2990:2:19;2975:18;;2962:32;;-1:-1:-1;3046:2:19;3031:18;;3018:32;3059:33;3018:32;3059:33;:::i;:::-;2647:529;;;;-1:-1:-1;2647:529:19;;3165:3;3150:19;3137:33;;2647:529;-1:-1:-1;;2647:529:19:o;3181:665::-;3276:6;3284;3292;3300;3353:3;3341:9;3332:7;3328:23;3324:33;3321:2;;;3370:1;3367;3360:12;3321:2;3409:9;3396:23;3428:31;3453:5;3428:31;:::i;:::-;3478:5;-1:-1:-1;3535:2:19;3520:18;;3507:32;3548:33;3507:32;3548:33;:::i;:::-;3600:7;-1:-1:-1;3654:2:19;3639:18;;3626:32;;-1:-1:-1;3709:2:19;3694:18;;3681:32;3736:18;3725:30;;3722:2;;;3768:1;3765;3758:12;3722:2;3791:49;3832:7;3823:6;3812:9;3808:22;3791:49;:::i;:::-;3781:59;;;3311:535;;;;;;;:::o;3851:382::-;3916:6;3924;3977:2;3965:9;3956:7;3952:23;3948:32;3945:2;;;3993:1;3990;3983:12;3945:2;4032:9;4019:23;4051:31;4076:5;4051:31;:::i;:::-;4101:5;-1:-1:-1;4158:2:19;4143:18;;4130:32;4171:30;4130:32;4171:30;:::i;4238:758::-;4340:6;4348;4356;4364;4372;4425:3;4413:9;4404:7;4400:23;4396:33;4393:2;;;4442:1;4439;4432:12;4393:2;4481:9;4468:23;4500:31;4525:5;4500:31;:::i;:::-;4550:5;-1:-1:-1;4606:2:19;4591:18;;4578:32;4633:18;4622:30;;4619:2;;;4665:1;4662;4655:12;4619:2;4688:49;4729:7;4720:6;4709:9;4705:22;4688:49;:::i;:::-;4678:59;;;4784:2;4773:9;4769:18;4756:32;4746:42;;4835:2;4824:9;4820:18;4807:32;4797:42;;4891:3;4880:9;4876:19;4863:33;4940:4;4931:7;4927:18;4918:7;4915:31;4905:2;;4960:1;4957;4950:12;4905:2;4983:7;4973:17;;;4383:613;;;;;;;;:::o;5001:315::-;5069:6;5077;5130:2;5118:9;5109:7;5105:23;5101:32;5098:2;;;5146:1;5143;5136:12;5098:2;5185:9;5172:23;5204:31;5229:5;5204:31;:::i;:::-;5254:5;5306:2;5291:18;;;;5278:32;;-1:-1:-1;;;5088:228:19:o;5321:1151::-;5439:6;5447;5500:2;5488:9;5479:7;5475:23;5471:32;5468:2;;;5516:1;5513;5506:12;5468:2;5556:9;5543:23;5585:18;5626:2;5618:6;5615:14;5612:2;;;5642:1;5639;5632:12;5612:2;5680:6;5669:9;5665:22;5655:32;;5725:7;5718:4;5714:2;5710:13;5706:27;5696:2;;5747:1;5744;5737:12;5696:2;5783;5770:16;5805:4;5829:60;5845:43;5885:2;5845:43;:::i;5829:60::-;5911:3;5935:2;5930:3;5923:15;5963:2;5958:3;5954:12;5947:19;;5994:2;5990;5986:11;6042:7;6037:2;6031;6028:1;6024:10;6020:2;6016:19;6012:28;6009:41;6006:2;;;6063:1;6060;6053:12;6006:2;6085:1;6076:10;;6095:163;6109:2;6106:1;6103:9;6095:163;;;6166:17;;6154:30;;6127:1;6120:9;;;;;6204:12;;;;6236;;6095:163;;;-1:-1:-1;6277:5:19;-1:-1:-1;;6320:18:19;;6307:32;;-1:-1:-1;;6351:16:19;;;6348:2;;;6380:1;6377;6370:12;6348:2;;6403:63;6458:7;6447:8;6436:9;6432:24;6403:63;:::i;:::-;6393:73;;;5458:1014;;;;;:::o;6477:245::-;6544:6;6597:2;6585:9;6576:7;6572:23;6568:32;6565:2;;;6613:1;6610;6603:12;6565:2;6645:9;6639:16;6664:28;6686:5;6664:28;:::i;6727:245::-;6785:6;6838:2;6826:9;6817:7;6813:23;6809:32;6806:2;;;6854:1;6851;6844:12;6806:2;6893:9;6880:23;6912:30;6936:5;6912:30;:::i;6977:249::-;7046:6;7099:2;7087:9;7078:7;7074:23;7070:32;7067:2;;;7115:1;7112;7105:12;7067:2;7147:9;7141:16;7166:30;7190:5;7166:30;:::i;7231:279::-;7329:6;7382:2;7370:9;7361:7;7357:23;7353:32;7350:2;;;7398:1;7395;7388:12;7350:2;7430:9;7424:16;7449:31;7474:5;7449:31;:::i;7515:450::-;7584:6;7637:2;7625:9;7616:7;7612:23;7608:32;7605:2;;;7653:1;7650;7643:12;7605:2;7693:9;7680:23;7726:18;7718:6;7715:30;7712:2;;;7758:1;7755;7748:12;7712:2;7781:22;;7834:4;7826:13;;7822:27;-1:-1:-1;7812:2:19;;7863:1;7860;7853:12;7812:2;7886:73;7951:7;7946:2;7933:16;7928:2;7924;7920:11;7886:73;:::i;7970:180::-;8029:6;8082:2;8070:9;8061:7;8057:23;8053:32;8050:2;;;8098:1;8095;8088:12;8050:2;-1:-1:-1;8121:23:19;;8040:110;-1:-1:-1;8040:110:19:o;8155:184::-;8225:6;8278:2;8266:9;8257:7;8253:23;8249:32;8246:2;;;8294:1;8291;8284:12;8246:2;-1:-1:-1;8317:16:19;;8236:103;-1:-1:-1;8236:103:19:o;8344:315::-;8412:6;8420;8473:2;8461:9;8452:7;8448:23;8444:32;8441:2;;;8489:1;8486;8479:12;8441:2;8525:9;8512:23;8502:33;;8585:2;8574:9;8570:18;8557:32;8598:31;8623:5;8598:31;:::i;8664:248::-;8732:6;8740;8793:2;8781:9;8772:7;8768:23;8764:32;8761:2;;;8809:1;8806;8799:12;8761:2;-1:-1:-1;;8832:23:19;;;8902:2;8887:18;;;8874:32;;-1:-1:-1;8751:161:19:o;8917:383::-;8994:6;9002;9010;9063:2;9051:9;9042:7;9038:23;9034:32;9031:2;;;9079:1;9076;9069:12;9031:2;9115:9;9102:23;9092:33;;9172:2;9161:9;9157:18;9144:32;9134:42;;9226:2;9215:9;9211:18;9198:32;9239:31;9264:5;9239:31;:::i;:::-;9289:5;9279:15;;;9021:279;;;;;:::o;9305:592::-;9400:6;9408;9416;9424;9477:3;9465:9;9456:7;9452:23;9448:33;9445:2;;;9494:1;9491;9484:12;9445:2;9530:9;9517:23;9507:33;;9587:2;9576:9;9572:18;9559:32;9549:42;;9642:2;9631:9;9627:18;9614:32;9669:18;9661:6;9658:30;9655:2;;;9701:1;9698;9691:12;9655:2;9724:49;9765:7;9756:6;9745:9;9741:22;9724:49;:::i;:::-;9714:59;;;9823:2;9812:9;9808:18;9795:32;9836:31;9861:5;9836:31;:::i;:::-;9435:462;;;;-1:-1:-1;9435:462:19;;-1:-1:-1;;9435:462:19:o;9902:257::-;9943:3;9981:5;9975:12;10008:6;10003:3;9996:19;10024:63;10080:6;10073:4;10068:3;10064:14;10057:4;10050:5;10046:16;10024:63;:::i;:::-;10141:2;10120:15;-1:-1:-1;;10116:29:19;10107:39;;;;10148:4;10103:50;;9951:208;-1:-1:-1;;9951:208:19:o;10164:274::-;10293:3;10331:6;10325:13;10347:53;10393:6;10388:3;10381:4;10373:6;10369:17;10347:53;:::i;:::-;10416:16;;;;;10301:137;-1:-1:-1;;10301:137:19:o;10443:415::-;10600:3;10638:6;10632:13;10654:53;10700:6;10695:3;10688:4;10680:6;10676:17;10654:53;:::i;:::-;10776:2;10772:15;;;;-1:-1:-1;;10768:53:19;10729:16;;;;10754:68;;;10849:2;10838:14;;10608:250;-1:-1:-1;;10608:250:19:o;10863:470::-;11042:3;11080:6;11074:13;11096:53;11142:6;11137:3;11130:4;11122:6;11118:17;11096:53;:::i;:::-;11212:13;;11171:16;;;;11234:57;11212:13;11171:16;11268:4;11256:17;;11234:57;:::i;:::-;11307:20;;11050:283;-1:-1:-1;;;;11050:283:19:o;12580:431::-;-1:-1:-1;;;;;12837:15:19;;;12819:34;;12889:15;;12884:2;12869:18;;12862:43;12941:2;12936;12921:18;;12914:30;;;12762:4;;12961:44;;12986:18;;12978:6;12961:44;:::i;:::-;12953:52;12771:240;-1:-1:-1;;;;;12771:240:19:o;13396:488::-;-1:-1:-1;;;;;13665:15:19;;;13647:34;;13717:15;;13712:2;13697:18;;13690:43;13764:2;13749:18;;13742:34;;;13812:3;13807:2;13792:18;;13785:31;;;13590:4;;13833:45;;13858:19;;13850:6;13833:45;:::i;:::-;13825:53;13599:285;-1:-1:-1;;;;;;13599:285:19:o;14518:632::-;14689:2;14741:21;;;14811:13;;14714:18;;;14833:22;;;14660:4;;14689:2;14912:15;;;;14886:2;14871:18;;;14660:4;14955:169;14969:6;14966:1;14963:13;14955:169;;;15030:13;;15018:26;;15099:15;;;;15064:12;;;;14991:1;14984:9;14955:169;;;-1:-1:-1;15141:3:19;;14669:481;-1:-1:-1;;;;;;14669:481:19:o;16354:217::-;16501:2;16490:9;16483:21;16464:4;16521:44;16561:2;16550:9;16546:18;16538:6;16521:44;:::i;17559:414::-;17761:2;17743:21;;;17800:2;17780:18;;;17773:30;17839:34;17834:2;17819:18;;17812:62;-1:-1:-1;;;17905:2:19;17890:18;;17883:48;17963:3;17948:19;;17733:240::o;24444:356::-;24646:2;24628:21;;;24665:18;;;24658:30;24724:34;24719:2;24704:18;;24697:62;24791:2;24776:18;;24618:182::o;26019:413::-;26221:2;26203:21;;;26260:2;26240:18;;;26233:30;26299:34;26294:2;26279:18;;26272:62;-1:-1:-1;;;26365:2:19;26350:18;;26343:47;26422:3;26407:19;;26193:239::o;27385:275::-;27456:2;27450:9;27521:2;27502:13;;-1:-1:-1;;27498:27:19;27486:40;;27556:18;27541:34;;27577:22;;;27538:62;27535:2;;;27603:18;;:::i;:::-;27639:2;27632:22;27430:230;;-1:-1:-1;27430:230:19:o;27665:183::-;27725:4;27758:18;27750:6;27747:30;27744:2;;;27780:18;;:::i;:::-;-1:-1:-1;27825:1:19;27821:14;27837:4;27817:25;;27734:114::o;27853:128::-;27893:3;27924:1;27920:6;27917:1;27914:13;27911:2;;;27930:18;;:::i;:::-;-1:-1:-1;27966:9:19;;27901:80::o;27986:120::-;28026:1;28052;28042:2;;28057:18;;:::i;:::-;-1:-1:-1;28091:9:19;;28032:74::o;28111:125::-;28151:4;28179:1;28176;28173:8;28170:2;;;28184:18;;:::i;:::-;-1:-1:-1;28221:9:19;;28160:76::o;28241:258::-;28313:1;28323:113;28337:6;28334:1;28331:13;28323:113;;;28413:11;;;28407:18;28394:11;;;28387:39;28359:2;28352:10;28323:113;;;28454:6;28451:1;28448:13;28445:2;;;-1:-1:-1;;28489:1:19;28471:16;;28464:27;28294:205::o;28504:380::-;28583:1;28579:12;;;;28626;;;28647:2;;28701:4;28693:6;28689:17;28679:27;;28647:2;28754;28746:6;28743:14;28723:18;28720:38;28717:2;;;28800:10;28795:3;28791:20;28788:1;28781:31;28835:4;28832:1;28825:15;28863:4;28860:1;28853:15;28889:135;28928:3;-1:-1:-1;;28949:17:19;;28946:2;;;28969:18;;:::i;:::-;-1:-1:-1;29016:1:19;29005:13;;28936:88::o;29029:112::-;29061:1;29087;29077:2;;29092:18;;:::i;:::-;-1:-1:-1;29126:9:19;;29067:74::o;29146:127::-;29207:10;29202:3;29198:20;29195:1;29188:31;29238:4;29235:1;29228:15;29262:4;29259:1;29252:15;29278:127;29339:10;29334:3;29330:20;29327:1;29320:31;29370:4;29367:1;29360:15;29394:4;29391:1;29384:15;29410:127;29471:10;29466:3;29462:20;29459:1;29452:31;29502:4;29499:1;29492:15;29526:4;29523:1;29516:15;29542:127;29603:10;29598:3;29594:20;29591:1;29584:31;29634:4;29631:1;29624:15;29658:4;29655:1;29648:15;29674:127;29735:10;29730:3;29726:20;29723:1;29716:31;29766:4;29763:1;29756:15;29790:4;29787:1;29780:15;29806:131;-1:-1:-1;;;;;29881:31:19;;29871:42;;29861:2;;29927:1;29924;29917:12;29942:118;30028:5;30021:13;30014:21;30007:5;30004:32;29994:2;;30050:1;30047;30040:12;30065:131;-1:-1:-1;;;;;;30139:32:19;;30129:43;;30119:2;;30186:1;30183;30176:12

Swarm Source

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