ETH Price: $3,303.14 (-3.58%)
Gas: 7 Gwei

Angry Frogs Famiglia (AFFs)
 

Overview

TokenID

1087

Total Transfers

-

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Loading...
Loading
Loading...
Loading
Loading...
Loading

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

Contract Source Code Verified (Exact Match)

Contract Name:
AngryFrogs

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 2 of 13: AngryFrogs.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721SBurnable.sol";
import "./IERC721S.sol";

interface IMeta {
    function getTokensOfOwner(address _owner)
        external
        view
        returns (uint256[] memory);

    function tokenOfOwnerByIndex(address _owner, uint256 id)
        external
        view
        returns (uint256);
}

/**
 * @title AngryFrogs Contract
 * @dev Extends ERC721S Non-Fungible Token Standard basic implementation
 */
contract AngryFrogs is ERC721SBurnable {
    string public baseTokenURI;
    uint16 public mintedCount;

    uint16 public MAX_SUPPLY;
    uint16 public CLAIM_COUNT;
    uint16 public GIVEAWAY_COUNT;

    uint256 public mintPrice;
    uint16 public maxByMint;

    address private admin;

    address public metaAddress;
    address public stakingAddress;

    bool public publicSale;
    bool public privateSale;
    bool public claimSale;

    mapping(address => bool) public mintedWhiteliste;
    mapping(uint8 => bool) public mintedFromMeta;
    mapping(address => uint8) public mintableFromRaccoon;
    mapping(address => bool) public mintableDiamond;

    string public constant CONTRACT_NAME = "Angryfrogs Contract";
    bytes32 public constant DOMAIN_TYPEHASH =
        keccak256(
            "EIP712Domain(string name,uint256 chainId,address verifyingContract)"
        );
    bytes32 public constant MINT_TYPEHASH =
        keccak256("Mint(address user,uint256 num)");

    constructor(address _admin) ERC721S("Angry Frogs Famiglia", "AFFs") {
        MAX_SUPPLY = 10000;
        CLAIM_COUNT = 1462;
        GIVEAWAY_COUNT = 150;
        mintPrice = 0.069 ether; // Private: 0.069ETH, Public: 0.08ETH
        maxByMint = 2;

        admin = _admin;
    }

    function setMintPrice(uint256 newMintPrice) external onlyOwner {
        mintPrice = newMintPrice;
    }

    function setMaxByMint(uint16 newMaxByMint) external onlyOwner {
        maxByMint = newMaxByMint;
    }

    function setCount(
        uint16 _max_supply,
        uint16 _claim_count,
        uint16 _giveaway_count
    ) external onlyOwner {
        MAX_SUPPLY = _max_supply;
        CLAIM_COUNT = _claim_count;
        GIVEAWAY_COUNT = _giveaway_count;
    }

    function setPublicSaleStatus(bool status) external onlyOwner {
        publicSale = status;
    }

    function setPrivateSaleStatus(bool status) external onlyOwner {
        privateSale = status;
    }

    function setClaimSaleStatus(bool status) external onlyOwner {
        claimSale = status;
    }

    function setContractAddress(address _metaAddress, address _stakingAddress)
        external
        onlyOwner
    {
        metaAddress = _metaAddress;
        stakingAddress = _stakingAddress;
    }

    function setRaccoonOwners(address[] memory _owners, uint8[] memory _counts)
        external
        onlyOwner
    {
        require(_owners.length == _counts.length, "Not same count");
        for (uint16 i; i < _owners.length; i++) {
            mintableFromRaccoon[_owners[i]] = _counts[i];
        }
    }

    function setDiamond(address[] memory _owners) external onlyOwner {
        require(_owners.length > 0, "Not zero count");
        for (uint16 i; i < _owners.length; i++) {
            mintableDiamond[_owners[i]] = true;
        }
    }

    function setBaseURI(string memory baseURI) external onlyOwner {
        baseTokenURI = baseURI;
    }

    function _baseURI() internal view virtual override returns (string memory) {
        return baseTokenURI;
    }

    function exists(uint256 _tokenId) public view returns (bool) {
        return _exists(_tokenId);
    }

    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        // Hardcode the Manager's approval so that users don't have to waste gas approving
        if (_msgSender() != stakingAddress)
            require(
                _isApprovedOrOwner(_msgSender(), tokenId),
                "ERC721S: transfer caller is not owner nor approved"
            );
        _transfer(from, to, tokenId);
    }

    function totalSupply() public view virtual returns (uint256) {
        return mintedCount;
    }

    function getTokensOfOwner(address owner)
        public
        view
        returns (uint256[] memory)
    {
        uint256 tokenCount = balanceOf(owner);

        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 resultIndex = 0;
            uint256 tokenId;

            for (tokenId = 0; tokenId < totalSupply(); tokenId++) {
                if (_owners[tokenId] == owner) {
                    result[resultIndex] = tokenId;
                    resultIndex++;
                    if (resultIndex >= tokenCount) {
                        break;
                    }
                }
            }
            return result;
        }
    }

    function mintByUserPrivate(
        uint8 _numberOfTokens,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) external payable {
        require(privateSale, "Private Sale is not active");
        require(!mintedWhiteliste[msg.sender], "You minted aleady");
        require(tx.origin == msg.sender, "Only EOA");
        require(
            mintedCount + _numberOfTokens <=
                MAX_SUPPLY - CLAIM_COUNT - GIVEAWAY_COUNT,
            "Max Limit To Sale"
        );
        require(_numberOfTokens <= maxByMint, "Exceeds Amount");
        require(mintPrice * _numberOfTokens <= msg.value, "Low Price To Mint");

        bytes32 domainSeparator = keccak256(
            abi.encode(
                DOMAIN_TYPEHASH,
                keccak256(bytes(CONTRACT_NAME)),
                getChainId(),
                address(this)
            )
        );
        bytes32 structHash = keccak256(
            abi.encode(MINT_TYPEHASH, msg.sender, _numberOfTokens)
        );
        bytes32 digest = keccak256(
            abi.encodePacked("\x19\x01", domainSeparator, structHash)
        );
        address signatory = ecrecover(digest, v, r, s);
        require(signatory == admin, "Invalid signatory");

        mintedWhiteliste[msg.sender] = true;
        for (uint8 i = 0; i < _numberOfTokens; i += 1) {
            _safeMint(msg.sender, mintedCount + i);
        }

        mintedCount = mintedCount + _numberOfTokens;
    }

    function mintByUser(uint8 _numberOfTokens) external payable {
        require(publicSale, "Public Sale is not active");
        require(tx.origin == msg.sender, "Only EOA");
        require(
            mintedCount + _numberOfTokens <=
                MAX_SUPPLY - CLAIM_COUNT - GIVEAWAY_COUNT,
            "Max Limit To Sale"
        );
        require(_numberOfTokens <= maxByMint, "Exceeds Amount");
        require(mintPrice * _numberOfTokens <= msg.value, "Low Price To Mint");

        for (uint8 i = 0; i < _numberOfTokens; i += 1) {
            _safeMint(msg.sender, mintedCount + i);
        }

        mintedCount = mintedCount + _numberOfTokens;
    }

    function mintByOwner(uint8 _numberOfTokens, address user)
        external
        onlyOwner
    {
        require(publicSale, "Public Sale is not active");
        require(tx.origin == msg.sender, "Only EOA");
        require(
            mintedCount + _numberOfTokens <= MAX_SUPPLY,
            "Max Limit To Sale"
        );

        for (uint8 i = 0; i < _numberOfTokens; i += 1) {
            _safeMint(user, mintedCount + i);
        }

        mintedCount = mintedCount + _numberOfTokens;
    }

    function mintByDiamond() external {
        require(publicSale, "Public Sale is not active");
        require(tx.origin == msg.sender, "Only EOA");
        require(mintableDiamond[msg.sender], "Not Diamond list");

        mintableDiamond[msg.sender] = false;

        _safeMint(msg.sender, mintedCount);

        mintedCount = mintedCount + 1;
    }

    function getAvailableMeta(address owner) public view returns (uint256) {
        uint256[] memory tokenIds = IMeta(metaAddress).getTokensOfOwner(owner);

        uint256 availableCount;
        for (uint8 i; i < tokenIds.length; i++) {
            if (!mintedFromMeta[uint8(tokenIds[i])]) {
                availableCount++;
            }
        }

        return availableCount;
    }

    function claimByMeta(uint8 count) external {
        require(claimSale, "Claim is not active");
        require(tx.origin == msg.sender, "Only EOA");

        require(
            getAvailableMeta(msg.sender) >= count,
            "Don't have enough Ceramic"
        );

        uint8 j = 0;
        uint8 balance = uint8(IERC721S(metaAddress).balanceOf(_msgSender()));
        for (uint8 i = 0; i < balance; i++) {
            uint8 tokenId = uint8(
                IMeta(metaAddress).tokenOfOwnerByIndex(msg.sender, i)
            );
            if (!mintedFromMeta[tokenId]) {
                mintedFromMeta[tokenId] = true;
                j++;
            }
            if (j == count) {
                break;
            }
        }

        uint8 _numberOfTokens = count * 2;

        for (uint8 i = 0; i < _numberOfTokens; i += 1) {
            _safeMint(msg.sender, mintedCount + i);
        }

        mintedCount = mintedCount + _numberOfTokens;
    }

    function claimByRaccoon(uint8 count) external {
        require(claimSale, "Claim is not active");
        require(tx.origin == msg.sender, "Only EOA");
        require(mintableFromRaccoon[msg.sender] >= count, "Already Claimed");

        uint8 _numberOfTokens = count * 2;

        mintableFromRaccoon[msg.sender] =
            mintableFromRaccoon[msg.sender] -
            count;

        for (uint8 i = 0; i < _numberOfTokens; i += 1) {
            _safeMint(msg.sender, mintedCount + i);
        }

        mintedCount = mintedCount + _numberOfTokens;
    }

    function withdrawAll() external onlyOwner {
        uint256 totalBalance = address(this).balance;
        payable(_msgSender()).transfer(totalBalance);
    }

    function getChainId() internal view returns (uint256) {
        uint256 chainId;
        assembly {
            chainId := chainid()
        }
        return chainId;
    }
}

File 1 of 13: 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);
    }

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

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

File 3 of 13: 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 4 of 13: ERC165S.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165S.sol";

/**
 * @dev Implementation of the {IERC165S} interface.
 *
 * Contracts that want to implement IERC165S 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 ERC165S is IERC165S {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override
        returns (bool)
    {
        return interfaceId == type(IERC165S).interfaceId;
    }
}

File 5 of 13: ERC721S.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721S.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165S.sol";

/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721S] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721S is Context, ERC165S, IERC721S, 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
    // CUSTOM: Visible for child contract so it's possible to emulate methods of ERC721S's enumerable extension
    mapping(uint256 => address) internal _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(ERC165S, IERC165S)
        returns (bool)
    {
        return
            interfaceId == type(IERC721S).interfaceId ||
            interfaceId == type(IERC721Metadata).interfaceId ||
            super.supportsInterface(interfaceId);
    }

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

    /**
     * @dev See {IERC721S-ownerOf}.
     */
    function ownerOf(uint256 tokenId)
        public
        view
        virtual
        override
        returns (address)
    {
        address owner = _owners[tokenId];
        require(
            owner != address(0),
            "ERC721S: 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 {IERC721S-approve}.
     */
    function approve(address to, uint256 tokenId) public virtual override {
        address owner = ERC721S.ownerOf(tokenId);
        require(to != owner, "ERC721S: approval to current owner");

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

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721S-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 {IERC721S-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved)
        public
        virtual
        override
    {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

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

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721S-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory _data
    ) public virtual override {
        require(
            _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721S: 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 ERC721S 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),
            "ERC721S: 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),
            "ERC721S: operator query for nonexistent token"
        );
        address owner = ERC721S.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-ERC721S-_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), "ERC721S: mint to the zero address");
        require(!_exists(tokenId), "ERC721S: token already minted");

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

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

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

        _afterTokenTransfer(address(0), to, tokenId);
    }

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

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

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

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

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

        _afterTokenTransfer(owner, address(0), tokenId);
    }

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

        _beforeTokenTransfer(from, to, tokenId);

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

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

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId);
    }

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

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

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

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

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

File 6 of 13: ERC721SBurnable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./ERC721S.sol";
import "./Ownable.sol";

/**
 * @title ERC721S Burnable Token
 * @dev ERC721S Token that can be irreversibly burned (destroyed).
 */
abstract contract ERC721SBurnable is Ownable, ERC721S {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(
            _msgSender() == owner() ||
                _isApprovedOrOwner(_msgSender(), tokenId),
            "ERC721SBurnable: caller is not owner nor approved"
        );
        _burn(tokenId);
    }
}

File 7 of 13: IERC165S.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 IERC165S {
    /**
     * @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 8 of 13: IERC721Metadata.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC721S.sol";

/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721S {
    /**
     * @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 9 of 13: IERC721Receiver.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

/**
 * @title ERC721S token receiver interface
 * @dev Interface for any contract that wants to support safeTransfers
 * from ERC721S asset contracts.
 */
interface IERC721Receiver {
    /**
     * @dev Whenever an {IERC721S} `tokenId` token is transferred to this contract via {IERC721S-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 `IERC721S.onERC721Received.selector`.
     */
    function onERC721Received(
        address operator,
        address from,
        uint256 tokenId,
        bytes calldata data
    ) external returns (bytes4);
}

File 10 of 13: IERC721S.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./IERC165S.sol";

/**
 * @dev Required interface of an ERC721S compliant contract.
 */
interface IERC721S is IERC165S {
    /**
     * @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 ERC721S 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 11 of 13: Ownable.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor() {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), 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 {
        emit OwnershipTransferred(_owner, address(0));
        _owner = 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"
        );
        emit OwnershipTransferred(_owner, newOwner);
        _owner = newOwner;
    }
}

File 12 of 13: SafeMath.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 13 of 13: 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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"_admin","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"CLAIM_COUNT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"CONTRACT_NAME","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DOMAIN_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"GIVEAWAY_COUNT","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_TYPEHASH","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"count","type":"uint8"}],"name":"claimByMeta","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"count","type":"uint8"}],"name":"claimByRaccoon","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getAvailableMeta","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getTokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","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":[],"name":"maxByMint","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"metaAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintByDiamond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_numberOfTokens","type":"uint8"},{"internalType":"address","name":"user","type":"address"}],"name":"mintByOwner","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_numberOfTokens","type":"uint8"}],"name":"mintByUser","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint8","name":"_numberOfTokens","type":"uint8"},{"internalType":"uint8","name":"v","type":"uint8"},{"internalType":"bytes32","name":"r","type":"bytes32"},{"internalType":"bytes32","name":"s","type":"bytes32"}],"name":"mintByUserPrivate","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintableDiamond","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintableFromRaccoon","outputs":[{"internalType":"uint8","name":"","type":"uint8"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintedCount","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint8","name":"","type":"uint8"}],"name":"mintedFromMeta","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"mintedWhiteliste","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"privateSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"publicSale","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setClaimSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_metaAddress","type":"address"},{"internalType":"address","name":"_stakingAddress","type":"address"}],"name":"setContractAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"_max_supply","type":"uint16"},{"internalType":"uint16","name":"_claim_count","type":"uint16"},{"internalType":"uint16","name":"_giveaway_count","type":"uint16"}],"name":"setCount","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"}],"name":"setDiamond","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint16","name":"newMaxByMint","type":"uint16"}],"name":"setMaxByMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newMintPrice","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setPrivateSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"status","type":"bool"}],"name":"setPublicSaleStatus","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint8[]","name":"_counts","type":"uint8[]"}],"name":"setRaccoonOwners","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"stakingAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdrawAll","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162003cbc38038062003cbc833981016040819052620000349162000211565b6040518060400160405280601481526020017f416e6772792046726f67732046616d69676c6961000000000000000000000000815250604051806040016040528060048152602001634146467360e01b8152506000620000996200016760201b60201c565b600080546001600160a01b0319166001600160a01b0383169081178255604051929350917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3508151620000f89060019060208501906200016b565b5080516200010e9060029060208401906200016b565b505060088054669605b62710000067ffffffffffff0000199091161790555066f5232269808000600955600a80546001600160a01b0390921662010000026001600160b01b031990921691909117600217905562000280565b3390565b828054620001799062000243565b90600052602060002090601f0160209004810192826200019d5760008555620001e8565b82601f10620001b857805160ff1916838001178555620001e8565b82800160010185558215620001e8579182015b82811115620001e8578251825591602001919060010190620001cb565b50620001f6929150620001fa565b5090565b5b80821115620001f65760008155600101620001fb565b6000602082840312156200022457600080fd5b81516001600160a01b03811681146200023c57600080fd5b9392505050565b600181811c908216806200025857607f821691505b602082108114156200027a57634e487b7160e01b600052602260045260246000fd5b50919050565b613a2c80620002906000396000f3fe6080604052600436106103765760003560e01c8063715018a6116101d1578063cf721b1511610102578063ed215889116100a0578063f2fde38b1161006f578063f2fde38b14610a9d578063f4a0a52814610abd578063f6efd26614610add578063f76fc35e14610b1f57600080fd5b8063ed21588914610a0b578063f048ce9c14610a2b578063f1d89d9714610a4d578063f2af982014610a6d57600080fd5b8063d547cfb7116100dc578063d547cfb71461096d578063d7b4be2414610982578063dbb69228146109a2578063e985e9c5146109c257600080fd5b8063cf721b151461091f578063d347c09c1461093a578063d4d9f6ff1461094d57600080fd5b80639d9fab341161016f578063b423fe6711610149578063b423fe671461089e578063b88d4fde146108be578063ba1f879f146108de578063c87b56dd146108ff57600080fd5b80639d9fab341461081e578063a15d90951461084e578063a22cb4651461087e57600080fd5b80638bf7e1ac116101ab5780638bf7e1ac146107ab5780638da5cb5b146107cb57806395d89b41146107e95780639be1162f146107fe57600080fd5b8063715018a61461076157806372a207e514610776578063853828b61461079657600080fd5b806342842e0e116102ab578063614d08f8116102495780636352211e116102235780636352211e146106eb5780636817c76c1461070b57806368245fd11461072157806370a082311461074157600080fd5b8063614d08f81461067757806362557d00146106b6578063628e49c0146106cb57600080fd5b80634f558e79116102855780634f558e79146105f757806355f804b31461061757806357e7a6aa146106375780635de6dc551461064a57600080fd5b806342842e0e1461059657806342966c68146105b6578063454dfaaf146105d657600080fd5b806320606b7011610318578063287b038b116102f2578063287b038b1461051157806332cb6b0c1461053157806333bc1c5c14610552578063388ebd591461057357600080fd5b806320606b701461049d57806323626df7146104d157806323b872dd146104f157600080fd5b806308f2a8de1161035457806308f2a8de1461040a578063095ea7b31461042c578063138a4e011461044c57806318160ddd1461047a57600080fd5b806301ffc9a71461037b57806306fdde03146103b0578063081812fc146103d2575b600080fd5b34801561038757600080fd5b5061039b610396366004613375565b610b53565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103c5610ba5565b6040516103a791906135dd565b3480156103de57600080fd5b506103f26103ed366004613456565b610c37565b6040516001600160a01b0390911681526020016103a7565b34801561041657600080fd5b5061042a6104253660046131f9565b610cd1565b005b34801561043857600080fd5b5061042a61044736600461319a565b610ddd565b34801561045857600080fd5b50600a546104679061ffff1681565b60405161ffff90911681526020016103a7565b34801561048657600080fd5b5060085461ffff165b6040519081526020016103a7565b3480156104a957600080fd5b5061048f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156104dd57600080fd5b5061042a6104ec366004613085565b610eef565b3480156104fd57600080fd5b5061042a61050c3660046130b8565b610f47565b34801561051d57600080fd5b5061042a61052c36600461335a565b610f94565b34801561053d57600080fd5b506008546104679062010000900461ffff1681565b34801561055e57600080fd5b50600c5461039b90600160a01b900460ff1681565b34801561057f57600080fd5b5060085461046790640100000000900461ffff1681565b3480156105a257600080fd5b5061042a6105b13660046130b8565b610fdc565b3480156105c257600080fd5b5061042a6105d1366004613456565b610ff7565b3480156105e257600080fd5b50600c5461039b90600160b01b900460ff1681565b34801561060357600080fd5b5061039b610612366004613456565b611086565b34801561062357600080fd5b5061042a6106323660046133af565b6110a5565b61042a610645366004613488565b6110e6565b34801561065657600080fd5b5061066a61066536600461306a565b6112b2565b6040516103a79190613599565b34801561068357600080fd5b506103c560405180604001604052806013815260200172105b99dc9e599c9bd9dcc810dbdb9d1c9858dd606a1b81525081565b3480156106c257600080fd5b5061042a6113b4565b3480156106d757600080fd5b5061042a6106e6366004613413565b6114a0565b3480156106f757600080fd5b506103f2610706366004613456565b61151a565b34801561071757600080fd5b5061048f60095481565b34801561072d57600080fd5b5061042a61073c3660046133f8565b611592565b34801561074d57600080fd5b5061048f61075c36600461306a565b6115d4565b34801561076d57600080fd5b5061042a61165c565b34801561078257600080fd5b5061042a6107913660046131c4565b6116d0565b3480156107a257600080fd5b5061042a6117ac565b3480156107b757600080fd5b50600b546103f2906001600160a01b031681565b3480156107d757600080fd5b506000546001600160a01b03166103f2565b3480156107f557600080fd5b506103c5611805565b34801561080a57600080fd5b5061048f61081936600461306a565b611814565b34801561082a57600080fd5b5061039b61083936600461306a565b600d6020526000908152604090205460ff1681565b34801561085a57600080fd5b5061039b610869366004613488565b600e6020526000908152604090205460ff1681565b34801561088a57600080fd5b5061042a610899366004613170565b61190a565b3480156108aa57600080fd5b5061042a6108b936600461335a565b611915565b3480156108ca57600080fd5b5061042a6108d93660046130f4565b61195d565b3480156108ea57600080fd5b50600c5461039b90600160a81b900460ff1681565b34801561090b57600080fd5b506103c561091a366004613456565b611995565b34801561092b57600080fd5b506008546104679061ffff1681565b61042a6109483660046134bf565b611a70565b34801561095957600080fd5b5061042a610968366004613488565b611ebe565b34801561097957600080fd5b506103c561219b565b34801561098e57600080fd5b50600c546103f2906001600160a01b031681565b3480156109ae57600080fd5b5061042a6109bd366004613488565b612229565b3480156109ce57600080fd5b5061039b6109dd366004613085565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a1757600080fd5b5061042a610a2636600461335a565b6123aa565b348015610a3757600080fd5b5060085461046790600160301b900461ffff1681565b348015610a5957600080fd5b5061042a610a683660046134a3565b6123f2565b348015610a7957600080fd5b5061039b610a8836600461306a565b60106020526000908152604090205460ff1681565b348015610aa957600080fd5b5061042a610ab836600461306a565b6124f8565b348015610ac957600080fd5b5061042a610ad8366004613456565b6125e2565b348015610ae957600080fd5b50610b0d610af836600461306a565b600f6020526000908152604090205460ff1681565b60405160ff90911681526020016103a7565b348015610b2b57600080fd5b5061048f7f79800d7a879f6d3ff90ed42057b41065ab94943f7417273b44f9e3044f19617181565b60006001600160e01b031982166380ac58cd60e01b1480610b8457506001600160e01b03198216635b5e139f60e01b145b80610b9f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610bb4906138e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610be0906138e2565b8015610c2d5780601f10610c0257610100808354040283529160200191610c2d565b820191906000526020600020905b815481529060010190602001808311610c1057829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610cb55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000546001600160a01b03163314610cfb5760405162461bcd60e51b8152600401610cac9061369b565b8051825114610d3d5760405162461bcd60e51b815260206004820152600e60248201526d139bdd081cd85b594818dbdd5b9d60921b6044820152606401610cac565b60005b82518161ffff161015610dd857818161ffff1681518110610d6357610d636139b4565b6020026020010151600f6000858461ffff1681518110610d8557610d856139b4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610dd090613917565b915050610d40565b505050565b6000610de88261151a565b9050806001600160a01b0316836001600160a01b03161415610e575760405162461bcd60e51b815260206004820152602260248201527f455243373231533a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610cac565b336001600160a01b0382161480610e735750610e7381336109dd565b610ee55760405162461bcd60e51b815260206004820152603960248201527f455243373231533a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610cac565b610dd88383612611565b6000546001600160a01b03163314610f195760405162461bcd60e51b8152600401610cac9061369b565b600b80546001600160a01b039384166001600160a01b031991821617909155600c8054929093169116179055565b600c546001600160a01b0316336001600160a01b031614610f8957610f6d335b8261267f565b610f895760405162461bcd60e51b8152600401610cac90613649565b610dd8838383612777565b6000546001600160a01b03163314610fbe5760405162461bcd60e51b8152600401610cac9061369b565b600c8054911515600160a81b0260ff60a81b19909216919091179055565b610dd88383836040518060200160405280600081525061195d565b6000546001600160a01b0316331480611014575061101433610f67565b61107a5760405162461bcd60e51b815260206004820152603160248201527f455243373231534275726e61626c653a2063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610cac565b61108381612916565b50565b6000818152600360205260408120546001600160a01b03161515610b9f565b6000546001600160a01b031633146110cf5760405162461bcd60e51b8152600401610cac9061369b565b80516110e2906007906020840190612eb1565b5050565b600c54600160a01b900460ff1661110f5760405162461bcd60e51b8152600401610cac906135f0565b32331461112e5760405162461bcd60e51b8152600401610cac90613627565b60085461ffff600160301b820481169161115991640100000000820481169162010000900416613859565b6111639190613859565b60085461ffff9182169161117c9160ff851691166137a3565b61ffff16111561119e5760405162461bcd60e51b8152600401610cac906136d0565b600a5461ffff1660ff821611156111e85760405162461bcd60e51b815260206004820152600e60248201526d115e18d959591cc8105b5bdd5b9d60921b6044820152606401610cac565b348160ff166009546111fa9190613811565b111561123c5760405162461bcd60e51b8152602060048201526011602482015270131bddc8141c9a58d948151bc8135a5b9d607a1b6044820152606401610cac565b60005b8160ff168160ff161015611283576008546112719033906112689060ff85169061ffff166137a3565b61ffff166129b1565b61127c6001826137d8565b905061123f565b506008546112999060ff83169061ffff166137a3565b6008805461ffff191661ffff9290921691909117905550565b606060006112bf836115d4565b9050806112e05760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156112fb576112fb6139ca565b604051908082528060200260200182016040528015611324578160200160208202803683370190505b5090506000805b60085461ffff168110156113a4576000818152600360205260409020546001600160a01b0387811691161415611392578083838151811061136e5761136e6139b4565b60209081029190910101528161138381613939565b925050838210611392576113a4565b8061139c81613939565b91505061132b565b5090949350505050565b50919050565b600c54600160a01b900460ff166113dd5760405162461bcd60e51b8152600401610cac906135f0565b3233146113fc5760405162461bcd60e51b8152600401610cac90613627565b3360009081526010602052604090205460ff1661144e5760405162461bcd60e51b815260206004820152601060248201526f139bdd08111a585b5bdb99081b1a5cdd60821b6044820152606401610cac565b336000818152601060205260409020805460ff19169055600854611476919061ffff166129b1565b6008546114889061ffff1660016137a3565b6008805461ffff191661ffff92909216919091179055565b6000546001600160a01b031633146114ca5760405162461bcd60e51b8152600401610cac9061369b565b6008805465ffffffff000019166201000061ffff9586160265ffff00000000191617640100000000938516939093029290921767ffff0000000000001916600160301b9190931602919091179055565b6000818152600360205260408120546001600160a01b031680610b9f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231533a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610cac565b6000546001600160a01b031633146115bc5760405162461bcd60e51b8152600401610cac9061369b565b600a805461ffff191661ffff92909216919091179055565b60006001600160a01b0382166116405760405162461bcd60e51b815260206004820152602b60248201527f455243373231533a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610cac565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146116865760405162461bcd60e51b8152600401610cac9061369b565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146116fa5760405162461bcd60e51b8152600401610cac9061369b565b600081511161173c5760405162461bcd60e51b815260206004820152600e60248201526d139bdd081e995c9bc818dbdd5b9d60921b6044820152606401610cac565b60005b81518161ffff1610156110e257600160106000848461ffff1681518110611768576117686139b4565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806117a481613917565b91505061173f565b6000546001600160a01b031633146117d65760405162461bcd60e51b8152600401610cac9061369b565b6040514790339082156108fc029083906000818181858888f193505050501580156110e2573d6000803e3d6000fd5b606060028054610bb4906138e2565b600b54604051635de6dc5560e01b81526001600160a01b0383811660048301526000928392911690635de6dc559060240160006040518083038186803b15801561185d57600080fd5b505afa158015611871573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261189991908101906132c2565b90506000805b82518160ff1610156112d857600e6000848360ff16815181106118c4576118c46139b4565b60209081029190910181015160ff90811683529082019290925260400160002054166118f857816118f481613939565b9250505b8061190281613954565b91505061189f565b6110e23383836129cb565b6000546001600160a01b0316331461193f5760405162461bcd60e51b8152600401610cac9061369b565b600c8054911515600160a01b0260ff60a01b19909216919091179055565b611967338361267f565b6119835760405162461bcd60e51b8152600401610cac90613649565b61198f84848484612a9a565b50505050565b6000818152600360205260409020546060906001600160a01b0316611a145760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610cac565b6000611a1e612acd565b90506000815111611a3e5760405180602001604052806000815250611a69565b80611a4884612adc565b604051602001611a5992919061352d565b6040516020818303038152906040525b9392505050565b600c54600160a81b900460ff16611ac95760405162461bcd60e51b815260206004820152601a60248201527f507269766174652053616c65206973206e6f74206163746976650000000000006044820152606401610cac565b336000908152600d602052604090205460ff1615611b1d5760405162461bcd60e51b8152602060048201526011602482015270596f75206d696e74656420616c6561647960781b6044820152606401610cac565b323314611b3c5760405162461bcd60e51b8152600401610cac90613627565b60085461ffff600160301b8204811691611b6791640100000000820481169162010000900416613859565b611b719190613859565b60085461ffff91821691611b8a9160ff881691166137a3565b61ffff161115611bac5760405162461bcd60e51b8152600401610cac906136d0565b600a5461ffff1660ff85161115611bf65760405162461bcd60e51b815260206004820152600e60248201526d115e18d959591cc8105b5bdd5b9d60921b6044820152606401610cac565b348460ff16600954611c089190613811565b1115611c4a5760405162461bcd60e51b8152602060048201526011602482015270131bddc8141c9a58d948151bc8135a5b9d607a1b6044820152606401610cac565b6040805180820182526013815272105b99dc9e599c9bd9dcc810dbdb9d1c9858dd606a1b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527fb90cd577cce776c648ed341f7f7e909b7e08addeb6f79956e515352827f120d381840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f79800d7a879f6d3ff90ed42057b41065ab94943f7417273b44f9e3044f19617160c08301523360e083015260ff8816610100808401919091528451808403909101815261012083019094528351939092019290922061190160f01b6101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611dcc573d6000803e3d6000fd5b5050604051601f190151600a549092506001600160a01b038084166201000090920416149050611e325760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e61746f727960781b6044820152606401610cac565b336000908152600d60205260408120805460ff191660011790555b8860ff168160ff161015611e8857600854611e769033906112689060ff85169061ffff166137a3565b611e816001826137d8565b9050611e4d565b50600854611e9e9060ff8a169061ffff166137a3565b6008805461ffff191661ffff929092169190911790555050505050505050565b600c54600160b01b900460ff16611f0d5760405162461bcd60e51b8152602060048201526013602482015272436c61696d206973206e6f742061637469766560681b6044820152606401610cac565b323314611f2c5760405162461bcd60e51b8152600401610cac90613627565b8060ff16611f3933611814565b1015611f875760405162461bcd60e51b815260206004820152601960248201527f446f6e2774206861766520656e6f75676820436572616d6963000000000000006044820152606401610cac565b600b5460009081906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015611fdd57600080fd5b505afa158015611ff1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612015919061346f565b905060005b8160ff168160ff16101561211b57600b54604051632f745c5960e01b815233600482015260ff831660248201526000916001600160a01b031690632f745c599060440160206040518083038186803b15801561207557600080fd5b505afa158015612089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ad919061346f565b60ff8082166000908152600e6020526040902054919250166120f45760ff81166000908152600e60205260409020805460ff19166001179055836120f081613954565b9450505b8460ff168460ff161415612108575061211b565b508061211381613954565b91505061201a565b506000612129846002613830565b905060005b8160ff168160ff161015612169576008546121579033906112689060ff85169061ffff166137a3565b6121626001826137d8565b905061212e565b5060085461217f9060ff83169061ffff166137a3565b6008805461ffff191661ffff9290921691909117905550505050565b600780546121a8906138e2565b80601f01602080910402602001604051908101604052809291908181526020018280546121d4906138e2565b80156122215780601f106121f657610100808354040283529160200191612221565b820191906000526020600020905b81548152906001019060200180831161220457829003601f168201915b505050505081565b600c54600160b01b900460ff166122785760405162461bcd60e51b8152602060048201526013602482015272436c61696d206973206e6f742061637469766560681b6044820152606401610cac565b3233146122975760405162461bcd60e51b8152600401610cac90613627565b336000908152600f602052604090205460ff808316911610156122ee5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4810db185a5b5959608a1b6044820152606401610cac565b60006122fb826002613830565b336000908152600f602052604090205490915061231c90839060ff16613893565b336000908152600f60205260408120805460ff191660ff93909316929092179091555b8160ff168160ff16101561237a576008546123689033906112689060ff85169061ffff166137a3565b6123736001826137d8565b905061233f565b506008546123909060ff83169061ffff166137a3565b6008805461ffff191661ffff929092169190911790555050565b6000546001600160a01b031633146123d45760405162461bcd60e51b8152600401610cac9061369b565b600c8054911515600160b01b0260ff60b01b19909216919091179055565b6000546001600160a01b0316331461241c5760405162461bcd60e51b8152600401610cac9061369b565b600c54600160a01b900460ff166124455760405162461bcd60e51b8152600401610cac906135f0565b3233146124645760405162461bcd60e51b8152600401610cac90613627565b60085461ffff6201000082048116916124829160ff861691166137a3565b61ffff1611156124a45760405162461bcd60e51b8152600401610cac906136d0565b60005b8260ff168160ff1610156124e2576008546124d09083906112689060ff85169061ffff166137a3565b6124db6001826137d8565b90506124a7565b506008546123909060ff84169061ffff166137a3565b6000546001600160a01b031633146125225760405162461bcd60e51b8152600401610cac9061369b565b6001600160a01b0381166125875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cac565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461260c5760405162461bcd60e51b8152600401610cac9061369b565b600955565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906126468261151a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166126f95760405162461bcd60e51b815260206004820152602d60248201527f455243373231533a206f70657261746f7220717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610cac565b60006127048361151a565b9050806001600160a01b0316846001600160a01b0316148061273f5750836001600160a01b031661273484610c37565b6001600160a01b0316145b8061276f57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661278a8261151a565b6001600160a01b0316146127ef5760405162461bcd60e51b815260206004820152602660248201527f455243373231533a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610cac565b6001600160a01b0382166128535760405162461bcd60e51b815260206004820152602560248201527f455243373231533a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610cac565b61285e600082612611565b6001600160a01b038316600090815260046020526040812080546001929061288790849061387c565b90915550506001600160a01b03821660009081526004602052604081208054600192906128b59084906137c0565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006129218261151a565b905061292e600083612611565b6001600160a01b038116600090815260046020526040812080546001929061295790849061387c565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6110e2828260405180602001604052806000815250612bda565b816001600160a01b0316836001600160a01b03161415612a2d5760405162461bcd60e51b815260206004820152601a60248201527f455243373231533a20617070726f766520746f2063616c6c65720000000000006044820152606401610cac565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612aa5848484612777565b612ab184848484612c58565b61198f5760405162461bcd60e51b8152600401610cac906136fb565b606060078054610bb4906138e2565b606081612b005750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612b2a5780612b1481613939565b9150612b239050600a836137fd565b9150612b04565b60008167ffffffffffffffff811115612b4557612b456139ca565b6040519080825280601f01601f191660200182016040528015612b6f576020820181803683370190505b5090505b841561276f57612b8460018361387c565b9150612b91600a86613974565b612b9c9060306137c0565b60f81b818381518110612bb157612bb16139b4565b60200101906001600160f81b031916908160001a905350612bd3600a866137fd565b9450612b73565b612be48383612d65565b612bf16000848484612c58565b610dd85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610cac565b60006001600160a01b0384163b15612d5a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c9c90339089908890889060040161355c565b602060405180830381600087803b158015612cb657600080fd5b505af1925050508015612ce6575060408051601f3d908101601f19168201909252612ce391810190613392565b60015b612d40573d808015612d14576040519150601f19603f3d011682016040523d82523d6000602084013e612d19565b606091505b508051612d385760405162461bcd60e51b8152600401610cac906136fb565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061276f565b506001949350505050565b6001600160a01b038216612dc55760405162461bcd60e51b815260206004820152602160248201527f455243373231533a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610cac565b6000818152600360205260409020546001600160a01b031615612e2a5760405162461bcd60e51b815260206004820152601d60248201527f455243373231533a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610cac565b6001600160a01b0382166000908152600460205260408120805460019290612e539084906137c0565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612ebd906138e2565b90600052602060002090601f016020900481019282612edf5760008555612f25565b82601f10612ef857805160ff1916838001178555612f25565b82800160010185558215612f25579182015b82811115612f25578251825591602001919060010190612f0a565b50612f31929150612f35565b5090565b5b80821115612f315760008155600101612f36565b600067ffffffffffffffff831115612f6457612f646139ca565b612f77601f8401601f191660200161374e565b9050828152838383011115612f8b57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612fb957600080fd5b919050565b600082601f830112612fcf57600080fd5b81356020612fe4612fdf8361377f565b61374e565b80838252828201915082860187848660051b890101111561300457600080fd5b60005b8581101561302a5761301882612fa2565b84529284019290840190600101613007565b5090979650505050505050565b80358015158114612fb957600080fd5b803561ffff81168114612fb957600080fd5b803560ff81168114612fb957600080fd5b60006020828403121561307c57600080fd5b611a6982612fa2565b6000806040838503121561309857600080fd5b6130a183612fa2565b91506130af60208401612fa2565b90509250929050565b6000806000606084860312156130cd57600080fd5b6130d684612fa2565b92506130e460208501612fa2565b9150604084013590509250925092565b6000806000806080858703121561310a57600080fd5b61311385612fa2565b935061312160208601612fa2565b925060408501359150606085013567ffffffffffffffff81111561314457600080fd5b8501601f8101871361315557600080fd5b61316487823560208401612f4a565b91505092959194509250565b6000806040838503121561318357600080fd5b61318c83612fa2565b91506130af60208401613037565b600080604083850312156131ad57600080fd5b6131b683612fa2565b946020939093013593505050565b6000602082840312156131d657600080fd5b813567ffffffffffffffff8111156131ed57600080fd5b61276f84828501612fbe565b6000806040838503121561320c57600080fd5b823567ffffffffffffffff8082111561322457600080fd5b61323086838701612fbe565b935060209150818501358181111561324757600080fd5b85019050601f8101861361325a57600080fd5b8035613268612fdf8261377f565b80828252848201915084840189868560051b870101111561328857600080fd5b600094505b838510156132b25761329e81613059565b83526001949094019391850191850161328d565b5080955050505050509250929050565b600060208083850312156132d557600080fd5b825167ffffffffffffffff8111156132ec57600080fd5b8301601f810185136132fd57600080fd5b805161330b612fdf8261377f565b80828252848201915084840188868560051b870101111561332b57600080fd5b600094505b8385101561334e578051835260019490940193918501918501613330565b50979650505050505050565b60006020828403121561336c57600080fd5b611a6982613037565b60006020828403121561338757600080fd5b8135611a69816139e0565b6000602082840312156133a457600080fd5b8151611a69816139e0565b6000602082840312156133c157600080fd5b813567ffffffffffffffff8111156133d857600080fd5b8201601f810184136133e957600080fd5b61276f84823560208401612f4a565b60006020828403121561340a57600080fd5b611a6982613047565b60008060006060848603121561342857600080fd5b61343184613047565b925061343f60208501613047565b915061344d60408501613047565b90509250925092565b60006020828403121561346857600080fd5b5035919050565b60006020828403121561348157600080fd5b5051919050565b60006020828403121561349a57600080fd5b611a6982613059565b600080604083850312156134b657600080fd5b6130a183613059565b600080600080608085870312156134d557600080fd5b6134de85613059565b93506134ec60208601613059565b93969395505050506040820135916060013590565b600081518084526135198160208601602086016138b6565b601f01601f19169290920160200192915050565b6000835161353f8184602088016138b6565b8351908301906135538183602088016138b6565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061358f90830184613501565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156135d1578351835292840192918401916001016135b5565b50909695505050505050565b602081526000611a696020830184613501565b60208082526019908201527f5075626c69632053616c65206973206e6f742061637469766500000000000000604082015260600190565b6020808252600890820152674f6e6c7920454f4160c01b604082015260600190565b60208082526032908201527f455243373231533a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601190820152704d6178204c696d697420546f2053616c6560781b604082015260600190565b60208082526033908201527f455243373231533a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613777576137776139ca565b604052919050565b600067ffffffffffffffff821115613799576137996139ca565b5060051b60200190565b600061ffff80831681851680830382111561355357613553613988565b600082198211156137d3576137d3613988565b500190565b600060ff821660ff84168060ff038211156137f5576137f5613988565b019392505050565b60008261380c5761380c61399e565b500490565b600081600019048311821515161561382b5761382b613988565b500290565b600060ff821660ff84168160ff048111821515161561385157613851613988565b029392505050565b600061ffff8381169083168181101561387457613874613988565b039392505050565b60008282101561388e5761388e613988565b500390565b600060ff821660ff8416808210156138ad576138ad613988565b90039392505050565b60005b838110156138d15781810151838201526020016138b9565b8381111561198f5750506000910152565b600181811c908216806138f657607f821691505b602082108114156113ae57634e487b7160e01b600052602260045260246000fd5b600061ffff8083168181141561392f5761392f613988565b6001019392505050565b600060001982141561394d5761394d613988565b5060010190565b600060ff821660ff81141561396b5761396b613988565b60010192915050565b6000826139835761398361399e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461108357600080fdfea2646970667358221220f9e1e09b22ad9742f96b412b1a597f9addaa699e0f80ad0306ac03102d87961f64736f6c6343000807003300000000000000000000000004b9aaca1ad41cb19f6c21aa512cec2765d87698

Deployed Bytecode

0x6080604052600436106103765760003560e01c8063715018a6116101d1578063cf721b1511610102578063ed215889116100a0578063f2fde38b1161006f578063f2fde38b14610a9d578063f4a0a52814610abd578063f6efd26614610add578063f76fc35e14610b1f57600080fd5b8063ed21588914610a0b578063f048ce9c14610a2b578063f1d89d9714610a4d578063f2af982014610a6d57600080fd5b8063d547cfb7116100dc578063d547cfb71461096d578063d7b4be2414610982578063dbb69228146109a2578063e985e9c5146109c257600080fd5b8063cf721b151461091f578063d347c09c1461093a578063d4d9f6ff1461094d57600080fd5b80639d9fab341161016f578063b423fe6711610149578063b423fe671461089e578063b88d4fde146108be578063ba1f879f146108de578063c87b56dd146108ff57600080fd5b80639d9fab341461081e578063a15d90951461084e578063a22cb4651461087e57600080fd5b80638bf7e1ac116101ab5780638bf7e1ac146107ab5780638da5cb5b146107cb57806395d89b41146107e95780639be1162f146107fe57600080fd5b8063715018a61461076157806372a207e514610776578063853828b61461079657600080fd5b806342842e0e116102ab578063614d08f8116102495780636352211e116102235780636352211e146106eb5780636817c76c1461070b57806368245fd11461072157806370a082311461074157600080fd5b8063614d08f81461067757806362557d00146106b6578063628e49c0146106cb57600080fd5b80634f558e79116102855780634f558e79146105f757806355f804b31461061757806357e7a6aa146106375780635de6dc551461064a57600080fd5b806342842e0e1461059657806342966c68146105b6578063454dfaaf146105d657600080fd5b806320606b7011610318578063287b038b116102f2578063287b038b1461051157806332cb6b0c1461053157806333bc1c5c14610552578063388ebd591461057357600080fd5b806320606b701461049d57806323626df7146104d157806323b872dd146104f157600080fd5b806308f2a8de1161035457806308f2a8de1461040a578063095ea7b31461042c578063138a4e011461044c57806318160ddd1461047a57600080fd5b806301ffc9a71461037b57806306fdde03146103b0578063081812fc146103d2575b600080fd5b34801561038757600080fd5b5061039b610396366004613375565b610b53565b60405190151581526020015b60405180910390f35b3480156103bc57600080fd5b506103c5610ba5565b6040516103a791906135dd565b3480156103de57600080fd5b506103f26103ed366004613456565b610c37565b6040516001600160a01b0390911681526020016103a7565b34801561041657600080fd5b5061042a6104253660046131f9565b610cd1565b005b34801561043857600080fd5b5061042a61044736600461319a565b610ddd565b34801561045857600080fd5b50600a546104679061ffff1681565b60405161ffff90911681526020016103a7565b34801561048657600080fd5b5060085461ffff165b6040519081526020016103a7565b3480156104a957600080fd5b5061048f7f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a86681565b3480156104dd57600080fd5b5061042a6104ec366004613085565b610eef565b3480156104fd57600080fd5b5061042a61050c3660046130b8565b610f47565b34801561051d57600080fd5b5061042a61052c36600461335a565b610f94565b34801561053d57600080fd5b506008546104679062010000900461ffff1681565b34801561055e57600080fd5b50600c5461039b90600160a01b900460ff1681565b34801561057f57600080fd5b5060085461046790640100000000900461ffff1681565b3480156105a257600080fd5b5061042a6105b13660046130b8565b610fdc565b3480156105c257600080fd5b5061042a6105d1366004613456565b610ff7565b3480156105e257600080fd5b50600c5461039b90600160b01b900460ff1681565b34801561060357600080fd5b5061039b610612366004613456565b611086565b34801561062357600080fd5b5061042a6106323660046133af565b6110a5565b61042a610645366004613488565b6110e6565b34801561065657600080fd5b5061066a61066536600461306a565b6112b2565b6040516103a79190613599565b34801561068357600080fd5b506103c560405180604001604052806013815260200172105b99dc9e599c9bd9dcc810dbdb9d1c9858dd606a1b81525081565b3480156106c257600080fd5b5061042a6113b4565b3480156106d757600080fd5b5061042a6106e6366004613413565b6114a0565b3480156106f757600080fd5b506103f2610706366004613456565b61151a565b34801561071757600080fd5b5061048f60095481565b34801561072d57600080fd5b5061042a61073c3660046133f8565b611592565b34801561074d57600080fd5b5061048f61075c36600461306a565b6115d4565b34801561076d57600080fd5b5061042a61165c565b34801561078257600080fd5b5061042a6107913660046131c4565b6116d0565b3480156107a257600080fd5b5061042a6117ac565b3480156107b757600080fd5b50600b546103f2906001600160a01b031681565b3480156107d757600080fd5b506000546001600160a01b03166103f2565b3480156107f557600080fd5b506103c5611805565b34801561080a57600080fd5b5061048f61081936600461306a565b611814565b34801561082a57600080fd5b5061039b61083936600461306a565b600d6020526000908152604090205460ff1681565b34801561085a57600080fd5b5061039b610869366004613488565b600e6020526000908152604090205460ff1681565b34801561088a57600080fd5b5061042a610899366004613170565b61190a565b3480156108aa57600080fd5b5061042a6108b936600461335a565b611915565b3480156108ca57600080fd5b5061042a6108d93660046130f4565b61195d565b3480156108ea57600080fd5b50600c5461039b90600160a81b900460ff1681565b34801561090b57600080fd5b506103c561091a366004613456565b611995565b34801561092b57600080fd5b506008546104679061ffff1681565b61042a6109483660046134bf565b611a70565b34801561095957600080fd5b5061042a610968366004613488565b611ebe565b34801561097957600080fd5b506103c561219b565b34801561098e57600080fd5b50600c546103f2906001600160a01b031681565b3480156109ae57600080fd5b5061042a6109bd366004613488565b612229565b3480156109ce57600080fd5b5061039b6109dd366004613085565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b348015610a1757600080fd5b5061042a610a2636600461335a565b6123aa565b348015610a3757600080fd5b5060085461046790600160301b900461ffff1681565b348015610a5957600080fd5b5061042a610a683660046134a3565b6123f2565b348015610a7957600080fd5b5061039b610a8836600461306a565b60106020526000908152604090205460ff1681565b348015610aa957600080fd5b5061042a610ab836600461306a565b6124f8565b348015610ac957600080fd5b5061042a610ad8366004613456565b6125e2565b348015610ae957600080fd5b50610b0d610af836600461306a565b600f6020526000908152604090205460ff1681565b60405160ff90911681526020016103a7565b348015610b2b57600080fd5b5061048f7f79800d7a879f6d3ff90ed42057b41065ab94943f7417273b44f9e3044f19617181565b60006001600160e01b031982166380ac58cd60e01b1480610b8457506001600160e01b03198216635b5e139f60e01b145b80610b9f57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610bb4906138e2565b80601f0160208091040260200160405190810160405280929190818152602001828054610be0906138e2565b8015610c2d5780601f10610c0257610100808354040283529160200191610c2d565b820191906000526020600020905b815481529060010190602001808311610c1057829003601f168201915b5050505050905090565b6000818152600360205260408120546001600160a01b0316610cb55760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000546001600160a01b03163314610cfb5760405162461bcd60e51b8152600401610cac9061369b565b8051825114610d3d5760405162461bcd60e51b815260206004820152600e60248201526d139bdd081cd85b594818dbdd5b9d60921b6044820152606401610cac565b60005b82518161ffff161015610dd857818161ffff1681518110610d6357610d636139b4565b6020026020010151600f6000858461ffff1681518110610d8557610d856139b4565b60200260200101516001600160a01b03166001600160a01b0316815260200190815260200160002060006101000a81548160ff021916908360ff1602179055508080610dd090613917565b915050610d40565b505050565b6000610de88261151a565b9050806001600160a01b0316836001600160a01b03161415610e575760405162461bcd60e51b815260206004820152602260248201527f455243373231533a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610cac565b336001600160a01b0382161480610e735750610e7381336109dd565b610ee55760405162461bcd60e51b815260206004820152603960248201527f455243373231533a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610cac565b610dd88383612611565b6000546001600160a01b03163314610f195760405162461bcd60e51b8152600401610cac9061369b565b600b80546001600160a01b039384166001600160a01b031991821617909155600c8054929093169116179055565b600c546001600160a01b0316336001600160a01b031614610f8957610f6d335b8261267f565b610f895760405162461bcd60e51b8152600401610cac90613649565b610dd8838383612777565b6000546001600160a01b03163314610fbe5760405162461bcd60e51b8152600401610cac9061369b565b600c8054911515600160a81b0260ff60a81b19909216919091179055565b610dd88383836040518060200160405280600081525061195d565b6000546001600160a01b0316331480611014575061101433610f67565b61107a5760405162461bcd60e51b815260206004820152603160248201527f455243373231534275726e61626c653a2063616c6c6572206973206e6f74206f6044820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b6064820152608401610cac565b61108381612916565b50565b6000818152600360205260408120546001600160a01b03161515610b9f565b6000546001600160a01b031633146110cf5760405162461bcd60e51b8152600401610cac9061369b565b80516110e2906007906020840190612eb1565b5050565b600c54600160a01b900460ff1661110f5760405162461bcd60e51b8152600401610cac906135f0565b32331461112e5760405162461bcd60e51b8152600401610cac90613627565b60085461ffff600160301b820481169161115991640100000000820481169162010000900416613859565b6111639190613859565b60085461ffff9182169161117c9160ff851691166137a3565b61ffff16111561119e5760405162461bcd60e51b8152600401610cac906136d0565b600a5461ffff1660ff821611156111e85760405162461bcd60e51b815260206004820152600e60248201526d115e18d959591cc8105b5bdd5b9d60921b6044820152606401610cac565b348160ff166009546111fa9190613811565b111561123c5760405162461bcd60e51b8152602060048201526011602482015270131bddc8141c9a58d948151bc8135a5b9d607a1b6044820152606401610cac565b60005b8160ff168160ff161015611283576008546112719033906112689060ff85169061ffff166137a3565b61ffff166129b1565b61127c6001826137d8565b905061123f565b506008546112999060ff83169061ffff166137a3565b6008805461ffff191661ffff9290921691909117905550565b606060006112bf836115d4565b9050806112e05760408051600080825260208201909252905b509392505050565b60008167ffffffffffffffff8111156112fb576112fb6139ca565b604051908082528060200260200182016040528015611324578160200160208202803683370190505b5090506000805b60085461ffff168110156113a4576000818152600360205260409020546001600160a01b0387811691161415611392578083838151811061136e5761136e6139b4565b60209081029190910101528161138381613939565b925050838210611392576113a4565b8061139c81613939565b91505061132b565b5090949350505050565b50919050565b600c54600160a01b900460ff166113dd5760405162461bcd60e51b8152600401610cac906135f0565b3233146113fc5760405162461bcd60e51b8152600401610cac90613627565b3360009081526010602052604090205460ff1661144e5760405162461bcd60e51b815260206004820152601060248201526f139bdd08111a585b5bdb99081b1a5cdd60821b6044820152606401610cac565b336000818152601060205260409020805460ff19169055600854611476919061ffff166129b1565b6008546114889061ffff1660016137a3565b6008805461ffff191661ffff92909216919091179055565b6000546001600160a01b031633146114ca5760405162461bcd60e51b8152600401610cac9061369b565b6008805465ffffffff000019166201000061ffff9586160265ffff00000000191617640100000000938516939093029290921767ffff0000000000001916600160301b9190931602919091179055565b6000818152600360205260408120546001600160a01b031680610b9f5760405162461bcd60e51b815260206004820152602a60248201527f455243373231533a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610cac565b6000546001600160a01b031633146115bc5760405162461bcd60e51b8152600401610cac9061369b565b600a805461ffff191661ffff92909216919091179055565b60006001600160a01b0382166116405760405162461bcd60e51b815260206004820152602b60248201527f455243373231533a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610cac565b506001600160a01b031660009081526004602052604090205490565b6000546001600160a01b031633146116865760405162461bcd60e51b8152600401610cac9061369b565b600080546040516001600160a01b03909116907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908390a3600080546001600160a01b0319169055565b6000546001600160a01b031633146116fa5760405162461bcd60e51b8152600401610cac9061369b565b600081511161173c5760405162461bcd60e51b815260206004820152600e60248201526d139bdd081e995c9bc818dbdd5b9d60921b6044820152606401610cac565b60005b81518161ffff1610156110e257600160106000848461ffff1681518110611768576117686139b4565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff1916911515919091179055806117a481613917565b91505061173f565b6000546001600160a01b031633146117d65760405162461bcd60e51b8152600401610cac9061369b565b6040514790339082156108fc029083906000818181858888f193505050501580156110e2573d6000803e3d6000fd5b606060028054610bb4906138e2565b600b54604051635de6dc5560e01b81526001600160a01b0383811660048301526000928392911690635de6dc559060240160006040518083038186803b15801561185d57600080fd5b505afa158015611871573d6000803e3d6000fd5b505050506040513d6000823e601f3d908101601f1916820160405261189991908101906132c2565b90506000805b82518160ff1610156112d857600e6000848360ff16815181106118c4576118c46139b4565b60209081029190910181015160ff90811683529082019290925260400160002054166118f857816118f481613939565b9250505b8061190281613954565b91505061189f565b6110e23383836129cb565b6000546001600160a01b0316331461193f5760405162461bcd60e51b8152600401610cac9061369b565b600c8054911515600160a01b0260ff60a01b19909216919091179055565b611967338361267f565b6119835760405162461bcd60e51b8152600401610cac90613649565b61198f84848484612a9a565b50505050565b6000818152600360205260409020546060906001600160a01b0316611a145760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610cac565b6000611a1e612acd565b90506000815111611a3e5760405180602001604052806000815250611a69565b80611a4884612adc565b604051602001611a5992919061352d565b6040516020818303038152906040525b9392505050565b600c54600160a81b900460ff16611ac95760405162461bcd60e51b815260206004820152601a60248201527f507269766174652053616c65206973206e6f74206163746976650000000000006044820152606401610cac565b336000908152600d602052604090205460ff1615611b1d5760405162461bcd60e51b8152602060048201526011602482015270596f75206d696e74656420616c6561647960781b6044820152606401610cac565b323314611b3c5760405162461bcd60e51b8152600401610cac90613627565b60085461ffff600160301b8204811691611b6791640100000000820481169162010000900416613859565b611b719190613859565b60085461ffff91821691611b8a9160ff881691166137a3565b61ffff161115611bac5760405162461bcd60e51b8152600401610cac906136d0565b600a5461ffff1660ff85161115611bf65760405162461bcd60e51b815260206004820152600e60248201526d115e18d959591cc8105b5bdd5b9d60921b6044820152606401610cac565b348460ff16600954611c089190613811565b1115611c4a5760405162461bcd60e51b8152602060048201526011602482015270131bddc8141c9a58d948151bc8135a5b9d607a1b6044820152606401610cac565b6040805180820182526013815272105b99dc9e599c9bd9dcc810dbdb9d1c9858dd606a1b60209182015281517f8cad95687ba82c2ce50e74f7b754645e5117c3a5bec8151c0726d5857980a866818301527fb90cd577cce776c648ed341f7f7e909b7e08addeb6f79956e515352827f120d381840152466060820152306080808301919091528351808303909101815260a0820184528051908301207f79800d7a879f6d3ff90ed42057b41065ab94943f7417273b44f9e3044f19617160c08301523360e083015260ff8816610100808401919091528451808403909101815261012083019094528351939092019290922061190160f01b6101408401526101428301829052610162830181905290916000906101820160408051601f198184030181528282528051602091820120600080855291840180845281905260ff8a169284019290925260608301889052608083018790529092509060019060a0016020604051602081039080840390855afa158015611dcc573d6000803e3d6000fd5b5050604051601f190151600a549092506001600160a01b038084166201000090920416149050611e325760405162461bcd60e51b8152602060048201526011602482015270496e76616c6964207369676e61746f727960781b6044820152606401610cac565b336000908152600d60205260408120805460ff191660011790555b8860ff168160ff161015611e8857600854611e769033906112689060ff85169061ffff166137a3565b611e816001826137d8565b9050611e4d565b50600854611e9e9060ff8a169061ffff166137a3565b6008805461ffff191661ffff929092169190911790555050505050505050565b600c54600160b01b900460ff16611f0d5760405162461bcd60e51b8152602060048201526013602482015272436c61696d206973206e6f742061637469766560681b6044820152606401610cac565b323314611f2c5760405162461bcd60e51b8152600401610cac90613627565b8060ff16611f3933611814565b1015611f875760405162461bcd60e51b815260206004820152601960248201527f446f6e2774206861766520656e6f75676820436572616d6963000000000000006044820152606401610cac565b600b5460009081906001600160a01b03166370a08231336040516001600160e01b031960e084901b1681526001600160a01b03909116600482015260240160206040518083038186803b158015611fdd57600080fd5b505afa158015611ff1573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190612015919061346f565b905060005b8160ff168160ff16101561211b57600b54604051632f745c5960e01b815233600482015260ff831660248201526000916001600160a01b031690632f745c599060440160206040518083038186803b15801561207557600080fd5b505afa158015612089573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906120ad919061346f565b60ff8082166000908152600e6020526040902054919250166120f45760ff81166000908152600e60205260409020805460ff19166001179055836120f081613954565b9450505b8460ff168460ff161415612108575061211b565b508061211381613954565b91505061201a565b506000612129846002613830565b905060005b8160ff168160ff161015612169576008546121579033906112689060ff85169061ffff166137a3565b6121626001826137d8565b905061212e565b5060085461217f9060ff83169061ffff166137a3565b6008805461ffff191661ffff9290921691909117905550505050565b600780546121a8906138e2565b80601f01602080910402602001604051908101604052809291908181526020018280546121d4906138e2565b80156122215780601f106121f657610100808354040283529160200191612221565b820191906000526020600020905b81548152906001019060200180831161220457829003601f168201915b505050505081565b600c54600160b01b900460ff166122785760405162461bcd60e51b8152602060048201526013602482015272436c61696d206973206e6f742061637469766560681b6044820152606401610cac565b3233146122975760405162461bcd60e51b8152600401610cac90613627565b336000908152600f602052604090205460ff808316911610156122ee5760405162461bcd60e51b815260206004820152600f60248201526e105b1c9958591e4810db185a5b5959608a1b6044820152606401610cac565b60006122fb826002613830565b336000908152600f602052604090205490915061231c90839060ff16613893565b336000908152600f60205260408120805460ff191660ff93909316929092179091555b8160ff168160ff16101561237a576008546123689033906112689060ff85169061ffff166137a3565b6123736001826137d8565b905061233f565b506008546123909060ff83169061ffff166137a3565b6008805461ffff191661ffff929092169190911790555050565b6000546001600160a01b031633146123d45760405162461bcd60e51b8152600401610cac9061369b565b600c8054911515600160b01b0260ff60b01b19909216919091179055565b6000546001600160a01b0316331461241c5760405162461bcd60e51b8152600401610cac9061369b565b600c54600160a01b900460ff166124455760405162461bcd60e51b8152600401610cac906135f0565b3233146124645760405162461bcd60e51b8152600401610cac90613627565b60085461ffff6201000082048116916124829160ff861691166137a3565b61ffff1611156124a45760405162461bcd60e51b8152600401610cac906136d0565b60005b8260ff168160ff1610156124e2576008546124d09083906112689060ff85169061ffff166137a3565b6124db6001826137d8565b90506124a7565b506008546123909060ff84169061ffff166137a3565b6000546001600160a01b031633146125225760405162461bcd60e51b8152600401610cac9061369b565b6001600160a01b0381166125875760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610cac565b600080546040516001600160a01b03808516939216917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e091a3600080546001600160a01b0319166001600160a01b0392909216919091179055565b6000546001600160a01b0316331461260c5760405162461bcd60e51b8152600401610cac9061369b565b600955565b600081815260056020526040902080546001600160a01b0319166001600160a01b03841690811790915581906126468261151a565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600360205260408120546001600160a01b03166126f95760405162461bcd60e51b815260206004820152602d60248201527f455243373231533a206f70657261746f7220717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b6064820152608401610cac565b60006127048361151a565b9050806001600160a01b0316846001600160a01b0316148061273f5750836001600160a01b031661273484610c37565b6001600160a01b0316145b8061276f57506001600160a01b0380821660009081526006602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b031661278a8261151a565b6001600160a01b0316146127ef5760405162461bcd60e51b815260206004820152602660248201527f455243373231533a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610cac565b6001600160a01b0382166128535760405162461bcd60e51b815260206004820152602560248201527f455243373231533a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610cac565b61285e600082612611565b6001600160a01b038316600090815260046020526040812080546001929061288790849061387c565b90915550506001600160a01b03821660009081526004602052604081208054600192906128b59084906137c0565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b60006129218261151a565b905061292e600083612611565b6001600160a01b038116600090815260046020526040812080546001929061295790849061387c565b909155505060008281526003602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b6110e2828260405180602001604052806000815250612bda565b816001600160a01b0316836001600160a01b03161415612a2d5760405162461bcd60e51b815260206004820152601a60248201527f455243373231533a20617070726f766520746f2063616c6c65720000000000006044820152606401610cac565b6001600160a01b03838116600081815260066020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b612aa5848484612777565b612ab184848484612c58565b61198f5760405162461bcd60e51b8152600401610cac906136fb565b606060078054610bb4906138e2565b606081612b005750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612b2a5780612b1481613939565b9150612b239050600a836137fd565b9150612b04565b60008167ffffffffffffffff811115612b4557612b456139ca565b6040519080825280601f01601f191660200182016040528015612b6f576020820181803683370190505b5090505b841561276f57612b8460018361387c565b9150612b91600a86613974565b612b9c9060306137c0565b60f81b818381518110612bb157612bb16139b4565b60200101906001600160f81b031916908160001a905350612bd3600a866137fd565b9450612b73565b612be48383612d65565b612bf16000848484612c58565b610dd85760405162461bcd60e51b815260206004820152603260248201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560448201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b6064820152608401610cac565b60006001600160a01b0384163b15612d5a57604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612c9c90339089908890889060040161355c565b602060405180830381600087803b158015612cb657600080fd5b505af1925050508015612ce6575060408051601f3d908101601f19168201909252612ce391810190613392565b60015b612d40573d808015612d14576040519150601f19603f3d011682016040523d82523d6000602084013e612d19565b606091505b508051612d385760405162461bcd60e51b8152600401610cac906136fb565b805181602001fd5b6001600160e01b031916630a85bd0160e11b14905061276f565b506001949350505050565b6001600160a01b038216612dc55760405162461bcd60e51b815260206004820152602160248201527f455243373231533a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610cac565b6000818152600360205260409020546001600160a01b031615612e2a5760405162461bcd60e51b815260206004820152601d60248201527f455243373231533a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610cac565b6001600160a01b0382166000908152600460205260408120805460019290612e539084906137c0565b909155505060008181526003602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b828054612ebd906138e2565b90600052602060002090601f016020900481019282612edf5760008555612f25565b82601f10612ef857805160ff1916838001178555612f25565b82800160010185558215612f25579182015b82811115612f25578251825591602001919060010190612f0a565b50612f31929150612f35565b5090565b5b80821115612f315760008155600101612f36565b600067ffffffffffffffff831115612f6457612f646139ca565b612f77601f8401601f191660200161374e565b9050828152838383011115612f8b57600080fd5b828260208301376000602084830101529392505050565b80356001600160a01b0381168114612fb957600080fd5b919050565b600082601f830112612fcf57600080fd5b81356020612fe4612fdf8361377f565b61374e565b80838252828201915082860187848660051b890101111561300457600080fd5b60005b8581101561302a5761301882612fa2565b84529284019290840190600101613007565b5090979650505050505050565b80358015158114612fb957600080fd5b803561ffff81168114612fb957600080fd5b803560ff81168114612fb957600080fd5b60006020828403121561307c57600080fd5b611a6982612fa2565b6000806040838503121561309857600080fd5b6130a183612fa2565b91506130af60208401612fa2565b90509250929050565b6000806000606084860312156130cd57600080fd5b6130d684612fa2565b92506130e460208501612fa2565b9150604084013590509250925092565b6000806000806080858703121561310a57600080fd5b61311385612fa2565b935061312160208601612fa2565b925060408501359150606085013567ffffffffffffffff81111561314457600080fd5b8501601f8101871361315557600080fd5b61316487823560208401612f4a565b91505092959194509250565b6000806040838503121561318357600080fd5b61318c83612fa2565b91506130af60208401613037565b600080604083850312156131ad57600080fd5b6131b683612fa2565b946020939093013593505050565b6000602082840312156131d657600080fd5b813567ffffffffffffffff8111156131ed57600080fd5b61276f84828501612fbe565b6000806040838503121561320c57600080fd5b823567ffffffffffffffff8082111561322457600080fd5b61323086838701612fbe565b935060209150818501358181111561324757600080fd5b85019050601f8101861361325a57600080fd5b8035613268612fdf8261377f565b80828252848201915084840189868560051b870101111561328857600080fd5b600094505b838510156132b25761329e81613059565b83526001949094019391850191850161328d565b5080955050505050509250929050565b600060208083850312156132d557600080fd5b825167ffffffffffffffff8111156132ec57600080fd5b8301601f810185136132fd57600080fd5b805161330b612fdf8261377f565b80828252848201915084840188868560051b870101111561332b57600080fd5b600094505b8385101561334e578051835260019490940193918501918501613330565b50979650505050505050565b60006020828403121561336c57600080fd5b611a6982613037565b60006020828403121561338757600080fd5b8135611a69816139e0565b6000602082840312156133a457600080fd5b8151611a69816139e0565b6000602082840312156133c157600080fd5b813567ffffffffffffffff8111156133d857600080fd5b8201601f810184136133e957600080fd5b61276f84823560208401612f4a565b60006020828403121561340a57600080fd5b611a6982613047565b60008060006060848603121561342857600080fd5b61343184613047565b925061343f60208501613047565b915061344d60408501613047565b90509250925092565b60006020828403121561346857600080fd5b5035919050565b60006020828403121561348157600080fd5b5051919050565b60006020828403121561349a57600080fd5b611a6982613059565b600080604083850312156134b657600080fd5b6130a183613059565b600080600080608085870312156134d557600080fd5b6134de85613059565b93506134ec60208601613059565b93969395505050506040820135916060013590565b600081518084526135198160208601602086016138b6565b601f01601f19169290920160200192915050565b6000835161353f8184602088016138b6565b8351908301906135538183602088016138b6565b01949350505050565b6001600160a01b038581168252841660208201526040810183905260806060820181905260009061358f90830184613501565b9695505050505050565b6020808252825182820181905260009190848201906040850190845b818110156135d1578351835292840192918401916001016135b5565b50909695505050505050565b602081526000611a696020830184613501565b60208082526019908201527f5075626c69632053616c65206973206e6f742061637469766500000000000000604082015260600190565b6020808252600890820152674f6e6c7920454f4160c01b604082015260600190565b60208082526032908201527f455243373231533a207472616e736665722063616c6c6572206973206e6f74206040820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b606082015260800190565b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601190820152704d6178204c696d697420546f2053616c6560781b604082015260600190565b60208082526033908201527f455243373231533a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b604051601f8201601f1916810167ffffffffffffffff81118282101715613777576137776139ca565b604052919050565b600067ffffffffffffffff821115613799576137996139ca565b5060051b60200190565b600061ffff80831681851680830382111561355357613553613988565b600082198211156137d3576137d3613988565b500190565b600060ff821660ff84168060ff038211156137f5576137f5613988565b019392505050565b60008261380c5761380c61399e565b500490565b600081600019048311821515161561382b5761382b613988565b500290565b600060ff821660ff84168160ff048111821515161561385157613851613988565b029392505050565b600061ffff8381169083168181101561387457613874613988565b039392505050565b60008282101561388e5761388e613988565b500390565b600060ff821660ff8416808210156138ad576138ad613988565b90039392505050565b60005b838110156138d15781810151838201526020016138b9565b8381111561198f5750506000910152565b600181811c908216806138f657607f821691505b602082108114156113ae57634e487b7160e01b600052602260045260246000fd5b600061ffff8083168181141561392f5761392f613988565b6001019392505050565b600060001982141561394d5761394d613988565b5060010190565b600060ff821660ff81141561396b5761396b613988565b60010192915050565b6000826139835761398361399e565b500690565b634e487b7160e01b600052601160045260246000fd5b634e487b7160e01b600052601260045260246000fd5b634e487b7160e01b600052603260045260246000fd5b634e487b7160e01b600052604160045260246000fd5b6001600160e01b03198116811461108357600080fdfea2646970667358221220f9e1e09b22ad9742f96b412b1a597f9addaa699e0f80ad0306ac03102d87961f64736f6c63430008070033

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

00000000000000000000000004b9aaca1ad41cb19f6c21aa512cec2765d87698

-----Decoded View---------------
Arg [0] : _admin (address): 0x04b9AAca1AD41Cb19f6c21Aa512ceC2765d87698

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 00000000000000000000000004b9aaca1ad41cb19f6c21aa512cec2765d87698


Deployed Bytecode Sourcemap

479:9726:1:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1550:347:4;;;;;;;;;;-1:-1:-1;1550:347:4;;;;;:::i;:::-;;:::i;:::-;;;11968:14:13;;11961:22;11943:41;;11931:2;11916:18;1550:347:4;;;;;;;;2675:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;4313:295::-;;;;;;;;;;-1:-1:-1;4313:295:4;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;10341:32:13;;;10323:51;;10311:2;10296:18;4313:295:4;10177:203:13;2739:309:1;;;;;;;;;;-1:-1:-1;2739:309:1;;;;;:::i;:::-;;:::i;:::-;;3847:404:4;;;;;;;;;;-1:-1:-1;3847:404:4;;;;;:::i;:::-;;:::i;714:23:1:-;;;;;;;;;;-1:-1:-1;714:23:1;;;;;;;;;;;25873:6:13;25861:19;;;25843:38;;25831:2;25816:18;714:23:1;25699:188:13;4096:96:1;;;;;;;;;;-1:-1:-1;4174:11:1;;;;4096:96;;;12141:25:13;;;12129:2;12114:18;4096:96:1;11995:177:13;1207:152:1;;;;;;;;;;;;1257:102;1207:152;;2534:199;;;;;;;;;;-1:-1:-1;2534:199:1;;;;;:::i;:::-;;:::i;3627:463::-;;;;;;;;;;-1:-1:-1;3627:463:1;;;;;:::i;:::-;;:::i;2328:99::-;;;;;;;;;;-1:-1:-1;2328:99:1;;;;;:::i;:::-;;:::i;588:24::-;;;;;;;;;;-1:-1:-1;588:24:1;;;;;;;;;;;840:22;;;;;;;;;;-1:-1:-1;840:22:1;;;;-1:-1:-1;;;840:22:1;;;;;;618:25;;;;;;;;;;-1:-1:-1;618:25:1;;;;;;;;;;;5624:179:4;;;;;;;;;;-1:-1:-1;5624:179:4;;;;;:::i;:::-;;:::i;442:319:5:-;;;;;;;;;;-1:-1:-1;442:319:5;;;;;:::i;:::-;;:::i;897:21:1:-;;;;;;;;;;-1:-1:-1;897:21:1;;;;-1:-1:-1;;;897:21:1;;;;;;3519:102;;;;;;;;;;-1:-1:-1;3519:102:1;;;;;:::i;:::-;;:::i;3295:101::-;;;;;;;;;;-1:-1:-1;3295:101:1;;;;;:::i;:::-;;:::i;6408:662::-;;;;;;:::i;:::-;;:::i;4198:758::-;;;;;;;;;;-1:-1:-1;4198:758:1;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;1141:60::-;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;1141:60:1;;;;;7583:350;;;;;;;;;;;;;:::i;1968:251::-;;;;;;;;;;-1:-1:-1;1968:251:1;;;;;:::i;:::-;;:::i;2299:314:4:-;;;;;;;;;;-1:-1:-1;2299:314:4;;;;;:::i;:::-;;:::i;684:24:1:-;;;;;;;;;;;;;;;;1859:103;;;;;;;;;;-1:-1:-1;1859:103:1;;;;;:::i;:::-;;:::i;1957:284:4:-;;;;;;;;;;-1:-1:-1;1957:284:4;;;;;:::i;:::-;;:::i;1715:145:10:-;;;;;;;;;;;;;:::i;3054:235:1:-;;;;;;;;;;-1:-1:-1;3054:235:1;;;;;:::i;:::-;;:::i;9868:157::-;;;;;;;;;;;;;:::i;772:26::-;;;;;;;;;;-1:-1:-1;772:26:1;;;;-1:-1:-1;;;;;772:26:1;;;1083:85:10;;;;;;;;;;-1:-1:-1;1129:7:10;1155:6;-1:-1:-1;;;;;1155:6:10;1083:85;;2837:102:4;;;;;;;;;;;;;:::i;7939:386:1:-;;;;;;;;;;-1:-1:-1;7939:386:1;;;;;:::i;:::-;;:::i;925:48::-;;;;;;;;;;-1:-1:-1;925:48:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;979:44;;;;;;;;;;-1:-1:-1;979:44:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;4676:181:4;;;;;;;;;;-1:-1:-1;4676:181:4;;;;;:::i;:::-;;:::i;2225:97:1:-;;;;;;;;;;-1:-1:-1;2225:97:1;;;;;:::i;:::-;;:::i;5870:355:4:-;;;;;;;;;;-1:-1:-1;5870:355:4;;;;;:::i;:::-;;:::i;868:23:1:-;;;;;;;;;;-1:-1:-1;868:23:1;;;;-1:-1:-1;;;868:23:1;;;;;;3005:451:4;;;;;;;;;;-1:-1:-1;3005:451:4;;;;;:::i;:::-;;:::i;556:25:1:-;;;;;;;;;;-1:-1:-1;556:25:1;;;;;;;;4962:1440;;;;;;:::i;:::-;;:::i;8331:963::-;;;;;;;;;;-1:-1:-1;8331:963:1;;;;;:::i;:::-;;:::i;524:26::-;;;;;;;;;;;;;:::i;804:29::-;;;;;;;;;;-1:-1:-1;804:29:1;;;;-1:-1:-1;;;;;804:29:1;;;9300:562;;;;;;;;;;-1:-1:-1;9300:562:1;;;;;:::i;:::-;;:::i;4923:206:4:-;;;;;;;;;;-1:-1:-1;4923:206:4;;;;;:::i;:::-;-1:-1:-1;;;;;5087:25:4;;;5060:4;5087:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;4923:206;2433:95:1;;;;;;;;;;-1:-1:-1;2433:95:1;;;;;:::i;:::-;;:::i;649:28::-;;;;;;;;;;-1:-1:-1;649:28:1;;;;-1:-1:-1;;;649:28:1;;;;;;7076:501;;;;;;;;;;-1:-1:-1;7076:501:1;;;;;:::i;:::-;;:::i;1087:47::-;;;;;;;;;;-1:-1:-1;1087:47:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;2009:274:10;;;;;;;;;;-1:-1:-1;2009:274:10;;;;;:::i;:::-;;:::i;1749:104:1:-;;;;;;;;;;-1:-1:-1;1749:104:1;;;;;:::i;:::-;;:::i;1029:52::-;;;;;;;;;;-1:-1:-1;1029:52:1;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;26246:4:13;26234:17;;;26216:36;;26204:2;26189:18;1029:52:1;26074:184:13;1365:91:1;;;;;;;;;;;;1413:43;1365:91;;1550:347:4;1694:4;-1:-1:-1;;;;;;1733:41:4;;-1:-1:-1;;;1733:41:4;;:105;;-1:-1:-1;;;;;;;1790:48:4;;-1:-1:-1;;;1790:48:4;1733:105;:157;;;-1:-1:-1;;;;;;;;;;921:41:3;;;1854:36:4;1714:176;1550:347;-1:-1:-1;;1550:347:4:o;2675:98::-;2729:13;2761:5;2754:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2675:98;:::o;4313:295::-;4429:7;7821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7821:16:4;4452:107;;;;-1:-1:-1;;;4452:107:4;;21255:2:13;4452:107:4;;;21237:21:13;21294:2;21274:18;;;21267:30;21333:34;21313:18;;;21306:62;-1:-1:-1;;;21384:18:13;;;21377:42;21436:19;;4452:107:4;;;;;;;;;-1:-1:-1;4577:24:4;;;;:15;:24;;;;;;-1:-1:-1;;;;;4577:24:4;;4313:295::o;2739:309:1:-;1129:7:10;1155:6;-1:-1:-1;;;;;1155:6:10;666:10:2;1295:23:10;1287:68;;;;-1:-1:-1;;;1287:68:10;;;;;;;:::i;:::-;2890:7:1::1;:14;2872:7;:14;:32;2864:59;;;::::0;-1:-1:-1;;;2864:59:1;;18278:2:13;2864:59:1::1;::::0;::::1;18260:21:13::0;18317:2;18297:18;;;18290:30;-1:-1:-1;;;18336:18:13;;;18329:44;18390:18;;2864:59:1::1;18076:338:13::0;2864:59:1::1;2938:8;2933:109;2952:7;:14;2948:1;:18;;;2933:109;;;3021:7;3029:1;3021:10;;;;;;;;;;:::i;:::-;;;;;;;2987:19;:31;3007:7;3015:1;3007:10;;;;;;;;;;:::i;:::-;;;;;;;-1:-1:-1::0;;;;;2987:31:1::1;-1:-1:-1::0;;;;;2987:31:1::1;;;;;;;;;;;;;:44;;;;;;;;;;;;;;;;;;2968:3;;;;;:::i;:::-;;;;2933:109;;;;2739:309:::0;;:::o;3847:404:4:-;3927:13;3943:24;3959:7;3943:15;:24::i;:::-;3927:40;;3991:5;-1:-1:-1;;;;;3985:11:4;:2;-1:-1:-1;;;;;3985:11:4;;;3977:58;;;;-1:-1:-1;;;3977:58:4;;23556:2:13;3977:58:4;;;23538:21:13;23595:2;23575:18;;;23568:30;23634:34;23614:18;;;23607:62;-1:-1:-1;;;23685:18:13;;;23678:32;23727:19;;3977:58:4;23354:398:13;3977:58:4;666:10:2;-1:-1:-1;;;;;4067:21:4;;;;:62;;-1:-1:-1;4092:37:4;4109:5;666:10:2;4923:206:4;:::i;4092:37::-;4046:166;;;;-1:-1:-1;;;4046:166:4;;19028:2:13;4046:166:4;;;19010:21:13;19067:2;19047:18;;;19040:30;19106:34;19086:18;;;19079:62;19177:27;19157:18;;;19150:55;19222:19;;4046:166:4;18826:421:13;4046:166:4;4223:21;4232:2;4236:7;4223:8;:21::i;2534:199:1:-;1129:7:10;1155:6;-1:-1:-1;;;;;1155:6:10;666:10:2;1295:23:10;1287:68;;;;-1:-1:-1;;;1287:68:10;;;;;;;:::i;:::-;2658:11:1::1;:26:::0;;-1:-1:-1;;;;;2658:26:1;;::::1;-1:-1:-1::0;;;;;;2658:26:1;;::::1;;::::0;;;2694:14:::1;:32:::0;;;;;::::1;::::0;::::1;;::::0;;2534:199::o;3627:463::-;3867:14;;-1:-1:-1;;;;;3867:14:1;666:10:2;-1:-1:-1;;;;;3851:30:1;;3847:198;;3920:41;666:10:2;3939:12:1;3953:7;3920:18;:41::i;:::-;3895:150;;;;-1:-1:-1;;;3895:150:1;;;;;;;:::i;:::-;4055:28;4065:4;4071:2;4075:7;4055:9;:28::i;2328:99::-;1129:7:10;1155:6;-1:-1:-1;;;;;1155:6:10;666:10:2;1295:23:10;1287:68;;;;-1:-1:-1;;;1287:68:10;;;;;;;:::i;:::-;2400:11:1::1;:20:::0;;;::::1;;-1:-1:-1::0;;;2400:20:1::1;-1:-1:-1::0;;;;2400:20:1;;::::1;::::0;;;::::1;::::0;;2328:99::o;5624:179:4:-;5757:39;5774:4;5780:2;5784:7;5757:39;;;;;;;;;;;;:16;:39::i;442:319:5:-;1129:7:10;1155:6;-1:-1:-1;;;;;1155:6:10;666:10:2;571:23:5;;:84;;-1:-1:-1;614:41:5;666:10:2;633:12:5;587:96:2;614:41:5;550:180;;;;-1:-1:-1;;;550:180:5;;16057:2:13;550:180:5;;;16039:21:13;16096:2;16076:18;;;16069:30;16135:34;16115:18;;;16108:62;-1:-1:-1;;;16186:18:13;;;16179:47;16243:19;;550:180:5;15855:413:13;550:180:5;740:14;746:7;740:5;:14::i;:::-;442:319;:::o;3519:102:1:-;3574:4;7821:16:4;;;:7;:16;;;;;;-1:-1:-1;;;;;7821:16:4;:30;;3597:17:1;7733:125:4;3295:101:1;1129:7:10;1155:6;-1:-1:-1;;;;;1155:6:10;666:10:2;1295:23:10;1287:68;;;;-1:-1:-1;;;1287:68:10;;;;;;;:::i;:::-;3367:22:1;;::::1;::::0;:12:::1;::::0;:22:::1;::::0;::::1;::::0;::::1;:::i;:::-;;3295:101:::0;:::o;6408:662::-;6486:10;;-1:-1:-1;;;6486:10:1;;;;6478:48;;;;-1:-1:-1;;;6478:48:1;;;;;;;:::i;:::-;6544:9;6557:10;6544:23;6536:44;;;;-1:-1:-1;;;6536:44:1;;;;;;;:::i;:::-;6687:14;;;-1:-1:-1;;;6687:14:1;;;;;6660:24;;6673:11;;;;;;6660:10;;;;:24;:::i;:::-;:41;;;;:::i;:::-;6611:11;;:90;;;;;:29;;;;;;:11;:29;:::i;:::-;:90;;;;6590:154;;;;-1:-1:-1;;;6590:154:1;;;;;;;:::i;:::-;6781:9;;;;6762:28;;;;;6754:55;;;;-1:-1:-1;;;6754:55:1;;14140:2:13;6754:55:1;;;14122:21:13;14179:2;14159:18;;;14152:30;-1:-1:-1;;;14198:18:13;;;14191:44;14252:18;;6754:55:1;13938:338:13;6754:55:1;6858:9;6839:15;6827:27;;:9;;:27;;;;:::i;:::-;:40;;6819:70;;;;-1:-1:-1;;;6819:70:1;;17932:2:13;6819:70:1;;;17914:21:13;17971:2;17951:18;;;17944:30;-1:-1:-1;;;17990:18:13;;;17983:47;18047:18;;6819:70:1;17730:341:13;6819:70:1;6905:7;6900:110;6922:15;6918:19;;:1;:19;;;6900:110;;;6983:11;;6961:38;;6971:10;;6983:15;;;;;;:11;;:15;:::i;:::-;6961:38;;:9;:38::i;:::-;6939:6;6944:1;6939:6;;:::i;:::-;;;6900:110;;;-1:-1:-1;7034:11:1;;:29;;;;;;:11;;:29;:::i;:::-;7020:11;:43;;-1:-1:-1;;7020:43:1;;;;;;;;;;;;-1:-1:-1;6408:662:1:o;4198:758::-;4284:16;4316:18;4337:16;4347:5;4337:9;:16::i;:::-;4316:37;-1:-1:-1;4368:15:1;4364:586;;4406:16;;;4420:1;4406:16;;;;;;;;;;;-1:-1:-1;4399:23:1;4198:758;-1:-1:-1;;;4198:758:1:o;4364:586::-;4453:23;4493:10;4479:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;4479:25:1;;4453:51;;4518:19;4555:15;4585:328;4174:11;;;;4603:7;:23;4585:328;;;4661:16;;;;:7;:16;;;;;;-1:-1:-1;;;;;4661:25:1;;;:16;;:25;4657:242;;;4732:7;4710:6;4717:11;4710:19;;;;;;;;:::i;:::-;;;;;;;;;;:29;4761:13;;;;:::i;:::-;;;;4815:10;4800:11;:25;4796:85;;4853:5;;4796:85;4628:9;;;;:::i;:::-;;;;4585:328;;;-1:-1:-1;4933:6:1;;4198:758;-1:-1:-1;;;;4198:758:1:o;4364:586::-;4306:650;4198:758;;;:::o;7583:350::-;7635:10;;-1:-1:-1;;;7635:10:1;;;;7627:48;;;;-1:-1:-1;;;7627:48:1;;;;;;;:::i;:::-;7693:9;7706:10;7693:23;7685:44;;;;-1:-1:-1;;;7685:44:1;;;;;;;:::i;:::-;7763:10;7747:27;;;;:15;:27;;;;;;;;7739:56;;;;-1:-1:-1;;;7739:56:1;;19797:2:13;7739:56:1;;;19779:21:13;19836:2;19816:18;;;19809:30;-1:-1:-1;;;19855:18:13;;;19848:46;19911:18;;7739:56:1;19595:340:13;7739:56:1;7822:10;7836:5;7806:27;;;:15;:27;;;;;:35;;-1:-1:-1;;7806:35:1;;;7874:11;;7852:34;;7822:10;7874:11;;7852:9;:34::i;:::-;7911:11;;:15;;:11;;;:15;:::i;:::-;7897:11;:29;;-1:-1:-1;;7897:29:1;;;;;;;;;;;;7583:350::o;1968:251::-;1129:7:10;1155:6;-1:-1:-1;;;;;1155:6:10;666:10:2;1295:23:10;1287:68;;;;-1:-1:-1;;;1287:68:10;;;;;;;:::i;:::-;2110:10:1::1;:24:::0;;-1:-1:-1;;2144:26:1;2110:24;::::1;::::0;;::::1;;-1:-1:-1::0;;2144:26:1;;;;;::::1;::::0;;;::::1;::::0;;;::::1;-1:-1:-1::0;;2180:32:1::1;-1:-1:-1::0;;;2180:32:1;;;::::1;;::::0;;;::::1;::::0;;1968:251::o;2299:314:4:-;2411:7;2450:16;;;:7;:16;;;;;;-1:-1:-1;;;;;2450:16:4;2497:19;2476:108;;;;-1:-1:-1;;;2476:108:4;;22383:2:13;2476:108:4;;;22365:21:13;22422:2;22402:18;;;22395:30;22461:34;22441:18;;;22434:62;-1:-1:-1;;;22512:18:13;;;22505:40;22562:19;;2476:108:4;22181:406:13;1859:103:1;1129:7:10;1155:6;-1:-1:-1;;;;;1155:6:10;666:10:2;1295:23:10;1287:68;;;;-1:-1:-1;;;1287:68:10;;;;;;;:::i;:::-;1931:9:1::1;:24:::0;;-1:-1:-1;;1931:24:1::1;;::::0;;;::::1;::::0;;;::::1;::::0;;1859:103::o;1957:284:4:-;2069:7;-1:-1:-1;;;;;2113:19:4;;2092:109;;;;-1:-1:-1;;;2092:109:4;;16830:2:13;2092:109:4;;;16812:21:13;16869:2;16849:18;;;16842:30;16908:34;16888:18;;;16881:62;-1:-1:-1;;;16959:18:13;;;16952:41;17010:19;;2092:109:4;16628:407:13;2092:109:4;-1:-1:-1;;;;;;2218:16:4;;;;;:9;:16;;;;;;;1957:284::o;1715:145:10:-;1129:7;1155:6;-1:-1:-1;;;;;1155:6:10;666:10:2;1295:23:10;1287:68;;;;-1:-1:-1;;;1287:68:10;;;;;;;:::i;:::-;1821:1:::1;1805:6:::0;;1784:40:::1;::::0;-1:-1:-1;;;;;1805:6:10;;::::1;::::0;1784:40:::1;::::0;1821:1;;1784:40:::1;1851:1;1834:19:::0;;-1:-1:-1;;;;;;1834:19:10::1;::::0;;1715:145::o;3054:235:1:-;1129:7:10;1155:6;-1:-1:-1;;;;;1155:6:10;666:10:2;1295:23:10;1287:68;;;;-1:-1:-1;;;1287:68:10;;;;;;;:::i;:::-;3154:1:1::1;3137:7;:14;:18;3129:45;;;::::0;-1:-1:-1;;;3129:45:1;;19454:2:13;3129:45:1::1;::::0;::::1;19436:21:13::0;19493:2;19473:18;;;19466:30;-1:-1:-1;;;19512:18:13;;;19505:44;19566:18;;3129:45:1::1;19252:338:13::0;3129:45:1::1;3189:8;3184:99;3203:7;:14;3199:1;:18;;;3184:99;;;3268:4;3238:15;:27;3254:7;3262:1;3254:10;;;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;3238:27:1::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;3238:27:1;:34;;-1:-1:-1;;3238:34:1::1;::::0;::::1;;::::0;;;::::1;::::0;;3219:3;::::1;::::0;::::1;:::i;:::-;;;;3184:99;;9868:157:::0;1129:7:10;1155:6;-1:-1:-1;;;;;1155:6:10;666:10:2;1295:23:10;1287:68;;;;-1:-1:-1;;;1287:68:10;;;;;;;:::i;:::-;9974:44:1::1;::::0;9943:21:::1;::::0;666:10:2;;9974:44:1;::::1;;;::::0;9943:21;;9974:44:::1;::::0;;;9943:21;666:10:2;9974:44:1;::::1;;;;;;;;;;;;;::::0;::::1;;;;2837:102:4::0;2893:13;2925:7;2918:14;;;;;:::i;7939:386:1:-;8054:11;;8048:42;;-1:-1:-1;;;8048:42:1;;-1:-1:-1;;;;;10341:32:13;;;8048:42:1;;;10323:51:13;8001:7:1;;;;8054:11;;;8048:35;;10296:18:13;;8048:42:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;8048:42:1;;;;;;;;;;;;:::i;:::-;8020:70;;8101:22;8138:7;8133:154;8151:8;:15;8147:1;:19;;;8133:154;;;8192:14;:34;8213:8;8222:1;8213:11;;;;;;;;;;:::i;:::-;;;;;;;;;;;;8192:34;;;;;;;;;;;;;;;-1:-1:-1;8192:34:1;;;8187:90;;8246:16;;;;:::i;:::-;;;;8187:90;8168:3;;;;:::i;:::-;;;;8133:154;;4676:181:4;4798:52;666:10:2;4831:8:4;4841;4798:18;:52::i;2225:97:1:-;1129:7:10;1155:6;-1:-1:-1;;;;;1155:6:10;666:10:2;1295:23:10;1287:68;;;;-1:-1:-1;;;1287:68:10;;;;;;;:::i;:::-;2296:10:1::1;:19:::0;;;::::1;;-1:-1:-1::0;;;2296:19:1::1;-1:-1:-1::0;;;;2296:19:1;;::::1;::::0;;;::::1;::::0;;2225:97::o;5870:355:4:-;6052:41;666:10:2;6085:7:4;6052:18;:41::i;:::-;6031:138;;;;-1:-1:-1;;;6031:138:4;;;;;;;:::i;:::-;6179:39;6193:4;6199:2;6203:7;6212:5;6179:13;:39::i;:::-;5870:355;;;;:::o;3005:451::-;7798:4;7821:16;;;:7;:16;;;;;;3118:13;;-1:-1:-1;;;;;7821:16:4;3147:110;;;;-1:-1:-1;;;3147:110:4;;22794:2:13;3147:110:4;;;22776:21:13;22833:2;22813:18;;;22806:30;22872:34;22852:18;;;22845:62;-1:-1:-1;;;22923:18:13;;;22916:45;22978:19;;3147:110:4;22592:411:13;3147:110:4;3268:21;3292:10;:8;:10::i;:::-;3268:34;;3355:1;3337:7;3331:21;:25;:118;;;;;;;;;;;;;;;;;3399:7;3408:18;:7;:16;:18::i;:::-;3382:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3331:118;3312:137;3005:451;-1:-1:-1;;;3005:451:4:o;4962:1440:1:-;5116:11;;-1:-1:-1;;;5116:11:1;;;;5108:50;;;;-1:-1:-1;;;5108:50:1;;16475:2:13;5108:50:1;;;16457:21:13;16514:2;16494:18;;;16487:30;16553:28;16533:18;;;16526:56;16599:18;;5108:50:1;16273:350:13;5108:50:1;5194:10;5177:28;;;;:16;:28;;;;;;;;5176:29;5168:59;;;;-1:-1:-1;;;5168:59:1;;14483:2:13;5168:59:1;;;14465:21:13;14522:2;14502:18;;;14495:30;-1:-1:-1;;;14541:18:13;;;14534:47;14598:18;;5168:59:1;14281:341:13;5168:59:1;5245:9;5258:10;5245:23;5237:44;;;;-1:-1:-1;;;5237:44:1;;;;;;;:::i;:::-;5388:14;;;-1:-1:-1;;;5388:14:1;;;;;5361:24;;5374:11;;;;;;5361:10;;;;:24;:::i;:::-;:41;;;;:::i;:::-;5312:11;;:90;;;;;:29;;;;;;:11;:29;:::i;:::-;:90;;;;5291:154;;;;-1:-1:-1;;;5291:154:1;;;;;;;:::i;:::-;5482:9;;;;5463:28;;;;;5455:55;;;;-1:-1:-1;;;5455:55:1;;14140:2:13;5455:55:1;;;14122:21:13;14179:2;14159:18;;;14152:30;-1:-1:-1;;;14198:18:13;;;14191:44;14252:18;;5455:55:1;13938:338:13;5455:55:1;5559:9;5540:15;5528:27;;:9;;:27;;;;:::i;:::-;:40;;5520:70;;;;-1:-1:-1;;;5520:70:1;;17932:2:13;5520:70:1;;;17914:21:13;17971:2;17951:18;;;17944:30;-1:-1:-1;;;17990:18:13;;;17983:47;18047:18;;5520:70:1;17730:341:13;5520:70:1;5727:13;;;;;;;;;;;-1:-1:-1;;;5727:13:1;;;;;5650:167;;1257:102;5650:167;;;12765:25:13;5711:31:1;12806:18:13;;;12799:34;10154:9:1;12849:18:13;;;12842:34;5798:4:1;12892:18:13;;;;12885:60;;;;5650:167:1;;;;;;;;;;12737:19:13;;;5650:167:1;;5627:200;;;;;;1413:43;5881:54;;;12375:25:13;5907:10:1;12416:18:13;;;12409:60;12517:4;12505:17;;12485:18;;;;12478:45;;;;5881:54:1;;;;;;;;;;12348:18:13;;;5881:54:1;;;5858:87;;;;;;;;;;-1:-1:-1;;;5995:57:1;;;10038:27:13;10081:11;;;10074:27;;;10117:12;;;10110:28;;;5627:200:1;;-1:-1:-1;;10154:12:13;;5995:57:1;;;-1:-1:-1;;5995:57:1;;;;;;;;;5972:90;;5995:57;5972:90;;;;6072:17;6092:26;;;;;;;;;13183:25:13;;;13256:4;13244:17;;13224:18;;;13217:45;;;;13278:18;;;13271:34;;;13321:18;;;13314:34;;;5972:90:1;;-1:-1:-1;6072:17:1;6092:26;;13155:19:13;;6092:26:1;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6092:26:1;;-1:-1:-1;;6092:26:1;;6149:5;;6092:26;;-1:-1:-1;;;;;;6136:18:1;;;6149:5;;;;;6136:18;;-1:-1:-1;6128:48:1;;;;-1:-1:-1;;;6128:48:1;;20561:2:13;6128:48:1;;;20543:21:13;20600:2;20580:18;;;20573:30;-1:-1:-1;;;20619:18:13;;;20612:47;20676:18;;6128:48:1;20359:341:13;6128:48:1;6204:10;6187:28;;;;:16;:28;;;;;:35;;-1:-1:-1;;6187:35:1;6218:4;6187:35;;;6232:110;6254:15;6250:19;;:1;:19;;;6232:110;;;6315:11;;6293:38;;6303:10;;6315:15;;;;;;:11;;:15;:::i;6293:38::-;6271:6;6276:1;6271:6;;:::i;:::-;;;6232:110;;;-1:-1:-1;6366:11:1;;:29;;;;;;:11;;:29;:::i;:::-;6352:11;:43;;-1:-1:-1;;6352:43:1;;;;;;;;;;;;-1:-1:-1;;;;;;;;4962:1440:1:o;8331:963::-;8392:9;;-1:-1:-1;;;8392:9:1;;;;8384:41;;;;-1:-1:-1;;;8384:41:1;;20907:2:13;8384:41:1;;;20889:21:13;20946:2;20926:18;;;20919:30;-1:-1:-1;;;20965:18:13;;;20958:49;21024:18;;8384:41:1;20705:343:13;8384:41:1;8443:9;8456:10;8443:23;8435:44;;;;-1:-1:-1;;;8435:44:1;;;;;;;:::i;:::-;8543:5;8511:37;;:28;8528:10;8511:16;:28::i;:::-;:37;;8490:109;;;;-1:-1:-1;;;8490:109:1;;22029:2:13;8490:109:1;;;22011:21:13;22068:2;22048:18;;;22041:30;22107:27;22087:18;;;22080:55;22152:18;;8490:109:1;21827:349:13;8490:109:1;8662:11;;8610:7;;;;-1:-1:-1;;;;;8662:11:1;8653:31;666:10:2;8653:45:1;;-1:-1:-1;;;;;;8653:45:1;;;;;;;-1:-1:-1;;;;;10341:32:13;;;8653:45:1;;;10323:51:13;10296:18;;8653:45:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8631:68;;8714:7;8709:361;8731:7;8727:11;;:1;:11;;;8709:361;;;8804:11;;8798:53;;-1:-1:-1;;;8798:53:1;;8837:10;8798:53;;;11050:51:13;11149:4;11137:17;;11117:18;;;11110:45;8759:13:1;;-1:-1:-1;;;;;8804:11:1;;8798:38;;11023:18:13;;8798:53:1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;8884:23;;;;;;;;:14;:23;;;;;;8759:106;;-1:-1:-1;8884:23:1;8879:114;;8927:23;;;;;;;:14;:23;;;;;:30;;-1:-1:-1;;8927:30:1;8953:4;8927:30;;;8975:3;;;;:::i;:::-;;;;8879:114;9015:5;9010:10;;:1;:10;;;9006:54;;;9040:5;;;9006:54;-1:-1:-1;8740:3:1;;;;:::i;:::-;;;;8709:361;;;-1:-1:-1;9080:21:1;9104:9;:5;9112:1;9104:9;:::i;:::-;9080:33;;9129:7;9124:110;9146:15;9142:19;;:1;:19;;;9124:110;;;9207:11;;9185:38;;9195:10;;9207:15;;;;;;:11;;:15;:::i;9185:38::-;9163:6;9168:1;9163:6;;:::i;:::-;;;9124:110;;;-1:-1:-1;9258:11:1;;:29;;;;;;:11;;:29;:::i;:::-;9244:11;:43;;-1:-1:-1;;9244:43:1;;;;;;;;;;;;-1:-1:-1;;;;8331:963:1:o;524:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;9300:562::-;9364:9;;-1:-1:-1;;;9364:9:1;;;;9356:41;;;;-1:-1:-1;;;9356:41:1;;20907:2:13;9356:41:1;;;20889:21:13;20946:2;20926:18;;;20919:30;-1:-1:-1;;;20965:18:13;;;20958:49;21024:18;;9356:41:1;20705:343:13;9356:41:1;9415:9;9428:10;9415:23;9407:44;;;;-1:-1:-1;;;9407:44:1;;;;;;;:::i;:::-;9489:10;9469:31;;;;:19;:31;;;;;;:40;;;;:31;;:40;;9461:68;;;;-1:-1:-1;;;9461:68:1;;23959:2:13;9461:68:1;;;23941:21:13;23998:2;23978:18;;;23971:30;-1:-1:-1;;;24017:18:13;;;24010:45;24072:18;;9461:68:1;23757:339:13;9461:68:1;9540:21;9564:9;:5;9572:1;9564:9;:::i;:::-;9650:10;9630:31;;;;:19;:31;;;;;;9540:33;;-1:-1:-1;9630:51:1;;9676:5;;9630:31;;:51;:::i;:::-;9604:10;9584:31;;;;:19;:31;;;;;:97;;-1:-1:-1;;9584:97:1;;;;;;;;;;;;;9692:110;9714:15;9710:19;;:1;:19;;;9692:110;;;9775:11;;9753:38;;9763:10;;9775:15;;;;;;:11;;:15;:::i;9753:38::-;9731:6;9736:1;9731:6;;:::i;:::-;;;9692:110;;;-1:-1:-1;9826:11:1;;:29;;;;;;:11;;:29;:::i;:::-;9812:11;:43;;-1:-1:-1;;9812:43:1;;;;;;;;;;;;-1:-1:-1;;9300:562:1:o;2433:95::-;1129:7:10;1155:6;-1:-1:-1;;;;;1155:6:10;666:10:2;1295:23:10;1287:68;;;;-1:-1:-1;;;1287:68:10;;;;;;;:::i;:::-;2503:9:1::1;:18:::0;;;::::1;;-1:-1:-1::0;;;2503:18:1::1;-1:-1:-1::0;;;;2503:18:1;;::::1;::::0;;;::::1;::::0;;2433:95::o;7076:501::-;1129:7:10;1155:6;-1:-1:-1;;;;;1155:6:10;666:10:2;1295:23:10;1287:68;;;;-1:-1:-1;;;1287:68:10;;;;;;;:::i;:::-;7191:10:1::1;::::0;-1:-1:-1;;;7191:10:1;::::1;;;7183:48;;;;-1:-1:-1::0;;;7183:48:1::1;;;;;;;:::i;:::-;7249:9;7262:10;7249:23;7241:44;;;;-1:-1:-1::0;;;7241:44:1::1;;;;;;;:::i;:::-;7349:10;::::0;::::1;::::0;;::::1;::::0;::::1;::::0;7316:29:::1;::::0;::::1;::::0;::::1;::::0;:11:::1;:29;:::i;:::-;:43;;;;7295:107;;;;-1:-1:-1::0;;;7295:107:1::1;;;;;;;:::i;:::-;7418:7;7413:104;7435:15;7431:19;;:1;:19;;;7413:104;;;7490:11;::::0;7474:32:::1;::::0;7484:4;;7490:15:::1;::::0;::::1;::::0;::::1;::::0;:11:::1;;:15;:::i;7474:32::-;7452:6;7457:1;7452:6:::0;::::1;:::i;:::-;;;7413:104;;;-1:-1:-1::0;7541:11:1::1;::::0;:29:::1;::::0;::::1;::::0;::::1;::::0;:11:::1;;:29;:::i;2009:274:10:-:0;1129:7;1155:6;-1:-1:-1;;;;;1155:6:10;666:10:2;1295:23:10;1287:68;;;;-1:-1:-1;;;1287:68:10;;;;;;;:::i;:::-;-1:-1:-1;;;;;2110:22:10;::::1;2089:107;;;::::0;-1:-1:-1;;;2089:107:10;;15248:2:13;2089:107:10::1;::::0;::::1;15230:21:13::0;15287:2;15267:18;;;15260:30;15326:34;15306:18;;;15299:62;-1:-1:-1;;;15377:18:13;;;15370:36;15423:19;;2089:107:10::1;15046:402:13::0;2089:107:10::1;2232:6;::::0;;2211:38:::1;::::0;-1:-1:-1;;;;;2211:38:10;;::::1;::::0;2232:6;::::1;::::0;2211:38:::1;::::0;::::1;2259:6;:17:::0;;-1:-1:-1;;;;;;2259:17:10::1;-1:-1:-1::0;;;;;2259:17:10;;;::::1;::::0;;;::::1;::::0;;2009:274::o;1749:104:1:-;1129:7:10;1155:6;-1:-1:-1;;;;;1155:6:10;666:10:2;1295:23:10;1287:68;;;;-1:-1:-1;;;1287:68:10;;;;;;;:::i;:::-;1822:9:1::1;:24:::0;1749:104::o;11879:172:4:-;11953:24;;;;:15;:24;;;;;:29;;-1:-1:-1;;;;;;11953:29:4;-1:-1:-1;;;;;11953:29:4;;;;;;;;:24;;12006;11953;12006:15;:24::i;:::-;-1:-1:-1;;;;;11997:47:4;;;;;;;;;;;11879:172;;:::o;8016:440::-;8141:4;7821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7821:16:4;8161:108;;;;-1:-1:-1;;;8161:108:4;;25487:2:13;8161:108:4;;;25469:21:13;25526:2;25506:18;;;25499:30;25565:34;25545:18;;;25538:62;-1:-1:-1;;;25616:18:13;;;25609:43;25669:19;;8161:108:4;25285:409:13;8161:108:4;8279:13;8295:24;8311:7;8295:15;:24::i;:::-;8279:40;;8348:5;-1:-1:-1;;;;;8337:16:4;:7;-1:-1:-1;;;;;8337:16:4;;:63;;;;8393:7;-1:-1:-1;;;;;8369:31:4;:20;8381:7;8369:11;:20::i;:::-;-1:-1:-1;;;;;8369:31:4;;8337:63;:111;;;-1:-1:-1;;;;;;5087:25:4;;;5060:4;5087:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;8416:32;8329:120;8016:440;-1:-1:-1;;;;8016:440:4:o;11126:642::-;11294:4;-1:-1:-1;;;;;11266:32:4;:24;11282:7;11266:15;:24::i;:::-;-1:-1:-1;;;;;11266:32:4;;11245:117;;;;-1:-1:-1;;;11245:117:4;;18621:2:13;11245:117:4;;;18603:21:13;18660:2;18640:18;;;18633:30;18699:34;18679:18;;;18672:62;-1:-1:-1;;;18750:18:13;;;18743:36;18796:19;;11245:117:4;18419:402:13;11245:117:4;-1:-1:-1;;;;;11380:16:4;;11372:66;;;;-1:-1:-1;;;11372:66:4;;25081:2:13;11372:66:4;;;25063:21:13;25120:2;25100:18;;;25093:30;25159:34;25139:18;;;25132:62;-1:-1:-1;;;25210:18:13;;;25203:35;25255:19;;11372:66:4;24879:401:13;11372:66:4;11550:29;11567:1;11571:7;11550:8;:29::i;:::-;-1:-1:-1;;;;;11590:15:4;;;;;;:9;:15;;;;;:20;;11609:1;;11590:15;:20;;11609:1;;11590:20;:::i;:::-;;;;-1:-1:-1;;;;;;;11620:13:4;;;;;;:9;:13;;;;;:18;;11637:1;;11620:13;:18;;11637:1;;11620:18;:::i;:::-;;;;-1:-1:-1;;11648:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;11648:21:4;-1:-1:-1;;;;;11648:21:4;;;;;;;;;11685:27;;11648:16;;11685:27;;;;;;;2933:109:1::1;2739:309:::0;;:::o;10395:407:4:-;10454:13;10470:24;10486:7;10470:15;:24::i;:::-;10454:40;;10591:29;10608:1;10612:7;10591:8;:29::i;:::-;-1:-1:-1;;;;;10631:16:4;;;;;;:9;:16;;;;;:21;;10651:1;;10631:16;:21;;10651:1;;10631:21;:::i;:::-;;;;-1:-1:-1;;10669:16:4;;;;:7;:16;;;;;;10662:23;;-1:-1:-1;;;;;;10662:23:4;;;10701:36;10677:7;;10669:16;-1:-1:-1;;;;;10701:36:4;;;;;10669:16;;10701:36;3367:22:1::1;3295:101:::0;:::o;8786:108:4:-;8861:26;8871:2;8875:7;8861:26;;;;;;;;;;;;:9;:26::i;12186:308::-;12336:8;-1:-1:-1;;;;;12327:17:4;:5;-1:-1:-1;;;;;12327:17:4;;;12319:56;;;;-1:-1:-1;;;12319:56:4;;13785:2:13;12319:56:4;;;13767:21:13;13824:2;13804:18;;;13797:30;13863:28;13843:18;;;13836:56;13909:18;;12319:56:4;13583:350:13;12319:56:4;-1:-1:-1;;;;;12385:25:4;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;12385:46:4;;;;;;;;;;12446:41;;11943::13;;;12446::4;;11916:18:13;12446:41:4;;;;;;;12186:308;;;:::o;7088:342::-;7239:28;7249:4;7255:2;7259:7;7239:9;:28::i;:::-;7298:48;7321:4;7327:2;7331:7;7340:5;7298:22;:48::i;:::-;7277:146;;;;-1:-1:-1;;;7277:146:4;;;;;;;:::i;3402:111:1:-;3462:13;3494:12;3487:19;;;;;:::i;275:703:12:-;331:13;548:10;544:51;;-1:-1:-1;;574:10:12;;;;;;;;;;;;-1:-1:-1;;;574:10:12;;;;;275:703::o;544:51::-;619:5;604:12;658:75;665:9;;658:75;;690:8;;;;:::i;:::-;;-1:-1:-1;712:10:12;;-1:-1:-1;720:2:12;712:10;;:::i;:::-;;;658:75;;;742:19;774:6;764:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;764:17:12;;742:39;;791:150;798:10;;791:150;;824:11;834:1;824:11;;:::i;:::-;;-1:-1:-1;892:10:12;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:12;;;;;;;;-1:-1:-1;919:11:12;928:2;919:11;;:::i;:::-;;;791:150;;9116:311:4;9241:18;9247:2;9251:7;9241:5;:18::i;:::-;9290:54;9321:1;9325:2;9329:7;9338:5;9290:22;:54::i;:::-;9269:151;;;;-1:-1:-1;;;9269:151:4;;14829:2:13;9269:151:4;;;14811:21:13;14868:2;14848:18;;;14841:30;14907:34;14887:18;;;14880:62;-1:-1:-1;;;14958:18:13;;;14951:48;15016:19;;9269:151:4;14627:414:13;13047:951:4;13197:4;-1:-1:-1;;;;;13217:13:4;;1034:20:0;1080:8;13213:779:4;;13268:170;;-1:-1:-1;;;13268:170:4;;-1:-1:-1;;;;;13268:36:4;;;;;:170;;666:10:2;;13360:4:4;;13386:7;;13415:5;;13268:170;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13268:170:4;;;;;;;;-1:-1:-1;;13268:170:4;;;;;;;;;;;;:::i;:::-;;;13248:692;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13617:13:4;;13613:313;;13659:107;;-1:-1:-1;;;13659:107:4;;;;;;;:::i;13613:313::-;13878:6;13872:13;13863:6;13859:2;13855:15;13848:38;13248:692;-1:-1:-1;;;;;;13500:51:4;-1:-1:-1;;;13500:51:4;;-1:-1:-1;13493:58:4;;13213:779;-1:-1:-1;13977:4:4;13047:951;;;;;;:::o;9749:429::-;-1:-1:-1;;;;;9828:16:4;;9820:62;;;;-1:-1:-1;;;9820:62:4;;15655:2:13;9820:62:4;;;15637:21:13;15694:2;15674:18;;;15667:30;15733:34;15713:18;;;15706:62;-1:-1:-1;;;15784:18:13;;;15777:31;15825:19;;9820:62:4;15453:397:13;9820:62:4;7798:4;7821:16;;;:7;:16;;;;;;-1:-1:-1;;;;;7821:16:4;:30;9892:59;;;;-1:-1:-1;;;9892:59:4;;24303:2:13;9892:59:4;;;24285:21:13;24342:2;24322:18;;;24315:30;24381:31;24361:18;;;24354:59;24430:18;;9892:59:4;24101:353:13;9892:59:4;-1:-1:-1;;;;;10018:13:4;;;;;;:9;:13;;;;;:18;;10035:1;;10018:13;:18;;10035:1;;10018:18;:::i;:::-;;;;-1:-1:-1;;10046:16:4;;;;:7;:16;;;;;;:21;;-1:-1:-1;;;;;;10046:21:4;-1:-1:-1;;;;;10046:21:4;;;;;;;;10083:33;;10046:16;;;10083:33;;10046:16;;10083:33;3367:22:1::1;3295:101:::0;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:406:13;78:5;112:18;104:6;101:30;98:56;;;134:18;;:::i;:::-;172:57;217:2;196:15;;-1:-1:-1;;192:29:13;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:45;;;309:1;306;299:12;268:45;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;14:406;;;;;:::o;425:173::-;493:20;;-1:-1:-1;;;;;542:31:13;;532:42;;522:70;;588:1;585;578:12;522:70;425:173;;;:::o;603:679::-;657:5;710:3;703:4;695:6;691:17;687:27;677:55;;728:1;725;718:12;677:55;764:6;751:20;790:4;814:60;830:43;870:2;830:43;:::i;:::-;814:60;:::i;:::-;896:3;920:2;915:3;908:15;948:2;943:3;939:12;932:19;;983:2;975:6;971:15;1035:3;1030:2;1024;1021:1;1017:10;1009:6;1005:23;1001:32;998:41;995:61;;;1052:1;1049;1042:12;995:61;1074:1;1084:169;1098:2;1095:1;1092:9;1084:169;;;1155:23;1174:3;1155:23;:::i;:::-;1143:36;;1199:12;;;;1231;;;;1116:1;1109:9;1084:169;;;-1:-1:-1;1271:5:13;;603:679;-1:-1:-1;;;;;;;603:679:13:o;1287:160::-;1352:20;;1408:13;;1401:21;1391:32;;1381:60;;1437:1;1434;1427:12;1452:159;1519:20;;1579:6;1568:18;;1558:29;;1548:57;;1601:1;1598;1591:12;1616:156;1682:20;;1742:4;1731:16;;1721:27;;1711:55;;1762:1;1759;1752:12;1777:186;1836:6;1889:2;1877:9;1868:7;1864:23;1860:32;1857:52;;;1905:1;1902;1895:12;1857:52;1928:29;1947:9;1928:29;:::i;1968:260::-;2036:6;2044;2097:2;2085:9;2076:7;2072:23;2068:32;2065:52;;;2113:1;2110;2103:12;2065:52;2136:29;2155:9;2136:29;:::i;:::-;2126:39;;2184:38;2218:2;2207:9;2203:18;2184:38;:::i;:::-;2174:48;;1968:260;;;;;:::o;2233:328::-;2310:6;2318;2326;2379:2;2367:9;2358:7;2354:23;2350:32;2347:52;;;2395:1;2392;2385:12;2347:52;2418:29;2437:9;2418:29;:::i;:::-;2408:39;;2466:38;2500:2;2489:9;2485:18;2466:38;:::i;:::-;2456:48;;2551:2;2540:9;2536:18;2523:32;2513:42;;2233:328;;;;;:::o;2566:666::-;2661:6;2669;2677;2685;2738:3;2726:9;2717:7;2713:23;2709:33;2706:53;;;2755:1;2752;2745:12;2706:53;2778:29;2797:9;2778:29;:::i;:::-;2768:39;;2826:38;2860:2;2849:9;2845:18;2826:38;:::i;:::-;2816:48;;2911:2;2900:9;2896:18;2883:32;2873:42;;2966:2;2955:9;2951:18;2938:32;2993:18;2985:6;2982:30;2979:50;;;3025:1;3022;3015:12;2979:50;3048:22;;3101:4;3093:13;;3089:27;-1:-1:-1;3079:55:13;;3130:1;3127;3120:12;3079:55;3153:73;3218:7;3213:2;3200:16;3195:2;3191;3187:11;3153:73;:::i;:::-;3143:83;;;2566:666;;;;;;;:::o;3237:254::-;3302:6;3310;3363:2;3351:9;3342:7;3338:23;3334:32;3331:52;;;3379:1;3376;3369:12;3331:52;3402:29;3421:9;3402:29;:::i;:::-;3392:39;;3450:35;3481:2;3470:9;3466:18;3450:35;:::i;3496:254::-;3564:6;3572;3625:2;3613:9;3604:7;3600:23;3596:32;3593:52;;;3641:1;3638;3631:12;3593:52;3664:29;3683:9;3664:29;:::i;:::-;3654:39;3740:2;3725:18;;;;3712:32;;-1:-1:-1;;;3496:254:13:o;3755:348::-;3839:6;3892:2;3880:9;3871:7;3867:23;3863:32;3860:52;;;3908:1;3905;3898:12;3860:52;3948:9;3935:23;3981:18;3973:6;3970:30;3967:50;;;4013:1;4010;4003:12;3967:50;4036:61;4089:7;4080:6;4069:9;4065:22;4036:61;:::i;4108:1151::-;4224:6;4232;4285:2;4273:9;4264:7;4260:23;4256:32;4253:52;;;4301:1;4298;4291:12;4253:52;4341:9;4328:23;4370:18;4411:2;4403:6;4400:14;4397:34;;;4427:1;4424;4417:12;4397:34;4450:61;4503:7;4494:6;4483:9;4479:22;4450:61;:::i;:::-;4440:71;;4530:2;4520:12;;4585:2;4574:9;4570:18;4557:32;4614:2;4604:8;4601:16;4598:36;;;4630:1;4627;4620:12;4598:36;4653:24;;;-1:-1:-1;4708:4:13;4700:13;;4696:27;-1:-1:-1;4686:55:13;;4737:1;4734;4727:12;4686:55;4773:2;4760:16;4796:60;4812:43;4852:2;4812:43;:::i;4796:60::-;4878:3;4902:2;4897:3;4890:15;4930:2;4925:3;4921:12;4914:19;;4961:2;4957;4953:11;5009:7;5004:2;4998;4995:1;4991:10;4987:2;4983:19;4979:28;4976:41;4973:61;;;5030:1;5027;5020:12;4973:61;5052:1;5043:10;;5062:167;5076:2;5073:1;5070:9;5062:167;;;5133:21;5150:3;5133:21;:::i;:::-;5121:34;;5094:1;5087:9;;;;;5175:12;;;;5207;;5062:167;;;5066:3;5248:5;5238:15;;;;;;;4108:1151;;;;;:::o;5264:892::-;5359:6;5390:2;5433;5421:9;5412:7;5408:23;5404:32;5401:52;;;5449:1;5446;5439:12;5401:52;5482:9;5476:16;5515:18;5507:6;5504:30;5501:50;;;5547:1;5544;5537:12;5501:50;5570:22;;5623:4;5615:13;;5611:27;-1:-1:-1;5601:55:13;;5652:1;5649;5642:12;5601:55;5681:2;5675:9;5704:60;5720:43;5760:2;5720:43;:::i;5704:60::-;5786:3;5810:2;5805:3;5798:15;5838:2;5833:3;5829:12;5822:19;;5869:2;5865;5861:11;5917:7;5912:2;5906;5903:1;5899:10;5895:2;5891:19;5887:28;5884:41;5881:61;;;5938:1;5935;5928:12;5881:61;5960:1;5951:10;;5970:156;5984:2;5981:1;5978:9;5970:156;;;6041:10;;6029:23;;6002:1;5995:9;;;;;6072:12;;;;6104;;5970:156;;;-1:-1:-1;6145:5:13;5264:892;-1:-1:-1;;;;;;;5264:892:13:o;6161:180::-;6217:6;6270:2;6258:9;6249:7;6245:23;6241:32;6238:52;;;6286:1;6283;6276:12;6238:52;6309:26;6325:9;6309:26;:::i;6346:245::-;6404:6;6457:2;6445:9;6436:7;6432:23;6428:32;6425:52;;;6473:1;6470;6463:12;6425:52;6512:9;6499:23;6531:30;6555:5;6531:30;:::i;6596:249::-;6665:6;6718:2;6706:9;6697:7;6693:23;6689:32;6686:52;;;6734:1;6731;6724:12;6686:52;6766:9;6760:16;6785:30;6809:5;6785:30;:::i;6850:450::-;6919:6;6972:2;6960:9;6951:7;6947:23;6943:32;6940:52;;;6988:1;6985;6978:12;6940:52;7028:9;7015:23;7061:18;7053:6;7050:30;7047:50;;;7093:1;7090;7083:12;7047:50;7116:22;;7169:4;7161:13;;7157:27;-1:-1:-1;7147:55:13;;7198:1;7195;7188:12;7147:55;7221:73;7286:7;7281:2;7268:16;7263:2;7259;7255:11;7221:73;:::i;7305:184::-;7363:6;7416:2;7404:9;7395:7;7391:23;7387:32;7384:52;;;7432:1;7429;7422:12;7384:52;7455:28;7473:9;7455:28;:::i;7494:328::-;7568:6;7576;7584;7637:2;7625:9;7616:7;7612:23;7608:32;7605:52;;;7653:1;7650;7643:12;7605:52;7676:28;7694:9;7676:28;:::i;:::-;7666:38;;7723:37;7756:2;7745:9;7741:18;7723:37;:::i;:::-;7713:47;;7779:37;7812:2;7801:9;7797:18;7779:37;:::i;:::-;7769:47;;7494:328;;;;;:::o;7827:180::-;7886:6;7939:2;7927:9;7918:7;7914:23;7910:32;7907:52;;;7955:1;7952;7945:12;7907:52;-1:-1:-1;7978:23:13;;7827:180;-1:-1:-1;7827:180:13:o;8012:184::-;8082:6;8135:2;8123:9;8114:7;8110:23;8106:32;8103:52;;;8151:1;8148;8141:12;8103:52;-1:-1:-1;8174:16:13;;8012:184;-1:-1:-1;8012:184:13:o;8201:182::-;8258:6;8311:2;8299:9;8290:7;8286:23;8282:32;8279:52;;;8327:1;8324;8317:12;8279:52;8350:27;8367:9;8350:27;:::i;8388:256::-;8454:6;8462;8515:2;8503:9;8494:7;8490:23;8486:32;8483:52;;;8531:1;8528;8521:12;8483:52;8554:27;8571:9;8554:27;:::i;8649:389::-;8731:6;8739;8747;8755;8808:3;8796:9;8787:7;8783:23;8779:33;8776:53;;;8825:1;8822;8815:12;8776:53;8848:27;8865:9;8848:27;:::i;:::-;8838:37;;8894:36;8926:2;8915:9;8911:18;8894:36;:::i;:::-;8649:389;;8884:46;;-1:-1:-1;;;;8977:2:13;8962:18;;8949:32;;9028:2;9013:18;9000:32;;8649:389::o;9043:257::-;9084:3;9122:5;9116:12;9149:6;9144:3;9137:19;9165:63;9221:6;9214:4;9209:3;9205:14;9198:4;9191:5;9187:16;9165:63;:::i;:::-;9282:2;9261:15;-1:-1:-1;;9257:29:13;9248:39;;;;9289:4;9244:50;;9043:257;-1:-1:-1;;9043:257:13:o;9305:470::-;9484:3;9522:6;9516:13;9538:53;9584:6;9579:3;9572:4;9564:6;9560:17;9538:53;:::i;:::-;9654:13;;9613:16;;;;9676:57;9654:13;9613:16;9710:4;9698:17;;9676:57;:::i;:::-;9749:20;;9305:470;-1:-1:-1;;;;9305:470:13:o;10385:488::-;-1:-1:-1;;;;;10654:15:13;;;10636:34;;10706:15;;10701:2;10686:18;;10679:43;10753:2;10738:18;;10731:34;;;10801:3;10796:2;10781:18;;10774:31;;;10579:4;;10822:45;;10847:19;;10839:6;10822:45;:::i;:::-;10814:53;10385:488;-1:-1:-1;;;;;;10385:488:13:o;11166:632::-;11337:2;11389:21;;;11459:13;;11362:18;;;11481:22;;;11308:4;;11337:2;11560:15;;;;11534:2;11519:18;;;11308:4;11603:169;11617:6;11614:1;11611:13;11603:169;;;11678:13;;11666:26;;11747:15;;;;11712:12;;;;11639:1;11632:9;11603:169;;;-1:-1:-1;11789:3:13;;11166:632;-1:-1:-1;;;;;;11166:632:13:o;13359:219::-;13508:2;13497:9;13490:21;13471:4;13528:44;13568:2;13557:9;13553:18;13545:6;13528:44;:::i;17040:349::-;17242:2;17224:21;;;17281:2;17261:18;;;17254:30;17320:27;17315:2;17300:18;;17293:55;17380:2;17365:18;;17040:349::o;17394:331::-;17596:2;17578:21;;;17635:1;17615:18;;;17608:29;-1:-1:-1;;;17668:2:13;17653:18;;17646:38;17716:2;17701:18;;17394:331::o;19940:414::-;20142:2;20124:21;;;20181:2;20161:18;;;20154:30;20220:34;20215:2;20200:18;;20193:62;-1:-1:-1;;;20286:2:13;20271:18;;20264:48;20344:3;20329:19;;19940:414::o;21466:356::-;21668:2;21650:21;;;21687:18;;;21680:30;21746:34;21741:2;21726:18;;21719:62;21813:2;21798:18;;21466:356::o;23008:341::-;23210:2;23192:21;;;23249:2;23229:18;;;23222:30;-1:-1:-1;;;23283:2:13;23268:18;;23261:47;23340:2;23325:18;;23008:341::o;24459:415::-;24661:2;24643:21;;;24700:2;24680:18;;;24673:30;24739:34;24734:2;24719:18;;24712:62;-1:-1:-1;;;24805:2:13;24790:18;;24783:49;24864:3;24849:19;;24459:415::o;26263:275::-;26334:2;26328:9;26399:2;26380:13;;-1:-1:-1;;26376:27:13;26364:40;;26434:18;26419:34;;26455:22;;;26416:62;26413:88;;;26481:18;;:::i;:::-;26517:2;26510:22;26263:275;;-1:-1:-1;26263:275:13:o;26543:183::-;26603:4;26636:18;26628:6;26625:30;26622:56;;;26658:18;;:::i;:::-;-1:-1:-1;26703:1:13;26699:14;26715:4;26695:25;;26543:183::o;26731:224::-;26770:3;26798:6;26831:2;26828:1;26824:10;26861:2;26858:1;26854:10;26892:3;26888:2;26884:12;26879:3;26876:21;26873:47;;;26900:18;;:::i;26960:128::-;27000:3;27031:1;27027:6;27024:1;27021:13;27018:39;;;27037:18;;:::i;:::-;-1:-1:-1;27073:9:13;;26960:128::o;27093:204::-;27131:3;27167:4;27164:1;27160:12;27199:4;27196:1;27192:12;27234:3;27228:4;27224:14;27219:3;27216:23;27213:49;;;27242:18;;:::i;:::-;27278:13;;27093:204;-1:-1:-1;;;27093:204:13:o;27302:120::-;27342:1;27368;27358:35;;27373:18;;:::i;:::-;-1:-1:-1;27407:9:13;;27302:120::o;27427:168::-;27467:7;27533:1;27529;27525:6;27521:14;27518:1;27515:21;27510:1;27503:9;27496:17;27492:45;27489:71;;;27540:18;;:::i;:::-;-1:-1:-1;27580:9:13;;27427:168::o;27600:238::-;27638:7;27678:4;27675:1;27671:12;27710:4;27707:1;27703:12;27770:3;27764:4;27760:14;27755:3;27752:23;27745:3;27738:11;27731:19;27727:49;27724:75;;;27779:18;;:::i;:::-;27819:13;;27600:238;-1:-1:-1;;;27600:238:13:o;27843:217::-;27882:4;27911:6;27967:10;;;;27937;;27989:12;;;27986:38;;;28004:18;;:::i;:::-;28041:13;;27843:217;-1:-1:-1;;;27843:217:13:o;28065:125::-;28105:4;28133:1;28130;28127:8;28124:34;;;28138:18;;:::i;:::-;-1:-1:-1;28175:9:13;;28065:125::o;28195:195::-;28233:4;28270;28267:1;28263:12;28302:4;28299:1;28295:12;28327:3;28322;28319:12;28316:38;;;28334:18;;:::i;:::-;28371:13;;;28195:195;-1:-1:-1;;;28195:195:13:o;28395:258::-;28467:1;28477:113;28491:6;28488:1;28485:13;28477:113;;;28567:11;;;28561:18;28548:11;;;28541:39;28513:2;28506:10;28477:113;;;28608:6;28605:1;28602:13;28599:48;;;-1:-1:-1;;28643:1:13;28625:16;;28618:27;28395:258::o;28658:380::-;28737:1;28733:12;;;;28780;;;28801:61;;28855:4;28847:6;28843:17;28833:27;;28801:61;28908:2;28900:6;28897:14;28877:18;28874:38;28871:161;;;28954:10;28949:3;28945:20;28942:1;28935:31;28989:4;28986:1;28979:15;29017:4;29014:1;29007:15;29043:197;29081:3;29109:6;29150:2;29143:5;29139:14;29177:2;29168:7;29165:15;29162:41;;;29183:18;;:::i;:::-;29232:1;29219:15;;29043:197;-1:-1:-1;;;29043:197:13:o;29245:135::-;29284:3;-1:-1:-1;;29305:17:13;;29302:43;;;29325:18;;:::i;:::-;-1:-1:-1;29372:1:13;29361:13;;29245:135::o;29385:175::-;29422:3;29466:4;29459:5;29455:16;29495:4;29486:7;29483:17;29480:43;;;29503:18;;:::i;:::-;29552:1;29539:15;;29385:175;-1:-1:-1;;29385:175:13:o;29565:112::-;29597:1;29623;29613:35;;29628:18;;:::i;:::-;-1:-1:-1;29662:9:13;;29565:112::o;29682:127::-;29743:10;29738:3;29734:20;29731:1;29724:31;29774:4;29771:1;29764:15;29798:4;29795:1;29788:15;29814:127;29875:10;29870:3;29866:20;29863:1;29856:31;29906:4;29903:1;29896:15;29930:4;29927:1;29920:15;29946:127;30007:10;30002:3;29998:20;29995:1;29988:31;30038:4;30035:1;30028:15;30062:4;30059:1;30052:15;30078:127;30139:10;30134:3;30130:20;30127:1;30120:31;30170:4;30167:1;30160:15;30194:4;30191:1;30184:15;30210:131;-1:-1:-1;;;;;;30284:32:13;;30274:43;;30264:71;;30331:1;30328;30321:12

Swarm Source

ipfs://f9e1e09b22ad9742f96b412b1a597f9addaa699e0f80ad0306ac03102d87961f
Loading...
Loading
Loading...
Loading
[ 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.