ETH Price: $2,645.77 (-0.28%)

Token

WGMI / NGMI (WN)
 

Overview

Max Total Supply

16 WN

Holders

15

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
koda997.eth
0x2c49b9aedf814d7f9cccc694bd7c9e2eec2112e8
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:
WGMI

Compiler Version
v0.8.13+commit.abaa5c0e

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 24 of 24: WGMI.sol
// SPDX-License-Identifier: MIT
pragma solidity 0.8.13;

import "./AbstractERC1155Factory.sol";
import "./Strings.sol";

/*

β–ˆβ–ˆ     β–ˆβ–ˆ  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  β–ˆβ–ˆβ–ˆ    β–ˆβ–ˆβ–ˆ β–ˆβ–ˆ         β–ˆβ–ˆ     β–ˆβ–ˆβ–ˆ    β–ˆβ–ˆ  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  β–ˆβ–ˆβ–ˆ    β–ˆβ–ˆβ–ˆ β–ˆβ–ˆ 
β–ˆβ–ˆ     β–ˆβ–ˆ β–ˆβ–ˆ       β–ˆβ–ˆβ–ˆβ–ˆ  β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ        β–ˆβ–ˆ      β–ˆβ–ˆβ–ˆβ–ˆ   β–ˆβ–ˆ β–ˆβ–ˆ       β–ˆβ–ˆβ–ˆβ–ˆ  β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ 
β–ˆβ–ˆ  β–ˆ  β–ˆβ–ˆ β–ˆβ–ˆ   β–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆ       β–ˆβ–ˆ       β–ˆβ–ˆ β–ˆβ–ˆ  β–ˆβ–ˆ β–ˆβ–ˆ   β–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆ 
β–ˆβ–ˆ β–ˆβ–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆ    β–ˆβ–ˆ β–ˆβ–ˆ  β–ˆβ–ˆ  β–ˆβ–ˆ β–ˆβ–ˆ      β–ˆβ–ˆ        β–ˆβ–ˆ  β–ˆβ–ˆ β–ˆβ–ˆ β–ˆβ–ˆ    β–ˆβ–ˆ β–ˆβ–ˆ  β–ˆβ–ˆ  β–ˆβ–ˆ β–ˆβ–ˆ 
 β–ˆβ–ˆβ–ˆ β–ˆβ–ˆβ–ˆ   β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  β–ˆβ–ˆ      β–ˆβ–ˆ β–ˆβ–ˆ     β–ˆβ–ˆ         β–ˆβ–ˆ   β–ˆβ–ˆβ–ˆβ–ˆ  β–ˆβ–ˆβ–ˆβ–ˆβ–ˆβ–ˆ  β–ˆβ–ˆ      β–ˆβ–ˆ β–ˆβ–ˆ 
                                                                                 
*/
contract WGMI is AbstractERC1155Factory {
    using Strings for uint256;

    uint256 public cost = 0 ether;
    uint256 public maxSupplyPerCollection = 1000;

    mapping(string => bool) private minted;
    string private uriSuffix = '.json';

    constructor(string memory _baseURI, address _signer) ERC1155(_baseURI) {
        name_ = "WGMI / NGMI";
        symbol_ = "WN";
        _setSigner(_signer);
    }

  modifier mintPriceCompliance() {
    require(msg.value >= cost, 'Insufficient funds!');
    _;
  }

  modifier mintCompliance(uint256 _tokenId) {
    require(totalSupply(_tokenId) + 1 <= maxSupplyPerCollection, 'Max supply exceeded!');
    _;
  }

    function mint(bytes calldata _salt, bytes calldata _token, uint256 _tokenId, string memory _nftName) payable public whenNotPaused nonReentrant mintPriceCompliance mintCompliance(_tokenId)
    {   
        require(verifyTokenForAddress(_salt, _tokenId, _nftName, _token, msg.sender), "Unauthorized");
        require(!minted[_nftName], "Token already minted!");
        _mint(msg.sender, _tokenId, 1, "");
        minted[_nftName] = true;
    }

    function airDrop(address _receiver, uint256 _mintAmount, uint256 _ticketId) public onlyOwner {
        _mint(_receiver, _ticketId, _mintAmount, "");
    }

    function batchAirDrop(uint256 _ticketId, address[] memory _addresses) public onlyOwner {
        for (uint i = 0; i < _addresses.length; i++) {
            airDrop(_addresses[i], 1, _ticketId);
        }
    }

    function uri(uint256 _id) public view override returns(string memory) {
        require(exists(_id), "URI: nonexistent token");
        return string(abi.encodePacked(super.uri(_id), Strings.toString(_id), uriSuffix));
    }

    function withdraw() public onlyOwner nonReentrant {
        (bool os, ) = payable(owner()).call{value: address(this).balance}('');
    require(os);
    }

    function setCost(uint256 _cost) public onlyOwner {
        cost = _cost;
    }
   
    function setMaxSupplyPerCollection(uint256 _maxSupplyPerCollection) public onlyOwner {
        maxSupplyPerCollection = _maxSupplyPerCollection;
    }

    function setRoyaltyInfo(address payable receiver, uint96 numerator) public onlyOwner {
        _setDefaultRoyalty(receiver, numerator);
    }
}

File 1 of 24: AbstractERC1155Factory.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.9;

import "./Ownable.sol";
import "./ERC1155Burnable.sol";
import "./Pausable.sol";
import "./ERC1155Supply.sol";
import "./Ownable.sol";
import "./SignedTokenVerifier.sol";
import "./ReentrancyGuard.sol";
import "./DefaultOperatorFilterer.sol";
import "./ERC2981.sol";

abstract contract AbstractERC1155Factory is Pausable, ERC1155Supply, ERC1155Burnable, Ownable, SignedTokenVerifier, ReentrancyGuard, DefaultOperatorFilterer, ERC2981 {

    string name_;
    string symbol_;   

    function pause() external onlyOwner {
        _pause();
    }

    function unpause() external onlyOwner {
        _unpause();
    }    

    function setURI(string memory baseURI) external onlyOwner {
        _setURI(baseURI);
    }    

    function name() public view returns (string memory) {
        return name_;
    }

    function symbol() public view returns (string memory) {
        return symbol_;
    }         

    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override(ERC1155, ERC1155Supply) {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }  

  function supportsInterface(bytes4 interfaceId) public view virtual override(ERC1155, ERC2981) returns (bool) {
    return ERC1155.supportsInterface(interfaceId) || ERC2981.supportsInterface(interfaceId);
  }

    function setApprovalForAll(address operator, bool approved) public override onlyAllowedOperatorApproval(operator) {
        super.setApprovalForAll(operator, approved);
    } 

    function safeTransferFrom(address from, address to, uint256 tokenId, uint256 amount, bytes memory data)
        public
        override
        onlyAllowedOperator(from)
    {
        super.safeTransferFrom(from, to, tokenId, amount, data);
    }

    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override onlyAllowedOperator(from) {
        super.safeBatchTransferFrom(from, to, ids, amounts, data);
    }
}

File 2 of 24: Address.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

File 3 of 24: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

File 4 of 24: Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

File 5 of 24: DefaultOperatorFilterer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

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

/**
 * @title  DefaultOperatorFilterer
 * @notice Inherits from OperatorFilterer and automatically subscribes to the default OpenSea subscription.
 */
abstract contract DefaultOperatorFilterer is OperatorFilterer {
    address constant DEFAULT_SUBSCRIPTION = address(0x3cc6CddA760b79bAfa08dF41ECFA224f810dCeB6);

    constructor() OperatorFilterer(DEFAULT_SUBSCRIPTION, true) {}
}

File 6 of 24: ECDSA.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;

import "./Strings.sol";

/**
 * @dev Elliptic Curve Digital Signature Algorithm (ECDSA) operations.
 *
 * These functions can be used to verify that a message was signed by the holder
 * of the private keys of a given address.
 */
library ECDSA {
    enum RecoverError {
        NoError,
        InvalidSignature,
        InvalidSignatureLength,
        InvalidSignatureS,
        InvalidSignatureV
    }

    function _throwError(RecoverError error) private pure {
        if (error == RecoverError.NoError) {
            return; // no error: do nothing
        } else if (error == RecoverError.InvalidSignature) {
            revert("ECDSA: invalid signature");
        } else if (error == RecoverError.InvalidSignatureLength) {
            revert("ECDSA: invalid signature length");
        } else if (error == RecoverError.InvalidSignatureS) {
            revert("ECDSA: invalid signature 's' value");
        } else if (error == RecoverError.InvalidSignatureV) {
            revert("ECDSA: invalid signature 'v' value");
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature` or error string. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     *
     * Documentation for signature generation:
     * - with https://web3js.readthedocs.io/en/v1.3.4/web3-eth-accounts.html#sign[Web3.js]
     * - with https://docs.ethers.io/v5/api/signer/#Signer-signMessage[ethers]
     *
     * _Available since v4.3._
     */
    function tryRecover(bytes32 hash, bytes memory signature) internal pure returns (address, RecoverError) {
        // Check the signature length
        // - case 65: r,s,v signature (standard)
        // - case 64: r,vs signature (cf https://eips.ethereum.org/EIPS/eip-2098) _Available since v4.1._
        if (signature.length == 65) {
            bytes32 r;
            bytes32 s;
            uint8 v;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                s := mload(add(signature, 0x40))
                v := byte(0, mload(add(signature, 0x60)))
            }
            return tryRecover(hash, v, r, s);
        } else if (signature.length == 64) {
            bytes32 r;
            bytes32 vs;
            // ecrecover takes the signature parameters, and the only way to get them
            // currently is to use assembly.
            /// @solidity memory-safe-assembly
            assembly {
                r := mload(add(signature, 0x20))
                vs := mload(add(signature, 0x40))
            }
            return tryRecover(hash, r, vs);
        } else {
            return (address(0), RecoverError.InvalidSignatureLength);
        }
    }

    /**
     * @dev Returns the address that signed a hashed message (`hash`) with
     * `signature`. This address can then be used for verification purposes.
     *
     * The `ecrecover` EVM opcode allows for malleable (non-unique) signatures:
     * this function rejects them by requiring the `s` value to be in the lower
     * half order, and the `v` value to be either 27 or 28.
     *
     * IMPORTANT: `hash` _must_ be the result of a hash operation for the
     * verification to be secure: it is possible to craft signatures that
     * recover to arbitrary addresses for non-hashed data. A safe way to ensure
     * this is by receiving a hash of the original message (which may otherwise
     * be too long), and then calling {toEthSignedMessageHash} on it.
     */
    function recover(bytes32 hash, bytes memory signature) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, signature);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `r` and `vs` short-signature fields separately.
     *
     * See https://eips.ethereum.org/EIPS/eip-2098[EIP-2098 short signatures]
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address, RecoverError) {
        bytes32 s = vs & bytes32(0x7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff);
        uint8 v = uint8((uint256(vs) >> 255) + 27);
        return tryRecover(hash, v, r, s);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `r and `vs` short-signature fields separately.
     *
     * _Available since v4.2._
     */
    function recover(
        bytes32 hash,
        bytes32 r,
        bytes32 vs
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, r, vs);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Overload of {ECDSA-tryRecover} that receives the `v`,
     * `r` and `s` signature fields separately.
     *
     * _Available since v4.3._
     */
    function tryRecover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address, RecoverError) {
        // EIP-2 still allows signature malleability for ecrecover(). Remove this possibility and make the signature
        // unique. Appendix F in the Ethereum Yellow paper (https://ethereum.github.io/yellowpaper/paper.pdf), defines
        // the valid range for s in (301): 0 < s < secp256k1n ÷ 2 + 1, and for v in (302): v ∈ {27, 28}. Most
        // signatures from current libraries generate a unique signature with an s-value in the lower half order.
        //
        // If your library generates malleable signatures, such as s-values in the upper range, calculate a new s-value
        // with 0xFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFFEBAAEDCE6AF48A03BBFD25E8CD0364141 - s1 and flip v from 27 to 28 or
        // vice versa. If your library also generates signatures with 0/1 for v instead 27/28, add 27 to v to accept
        // these malleable signatures as well.
        if (uint256(s) > 0x7FFFFFFFFFFFFFFFFFFFFFFFFFFFFFFF5D576E7357A4501DDFE92F46681B20A0) {
            return (address(0), RecoverError.InvalidSignatureS);
        }
        if (v != 27 && v != 28) {
            return (address(0), RecoverError.InvalidSignatureV);
        }

        // If the signature is valid (and not malleable), return the signer address
        address signer = ecrecover(hash, v, r, s);
        if (signer == address(0)) {
            return (address(0), RecoverError.InvalidSignature);
        }

        return (signer, RecoverError.NoError);
    }

    /**
     * @dev Overload of {ECDSA-recover} that receives the `v`,
     * `r` and `s` signature fields separately.
     */
    function recover(
        bytes32 hash,
        uint8 v,
        bytes32 r,
        bytes32 s
    ) internal pure returns (address) {
        (address recovered, RecoverError error) = tryRecover(hash, v, r, s);
        _throwError(error);
        return recovered;
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from a `hash`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes32 hash) internal pure returns (bytes32) {
        // 32 is the length in bytes of hash,
        // enforced by the type signature above
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n32", hash));
    }

    /**
     * @dev Returns an Ethereum Signed Message, created from `s`. This
     * produces hash corresponding to the one signed with the
     * https://eth.wiki/json-rpc/API#eth_sign[`eth_sign`]
     * JSON-RPC method as part of EIP-191.
     *
     * See {recover}.
     */
    function toEthSignedMessageHash(bytes memory s) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19Ethereum Signed Message:\n", Strings.toString(s.length), s));
    }

    /**
     * @dev Returns an Ethereum Signed Typed Data, created from a
     * `domainSeparator` and a `structHash`. This produces hash corresponding
     * to the one signed with the
     * https://eips.ethereum.org/EIPS/eip-712[`eth_signTypedData`]
     * JSON-RPC method as part of EIP-712.
     *
     * See {recover}.
     */
    function toTypedDataHash(bytes32 domainSeparator, bytes32 structHash) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked("\x19\x01", domainSeparator, structHash));
    }
}

File 7 of 24: ERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";
import "./IERC1155Receiver.sol";
import "./IERC1155MetadataURI.sol";
import "./Address.sol";
import "./Context.sol";
import "./ERC165.sol";

/**
 * @dev Implementation of the basic standard multi-token.
 * See https://eips.ethereum.org/EIPS/eip-1155
 * Originally based on code by Enjin: https://github.com/enjin/erc-1155
 *
 * _Available since v3.1._
 */
contract ERC1155 is Context, ERC165, IERC1155, IERC1155MetadataURI {
    using Address for address;

    // Mapping from token ID to account balances
    mapping(uint256 => mapping(address => uint256)) private _balances;

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

    // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json
    string private _uri;

    /**
     * @dev See {_setURI}.
     */
    constructor(string memory uri_) {
        _setURI(uri_);
    }

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

    /**
     * @dev See {IERC1155MetadataURI-uri}.
     *
     * This implementation returns the same URI for *all* token types. It relies
     * on the token type ID substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * Clients calling this function must replace the `\{id\}` substring with the
     * actual token type ID.
     */
    function uri(uint256) public view virtual override returns (string memory) {
        return _uri;
    }

    /**
     * @dev See {IERC1155-balanceOf}.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {
        require(account != address(0), "ERC1155: address zero is not a valid owner");
        return _balances[id][account];
    }

    /**
     * @dev See {IERC1155-balanceOfBatch}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] memory accounts, uint256[] memory ids)
        public
        view
        virtual
        override
        returns (uint256[] memory)
    {
        require(accounts.length == ids.length, "ERC1155: accounts and ids length mismatch");

        uint256[] memory batchBalances = new uint256[](accounts.length);

        for (uint256 i = 0; i < accounts.length; ++i) {
            batchBalances[i] = balanceOf(accounts[i], ids[i]);
        }

        return batchBalances;
    }

    /**
     * @dev See {IERC1155-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC1155-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeTransferFrom(from, to, id, amount, data);
    }

    /**
     * @dev See {IERC1155-safeBatchTransferFrom}.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) public virtual override {
        require(
            from == _msgSender() || isApprovedForAll(from, _msgSender()),
            "ERC1155: caller is not token owner or approved"
        );
        _safeBatchTransferFrom(from, to, ids, amounts, data);
    }

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }
        _balances[id][to] += amount;

        emit TransferSingle(operator, from, to, id, amount);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");
        require(to != address(0), "ERC1155: transfer to the zero address");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; ++i) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: insufficient balance for transfer");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
            _balances[id][to] += amount;
        }

        emit TransferBatch(operator, from, to, ids, amounts);

        _afterTokenTransfer(operator, from, to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);
    }

    /**
     * @dev Sets a new URI for all token types, by relying on the token type ID
     * substitution mechanism
     * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].
     *
     * By this mechanism, any occurrence of the `\{id\}` substring in either the
     * URI or any of the amounts in the JSON file at said URI will be replaced by
     * clients with the token type ID.
     *
     * For example, the `https://token-cdn-domain/\{id\}.json` URI would be
     * interpreted by clients as
     * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`
     * for token type ID 0x4cce0.
     *
     * See {uri}.
     *
     * Because these URIs cannot be meaningfully represented by the {URI} event,
     * this function emits no events.
     */
    function _setURI(string memory newuri) internal virtual {
        _uri = newuri;
    }

    /**
     * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function _mint(
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        _balances[id][to] += amount;
        emit TransferSingle(operator, address(0), to, id, amount);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function _mintBatch(
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "ERC1155: mint to the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);

        for (uint256 i = 0; i < ids.length; i++) {
            _balances[ids[i]][to] += amounts[i];
        }

        emit TransferBatch(operator, address(0), to, ids, amounts);

        _afterTokenTransfer(operator, address(0), to, ids, amounts, data);

        _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);
    }

    /**
     * @dev Destroys `amount` tokens of token type `id` from `from`
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `from` must have at least `amount` tokens of token type `id`.
     */
    function _burn(
        address from,
        uint256 id,
        uint256 amount
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");

        address operator = _msgSender();
        uint256[] memory ids = _asSingletonArray(id);
        uint256[] memory amounts = _asSingletonArray(amount);

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        uint256 fromBalance = _balances[id][from];
        require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
        unchecked {
            _balances[id][from] = fromBalance - amount;
        }

        emit TransferSingle(operator, from, address(0), id, amount);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     */
    function _burnBatch(
        address from,
        uint256[] memory ids,
        uint256[] memory amounts
    ) internal virtual {
        require(from != address(0), "ERC1155: burn from the zero address");
        require(ids.length == amounts.length, "ERC1155: ids and amounts length mismatch");

        address operator = _msgSender();

        _beforeTokenTransfer(operator, from, address(0), ids, amounts, "");

        for (uint256 i = 0; i < ids.length; i++) {
            uint256 id = ids[i];
            uint256 amount = amounts[i];

            uint256 fromBalance = _balances[id][from];
            require(fromBalance >= amount, "ERC1155: burn amount exceeds balance");
            unchecked {
                _balances[id][from] = fromBalance - amount;
            }
        }

        emit TransferBatch(operator, from, address(0), ids, amounts);

        _afterTokenTransfer(operator, from, address(0), ids, amounts, "");
    }

    /**
     * @dev Approve `operator` to operate on all of `owner` tokens
     *
     * Emits an {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC1155: setting approval status for self");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `ids` and `amounts` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting
     * and burning, as well as batched variants.
     *
     * The same hook is called on both single and batched variants. For single
     * transfers, the length of the `id` and `amount` arrays will be 1.
     *
     * Calling conditions (for each `id` and `amount` pair):
     *
     * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens
     * of token type `id` will be  transferred to `to`.
     * - When `from` is zero, `amount` tokens of token type `id` will be minted
     * for `to`.
     * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`
     * will be burned.
     * - `from` and `to` are never both zero.
     * - `ids` and `amounts` have the same, non-zero length.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual {}

    function _doSafeTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {
                if (response != IERC1155Receiver.onERC1155Received.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _doSafeBatchTransferAcceptanceCheck(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) private {
        if (to.isContract()) {
            try IERC1155Receiver(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (
                bytes4 response
            ) {
                if (response != IERC1155Receiver.onERC1155BatchReceived.selector) {
                    revert("ERC1155: ERC1155Receiver rejected tokens");
                }
            } catch Error(string memory reason) {
                revert(reason);
            } catch {
                revert("ERC1155: transfer to non-ERC1155Receiver implementer");
            }
        }
    }

    function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {
        uint256[] memory array = new uint256[](1);
        array[0] = element;

        return array;
    }
}

File 8 of 24: ERC1155Burnable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;

import "./ERC1155.sol";

/**
 * @dev Extension of {ERC1155} that allows token holders to destroy both their
 * own tokens and those that they have been approved to use.
 *
 * _Available since v3.1._
 */
abstract contract ERC1155Burnable is ERC1155 {
    function burn(
        address _account,
        uint256 _id,
        uint256 _amount
    ) public virtual {
        require(
            _account == _msgSender() || isApprovedForAll(_account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burn(_account, _id, _amount);
    }

    function burnBatch(
        address _account,
        uint256[] memory _ids,
        uint256[] memory _amounts
    ) public virtual {
        require(
            _account == _msgSender() || isApprovedForAll(_account, _msgSender()),
            "ERC1155: caller is not owner nor approved"
        );

        _burnBatch(_account, _ids, _amounts);
    }
}

File 9 of 24: ERC1155Supply.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;

import "./ERC1155.sol";

/**
 * @dev Extension of ERC1155 that adds tracking of total supply per id.
 *
 * Useful for scenarios where Fungible and Non-fungible tokens have to be
 * clearly identified. Note: While a totalSupply of 1 might mean the
 * corresponding is an NFT, there is no guarantees that no other token with the
 * same id are not going to be minted.
 */
abstract contract ERC1155Supply is ERC1155 {
    mapping(uint256 => uint256) private _totalSupply;

    /**
     * @dev Total amount of tokens in with a given id.
     */
    function totalSupply(uint256 id) public view virtual returns (uint256) {
        return _totalSupply[id];
    }

    /**
     * @dev Indicates whether any token exist with a given id, or not.
     */
    function exists(uint256 id) public view virtual returns (bool) {
        return totalSupply(id) > 0;
    }

    /**
     * @dev See {ERC1155-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address operator,
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory amounts,
        bytes memory data
    ) internal virtual override {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);

        if (from == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] += amounts[i];
            }
        }

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                _totalSupply[ids[i]] -= amounts[i];
            }
        }
    }
}

File 10 of 24: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

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

File 11 of 24: ERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;

import './ERC165.sol';
import './IERC2981.sol';

/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

File 12 of 24: IERC1155.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev Required interface of an ERC1155 compliant contract, as defined in the
 * https://eips.ethereum.org/EIPS/eip-1155[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155 is IERC165 {
    /**
     * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.
     */
    event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);

    /**
     * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all
     * transfers.
     */
    event TransferBatch(
        address indexed operator,
        address indexed from,
        address indexed to,
        uint256[] ids,
        uint256[] values
    );

    /**
     * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to
     * `approved`.
     */
    event ApprovalForAll(address indexed account, address indexed operator, bool approved);

    /**
     * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.
     *
     * If an {URI} event was emitted for `id`, the standard
     * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value
     * returned by {IERC1155MetadataURI-uri}.
     */
    event URI(string value, uint256 indexed id);

    /**
     * @dev Returns the amount of tokens of token type `id` owned by `account`.
     *
     * Requirements:
     *
     * - `account` cannot be the zero address.
     */
    function balanceOf(address account, uint256 id) external view returns (uint256);

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.
     *
     * Requirements:
     *
     * - `accounts` and `ids` must have the same length.
     */
    function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)
        external
        view
        returns (uint256[] memory);

    /**
     * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,
     *
     * Emits an {ApprovalForAll} event.
     *
     * Requirements:
     *
     * - `operator` cannot be the caller.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.
     *
     * See {setApprovalForAll}.
     */
    function isApprovedForAll(address account, address operator) external view returns (bool);

    /**
     * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.
     *
     * Emits a {TransferSingle} event.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.
     * - `from` must have a balance of tokens of type `id` of at least `amount`.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the
     * acceptance magic value.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 amount,
        bytes calldata data
    ) external;

    /**
     * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.
     *
     * Emits a {TransferBatch} event.
     *
     * Requirements:
     *
     * - `ids` and `amounts` must have the same length.
     * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the
     * acceptance magic value.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata amounts,
        bytes calldata data
    ) external;
}

File 13 of 24: IERC1155MetadataURI.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;

import "./IERC1155.sol";

/**
 * @dev Interface of the optional ERC1155MetadataExtension interface, as defined
 * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].
 *
 * _Available since v3.1._
 */
interface IERC1155MetadataURI is IERC1155 {
    /**
     * @dev Returns the URI for token type `id`.
     *
     * If the `\{id\}` substring is present in the URI, it must be replaced by
     * clients with the actual token type ID.
     */
    function uri(uint256 id) external view returns (string memory);
}

File 14 of 24: IERC1155Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @dev _Available since v3.1._
 */
interface IERC1155Receiver is IERC165 {
    /**
     * @dev Handles the receipt of a single ERC1155 token type. This function is
     * called at the end of a `safeTransferFrom` after the balance has been updated.
     *
     * NOTE: To accept the transfer, this must return
     * `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     * (i.e. 0xf23a6e61, or its own function selector).
     *
     * @param operator The address which initiated the transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param id The ID of the token being transferred
     * @param value The amount of tokens being transferred
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` if transfer is allowed
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @dev Handles the receipt of a multiple ERC1155 token types. This function
     * is called at the end of a `safeBatchTransferFrom` after the balances have
     * been updated.
     *
     * NOTE: To accept the transfer(s), this must return
     * `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     * (i.e. 0xbc197c81, or its own function selector).
     *
     * @param operator The address which initiated the batch transfer (i.e. msg.sender)
     * @param from The address which previously owned the token
     * @param ids An array containing ids of each token being transferred (order and length must match values array)
     * @param values An array containing amounts of each token being transferred (order and length must match ids array)
     * @param data Additional data with no specified format
     * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` if transfer is allowed
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}

File 15 of 24: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

File 16 of 24: IERC2981.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;

import './IERC165.sol';
/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

File 17 of 24: IOperatorFilterRegistry.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

interface IOperatorFilterRegistry {
    function isOperatorAllowed(address registrant, address operator) external view returns (bool);
    function register(address registrant) external;
    function registerAndSubscribe(address registrant, address subscription) external;
    function registerAndCopyEntries(address registrant, address registrantToCopy) external;
    function unregister(address addr) external;
    function updateOperator(address registrant, address operator, bool filtered) external;
    function updateOperators(address registrant, address[] calldata operators, bool filtered) external;
    function updateCodeHash(address registrant, bytes32 codehash, bool filtered) external;
    function updateCodeHashes(address registrant, bytes32[] calldata codeHashes, bool filtered) external;
    function subscribe(address registrant, address registrantToSubscribe) external;
    function unsubscribe(address registrant, bool copyExistingEntries) external;
    function subscriptionOf(address addr) external returns (address registrant);
    function subscribers(address registrant) external returns (address[] memory);
    function subscriberAt(address registrant, uint256 index) external returns (address);
    function copyEntriesOf(address registrant, address registrantToCopy) external;
    function isOperatorFiltered(address registrant, address operator) external returns (bool);
    function isCodeHashOfFiltered(address registrant, address operatorWithCode) external returns (bool);
    function isCodeHashFiltered(address registrant, bytes32 codeHash) external returns (bool);
    function filteredOperators(address addr) external returns (address[] memory);
    function filteredCodeHashes(address addr) external returns (bytes32[] memory);
    function filteredOperatorAt(address registrant, uint256 index) external returns (address);
    function filteredCodeHashAt(address registrant, uint256 index) external returns (bytes32);
    function isRegistered(address addr) external returns (bool);
    function codeHashOf(address addr) external returns (bytes32);
}

File 18 of 24: OperatorFilterer.sol
// SPDX-License-Identifier: MIT
pragma solidity ^0.8.13;

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

/**
 * @title  OperatorFilterer
 * @notice Abstract contract whose constructor automatically registers and optionally subscribes to or copies another
 *         registrant's entries in the OperatorFilterRegistry.
 * @dev    This smart contract is meant to be inherited by token contracts so they can use the following:
 *         - `onlyAllowedOperator` modifier for `transferFrom` and `safeTransferFrom` methods.
 *         - `onlyAllowedOperatorApproval` modifier for `approve` and `setApprovalForAll` methods.
 */
abstract contract OperatorFilterer {
    error OperatorNotAllowed(address operator);

    IOperatorFilterRegistry public constant OPERATOR_FILTER_REGISTRY =
        IOperatorFilterRegistry(0x000000000000AAeB6D7670E522A718067333cd4E);

    constructor(address subscriptionOrRegistrantToCopy, bool subscribe) {
        // If an inheriting token contract is deployed to a network without the registry deployed, the modifier
        // will not revert, but the contract will need to be registered with the registry once it is deployed in
        // order for the modifier to filter addresses.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (subscribe) {
                OPERATOR_FILTER_REGISTRY.registerAndSubscribe(address(this), subscriptionOrRegistrantToCopy);
            } else {
                if (subscriptionOrRegistrantToCopy != address(0)) {
                    OPERATOR_FILTER_REGISTRY.registerAndCopyEntries(address(this), subscriptionOrRegistrantToCopy);
                } else {
                    OPERATOR_FILTER_REGISTRY.register(address(this));
                }
            }
        }
    }

    modifier onlyAllowedOperator(address from) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            // Allow spending tokens from addresses with balance
            // Note that this still allows listings and marketplaces with escrow to transfer tokens if transferred
            // from an EOA.
            if (from == msg.sender) {
                _;
                return;
            }
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), msg.sender)) {
                revert OperatorNotAllowed(msg.sender);
            }
        }
        _;
    }

    modifier onlyAllowedOperatorApproval(address operator) virtual {
        // Check registry code length to facilitate testing in environments without a deployed registry.
        if (address(OPERATOR_FILTER_REGISTRY).code.length > 0) {
            if (!OPERATOR_FILTER_REGISTRY.isOperatorAllowed(address(this), operator)) {
                revert OperatorNotAllowed(operator);
            }
        }
        _;
    }
}

File 19 of 24: Ownable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

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() {
        _transferOwnership(_msgSender());
    }

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        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 {
        _transferOwnership(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");
        _transferOwnership(newOwner);
    }

    /**
     * @dev Transfers ownership of the contract to a new account (`newOwner`).
     * Internal function without access restriction.
     */
    function _transferOwnership(address newOwner) internal virtual {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}

File 20 of 24: Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        require(!paused(), "Pausable: paused");
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        require(paused(), "Pausable: not paused");
        _;
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

File 21 of 24: ReentrancyGuard.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        _nonReentrantBefore();
        _;
        _nonReentrantAfter();
    }

    function _nonReentrantBefore() private {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

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

File 22 of 24: SignedTokenVerifier.sol
// SPDX-License-Identifier: MIT

pragma solidity ^0.8.4;

import "./Ownable.sol";
import "./ECDSA.sol";

contract SignedTokenVerifier {
    using ECDSA for bytes32;

    address private _signer;
    event SignerUpdated(address newSigner);

    constructor() {
    }

    function _setSigner(address _newSigner) internal {
        _signer = _newSigner;
        emit SignerUpdated(_signer);
    }

    function _hash(bytes calldata _salt, uint256 _tokenId, string memory _nftName, address _address)
        internal
        view
        returns (bytes32)
    {
        return keccak256(abi.encode(_salt, address(this), _address, _tokenId, _nftName));
    }

    function _recover(bytes32 hash, bytes memory token)
        internal
        pure
        returns (address)
    {
        return hash.toEthSignedMessageHash().recover(token);
    }

    function getAddress(
        bytes calldata _salt,
        uint256 _tokenId,
        string memory _nftName,
        bytes calldata _token,
        address _address
    ) internal view returns (address) {
        return _recover(_hash(_salt, _tokenId, _nftName, _address), _token);
    }

    function verifyTokenForAddress(
        bytes calldata _salt,
        uint256 _tokenId,
        string memory _nftName,
        bytes calldata _token,
        address _address
    ) public view returns (bool) {
        return getAddress(_salt, _tokenId, _nftName, _token, _address) == _signer;
    }
}

File 23 of 24: 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":"string","name":"_baseURI","type":"string"},{"internalType":"address","name":"_signer","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[{"internalType":"address","name":"operator","type":"address"}],"name":"OperatorNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"newSigner","type":"address"}],"name":"SignerUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":false,"internalType":"uint256","name":"id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"value","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"value","type":"string"},{"indexed":true,"internalType":"uint256","name":"id","type":"uint256"}],"name":"URI","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"OPERATOR_FILTER_REGISTRY","outputs":[{"internalType":"contract IOperatorFilterRegistry","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_receiver","type":"address"},{"internalType":"uint256","name":"_mintAmount","type":"uint256"},{"internalType":"uint256","name":"_ticketId","type":"uint256"}],"name":"airDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_ticketId","type":"uint256"},{"internalType":"address[]","name":"_addresses","type":"address[]"}],"name":"batchAirDrop","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_account","type":"address"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyPerCollection","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_salt","type":"bytes"},{"internalType":"bytes","name":"_token","type":"bytes"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_nftName","type":"string"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","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":"uint256","name":"amount","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":"uint256","name":"_cost","type":"uint256"}],"name":"setCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_maxSupplyPerCollection","type":"uint256"}],"name":"setMaxSupplyPerCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"receiver","type":"address"},{"internalType":"uint96","name":"numerator","type":"uint96"}],"name":"setRoyaltyInfo","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes","name":"_salt","type":"bytes"},{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"string","name":"_nftName","type":"string"},{"internalType":"bytes","name":"_token","type":"bytes"},{"internalType":"address","name":"_address","type":"address"}],"name":"verifyTokenForAddress","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6000600c556103e8600d5560c06040526005608081905264173539b7b760d91b60a09081526200003391600f91906200031c565b503480156200004157600080fd5b5060405162003af538038062003af58339810160408190526200006491620003f5565b6000805460ff19169055733cc6cdda760b79bafa08df41ecfa224f810dceb660018362000091816200025d565b506200009d3362000276565b60016007556daaeb6d7670e522a718067333cd4e3b15620001e75780156200013557604051633e9f1edf60e11b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e90637d3e3dbe906044015b600060405180830381600087803b1580156200011657600080fd5b505af11580156200012b573d6000803e3d6000fd5b50505050620001e7565b6001600160a01b03821615620001865760405163a0af290360e01b81523060048201526001600160a01b03831660248201526daaeb6d7670e522a718067333cd4e9063a0af290390604401620000fb565b604051632210724360e11b81523060048201526daaeb6d7670e522a718067333cd4e90634420e48690602401600060405180830381600087803b158015620001cd57600080fd5b505af1158015620001e2573d6000803e3d6000fd5b505050505b505060408051808201909152600b8082526a57474d49202f204e474d4960a81b60209092019182526200021d91600a916200031c565b50604080518082019091526002808252612ba760f11b60209092019182526200024991600b916200031c565b506200025581620002c8565b505062000522565b8051620002729060039060208401906200031c565b5050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b600680546001600160a01b0319166001600160a01b0383169081179091556040519081527f5553331329228fbd4123164423717a4a7539f6dfa1c3279a923b98fd681a6c739060200160405180910390a150565b8280546200032a90620004e6565b90600052602060002090601f0160209004810192826200034e576000855562000399565b82601f106200036957805160ff191683800117855562000399565b8280016001018555821562000399579182015b82811115620003995782518255916020019190600101906200037c565b50620003a7929150620003ab565b5090565b5b80821115620003a75760008155600101620003ac565b634e487b7160e01b600052604160045260246000fd5b80516001600160a01b0381168114620003f057600080fd5b919050565b600080604083850312156200040957600080fd5b82516001600160401b03808211156200042157600080fd5b818501915085601f8301126200043657600080fd5b8151818111156200044b576200044b620003c2565b604051601f8201601f19908116603f01168101908382118183101715620004765762000476620003c2565b816040528281526020935088848487010111156200049357600080fd5b600091505b82821015620004b7578482018401518183018501529083019062000498565b82821115620004c95760008484830101525b9550620004db915050858201620003d8565b925050509250929050565b600181811c90821680620004fb57607f821691505b6020821081036200051c57634e487b7160e01b600052602260045260246000fd5b50919050565b6135c380620005326000396000f3fe6080604052600436106101ed5760003560e01c80635c975abb1161010d578063bd85b039116100a0578063e985e9c51161006f578063e985e9c514610599578063f242432a146105e2578063f2fde38b14610602578063f5298aca14610622578063fe1c947c1461064257600080fd5b8063bd85b03914610516578063d651acd414610543578063da6d6f2d14610563578063daaa4b731461058357600080fd5b80638456cb59116100dc5780638456cb59146104ae5780638da5cb5b146104c357806395d89b41146104e1578063a22cb465146104f657600080fd5b80635c975abb14610441578063651a56b2146104595780636b20c45414610479578063715018a61461049957600080fd5b80632eb2c2d61161018557806344a0d68a1161015457806344a0d68a146103b25780634c37697d146103d25780634e1273f4146103e55780634f558e791461041257600080fd5b80632eb2c2d61461032e5780633ccfd60b1461034e5780633f4ba83a1461036357806341f434341461037857600080fd5b806306fdde03116101c157806306fdde03146102975780630e89341c146102b957806313faede6146102d95780632a55205a146102ef57600080fd5b8062fdd58e146101f257806301ffc9a71461022557806302fa7c471461025557806302fe530514610277575b600080fd5b3480156101fe57600080fd5b5061021261020d36600461274d565b610662565b6040519081526020015b60405180910390f35b34801561023157600080fd5b5061024561024036600461278f565b6106fa565b604051901515815260200161021c565b34801561026157600080fd5b506102756102703660046127ac565b61071a565b005b34801561028357600080fd5b506102756102923660046128a6565b610730565b3480156102a357600080fd5b506102ac610744565b60405161021c9190612932565b3480156102c557600080fd5b506102ac6102d4366004612945565b6107d6565b3480156102e557600080fd5b50610212600c5481565b3480156102fb57600080fd5b5061030f61030a36600461295e565b610869565b604080516001600160a01b03909316835260208301919091520161021c565b34801561033a57600080fd5b50610275610349366004612a14565b610917565b34801561035a57600080fd5b506102756109f6565b34801561036f57600080fd5b50610275610a84565b34801561038457600080fd5b5061039a6daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b03909116815260200161021c565b3480156103be57600080fd5b506102756103cd366004612945565b610a94565b6102756103e0366004612b02565b610aa1565b3480156103f157600080fd5b50610405610400366004612c0c565b610cac565b60405161021c9190612caa565b34801561041e57600080fd5b5061024561042d366004612945565b600090815260046020526040902054151590565b34801561044d57600080fd5b5060005460ff16610245565b34801561046557600080fd5b50610245610474366004612cbd565b610dd5565b34801561048557600080fd5b50610275610494366004612d6e565b610e09565b3480156104a557600080fd5b50610275610e51565b3480156104ba57600080fd5b50610275610e63565b3480156104cf57600080fd5b506005546001600160a01b031661039a565b3480156104ed57600080fd5b506102ac610e73565b34801561050257600080fd5b50610275610511366004612df1565b610e82565b34801561052257600080fd5b50610212610531366004612945565b60009081526004602052604090205490565b34801561054f57600080fd5b5061027561055e366004612945565b610f46565b34801561056f57600080fd5b5061027561057e366004612e1f565b610f53565b34801561058f57600080fd5b50610212600d5481565b3480156105a557600080fd5b506102456105b4366004612e5b565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b3480156105ee57600080fd5b506102756105fd366004612e89565b610f9e565b34801561060e57600080fd5b5061027561061d366004612ef1565b611070565b34801561062e57600080fd5b5061027561063d366004612f0e565b6110e6565b34801561064e57600080fd5b5061027561065d366004612f0e565b611129565b60006001600160a01b0383166106d25760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b60006107058261114c565b8061071457506107148261119c565b92915050565b6107226111c1565b61072c828261121b565b5050565b6107386111c1565b61074181611318565b50565b6060600a805461075390612f43565b80601f016020809104026020016040519081016040528092919081815260200182805461077f90612f43565b80156107cc5780601f106107a1576101008083540402835291602001916107cc565b820191906000526020600020905b8154815290600101906020018083116107af57829003601f168201915b5050505050905090565b60008181526004602052604090205460609061082d5760405162461bcd60e51b81526020600482015260166024820152752aa9249d103737b732bc34b9ba32b73a103a37b5b2b760511b60448201526064016106c9565b6108368261132b565b61083f836113bf565b600f60405160200161085393929190612f7d565b6040516020818303038152906040529050919050565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916108de5750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090612710906108fd906001600160601b031687613056565b610907919061308b565b91519350909150505b9250929050565b846daaeb6d7670e522a718067333cd4e3b156109e157336001600160a01b0382160361094f5761094a86868686866114c7565b6109ee565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c2919061309f565b6109e157604051633b79c77360e21b81523360048201526024016106c9565b6109ee86868686866114c7565b505050505050565b6109fe6111c1565b610a06611513565b6000610a1a6005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610a64576040519150601f19603f3d011682016040523d82523d6000602084013e610a69565b606091505b5050905080610a7757600080fd5b50610a826001600755565b565b610a8c6111c1565b610a8261156c565b610a9c6111c1565b600c55565b60005460ff1615610ae75760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106c9565b610aef611513565b600c54341015610b375760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016106c9565b81600d54610b518260009081526004602052604090205490565b610b5c9060016130bc565b1115610ba15760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016106c9565b610bb087878585898933610dd5565b610beb5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064016106c9565b600e82604051610bfb91906130d4565b9081526040519081900360200190205460ff1615610c535760405162461bcd60e51b8152602060048201526015602482015274546f6b656e20616c7265616479206d696e7465642160581b60448201526064016106c9565b610c6f33846001604051806020016040528060008152506115ff565b6001600e83604051610c8191906130d4565b908152604051908190036020019020805491151560ff19909216919091179055506109ee6001600755565b60608151835114610d115760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016106c9565b600083516001600160401b03811115610d2c57610d2c6127f1565b604051908082528060200260200182016040528015610d55578160200160208202803683370190505b50905060005b8451811015610dcd57610da0858281518110610d7957610d796130f0565b6020026020010151858381518110610d9357610d936130f0565b6020026020010151610662565b828281518110610db257610db26130f0565b6020908102919091010152610dc681613106565b9050610d5b565b509392505050565b6006546000906001600160a01b0316610df389898989898989611724565b6001600160a01b03161498975050505050505050565b6001600160a01b038316331480610e255750610e2583336105b4565b610e415760405162461bcd60e51b81526004016106c99061311f565b610e4c83838361177e565b505050565b610e596111c1565b610a82600061191f565b610e6b6111c1565b610a82611971565b6060600b805461075390612f43565b816daaeb6d7670e522a718067333cd4e3b15610f3c57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610ef0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f14919061309f565b610f3c57604051633b79c77360e21b81526001600160a01b03821660048201526024016106c9565b610e4c83836119ec565b610f4e6111c1565b600d55565b610f5b6111c1565b60005b8151811015610e4c57610f8c828281518110610f7c57610f7c6130f0565b6020026020010151600185611129565b80610f9681613106565b915050610f5e565b846daaeb6d7670e522a718067333cd4e3b1561106357336001600160a01b03821603610fd15761094a86868686866119f7565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611044919061309f565b61106357604051633b79c77360e21b81523360048201526024016106c9565b6109ee86868686866119f7565b6110786111c1565b6001600160a01b0381166110dd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c9565b6107418161191f565b6001600160a01b038316331480611102575061110283336105b4565b61111e5760405162461bcd60e51b81526004016106c99061311f565b610e4c838383611a3c565b6111316111c1565b610e4c838284604051806020016040528060008152506115ff565b60006001600160e01b03198216636cdb3d1360e11b148061117d57506001600160e01b031982166303a24d0760e21b145b8061071457506301ffc9a760e01b6001600160e01b0319831614610714565b60006001600160e01b0319821663152a902d60e11b148061071457506107148261114c565b6005546001600160a01b03163314610a825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c9565b6127106001600160601b03821611156112895760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016106c9565b6001600160a01b0382166112df5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016106c9565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b805161072c90600390602084019061269f565b60606003805461133a90612f43565b80601f016020809104026020016040519081016040528092919081815260200182805461136690612f43565b80156113b35780601f10611388576101008083540402835291602001916113b3565b820191906000526020600020905b81548152906001019060200180831161139657829003601f168201915b50505050509050919050565b6060816000036113e65750506040805180820190915260018152600360fc1b602082015290565b8160005b811561141057806113fa81613106565b91506114099050600a8361308b565b91506113ea565b6000816001600160401b0381111561142a5761142a6127f1565b6040519080825280601f01601f191660200182016040528015611454576020820181803683370190505b5090505b84156114bf57611469600183613168565b9150611476600a8661317f565b6114819060306130bc565b60f81b818381518110611496576114966130f0565b60200101906001600160f81b031916908160001a9053506114b8600a8661308b565b9450611458565b949350505050565b6001600160a01b0385163314806114e357506114e385336105b4565b6114ff5760405162461bcd60e51b81526004016106c990613193565b61150c8585858585611b58565b5050505050565b6002600754036115655760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c9565b6002600755565b60005460ff166115b55760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106c9565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03841661165f5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016106c9565b33600061166b85611cfd565b9050600061167885611cfd565b905061168983600089858589611d48565b60008681526001602090815260408083206001600160a01b038b168452909152812080548792906116bb9084906130bc565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461171b83600089898989611d56565b50505050505050565b60006117726117368989898987611eb1565b85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eef92505050565b98975050505050505050565b6001600160a01b0383166117a45760405162461bcd60e51b81526004016106c9906131e1565b80518251146117c55760405162461bcd60e51b81526004016106c990613224565b60003390506117e881856000868660405180602001604052806000815250611d48565b60005b83518110156118b0576000848281518110611808576118086130f0565b602002602001015190506000848381518110611826576118266130f0565b60209081029190910181015160008481526001835260408082206001600160a01b038c1683529093529190912054909150818110156118775760405162461bcd60e51b81526004016106c99061326c565b60009283526001602090815260408085206001600160a01b038b16865290915290922091039055806118a881613106565b9150506117eb565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516119019291906132b0565b60405180910390a46040805160208101909152600090525b50505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005460ff16156119b75760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106c9565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115e23390565b61072c338383611f59565b6001600160a01b038516331480611a135750611a1385336105b4565b611a2f5760405162461bcd60e51b81526004016106c990613193565b61150c8585858585612039565b6001600160a01b038316611a625760405162461bcd60e51b81526004016106c9906131e1565b336000611a6e84611cfd565b90506000611a7b84611cfd565b9050611a9b83876000858560405180602001604052806000815250611d48565b60008581526001602090815260408083206001600160a01b038a16845290915290205484811015611ade5760405162461bcd60e51b81526004016106c99061326c565b60008681526001602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091526000905261171b565b8151835114611b795760405162461bcd60e51b81526004016106c990613224565b6001600160a01b038416611b9f5760405162461bcd60e51b81526004016106c9906132de565b33611bae818787878787611d48565b60005b8451811015611c97576000858281518110611bce57611bce6130f0565b602002602001015190506000858381518110611bec57611bec6130f0565b60209081029190910181015160008481526001835260408082206001600160a01b038e168352909352919091205490915081811015611c3d5760405162461bcd60e51b81526004016106c990613323565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611c7c9084906130bc565b9250508190555050505080611c9090613106565b9050611bb1565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611ce79291906132b0565b60405180910390a46109ee818787878787612175565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611d3757611d376130f0565b602090810291909101015292915050565b6109ee868686868686612230565b6001600160a01b0384163b156109ee5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611d9a908990899088908890889060040161336d565b6020604051808303816000875af1925050508015611dd5575060408051601f3d908101601f19168201909252611dd2918101906133b2565b60015b611e8157611de16133cf565b806308c379a003611e1a5750611df56133eb565b80611e005750611e1c565b8060405162461bcd60e51b81526004016106c99190612932565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016106c9565b6001600160e01b0319811663f23a6e6160e01b1461171b5760405162461bcd60e51b81526004016106c990613474565b6000858530848787604051602001611ece969594939291906134bc565b60405160208183030381529060405280519060200120905095945050505050565b6000611f5282611f4c856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9061233c565b9392505050565b816001600160a01b0316836001600160a01b031603611fcc5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016106c9565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661205f5760405162461bcd60e51b81526004016106c9906132de565b33600061206b85611cfd565b9050600061207885611cfd565b9050612088838989858589611d48565b60008681526001602090815260408083206001600160a01b038c168452909152902054858110156120cb5760405162461bcd60e51b81526004016106c990613323565b60008781526001602090815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061210a9084906130bc565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461216a848a8a8a8a8a611d56565b505050505050505050565b6001600160a01b0384163b156109ee5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906121b99089908990889088908890600401613525565b6020604051808303816000875af19250505080156121f4575060408051601f3d908101601f191682019092526121f1918101906133b2565b60015b61220057611de16133cf565b6001600160e01b0319811663bc197c8160e01b1461171b5760405162461bcd60e51b81526004016106c990613474565b6001600160a01b0385166122b75760005b83518110156122b55782818151811061225c5761225c6130f0565b60200260200101516004600086848151811061227a5761227a6130f0565b60200260200101518152602001908152602001600020600082825461229f91906130bc565b909155506122ae905081613106565b9050612241565b505b6001600160a01b0384166109ee5760005b835181101561171b578281815181106122e3576122e36130f0565b602002602001015160046000868481518110612301576123016130f0565b6020026020010151815260200190815260200160002060008282546123269190613168565b90915550612335905081613106565b90506122c8565b600080600061234b8585612358565b91509150610dcd816123c3565b600080825160410361238e5760208301516040840151606085015160001a61238287828585612579565b94509450505050610910565b82516040036123b757602083015160408401516123ac868383612666565b935093505050610910565b50600090506002610910565b60008160048111156123d7576123d7613577565b036123df5750565b60018160048111156123f3576123f3613577565b036124405760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106c9565b600281600481111561245457612454613577565b036124a15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106c9565b60038160048111156124b5576124b5613577565b0361250d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106c9565b600481600481111561252157612521613577565b036107415760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016106c9565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156125b0575060009050600361265d565b8460ff16601b141580156125c857508460ff16601c14155b156125d9575060009050600461265d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561262d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166126565760006001925092505061265d565b9150600090505b94509492505050565b6000806001600160ff1b0383168161268360ff86901c601b6130bc565b905061269187828885612579565b935093505050935093915050565b8280546126ab90612f43565b90600052602060002090601f0160209004810192826126cd5760008555612713565b82601f106126e657805160ff1916838001178555612713565b82800160010185558215612713579182015b828111156127135782518255916020019190600101906126f8565b5061271f929150612723565b5090565b5b8082111561271f5760008155600101612724565b6001600160a01b038116811461074157600080fd5b6000806040838503121561276057600080fd5b823561276b81612738565b946020939093013593505050565b6001600160e01b03198116811461074157600080fd5b6000602082840312156127a157600080fd5b8135611f5281612779565b600080604083850312156127bf57600080fd5b82356127ca81612738565b915060208301356001600160601b03811681146127e657600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561282c5761282c6127f1565b6040525050565b600082601f83011261284457600080fd5b81356001600160401b0381111561285d5761285d6127f1565b604051612874601f8301601f191660200182612807565b81815284602083860101111561288957600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156128b857600080fd5b81356001600160401b038111156128ce57600080fd5b6114bf84828501612833565b60005b838110156128f55781810151838201526020016128dd565b838111156119195750506000910152565b6000815180845261291e8160208601602086016128da565b601f01601f19169290920160200192915050565b602081526000611f526020830184612906565b60006020828403121561295757600080fd5b5035919050565b6000806040838503121561297157600080fd5b50508035926020909101359150565b60006001600160401b03821115612999576129996127f1565b5060051b60200190565b600082601f8301126129b457600080fd5b813560206129c182612980565b6040516129ce8282612807565b83815260059390931b85018201928281019150868411156129ee57600080fd5b8286015b84811015612a0957803583529183019183016129f2565b509695505050505050565b600080600080600060a08688031215612a2c57600080fd5b8535612a3781612738565b94506020860135612a4781612738565b935060408601356001600160401b0380821115612a6357600080fd5b612a6f89838a016129a3565b94506060880135915080821115612a8557600080fd5b612a9189838a016129a3565b93506080880135915080821115612aa757600080fd5b50612ab488828901612833565b9150509295509295909350565b60008083601f840112612ad357600080fd5b5081356001600160401b03811115612aea57600080fd5b60208301915083602082850101111561091057600080fd5b60008060008060008060808789031215612b1b57600080fd5b86356001600160401b0380821115612b3257600080fd5b612b3e8a838b01612ac1565b90985096506020890135915080821115612b5757600080fd5b612b638a838b01612ac1565b9096509450604089013593506060890135915080821115612b8357600080fd5b50612b9089828a01612833565b9150509295509295509295565b600082601f830112612bae57600080fd5b81356020612bbb82612980565b604051612bc88282612807565b83815260059390931b8501820192828101915086841115612be857600080fd5b8286015b84811015612a09578035612bff81612738565b8352918301918301612bec565b60008060408385031215612c1f57600080fd5b82356001600160401b0380821115612c3657600080fd5b612c4286838701612b9d565b93506020850135915080821115612c5857600080fd5b50612c65858286016129a3565b9150509250929050565b600081518084526020808501945080840160005b83811015612c9f57815187529582019590820190600101612c83565b509495945050505050565b602081526000611f526020830184612c6f565b600080600080600080600060a0888a031215612cd857600080fd5b87356001600160401b0380821115612cef57600080fd5b612cfb8b838c01612ac1565b909950975060208a0135965060408a0135915080821115612d1b57600080fd5b612d278b838c01612833565b955060608a0135915080821115612d3d57600080fd5b50612d4a8a828b01612ac1565b9094509250506080880135612d5e81612738565b8091505092959891949750929550565b600080600060608486031215612d8357600080fd5b8335612d8e81612738565b925060208401356001600160401b0380821115612daa57600080fd5b612db6878388016129a3565b93506040860135915080821115612dcc57600080fd5b50612dd9868287016129a3565b9150509250925092565b801515811461074157600080fd5b60008060408385031215612e0457600080fd5b8235612e0f81612738565b915060208301356127e681612de3565b60008060408385031215612e3257600080fd5b8235915060208301356001600160401b03811115612e4f57600080fd5b612c6585828601612b9d565b60008060408385031215612e6e57600080fd5b8235612e7981612738565b915060208301356127e681612738565b600080600080600060a08688031215612ea157600080fd5b8535612eac81612738565b94506020860135612ebc81612738565b9350604086013592506060860135915060808601356001600160401b03811115612ee557600080fd5b612ab488828901612833565b600060208284031215612f0357600080fd5b8135611f5281612738565b600080600060608486031215612f2357600080fd5b8335612f2e81612738565b95602085013595506040909401359392505050565b600181811c90821680612f5757607f821691505b602082108103612f7757634e487b7160e01b600052602260045260246000fd5b50919050565b600084516020612f908285838a016128da565b855191840191612fa38184848a016128da565b8554920191600090600181811c9080831680612fc057607f831692505b8583108103612fdd57634e487b7160e01b85526022600452602485fd5b808015612ff157600181146130025761302f565b60ff1985168852838801955061302f565b60008b81526020902060005b858110156130275781548a82015290840190880161300e565b505083880195505b50939b9a5050505050505050505050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561307057613070613040565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261309a5761309a613075565b500490565b6000602082840312156130b157600080fd5b8151611f5281612de3565b600082198211156130cf576130cf613040565b500190565b600082516130e68184602087016128da565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b60006001820161311857613118613040565b5060010190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60008282101561317a5761317a613040565b500390565b60008261318e5761318e613075565b500690565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6040815260006132c36040830185612c6f565b82810360208401526132d58185612c6f565b95945050505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906133a790830184612906565b979650505050505050565b6000602082840312156133c457600080fd5b8151611f5281612779565b600060033d11156133e85760046000803e5060005160e01c5b90565b600060443d10156133f95790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561342857505050505090565b82850191508151818111156134405750505050505090565b843d870101602082850101111561345a5750505050505090565b61346960208286010187612807565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60a081528560a0820152858760c0830137600060c087830181018290526001600160a01b0387811660208501528616604084015260608301859052601f8801601f19168301838103820160808501529061351890820185612906565b9998505050505050505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061355190830186612c6f565b82810360608401526135638186612c6f565b905082810360808401526117728185612906565b634e487b7160e01b600052602160045260246000fdfea264697066735822122072a796c25373e81786bed4d74bfb2229065905a0076cf702a1285fbe010bf1d764736f6c634300080d003300000000000000000000000000000000000000000000000000000000000000400000000000000000000000008d10505d63581a18063bb1c94cb6e3caefd4c901000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f676c6f62616c2e6d7970696e6174612e636c6f75642f697066732f516d5271785a4d52546838344b335a69676741643955547431365653376a5a4877426d5a5a34654c7348693541392f0000000000000000000000000000

Deployed Bytecode

0x6080604052600436106101ed5760003560e01c80635c975abb1161010d578063bd85b039116100a0578063e985e9c51161006f578063e985e9c514610599578063f242432a146105e2578063f2fde38b14610602578063f5298aca14610622578063fe1c947c1461064257600080fd5b8063bd85b03914610516578063d651acd414610543578063da6d6f2d14610563578063daaa4b731461058357600080fd5b80638456cb59116100dc5780638456cb59146104ae5780638da5cb5b146104c357806395d89b41146104e1578063a22cb465146104f657600080fd5b80635c975abb14610441578063651a56b2146104595780636b20c45414610479578063715018a61461049957600080fd5b80632eb2c2d61161018557806344a0d68a1161015457806344a0d68a146103b25780634c37697d146103d25780634e1273f4146103e55780634f558e791461041257600080fd5b80632eb2c2d61461032e5780633ccfd60b1461034e5780633f4ba83a1461036357806341f434341461037857600080fd5b806306fdde03116101c157806306fdde03146102975780630e89341c146102b957806313faede6146102d95780632a55205a146102ef57600080fd5b8062fdd58e146101f257806301ffc9a71461022557806302fa7c471461025557806302fe530514610277575b600080fd5b3480156101fe57600080fd5b5061021261020d36600461274d565b610662565b6040519081526020015b60405180910390f35b34801561023157600080fd5b5061024561024036600461278f565b6106fa565b604051901515815260200161021c565b34801561026157600080fd5b506102756102703660046127ac565b61071a565b005b34801561028357600080fd5b506102756102923660046128a6565b610730565b3480156102a357600080fd5b506102ac610744565b60405161021c9190612932565b3480156102c557600080fd5b506102ac6102d4366004612945565b6107d6565b3480156102e557600080fd5b50610212600c5481565b3480156102fb57600080fd5b5061030f61030a36600461295e565b610869565b604080516001600160a01b03909316835260208301919091520161021c565b34801561033a57600080fd5b50610275610349366004612a14565b610917565b34801561035a57600080fd5b506102756109f6565b34801561036f57600080fd5b50610275610a84565b34801561038457600080fd5b5061039a6daaeb6d7670e522a718067333cd4e81565b6040516001600160a01b03909116815260200161021c565b3480156103be57600080fd5b506102756103cd366004612945565b610a94565b6102756103e0366004612b02565b610aa1565b3480156103f157600080fd5b50610405610400366004612c0c565b610cac565b60405161021c9190612caa565b34801561041e57600080fd5b5061024561042d366004612945565b600090815260046020526040902054151590565b34801561044d57600080fd5b5060005460ff16610245565b34801561046557600080fd5b50610245610474366004612cbd565b610dd5565b34801561048557600080fd5b50610275610494366004612d6e565b610e09565b3480156104a557600080fd5b50610275610e51565b3480156104ba57600080fd5b50610275610e63565b3480156104cf57600080fd5b506005546001600160a01b031661039a565b3480156104ed57600080fd5b506102ac610e73565b34801561050257600080fd5b50610275610511366004612df1565b610e82565b34801561052257600080fd5b50610212610531366004612945565b60009081526004602052604090205490565b34801561054f57600080fd5b5061027561055e366004612945565b610f46565b34801561056f57600080fd5b5061027561057e366004612e1f565b610f53565b34801561058f57600080fd5b50610212600d5481565b3480156105a557600080fd5b506102456105b4366004612e5b565b6001600160a01b03918216600090815260026020908152604080832093909416825291909152205460ff1690565b3480156105ee57600080fd5b506102756105fd366004612e89565b610f9e565b34801561060e57600080fd5b5061027561061d366004612ef1565b611070565b34801561062e57600080fd5b5061027561063d366004612f0e565b6110e6565b34801561064e57600080fd5b5061027561065d366004612f0e565b611129565b60006001600160a01b0383166106d25760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b5060009081526001602090815260408083206001600160a01b03949094168352929052205490565b60006107058261114c565b8061071457506107148261119c565b92915050565b6107226111c1565b61072c828261121b565b5050565b6107386111c1565b61074181611318565b50565b6060600a805461075390612f43565b80601f016020809104026020016040519081016040528092919081815260200182805461077f90612f43565b80156107cc5780601f106107a1576101008083540402835291602001916107cc565b820191906000526020600020905b8154815290600101906020018083116107af57829003601f168201915b5050505050905090565b60008181526004602052604090205460609061082d5760405162461bcd60e51b81526020600482015260166024820152752aa9249d103737b732bc34b9ba32b73a103a37b5b2b760511b60448201526064016106c9565b6108368261132b565b61083f836113bf565b600f60405160200161085393929190612f7d565b6040516020818303038152906040529050919050565b60008281526009602090815260408083208151808301909252546001600160a01b038116808352600160a01b9091046001600160601b03169282019290925282916108de5750604080518082019091526008546001600160a01b0381168252600160a01b90046001600160601b031660208201525b6020810151600090612710906108fd906001600160601b031687613056565b610907919061308b565b91519350909150505b9250929050565b846daaeb6d7670e522a718067333cd4e3b156109e157336001600160a01b0382160361094f5761094a86868686866114c7565b6109ee565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa15801561099e573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906109c2919061309f565b6109e157604051633b79c77360e21b81523360048201526024016106c9565b6109ee86868686866114c7565b505050505050565b6109fe6111c1565b610a06611513565b6000610a1a6005546001600160a01b031690565b6001600160a01b03164760405160006040518083038185875af1925050503d8060008114610a64576040519150601f19603f3d011682016040523d82523d6000602084013e610a69565b606091505b5050905080610a7757600080fd5b50610a826001600755565b565b610a8c6111c1565b610a8261156c565b610a9c6111c1565b600c55565b60005460ff1615610ae75760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106c9565b610aef611513565b600c54341015610b375760405162461bcd60e51b8152602060048201526013602482015272496e73756666696369656e742066756e64732160681b60448201526064016106c9565b81600d54610b518260009081526004602052604090205490565b610b5c9060016130bc565b1115610ba15760405162461bcd60e51b81526020600482015260146024820152734d617820737570706c792065786365656465642160601b60448201526064016106c9565b610bb087878585898933610dd5565b610beb5760405162461bcd60e51b815260206004820152600c60248201526b155b985d5d1a1bdc9a5e995960a21b60448201526064016106c9565b600e82604051610bfb91906130d4565b9081526040519081900360200190205460ff1615610c535760405162461bcd60e51b8152602060048201526015602482015274546f6b656e20616c7265616479206d696e7465642160581b60448201526064016106c9565b610c6f33846001604051806020016040528060008152506115ff565b6001600e83604051610c8191906130d4565b908152604051908190036020019020805491151560ff19909216919091179055506109ee6001600755565b60608151835114610d115760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016106c9565b600083516001600160401b03811115610d2c57610d2c6127f1565b604051908082528060200260200182016040528015610d55578160200160208202803683370190505b50905060005b8451811015610dcd57610da0858281518110610d7957610d796130f0565b6020026020010151858381518110610d9357610d936130f0565b6020026020010151610662565b828281518110610db257610db26130f0565b6020908102919091010152610dc681613106565b9050610d5b565b509392505050565b6006546000906001600160a01b0316610df389898989898989611724565b6001600160a01b03161498975050505050505050565b6001600160a01b038316331480610e255750610e2583336105b4565b610e415760405162461bcd60e51b81526004016106c99061311f565b610e4c83838361177e565b505050565b610e596111c1565b610a82600061191f565b610e6b6111c1565b610a82611971565b6060600b805461075390612f43565b816daaeb6d7670e522a718067333cd4e3b15610f3c57604051633185c44d60e21b81523060048201526001600160a01b03821660248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015610ef0573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190610f14919061309f565b610f3c57604051633b79c77360e21b81526001600160a01b03821660048201526024016106c9565b610e4c83836119ec565b610f4e6111c1565b600d55565b610f5b6111c1565b60005b8151811015610e4c57610f8c828281518110610f7c57610f7c6130f0565b6020026020010151600185611129565b80610f9681613106565b915050610f5e565b846daaeb6d7670e522a718067333cd4e3b1561106357336001600160a01b03821603610fd15761094a86868686866119f7565b604051633185c44d60e21b81523060048201523360248201526daaeb6d7670e522a718067333cd4e9063c617113490604401602060405180830381865afa158015611020573d6000803e3d6000fd5b505050506040513d601f19601f82011682018060405250810190611044919061309f565b61106357604051633b79c77360e21b81523360048201526024016106c9565b6109ee86868686866119f7565b6110786111c1565b6001600160a01b0381166110dd5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b60648201526084016106c9565b6107418161191f565b6001600160a01b038316331480611102575061110283336105b4565b61111e5760405162461bcd60e51b81526004016106c99061311f565b610e4c838383611a3c565b6111316111c1565b610e4c838284604051806020016040528060008152506115ff565b60006001600160e01b03198216636cdb3d1360e11b148061117d57506001600160e01b031982166303a24d0760e21b145b8061071457506301ffc9a760e01b6001600160e01b0319831614610714565b60006001600160e01b0319821663152a902d60e11b148061071457506107148261114c565b6005546001600160a01b03163314610a825760405162461bcd60e51b815260206004820181905260248201527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e657260448201526064016106c9565b6127106001600160601b03821611156112895760405162461bcd60e51b815260206004820152602a60248201527f455243323938313a20726f79616c7479206665652077696c6c206578636565646044820152692073616c65507269636560b01b60648201526084016106c9565b6001600160a01b0382166112df5760405162461bcd60e51b815260206004820152601960248201527f455243323938313a20696e76616c69642072656365697665720000000000000060448201526064016106c9565b604080518082019091526001600160a01b039092168083526001600160601b039091166020909201829052600160a01b90910217600855565b805161072c90600390602084019061269f565b60606003805461133a90612f43565b80601f016020809104026020016040519081016040528092919081815260200182805461136690612f43565b80156113b35780601f10611388576101008083540402835291602001916113b3565b820191906000526020600020905b81548152906001019060200180831161139657829003601f168201915b50505050509050919050565b6060816000036113e65750506040805180820190915260018152600360fc1b602082015290565b8160005b811561141057806113fa81613106565b91506114099050600a8361308b565b91506113ea565b6000816001600160401b0381111561142a5761142a6127f1565b6040519080825280601f01601f191660200182016040528015611454576020820181803683370190505b5090505b84156114bf57611469600183613168565b9150611476600a8661317f565b6114819060306130bc565b60f81b818381518110611496576114966130f0565b60200101906001600160f81b031916908160001a9053506114b8600a8661308b565b9450611458565b949350505050565b6001600160a01b0385163314806114e357506114e385336105b4565b6114ff5760405162461bcd60e51b81526004016106c990613193565b61150c8585858585611b58565b5050505050565b6002600754036115655760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016106c9565b6002600755565b60005460ff166115b55760405162461bcd60e51b815260206004820152601460248201527314185d5cd8589b194e881b9bdd081c185d5cd95960621b60448201526064016106c9565b6000805460ff191690557f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa335b6040516001600160a01b03909116815260200160405180910390a1565b6001600160a01b03841661165f5760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016106c9565b33600061166b85611cfd565b9050600061167885611cfd565b905061168983600089858589611d48565b60008681526001602090815260408083206001600160a01b038b168452909152812080548792906116bb9084906130bc565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461171b83600089898989611d56565b50505050505050565b60006117726117368989898987611eb1565b85858080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250611eef92505050565b98975050505050505050565b6001600160a01b0383166117a45760405162461bcd60e51b81526004016106c9906131e1565b80518251146117c55760405162461bcd60e51b81526004016106c990613224565b60003390506117e881856000868660405180602001604052806000815250611d48565b60005b83518110156118b0576000848281518110611808576118086130f0565b602002602001015190506000848381518110611826576118266130f0565b60209081029190910181015160008481526001835260408082206001600160a01b038c1683529093529190912054909150818110156118775760405162461bcd60e51b81526004016106c99061326c565b60009283526001602090815260408085206001600160a01b038b16865290915290922091039055806118a881613106565b9150506117eb565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516119019291906132b0565b60405180910390a46040805160208101909152600090525b50505050565b600580546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60005460ff16156119b75760405162461bcd60e51b815260206004820152601060248201526f14185d5cd8589b194e881c185d5cd95960821b60448201526064016106c9565b6000805460ff191660011790557f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a2586115e23390565b61072c338383611f59565b6001600160a01b038516331480611a135750611a1385336105b4565b611a2f5760405162461bcd60e51b81526004016106c990613193565b61150c8585858585612039565b6001600160a01b038316611a625760405162461bcd60e51b81526004016106c9906131e1565b336000611a6e84611cfd565b90506000611a7b84611cfd565b9050611a9b83876000858560405180602001604052806000815250611d48565b60008581526001602090815260408083206001600160a01b038a16845290915290205484811015611ade5760405162461bcd60e51b81526004016106c99061326c565b60008681526001602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a460408051602081019091526000905261171b565b8151835114611b795760405162461bcd60e51b81526004016106c990613224565b6001600160a01b038416611b9f5760405162461bcd60e51b81526004016106c9906132de565b33611bae818787878787611d48565b60005b8451811015611c97576000858281518110611bce57611bce6130f0565b602002602001015190506000858381518110611bec57611bec6130f0565b60209081029190910181015160008481526001835260408082206001600160a01b038e168352909352919091205490915081811015611c3d5760405162461bcd60e51b81526004016106c990613323565b60008381526001602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290611c7c9084906130bc565b9250508190555050505080611c9090613106565b9050611bb1565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051611ce79291906132b0565b60405180910390a46109ee818787878787612175565b60408051600180825281830190925260609160009190602080830190803683370190505090508281600081518110611d3757611d376130f0565b602090810291909101015292915050565b6109ee868686868686612230565b6001600160a01b0384163b156109ee5760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e6190611d9a908990899088908890889060040161336d565b6020604051808303816000875af1925050508015611dd5575060408051601f3d908101601f19168201909252611dd2918101906133b2565b60015b611e8157611de16133cf565b806308c379a003611e1a5750611df56133eb565b80611e005750611e1c565b8060405162461bcd60e51b81526004016106c99190612932565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e2d455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016106c9565b6001600160e01b0319811663f23a6e6160e01b1461171b5760405162461bcd60e51b81526004016106c990613474565b6000858530848787604051602001611ece969594939291906134bc565b60405160208183030381529060405280519060200120905095945050505050565b6000611f5282611f4c856040517f19457468657265756d205369676e6564204d6573736167653a0a3332000000006020820152603c8101829052600090605c01604051602081830303815290604052805190602001209050919050565b9061233c565b9392505050565b816001600160a01b0316836001600160a01b031603611fcc5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016106c9565b6001600160a01b03838116600081815260026020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b03841661205f5760405162461bcd60e51b81526004016106c9906132de565b33600061206b85611cfd565b9050600061207885611cfd565b9050612088838989858589611d48565b60008681526001602090815260408083206001600160a01b038c168452909152902054858110156120cb5760405162461bcd60e51b81526004016106c990613323565b60008781526001602090815260408083206001600160a01b038d8116855292528083208985039055908a1682528120805488929061210a9084906130bc565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a461216a848a8a8a8a8a611d56565b505050505050505050565b6001600160a01b0384163b156109ee5760405163bc197c8160e01b81526001600160a01b0385169063bc197c81906121b99089908990889088908890600401613525565b6020604051808303816000875af19250505080156121f4575060408051601f3d908101601f191682019092526121f1918101906133b2565b60015b61220057611de16133cf565b6001600160e01b0319811663bc197c8160e01b1461171b5760405162461bcd60e51b81526004016106c990613474565b6001600160a01b0385166122b75760005b83518110156122b55782818151811061225c5761225c6130f0565b60200260200101516004600086848151811061227a5761227a6130f0565b60200260200101518152602001908152602001600020600082825461229f91906130bc565b909155506122ae905081613106565b9050612241565b505b6001600160a01b0384166109ee5760005b835181101561171b578281815181106122e3576122e36130f0565b602002602001015160046000868481518110612301576123016130f0565b6020026020010151815260200190815260200160002060008282546123269190613168565b90915550612335905081613106565b90506122c8565b600080600061234b8585612358565b91509150610dcd816123c3565b600080825160410361238e5760208301516040840151606085015160001a61238287828585612579565b94509450505050610910565b82516040036123b757602083015160408401516123ac868383612666565b935093505050610910565b50600090506002610910565b60008160048111156123d7576123d7613577565b036123df5750565b60018160048111156123f3576123f3613577565b036124405760405162461bcd60e51b815260206004820152601860248201527f45434453413a20696e76616c6964207369676e6174757265000000000000000060448201526064016106c9565b600281600481111561245457612454613577565b036124a15760405162461bcd60e51b815260206004820152601f60248201527f45434453413a20696e76616c6964207369676e6174757265206c656e6774680060448201526064016106c9565b60038160048111156124b5576124b5613577565b0361250d5760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202773272076616c604482015261756560f01b60648201526084016106c9565b600481600481111561252157612521613577565b036107415760405162461bcd60e51b815260206004820152602260248201527f45434453413a20696e76616c6964207369676e6174757265202776272076616c604482015261756560f01b60648201526084016106c9565b6000807f7fffffffffffffffffffffffffffffff5d576e7357a4501ddfe92f46681b20a08311156125b0575060009050600361265d565b8460ff16601b141580156125c857508460ff16601c14155b156125d9575060009050600461265d565b6040805160008082526020820180845289905260ff881692820192909252606081018690526080810185905260019060a0016020604051602081039080840390855afa15801561262d573d6000803e3d6000fd5b5050604051601f1901519150506001600160a01b0381166126565760006001925092505061265d565b9150600090505b94509492505050565b6000806001600160ff1b0383168161268360ff86901c601b6130bc565b905061269187828885612579565b935093505050935093915050565b8280546126ab90612f43565b90600052602060002090601f0160209004810192826126cd5760008555612713565b82601f106126e657805160ff1916838001178555612713565b82800160010185558215612713579182015b828111156127135782518255916020019190600101906126f8565b5061271f929150612723565b5090565b5b8082111561271f5760008155600101612724565b6001600160a01b038116811461074157600080fd5b6000806040838503121561276057600080fd5b823561276b81612738565b946020939093013593505050565b6001600160e01b03198116811461074157600080fd5b6000602082840312156127a157600080fd5b8135611f5281612779565b600080604083850312156127bf57600080fd5b82356127ca81612738565b915060208301356001600160601b03811681146127e657600080fd5b809150509250929050565b634e487b7160e01b600052604160045260246000fd5b601f8201601f191681016001600160401b038111828210171561282c5761282c6127f1565b6040525050565b600082601f83011261284457600080fd5b81356001600160401b0381111561285d5761285d6127f1565b604051612874601f8301601f191660200182612807565b81815284602083860101111561288957600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156128b857600080fd5b81356001600160401b038111156128ce57600080fd5b6114bf84828501612833565b60005b838110156128f55781810151838201526020016128dd565b838111156119195750506000910152565b6000815180845261291e8160208601602086016128da565b601f01601f19169290920160200192915050565b602081526000611f526020830184612906565b60006020828403121561295757600080fd5b5035919050565b6000806040838503121561297157600080fd5b50508035926020909101359150565b60006001600160401b03821115612999576129996127f1565b5060051b60200190565b600082601f8301126129b457600080fd5b813560206129c182612980565b6040516129ce8282612807565b83815260059390931b85018201928281019150868411156129ee57600080fd5b8286015b84811015612a0957803583529183019183016129f2565b509695505050505050565b600080600080600060a08688031215612a2c57600080fd5b8535612a3781612738565b94506020860135612a4781612738565b935060408601356001600160401b0380821115612a6357600080fd5b612a6f89838a016129a3565b94506060880135915080821115612a8557600080fd5b612a9189838a016129a3565b93506080880135915080821115612aa757600080fd5b50612ab488828901612833565b9150509295509295909350565b60008083601f840112612ad357600080fd5b5081356001600160401b03811115612aea57600080fd5b60208301915083602082850101111561091057600080fd5b60008060008060008060808789031215612b1b57600080fd5b86356001600160401b0380821115612b3257600080fd5b612b3e8a838b01612ac1565b90985096506020890135915080821115612b5757600080fd5b612b638a838b01612ac1565b9096509450604089013593506060890135915080821115612b8357600080fd5b50612b9089828a01612833565b9150509295509295509295565b600082601f830112612bae57600080fd5b81356020612bbb82612980565b604051612bc88282612807565b83815260059390931b8501820192828101915086841115612be857600080fd5b8286015b84811015612a09578035612bff81612738565b8352918301918301612bec565b60008060408385031215612c1f57600080fd5b82356001600160401b0380821115612c3657600080fd5b612c4286838701612b9d565b93506020850135915080821115612c5857600080fd5b50612c65858286016129a3565b9150509250929050565b600081518084526020808501945080840160005b83811015612c9f57815187529582019590820190600101612c83565b509495945050505050565b602081526000611f526020830184612c6f565b600080600080600080600060a0888a031215612cd857600080fd5b87356001600160401b0380821115612cef57600080fd5b612cfb8b838c01612ac1565b909950975060208a0135965060408a0135915080821115612d1b57600080fd5b612d278b838c01612833565b955060608a0135915080821115612d3d57600080fd5b50612d4a8a828b01612ac1565b9094509250506080880135612d5e81612738565b8091505092959891949750929550565b600080600060608486031215612d8357600080fd5b8335612d8e81612738565b925060208401356001600160401b0380821115612daa57600080fd5b612db6878388016129a3565b93506040860135915080821115612dcc57600080fd5b50612dd9868287016129a3565b9150509250925092565b801515811461074157600080fd5b60008060408385031215612e0457600080fd5b8235612e0f81612738565b915060208301356127e681612de3565b60008060408385031215612e3257600080fd5b8235915060208301356001600160401b03811115612e4f57600080fd5b612c6585828601612b9d565b60008060408385031215612e6e57600080fd5b8235612e7981612738565b915060208301356127e681612738565b600080600080600060a08688031215612ea157600080fd5b8535612eac81612738565b94506020860135612ebc81612738565b9350604086013592506060860135915060808601356001600160401b03811115612ee557600080fd5b612ab488828901612833565b600060208284031215612f0357600080fd5b8135611f5281612738565b600080600060608486031215612f2357600080fd5b8335612f2e81612738565b95602085013595506040909401359392505050565b600181811c90821680612f5757607f821691505b602082108103612f7757634e487b7160e01b600052602260045260246000fd5b50919050565b600084516020612f908285838a016128da565b855191840191612fa38184848a016128da565b8554920191600090600181811c9080831680612fc057607f831692505b8583108103612fdd57634e487b7160e01b85526022600452602485fd5b808015612ff157600181146130025761302f565b60ff1985168852838801955061302f565b60008b81526020902060005b858110156130275781548a82015290840190880161300e565b505083880195505b50939b9a5050505050505050505050565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561307057613070613040565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261309a5761309a613075565b500490565b6000602082840312156130b157600080fd5b8151611f5281612de3565b600082198211156130cf576130cf613040565b500190565b600082516130e68184602087016128da565b9190910192915050565b634e487b7160e01b600052603260045260246000fd5b60006001820161311857613118613040565b5060010190565b60208082526029908201527f455243313135353a2063616c6c6572206973206e6f74206f776e6572206e6f7260408201526808185c1c1c9bdd995960ba1b606082015260800190565b60008282101561317a5761317a613040565b500390565b60008261318e5761318e613075565b500690565b6020808252602e908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526d195c881bdc88185c1c1c9bdd995960921b606082015260800190565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b6040815260006132c36040830185612c6f565b82810360208401526132d58185612c6f565b95945050505050565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6001600160a01b03868116825285166020820152604081018490526060810183905260a0608082018190526000906133a790830184612906565b979650505050505050565b6000602082840312156133c457600080fd5b8151611f5281612779565b600060033d11156133e85760046000803e5060005160e01c5b90565b600060443d10156133f95790565b6040516003193d81016004833e81513d6001600160401b03816024840111818411171561342857505050505090565b82850191508151818111156134405750505050505090565b843d870101602082850101111561345a5750505050505090565b61346960208286010187612807565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b60a081528560a0820152858760c0830137600060c087830181018290526001600160a01b0387811660208501528616604084015260608301859052601f8801601f19168301838103820160808501529061351890820185612906565b9998505050505050505050565b6001600160a01b0386811682528516602082015260a06040820181905260009061355190830186612c6f565b82810360608401526135638186612c6f565b905082810360808401526117728185612906565b634e487b7160e01b600052602160045260246000fdfea264697066735822122072a796c25373e81786bed4d74bfb2229065905a0076cf702a1285fbe010bf1d764736f6c634300080d0033

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

00000000000000000000000000000000000000000000000000000000000000400000000000000000000000008d10505d63581a18063bb1c94cb6e3caefd4c901000000000000000000000000000000000000000000000000000000000000005268747470733a2f2f676c6f62616c2e6d7970696e6174612e636c6f75642f697066732f516d5271785a4d52546838344b335a69676741643955547431365653376a5a4877426d5a5a34654c7348693541392f0000000000000000000000000000

-----Decoded View---------------
Arg [0] : _baseURI (string): https://global.mypinata.cloud/ipfs/QmRqxZMRTh84K3ZiggAd9UTt16VS7jZHwBmZZ4eLsHi5A9/
Arg [1] : _signer (address): 0x8d10505d63581A18063Bb1c94cB6e3caefD4c901

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000008d10505d63581a18063bb1c94cb6e3caefd4c901
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000052
Arg [3] : 68747470733a2f2f676c6f62616c2e6d7970696e6174612e636c6f75642f6970
Arg [4] : 66732f516d5271785a4d52546838344b335a6967674164395554743136565337
Arg [5] : 6a5a4877426d5a5a34654c7348693541392f0000000000000000000000000000


Deployed Bytecode Sourcemap

1025:2330:23:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2199:230:6;;;;;;;;;;-1:-1:-1;2199:230:6;;;;;:::i;:::-;;:::i;:::-;;;616:25:24;;;604:2;589:18;2199:230:6;;;;;;;;1355:209:0;;;;;;;;;;-1:-1:-1;1355:209:0;;;;;:::i;:::-;;:::i;:::-;;;1203:14:24;;1196:22;1178:41;;1166:2;1151:18;1355:209:0;1038:187:24;3209:143:23;;;;;;;;;;-1:-1:-1;3209:143:23;;;;;:::i;:::-;;:::i;:::-;;710:93:0;;;;;;;;;;-1:-1:-1;710:93:0;;;;;:::i;:::-;;:::i;815:83::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;2559:227:23:-;;;;;;;;;;-1:-1:-1;2559:227:23;;;;;:::i;:::-;;:::i;1106:29::-;;;;;;;;;;;;;;;;1674:442:10;;;;;;;;;;-1:-1:-1;1674:442:10;;;;;:::i;:::-;;:::i;:::-;;;;-1:-1:-1;;;;;4333:32:24;;;4315:51;;4397:2;4382:18;;4375:34;;;;4288:18;1674:442:10;4141:274:24;2017:302:0;;;;;;;;;;-1:-1:-1;2017:302:0;;;;;:::i;:::-;;:::i;2794:156:23:-;;;;;;;;;;;;;:::i;631:67:0:-;;;;;;;;;;;;;:::i;753:143:17:-;;;;;;;;;;;;853:42;753:143;;;;;-1:-1:-1;;;;;6610:32:24;;;6592:51;;6580:2;6565:18;753:143:17;6414:235:24;2958:80:23;;;;;;;;;;-1:-1:-1;2958:80:23;;;;;:::i;:::-;;:::i;1717:449::-;;;;;;:::i;:::-;;:::i;2595:524:6:-;;;;;;;;;;-1:-1:-1;2595:524:6;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;913:108:8:-;;;;;;;;;;-1:-1:-1;913:108:8;;;;;:::i;:::-;970:4;791:16;;;:12;:16;;;;;;-1:-1:-1;;;913:108:8;1130:86:19;;;;;;;;;;-1:-1:-1;1177:4:19;1201:7;;;1130:86;;1186:307:21;;;;;;;;;;-1:-1:-1;1186:307:21;;;;;:::i;:::-;;:::i;745:363:7:-;;;;;;;;;;-1:-1:-1;745:363:7;;;;;:::i;:::-;;:::i;1884:103:18:-;;;;;;;;;;;;;:::i;560:63:0:-;;;;;;;;;;;;;:::i;1236:87:18:-;;;;;;;;;;-1:-1:-1;1309:6:18;;-1:-1:-1;;;;;1309:6:18;1236:87;;906::0;;;;;;;;;;;;;:::i;1572:176::-;;;;;;;;;;-1:-1:-1;1572:176:0;;;;;:::i;:::-;;:::i;702:113:8:-;;;;;;;;;;-1:-1:-1;702:113:8;;;;;:::i;:::-;764:7;791:16;;;:12;:16;;;;;;;702:113;3049:152:23;;;;;;;;;;-1:-1:-1;3049:152:23;;;;;:::i;:::-;;:::i;2338:213::-;;;;;;;;;;-1:-1:-1;2338:213:23;;;;;:::i;:::-;;:::i;1142:44::-;;;;;;;;;;;;;;;;3419:168:6;;;;;;;;;;-1:-1:-1;3419:168:6;;;;;:::i;:::-;-1:-1:-1;;;;;3542:27:6;;;3518:4;3542:27;;;:18;:27;;;;;;;;:37;;;;;;;;;;;;;;;3419:168;1757:252:0;;;;;;;;;;-1:-1:-1;1757:252:0;;;;;:::i;:::-;;:::i;2142:201:18:-;;;;;;;;;;-1:-1:-1;2142:201:18;;;;;:::i;:::-;;:::i;406:331:7:-;;;;;;;;;;-1:-1:-1;406:331:7;;;;;:::i;:::-;;:::i;2174:156:23:-;;;;;;;;;;-1:-1:-1;2174:156:23;;;;;:::i;:::-;;:::i;2199:230:6:-;2285:7;-1:-1:-1;;;;;2313:21:6;;2305:76;;;;-1:-1:-1;;;2305:76:6;;15083:2:24;2305:76:6;;;15065:21:24;15122:2;15102:18;;;15095:30;15161:34;15141:18;;;15134:62;-1:-1:-1;;;15212:18:24;;;15205:40;15262:19;;2305:76:6;;;;;;;;;-1:-1:-1;2399:13:6;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;2399:22:6;;;;;;;;;;;;2199:230::o;1355:209:0:-;1458:4;1478:38;1504:11;1478:25;:38::i;:::-;:80;;;;1520:38;1546:11;1520:25;:38::i;:::-;1471:87;1355:209;-1:-1:-1;;1355:209:0:o;3209:143:23:-;1122:13:18;:11;:13::i;:::-;3305:39:23::1;3324:8;3334:9;3305:18;:39::i;:::-;3209:143:::0;;:::o;710:93:0:-;1122:13:18;:11;:13::i;:::-;779:16:0::1;787:7;779;:16::i;:::-;710:93:::0;:::o;815:83::-;852:13;885:5;878:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;815:83;:::o;2559:227:23:-;970:4:8;791:16;;;:12;:16;;;;;;2614:13:23;;2640:46;;;;-1:-1:-1;;;2640:46:23;;15879:2:24;2640:46:23;;;15861:21:24;15918:2;15898:18;;;15891:30;-1:-1:-1;;;15937:18:24;;;15930:52;15999:18;;2640:46:23;15677:346:24;2640:46:23;2728:14;2738:3;2728:9;:14::i;:::-;2744:21;2761:3;2744:16;:21::i;:::-;2767:9;2711:66;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2697:81;;2559:227;;;:::o;1674:442:10:-;1771:7;1829:27;;;:17;:27;;;;;;;;1800:56;;;;;;;;;-1:-1:-1;;;;;1800:56:10;;;;;-1:-1:-1;;;1800:56:10;;;-1:-1:-1;;;;;1800:56:10;;;;;;;;1771:7;;1869:92;;-1:-1:-1;1920:29:10;;;;;;;;;1930:19;1920:29;-1:-1:-1;;;;;1920:29:10;;;;-1:-1:-1;;;1920:29:10;;-1:-1:-1;;;;;1920:29:10;;;;;1869:92;2011:23;;;;1973:21;;2482:5;;1998:36;;-1:-1:-1;;;;;1998:36:10;:10;:36;:::i;:::-;1997:58;;;;:::i;:::-;2076:16;;;-1:-1:-1;1973:82:10;;-1:-1:-1;;1674:442:10;;;;;;:::o;2017:302:0:-;2237:4;853:42:17;2001:45;:49;1997:539;;2290:10;-1:-1:-1;;;;;2282:18:17;;;2278:85;;2254:57:0::1;2282:4;2288:2;2292:3;2297:7;2306:4;2254:27;:57::i;:::-;2341:7:17::0;;2278:85;2382:69;;-1:-1:-1;;;2382:69:17;;2433:4;2382:69;;;18460:34:24;2440:10:17;18510:18:24;;;18503:43;853:42:17;;2382;;18395:18:24;;2382:69:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2377:148;;2479:30;;-1:-1:-1;;;2479:30:17;;2498:10;2479:30;;;6592:51:24;6565:18;;2479:30:17;6414:235:24;2377:148:17;2254:57:0::1;2282:4;2288:2;2292:3;2297:7;2306:4;2254:27;:57::i;:::-;2017:302:::0;;;;;;:::o;2794:156:23:-;1122:13:18;:11;:13::i;:::-;2296:21:20::1;:19;:21::i;:::-;2856:7:23::2;2877;1309:6:18::0;;-1:-1:-1;;;;;1309:6:18;;1236:87;2877:7:23::2;-1:-1:-1::0;;;;;2869:21:23::2;2898;2869:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2855:69;;;2939:2;2931:11;;;::::0;::::2;;2844:106;2340:20:20::1;1734:1:::0;2856:7;:22;2673:213;2340:20:::1;2794:156:23:o:0;631:67:0:-;1122:13:18;:11;:13::i;:::-;680:10:0::1;:8;:10::i;2958:80:23:-:0;1122:13:18;:11;:13::i;:::-;3018:4:23::1;:12:::0;2958:80::o;1717:449::-;1177:4:19;1201:7;;;1455:9;1447:38;;;;-1:-1:-1;;;1447:38:19;;19219:2:24;1447:38:19;;;19201:21:24;19258:2;19238:18;;;19231:30;-1:-1:-1;;;19277:18:24;;;19270:46;19333:18;;1447:38:19;19017:340:24;1447:38:19;2296:21:20::1;:19;:21::i;:::-;1514:4:23::2;;1501:9;:17;;1493:49;;;::::0;-1:-1:-1;;;1493:49:23;;19564:2:24;1493:49:23::2;::::0;::::2;19546:21:24::0;19603:2;19583:18;;;19576:30;-1:-1:-1;;;19622:18:24;;;19615:49;19681:18;;1493:49:23::2;19362:343:24::0;1493:49:23::2;1895:8:::3;1648:22;;1619:21;1631:8;764:7:8::0;791:16;;;:12;:16;;;;;;;702:113;1619:21:23::3;:25;::::0;1643:1:::3;1619:25;:::i;:::-;:51;;1611:84;;;::::0;-1:-1:-1;;;1611:84:23;;20045:2:24;1611:84:23::3;::::0;::::3;20027:21:24::0;20084:2;20064:18;;;20057:30;-1:-1:-1;;;20103:18:24;;;20096:50;20163:18;;1611:84:23::3;19843:344:24::0;1611:84:23::3;1932:68:::4;1954:5;;1961:8;1971;1981:6;;1989:10;1932:21;:68::i;:::-;1924:93;;;::::0;-1:-1:-1;;;1924:93:23;;20394:2:24;1924:93:23::4;::::0;::::4;20376:21:24::0;20433:2;20413:18;;;20406:30;-1:-1:-1;;;20452:18:24;;;20445:42;20504:18;;1924:93:23::4;20192:336:24::0;1924:93:23::4;2037:6;2044:8;2037:16;;;;;;:::i;:::-;::::0;;;::::4;::::0;;;;;::::4;::::0;;;;::::4;;2036:17;2028:51;;;::::0;-1:-1:-1;;;2028:51:23;;21016:2:24;2028:51:23::4;::::0;::::4;20998:21:24::0;21055:2;21035:18;;;21028:30;-1:-1:-1;;;21074:18:24;;;21067:51;21135:18;;2028:51:23::4;20814:345:24::0;2028:51:23::4;2090:34;2096:10;2108:8;2118:1;2090:34;;;;;;;;;;;::::0;:5:::4;:34::i;:::-;2154:4;2135:6;2142:8;2135:16;;;;;;:::i;:::-;::::0;;;::::4;::::0;;;;;::::4;::::0;;;:23;;;::::4;;-1:-1:-1::0;;2135:23:23;;::::4;::::0;;;::::4;::::0;;-1:-1:-1;2340:20:20::1;1734:1:::0;2856:7;:22;2673:213;2595:524:6;2751:16;2812:3;:10;2793:8;:15;:29;2785:83;;;;-1:-1:-1;;;2785:83:6;;21366:2:24;2785:83:6;;;21348:21:24;21405:2;21385:18;;;21378:30;21444:34;21424:18;;;21417:62;-1:-1:-1;;;21495:18:24;;;21488:39;21544:19;;2785:83:6;21164:405:24;2785:83:6;2881:30;2928:8;:15;-1:-1:-1;;;;;2914:30:6;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;2914:30:6;;2881:63;;2962:9;2957:122;2981:8;:15;2977:1;:19;2957:122;;;3037:30;3047:8;3056:1;3047:11;;;;;;;;:::i;:::-;;;;;;;3060:3;3064:1;3060:6;;;;;;;;:::i;:::-;;;;;;;3037:9;:30::i;:::-;3018:13;3032:1;3018:16;;;;;;;;:::i;:::-;;;;;;;;;;:49;2998:3;;;:::i;:::-;;;2957:122;;;-1:-1:-1;3098:13:6;2595:524;-1:-1:-1;;;2595:524:6:o;1186:307:21:-;1478:7;;1395:4;;-1:-1:-1;;;;;1478:7:21;1419:55;1430:5;;1437:8;1447;1457:6;;1465:8;1419:10;:55::i;:::-;-1:-1:-1;;;;;1419:66:21;;;1186:307;-1:-1:-1;;;;;;;;1186:307:21:o;745:363:7:-;-1:-1:-1;;;;;914:24:7;;736:10:2;914:24:7;;:68;;-1:-1:-1;942:40:7;959:8;736:10:2;3419:168:6;:::i;942:40:7:-;892:159;;;;-1:-1:-1;;;892:159:7;;;;;;;:::i;:::-;1064:36;1075:8;1085:4;1091:8;1064:10;:36::i;:::-;745:363;;;:::o;1884:103:18:-;1122:13;:11;:13::i;:::-;1949:30:::1;1976:1;1949:18;:30::i;560:63:0:-:0;1122:13:18;:11;:13::i;:::-;607:8:0::1;:6;:8::i;906:87::-:0;945:13;978:7;971:14;;;;;:::i;1572:176::-;1676:8;853:42:17;2747:45;:49;2743:225;;2818:67;;-1:-1:-1;;;2818:67:17;;2869:4;2818:67;;;18460:34:24;-1:-1:-1;;;;;18530:15:24;;18510:18;;;18503:43;853:42:17;;2818;;18395:18:24;;2818:67:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2813:144;;2913:28;;-1:-1:-1;;;2913:28:17;;-1:-1:-1;;;;;6610:32:24;;2913:28:17;;;6592:51:24;6565:18;;2913:28:17;6414:235:24;2813:144:17;1697:43:0::1;1721:8;1731;1697:23;:43::i;3049:152:23:-:0;1122:13:18;:11;:13::i;:::-;3145:22:23::1;:48:::0;3049:152::o;2338:213::-;1122:13:18;:11;:13::i;:::-;2441:6:23::1;2436:108;2457:10;:17;2453:1;:21;2436:108;;;2496:36;2504:10;2515:1;2504:13;;;;;;;;:::i;:::-;;;;;;;2519:1;2522:9;2496:7;:36::i;:::-;2476:3:::0;::::1;::::0;::::1;:::i;:::-;;;;2436:108;;1757:252:0::0;1924:4;853:42:17;2001:45;:49;1997:539;;2290:10;-1:-1:-1;;;;;2282:18:17;;;2278:85;;1946:55:0::1;1969:4;1975:2;1979:7;1988:6;1996:4;1946:22;:55::i;2278:85:17:-:0;2382:69;;-1:-1:-1;;;2382:69:17;;2433:4;2382:69;;;18460:34:24;2440:10:17;18510:18:24;;;18503:43;853:42:17;;2382;;18395:18:24;;2382:69:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;2377:148;;2479:30;;-1:-1:-1;;;2479:30:17;;2498:10;2479:30;;;6592:51:24;6565:18;;2479:30:17;6414:235:24;2377:148:17;1946:55:0::1;1969:4;1975:2;1979:7;1988:6;1996:4;1946:22;:55::i;2142:201:18:-:0;1122:13;:11;:13::i;:::-;-1:-1:-1;;;;;2231:22:18;::::1;2223:73;;;::::0;-1:-1:-1;;;2223:73:18;;22458:2:24;2223:73:18::1;::::0;::::1;22440:21:24::0;22497:2;22477:18;;;22470:30;22536:34;22516:18;;;22509:62;-1:-1:-1;;;22587:18:24;;;22580:36;22633:19;;2223:73:18::1;22256:402:24::0;2223:73:18::1;2307:28;2326:8;2307:18;:28::i;406:331:7:-:0;-1:-1:-1;;;;;550:24:7;;736:10:2;550:24:7;;:68;;-1:-1:-1;578:40:7;595:8;736:10:2;3419:168:6;:::i;578:40:7:-;528:159;;;;-1:-1:-1;;;528:159:7;;;;;;;:::i;:::-;700:29;706:8;716:3;721:7;700:5;:29::i;2174:156:23:-;1122:13:18;:11;:13::i;:::-;2278:44:23::1;2284:9;2295;2306:11;2278:44;;;;;;;;;;;::::0;:5:::1;:44::i;1222:310:6:-:0;1324:4;-1:-1:-1;;;;;;1361:41:6;;-1:-1:-1;;;1361:41:6;;:110;;-1:-1:-1;;;;;;;1419:52:6;;-1:-1:-1;;;1419:52:6;1361:110;:163;;;-1:-1:-1;;;;;;;;;;963:40:9;;;1488:36:6;854:157:9;1404:215:10;1506:4;-1:-1:-1;;;;;;1530:41:10;;-1:-1:-1;;;1530:41:10;;:81;;;1575:36;1599:11;1575:23;:36::i;1401:132:18:-;1309:6;;-1:-1:-1;;;;;1309:6:18;736:10:2;1465:23:18;1457:68;;;;-1:-1:-1;;;1457:68:18;;22865:2:24;1457:68:18;;;22847:21:24;;;22884:18;;;22877:30;22943:34;22923:18;;;22916:62;22995:18;;1457:68:18;22663:356:24;2766:332:10;2482:5;-1:-1:-1;;;;;2869:33:10;;;;2861:88;;;;-1:-1:-1;;;2861:88:10;;23226:2:24;2861:88:10;;;23208:21:24;23265:2;23245:18;;;23238:30;23304:34;23284:18;;;23277:62;-1:-1:-1;;;23355:18:24;;;23348:40;23405:19;;2861:88:10;23024:406:24;2861:88:10;-1:-1:-1;;;;;2968:22:10;;2960:60;;;;-1:-1:-1;;;2960:60:10;;23637:2:24;2960:60:10;;;23619:21:24;23676:2;23656:18;;;23649:30;23715:27;23695:18;;;23688:55;23760:18;;2960:60:10;23435:349:24;2960:60:10;3055:35;;;;;;;;;-1:-1:-1;;;;;3055:35:10;;;;;;-1:-1:-1;;;;;3055:35:10;;;;;;;;;;-1:-1:-1;;;3033:57:10;;;;:19;:57;2766:332::o;8366:88:6:-;8433:13;;;;:4;;:13;;;;;:::i;1943:105::-;2003:13;2036:4;2029:11;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1943:105;;;:::o;288:723:22:-;344:13;565:5;574:1;565:10;561:53;;-1:-1:-1;;592:10:22;;;;;;;;;;;;-1:-1:-1;;;592:10:22;;;;;288:723::o;561:53::-;639:5;624:12;680:78;687:9;;680:78;;713:8;;;;:::i;:::-;;-1:-1:-1;736:10:22;;-1:-1:-1;744:2:22;736:10;;:::i;:::-;;;680:78;;;768:19;800:6;-1:-1:-1;;;;;790:17:22;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;790:17:22;;768:39;;818:154;825:10;;818:154;;852:11;862:1;852:11;;:::i;:::-;;-1:-1:-1;921:10:22;929:2;921:5;:10;:::i;:::-;908:24;;:2;:24;:::i;:::-;895:39;;878:6;885;878:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;878:56:22;;;;;;;;-1:-1:-1;949:11:22;958:2;949:11;;:::i;:::-;;;818:154;;;996:6;288:723;-1:-1:-1;;;;288:723:22:o;4142:438:6:-;-1:-1:-1;;;;;4375:20:6;;736:10:2;4375:20:6;;:60;;-1:-1:-1;4399:36:6;4416:4;736:10:2;3419:168:6;:::i;4399:36::-;4353:156;;;;-1:-1:-1;;;4353:156:6;;;;;;;:::i;:::-;4520:52;4543:4;4549:2;4553:3;4558:7;4567:4;4520:22;:52::i;:::-;4142:438;;;;;:::o;2376:289:20:-;1778:1;2506:7;;:19;2498:63;;;;-1:-1:-1;;;2498:63:20;;24653:2:24;2498:63:20;;;24635:21:24;24692:2;24672:18;;;24665:30;24731:33;24711:18;;;24704:61;24782:18;;2498:63:20;24451:355:24;2498:63:20;1778:1;2639:7;:18;2376:289::o;2189:120:19:-;1177:4;1201:7;;;1725:41;;;;-1:-1:-1;;;1725:41:19;;25013:2:24;1725:41:19;;;24995:21:24;25052:2;25032:18;;;25025:30;-1:-1:-1;;;25071:18:24;;;25064:50;25131:18;;1725:41:19;24811:344:24;1725:41:19;2258:5:::1;2248:15:::0;;-1:-1:-1;;2248:15:19::1;::::0;;2279:22:::1;736:10:2::0;2288:12:19::1;2279:22;::::0;-1:-1:-1;;;;;6610:32:24;;;6592:51;;6580:2;6565:18;2279:22:19::1;;;;;;;2189:120::o:0;8840:729:6:-;-1:-1:-1;;;;;8993:16:6;;8985:62;;;;-1:-1:-1;;;8985:62:6;;25362:2:24;8985:62:6;;;25344:21:24;25401:2;25381:18;;;25374:30;25440:34;25420:18;;;25413:62;-1:-1:-1;;;25491:18:24;;;25484:31;25532:19;;8985:62:6;25160:397:24;8985:62:6;736:10:2;9060:16:6;9125:21;9143:2;9125:17;:21::i;:::-;9102:44;;9157:24;9184:25;9202:6;9184:17;:25::i;:::-;9157:52;;9222:66;9243:8;9261:1;9265:2;9269:3;9274:7;9283:4;9222:20;:66::i;:::-;9301:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;9301:17:6;;;;;;;;;:27;;9322:6;;9301:13;:27;;9322:6;;9301:27;:::i;:::-;;;;-1:-1:-1;;9344:52:6;;;25736:25:24;;;25792:2;25777:18;;25770:34;;;-1:-1:-1;;;;;9344:52:6;;;;9377:1;;9344:52;;;;;;25709:18:24;9344:52:6;;;;;;;9487:74;9518:8;9536:1;9540:2;9544;9548:6;9556:4;9487:30;:74::i;:::-;8974:595;;;8840:729;;;;:::o;883:295:21:-;1083:7;1110:60;1119:42;1125:5;;1132:8;1142;1152;1119:5;:42::i;:::-;1163:6;;1110:60;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;1110:8:21;;-1:-1:-1;;;1110:60:21:i;:::-;1103:67;883:295;-1:-1:-1;;;;;;;;883:295:21:o;12141:969:6:-;-1:-1:-1;;;;;12293:18:6;;12285:66;;;;-1:-1:-1;;;12285:66:6;;;;;;;:::i;:::-;12384:7;:14;12370:3;:10;:28;12362:81;;;;-1:-1:-1;;;12362:81:6;;;;;;;:::i;:::-;12456:16;736:10:2;12456:31:6;;12500:66;12521:8;12531:4;12545:1;12549:3;12554:7;12500:66;;;;;;;;;;;;:20;:66::i;:::-;12584:9;12579:373;12603:3;:10;12599:1;:14;12579:373;;;12635:10;12648:3;12652:1;12648:6;;;;;;;;:::i;:::-;;;;;;;12635:19;;12669:14;12686:7;12694:1;12686:10;;;;;;;;:::i;:::-;;;;;;;;;;;;12713:19;12735:13;;;:9;:13;;;;;;-1:-1:-1;;;;;12735:19:6;;;;;;;;;;;;12686:10;;-1:-1:-1;12777:21:6;;;;12769:70;;;;-1:-1:-1;;;12769:70:6;;;;;;;:::i;:::-;12883:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;12883:19:6;;;;;;;;;;12905:20;;12883:42;;12615:3;;;;:::i;:::-;;;;12579:373;;;;13007:1;-1:-1:-1;;;;;12969:55:6;12993:4;-1:-1:-1;;;;;12969:55:6;12983:8;-1:-1:-1;;;;;12969:55:6;;13011:3;13016:7;12969:55;;;;;;;:::i;:::-;;;;;;;;13037:65;;;;;;;;;13081:1;13037:65;;;12274:836;12141:969;;;:::o;2503:191:18:-;2596:6;;;-1:-1:-1;;;;;2613:17:18;;;-1:-1:-1;;;;;;2613:17:18;;;;;;;2646:40;;2596:6;;;2613:17;2596:6;;2646:40;;2577:16;;2646:40;2566:128;2503:191;:::o;1930:118:19:-;1177:4;1201:7;;;1455:9;1447:38;;;;-1:-1:-1;;;1447:38:19;;19219:2:24;1447:38:19;;;19201:21:24;19258:2;19238:18;;;19231:30;-1:-1:-1;;;19277:18:24;;;19270:46;19333:18;;1447:38:19;19017:340:24;1447:38:19;1990:7:::1;:14:::0;;-1:-1:-1;;1990:14:19::1;2000:4;1990:14;::::0;;2020:20:::1;2027:12;736:10:2::0;;656:98;3192:155:6;3287:52;736:10:2;3320:8:6;3330;3287:18;:52::i;3659:406::-;-1:-1:-1;;;;;3867:20:6;;736:10:2;3867:20:6;;:60;;-1:-1:-1;3891:36:6;3908:4;736:10:2;3419:168:6;:::i;3891:36::-;3845:156;;;;-1:-1:-1;;;3845:156:6;;;;;;;:::i;:::-;4012:45;4030:4;4036:2;4040;4044:6;4052:4;4012:17;:45::i;11083:808::-;-1:-1:-1;;;;;11210:18:6;;11202:66;;;;-1:-1:-1;;;11202:66:6;;;;;;;:::i;:::-;736:10:2;11281:16:6;11346:21;11364:2;11346:17;:21::i;:::-;11323:44;;11378:24;11405:25;11423:6;11405:17;:25::i;:::-;11378:52;;11443:66;11464:8;11474:4;11488:1;11492:3;11497:7;11443:66;;;;;;;;;;;;:20;:66::i;:::-;11522:19;11544:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;11544:19:6;;;;;;;;;;11582:21;;;;11574:70;;;;-1:-1:-1;;;11574:70:6;;;;;;;:::i;:::-;11680:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;11680:19:6;;;;;;;;;;;;11702:20;;;11680:42;;11751:54;;25736:25:24;;;25777:18;;;25770:34;;;11680:19:6;;11751:54;;;;;;25709:18:24;11751:54:6;;;;;;;11818:65;;;;;;;;;11862:1;11818:65;;;2017:302:0;6376:1146:6;6603:7;:14;6589:3;:10;:28;6581:81;;;;-1:-1:-1;;;6581:81:6;;;;;;;:::i;:::-;-1:-1:-1;;;;;6681:16:6;;6673:66;;;;-1:-1:-1;;;6673:66:6;;;;;;;:::i;:::-;736:10:2;6796:60:6;736:10:2;6827:4:6;6833:2;6837:3;6842:7;6851:4;6796:20;:60::i;:::-;6874:9;6869:421;6893:3;:10;6889:1;:14;6869:421;;;6925:10;6938:3;6942:1;6938:6;;;;;;;;:::i;:::-;;;;;;;6925:19;;6959:14;6976:7;6984:1;6976:10;;;;;;;;:::i;:::-;;;;;;;;;;;;7003:19;7025:13;;;:9;:13;;;;;;-1:-1:-1;;;;;7025:19:6;;;;;;;;;;;;6976:10;;-1:-1:-1;7067:21:6;;;;7059:76;;;;-1:-1:-1;;;7059:76:6;;;;;;;:::i;:::-;7179:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;7179:19:6;;;;;;;;;;7201:20;;;7179:42;;7251:17;;;;;;;:27;;7201:20;;7179:13;7251:27;;7201:20;;7251:27;:::i;:::-;;;;;;;;6910:380;;;6905:3;;;;:::i;:::-;;;6869:421;;;;7337:2;-1:-1:-1;;;;;7307:47:6;7331:4;-1:-1:-1;;;;;7307:47:6;7321:8;-1:-1:-1;;;;;7307:47:6;;7341:3;7346:7;7307:47;;;;;;;:::i;:::-;;;;;;;;7439:75;7475:8;7485:4;7491:2;7495:3;7500:7;7509:4;7439:35;:75::i;17519:198::-;17639:16;;;17653:1;17639:16;;;;;;;;;17585;;17614:22;;17639:16;;;;;;;;;;;;-1:-1:-1;17639:16:6;17614:41;;17677:7;17666:5;17672:1;17666:8;;;;;;;;:::i;:::-;;;;;;;;;;:18;17704:5;17519:198;-1:-1:-1;;17519:198:6:o;1010:337:0:-;1273:66;1300:8;1310:4;1316:2;1320:3;1325:7;1334:4;1273:26;:66::i;15946:744:6:-;-1:-1:-1;;;;;16161:13:6;;1066:20:1;1114:8;16157:526:6;;16197:72;;-1:-1:-1;;;16197:72:6;;-1:-1:-1;;;;;16197:38:6;;;;;:72;;16236:8;;16246:4;;16252:2;;16256:6;;16264:4;;16197:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16197:72:6;;;;;;;;-1:-1:-1;;16197:72:6;;;;;;;;;;;;:::i;:::-;;;16193:479;;;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;16545:6;16538:14;;-1:-1:-1;;;16538:14:6;;;;;;;;:::i;16193:479::-;;;16594:62;;-1:-1:-1;;;16594:62:6;;30202:2:24;16594:62:6;;;30184:21:24;30241:2;30221:18;;;30214:30;30280:34;30260:18;;;30253:62;-1:-1:-1;;;30331:18:24;;;30324:50;30391:19;;16594:62:6;30000:416:24;16193:479:6;-1:-1:-1;;;;;;16319:55:6;;-1:-1:-1;;;16319:55:6;16315:154;;16399:50;;-1:-1:-1;;;16399:50:6;;;;;;;:::i;421:260:21:-;568:7;621:5;;636:4;643:8;653;663;610:62;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;600:73;;;;;;593:80;;421:260;;;;;;;:::o;689:186::-;791:7;823:44;861:5;823:29;:4;8508:58:5;;33145:66:24;8508:58:5;;;33133:79:24;33228:12;;;33221:28;;;8375:7:5;;33265:12:24;;8508:58:5;;;;;;;;;;;;8498:69;;;;;;8491:76;;8306:269;;;;823:29:21;:37;;:44::i;:::-;816:51;689:186;-1:-1:-1;;;689:186:21:o;13253:331:6:-;13408:8;-1:-1:-1;;;;;13399:17:6;:5;-1:-1:-1;;;;;13399:17:6;;13391:71;;;;-1:-1:-1;;;13391:71:6;;31863:2:24;13391:71:6;;;31845:21:24;31902:2;31882:18;;;31875:30;31941:34;31921:18;;;31914:62;-1:-1:-1;;;31992:18:24;;;31985:39;32041:19;;13391:71:6;31661:405:24;13391:71:6;-1:-1:-1;;;;;13473:25:6;;;;;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;:46;;-1:-1:-1;;13473:46:6;;;;;;;;;;13535:41;;1178::24;;;13535::6;;1151:18:24;13535:41:6;;;;;;;13253:331;;;:::o;5044:974::-;-1:-1:-1;;;;;5232:16:6;;5224:66;;;;-1:-1:-1;;;5224:66:6;;;;;;;:::i;:::-;736:10:2;5303:16:6;5368:21;5386:2;5368:17;:21::i;:::-;5345:44;;5400:24;5427:25;5445:6;5427:17;:25::i;:::-;5400:52;;5465:60;5486:8;5496:4;5502:2;5506:3;5511:7;5520:4;5465:20;:60::i;:::-;5538:19;5560:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;5560:19:6;;;;;;;;;;5598:21;;;;5590:76;;;;-1:-1:-1;;;5590:76:6;;;;;;;:::i;:::-;5702:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;5702:19:6;;;;;;;;;;5724:20;;;5702:42;;5766:17;;;;;;;:27;;5724:20;;5702:13;5766:27;;5724:20;;5766:27;:::i;:::-;;;;-1:-1:-1;;5811:46:6;;;25736:25:24;;;25792:2;25777:18;;25770:34;;;-1:-1:-1;;;;;5811:46:6;;;;;;;;;;;;;;25709:18:24;5811:46:6;;;;;;;5942:68;5973:8;5983:4;5989:2;5993;5997:6;6005:4;5942:30;:68::i;:::-;5213:805;;;;5044:974;;;;;:::o;16698:813::-;-1:-1:-1;;;;;16938:13:6;;1066:20:1;1114:8;16934:570:6;;16974:79;;-1:-1:-1;;;16974:79:6;;-1:-1:-1;;;;;16974:43:6;;;;;:79;;17018:8;;17028:4;;17034:3;;17039:7;;17048:4;;16974:79;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;16974:79:6;;;;;;;;-1:-1:-1;;16974:79:6;;;;;;;;;;;;:::i;:::-;;;16970:523;;;;:::i;:::-;-1:-1:-1;;;;;;17135:60:6;;-1:-1:-1;;;17135:60:6;17131:159;;17220:50;;-1:-1:-1;;;17220:50:6;;;;;;;:::i;1096:655:8:-;-1:-1:-1;;;;;1418:18:8;;1414:160;;1458:9;1453:110;1477:3;:10;1473:1;:14;1453:110;;;1537:7;1545:1;1537:10;;;;;;;;:::i;:::-;;;;;;;1513:12;:20;1526:3;1530:1;1526:6;;;;;;;;:::i;:::-;;;;;;;1513:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;1489:3:8;;-1:-1:-1;1489:3:8;;:::i;:::-;;;1453:110;;;;1414:160;-1:-1:-1;;;;;1590:16:8;;1586:158;;1628:9;1623:110;1647:3;:10;1643:1;:14;1623:110;;;1707:7;1715:1;1707:10;;;;;;;;:::i;:::-;;;;;;;1683:12;:20;1696:3;1700:1;1696:6;;;;;;;;:::i;:::-;;;;;;;1683:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;-1:-1:-1;1659:3:8;;-1:-1:-1;1659:3:8;;:::i;:::-;;;1623:110;;4504:231:5;4582:7;4603:17;4622:18;4644:27;4655:4;4661:9;4644:10;:27::i;:::-;4602:69;;;;4682:18;4694:5;4682:11;:18::i;2298:1404::-;2379:7;2388:12;2613:9;:16;2633:2;2613:22;2609:1086;;2957:4;2942:20;;2936:27;3007:4;2992:20;;2986:27;3065:4;3050:20;;3044:27;2652:9;3036:36;3108:25;3119:4;3036:36;2936:27;2986;3108:10;:25::i;:::-;3101:32;;;;;;;;;2609:1086;3155:9;:16;3175:2;3155:22;3151:544;;3478:4;3463:20;;3457:27;3529:4;3514:20;;3508:27;3571:23;3582:4;3457:27;3508;3571:10;:23::i;:::-;3564:30;;;;;;;;3151:544;-1:-1:-1;3643:1:5;;-1:-1:-1;3647:35:5;3627:56;;569:643;647:20;638:5;:29;;;;;;;;:::i;:::-;;634:571;;569:643;:::o;634:571::-;745:29;736:5;:38;;;;;;;;:::i;:::-;;732:473;;791:34;;-1:-1:-1;;;791:34:5;;33622:2:24;791:34:5;;;33604:21:24;33661:2;33641:18;;;33634:30;33700:26;33680:18;;;33673:54;33744:18;;791:34:5;33420:348:24;732:473:5;856:35;847:5;:44;;;;;;;;:::i;:::-;;843:362;;908:41;;-1:-1:-1;;;908:41:5;;33975:2:24;908:41:5;;;33957:21:24;34014:2;33994:18;;;33987:30;34053:33;34033:18;;;34026:61;34104:18;;908:41:5;33773:355:24;843:362:5;980:30;971:5;:39;;;;;;;;:::i;:::-;;967:238;;1027:44;;-1:-1:-1;;;1027:44:5;;34335:2:24;1027:44:5;;;34317:21:24;34374:2;34354:18;;;34347:30;34413:34;34393:18;;;34386:62;-1:-1:-1;;;34464:18:24;;;34457:32;34506:19;;1027:44:5;34133:398:24;967:238:5;1102:30;1093:5;:39;;;;;;;;:::i;:::-;;1089:116;;1149:44;;-1:-1:-1;;;1149:44:5;;34738:2:24;1149:44:5;;;34720:21:24;34777:2;34757:18;;;34750:30;34816:34;34796:18;;;34789:62;-1:-1:-1;;;34867:18:24;;;34860:32;34909:19;;1149:44:5;34536:398:24;5956:1632:5;6087:7;;7021:66;7008:79;;7004:163;;;-1:-1:-1;7120:1:5;;-1:-1:-1;7124:30:5;7104:51;;7004:163;7181:1;:7;;7186:2;7181:7;;:18;;;;;7192:1;:7;;7197:2;7192:7;;7181:18;7177:102;;;-1:-1:-1;7232:1:5;;-1:-1:-1;7236:30:5;7216:51;;7177:102;7393:24;;;7376:14;7393:24;;;;;;;;;35166:25:24;;;35239:4;35227:17;;35207:18;;;35200:45;;;;35261:18;;;35254:34;;;35304:18;;;35297:34;;;7393:24:5;;35138:19:24;;7393:24:5;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;7393:24:5;;-1:-1:-1;;7393:24:5;;;-1:-1:-1;;;;;;;7432:20:5;;7428:103;;7485:1;7489:29;7469:50;;;;;;;7428:103;7551:6;-1:-1:-1;7559:20:5;;-1:-1:-1;5956:1632:5;;;;;;;;:::o;4998:344::-;5112:7;;-1:-1:-1;;;;;5158:80:5;;5112:7;5265:25;5281:3;5266:18;;;5288:2;5265:25;:::i;:::-;5249:42;;5309:25;5320:4;5326:1;5329;5332;5309:10;:25::i;:::-;5302:32;;;;;;4998:344;;;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;14:131:24;-1:-1:-1;;;;;89:31:24;;79:42;;69:70;;135:1;132;125:12;150:315;218:6;226;279:2;267:9;258:7;254:23;250:32;247:52;;;295:1;292;285:12;247:52;334:9;321:23;353:31;378:5;353:31;:::i;:::-;403:5;455:2;440:18;;;;427:32;;-1:-1:-1;;;150:315:24:o;652:131::-;-1:-1:-1;;;;;;726:32:24;;716:43;;706:71;;773:1;770;763:12;788:245;846:6;899:2;887:9;878:7;874:23;870:32;867:52;;;915:1;912;905:12;867:52;954:9;941:23;973:30;997:5;973:30;:::i;1230:443::-;1305:6;1313;1366:2;1354:9;1345:7;1341:23;1337:32;1334:52;;;1382:1;1379;1372:12;1334:52;1421:9;1408:23;1440:31;1465:5;1440:31;:::i;:::-;1490:5;-1:-1:-1;1547:2:24;1532:18;;1519:32;-1:-1:-1;;;;;1582:40:24;;1570:53;;1560:81;;1637:1;1634;1627:12;1560:81;1660:7;1650:17;;;1230:443;;;;;:::o;1678:127::-;1739:10;1734:3;1730:20;1727:1;1720:31;1770:4;1767:1;1760:15;1794:4;1791:1;1784:15;1810:249;1920:2;1901:13;;-1:-1:-1;;1897:27:24;1885:40;;-1:-1:-1;;;;;1940:34:24;;1976:22;;;1937:62;1934:88;;;2002:18;;:::i;:::-;2038:2;2031:22;-1:-1:-1;;1810:249:24:o;2064:556::-;2107:5;2160:3;2153:4;2145:6;2141:17;2137:27;2127:55;;2178:1;2175;2168:12;2127:55;2214:6;2201:20;-1:-1:-1;;;;;2236:2:24;2233:26;2230:52;;;2262:18;;:::i;:::-;2311:2;2305:9;2323:67;2378:2;2359:13;;-1:-1:-1;;2355:27:24;2384:4;2351:38;2305:9;2323:67;:::i;:::-;2414:2;2406:6;2399:18;2460:3;2453:4;2448:2;2440:6;2436:15;2432:26;2429:35;2426:55;;;2477:1;2474;2467:12;2426:55;2541:2;2534:4;2526:6;2522:17;2515:4;2507:6;2503:17;2490:54;2588:1;2564:15;;;2581:4;2560:26;2553:37;;;;2568:6;2064:556;-1:-1:-1;;;2064:556:24:o;2625:322::-;2694:6;2747:2;2735:9;2726:7;2722:23;2718:32;2715:52;;;2763:1;2760;2753:12;2715:52;2803:9;2790:23;-1:-1:-1;;;;;2828:6:24;2825:30;2822:50;;;2868:1;2865;2858:12;2822:50;2891;2933:7;2924:6;2913:9;2909:22;2891:50;:::i;2952:258::-;3024:1;3034:113;3048:6;3045:1;3042:13;3034:113;;;3124:11;;;3118:18;3105:11;;;3098:39;3070:2;3063:10;3034:113;;;3165:6;3162:1;3159:13;3156:48;;;-1:-1:-1;;3200:1:24;3182:16;;3175:27;2952:258::o;3215:::-;3257:3;3295:5;3289:12;3322:6;3317:3;3310:19;3338:63;3394:6;3387:4;3382:3;3378:14;3371:4;3364:5;3360:16;3338:63;:::i;:::-;3455:2;3434:15;-1:-1:-1;;3430:29:24;3421:39;;;;3462:4;3417:50;;3215:258;-1:-1:-1;;3215:258:24:o;3478:220::-;3627:2;3616:9;3609:21;3590:4;3647:45;3688:2;3677:9;3673:18;3665:6;3647:45;:::i;3703:180::-;3762:6;3815:2;3803:9;3794:7;3790:23;3786:32;3783:52;;;3831:1;3828;3821:12;3783:52;-1:-1:-1;3854:23:24;;3703:180;-1:-1:-1;3703:180:24:o;3888:248::-;3956:6;3964;4017:2;4005:9;3996:7;3992:23;3988:32;3985:52;;;4033:1;4030;4023:12;3985:52;-1:-1:-1;;4056:23:24;;;4126:2;4111:18;;;4098:32;;-1:-1:-1;3888:248:24:o;4420:183::-;4480:4;-1:-1:-1;;;;;4505:6:24;4502:30;4499:56;;;4535:18;;:::i;:::-;-1:-1:-1;4580:1:24;4576:14;4592:4;4572:25;;4420:183::o;4608:724::-;4662:5;4715:3;4708:4;4700:6;4696:17;4692:27;4682:55;;4733:1;4730;4723:12;4682:55;4769:6;4756:20;4795:4;4818:43;4858:2;4818:43;:::i;:::-;4890:2;4884:9;4902:31;4930:2;4922:6;4902:31;:::i;:::-;4968:18;;;5060:1;5056:10;;;;5044:23;;5040:32;;;5002:15;;;;-1:-1:-1;5084:15:24;;;5081:35;;;5112:1;5109;5102:12;5081:35;5148:2;5140:6;5136:15;5160:142;5176:6;5171:3;5168:15;5160:142;;;5242:17;;5230:30;;5280:12;;;;5193;;5160:142;;;-1:-1:-1;5320:6:24;4608:724;-1:-1:-1;;;;;;4608:724:24:o;5337:1072::-;5491:6;5499;5507;5515;5523;5576:3;5564:9;5555:7;5551:23;5547:33;5544:53;;;5593:1;5590;5583:12;5544:53;5632:9;5619:23;5651:31;5676:5;5651:31;:::i;:::-;5701:5;-1:-1:-1;5758:2:24;5743:18;;5730:32;5771:33;5730:32;5771:33;:::i;:::-;5823:7;-1:-1:-1;5881:2:24;5866:18;;5853:32;-1:-1:-1;;;;;5934:14:24;;;5931:34;;;5961:1;5958;5951:12;5931:34;5984:61;6037:7;6028:6;6017:9;6013:22;5984:61;:::i;:::-;5974:71;;6098:2;6087:9;6083:18;6070:32;6054:48;;6127:2;6117:8;6114:16;6111:36;;;6143:1;6140;6133:12;6111:36;6166:63;6221:7;6210:8;6199:9;6195:24;6166:63;:::i;:::-;6156:73;;6282:3;6271:9;6267:19;6254:33;6238:49;;6312:2;6302:8;6299:16;6296:36;;;6328:1;6325;6318:12;6296:36;;6351:52;6395:7;6384:8;6373:9;6369:24;6351:52;:::i;:::-;6341:62;;;5337:1072;;;;;;;;:::o;6654:347::-;6705:8;6715:6;6769:3;6762:4;6754:6;6750:17;6746:27;6736:55;;6787:1;6784;6777:12;6736:55;-1:-1:-1;6810:20:24;;-1:-1:-1;;;;;6842:30:24;;6839:50;;;6885:1;6882;6875:12;6839:50;6922:4;6914:6;6910:17;6898:29;;6974:3;6967:4;6958:6;6950;6946:19;6942:30;6939:39;6936:59;;;6991:1;6988;6981:12;7006:986;7124:6;7132;7140;7148;7156;7164;7217:3;7205:9;7196:7;7192:23;7188:33;7185:53;;;7234:1;7231;7224:12;7185:53;7274:9;7261:23;-1:-1:-1;;;;;7344:2:24;7336:6;7333:14;7330:34;;;7360:1;7357;7350:12;7330:34;7399:58;7449:7;7440:6;7429:9;7425:22;7399:58;:::i;:::-;7476:8;;-1:-1:-1;7373:84:24;-1:-1:-1;7564:2:24;7549:18;;7536:32;;-1:-1:-1;7580:16:24;;;7577:36;;;7609:1;7606;7599:12;7577:36;7648:60;7700:7;7689:8;7678:9;7674:24;7648:60;:::i;:::-;7727:8;;-1:-1:-1;7622:86:24;-1:-1:-1;7809:2:24;7794:18;;7781:32;;-1:-1:-1;7866:2:24;7851:18;;7838:32;;-1:-1:-1;7882:16:24;;;7879:36;;;7911:1;7908;7901:12;7879:36;;7934:52;7978:7;7967:8;7956:9;7952:24;7934:52;:::i;:::-;7924:62;;;7006:986;;;;;;;;:::o;7997:799::-;8051:5;8104:3;8097:4;8089:6;8085:17;8081:27;8071:55;;8122:1;8119;8112:12;8071:55;8158:6;8145:20;8184:4;8207:43;8247:2;8207:43;:::i;:::-;8279:2;8273:9;8291:31;8319:2;8311:6;8291:31;:::i;:::-;8357:18;;;8449:1;8445:10;;;;8433:23;;8429:32;;;8391:15;;;;-1:-1:-1;8473:15:24;;;8470:35;;;8501:1;8498;8491:12;8470:35;8537:2;8529:6;8525:15;8549:217;8565:6;8560:3;8557:15;8549:217;;;8645:3;8632:17;8662:31;8687:5;8662:31;:::i;:::-;8706:18;;8744:12;;;;8582;;8549:217;;8801:595;8919:6;8927;8980:2;8968:9;8959:7;8955:23;8951:32;8948:52;;;8996:1;8993;8986:12;8948:52;9036:9;9023:23;-1:-1:-1;;;;;9106:2:24;9098:6;9095:14;9092:34;;;9122:1;9119;9112:12;9092:34;9145:61;9198:7;9189:6;9178:9;9174:22;9145:61;:::i;:::-;9135:71;;9259:2;9248:9;9244:18;9231:32;9215:48;;9288:2;9278:8;9275:16;9272:36;;;9304:1;9301;9294:12;9272:36;;9327:63;9382:7;9371:8;9360:9;9356:24;9327:63;:::i;:::-;9317:73;;;8801:595;;;;;:::o;9401:435::-;9454:3;9492:5;9486:12;9519:6;9514:3;9507:19;9545:4;9574:2;9569:3;9565:12;9558:19;;9611:2;9604:5;9600:14;9632:1;9642:169;9656:6;9653:1;9650:13;9642:169;;;9717:13;;9705:26;;9751:12;;;;9786:15;;;;9678:1;9671:9;9642:169;;;-1:-1:-1;9827:3:24;;9401:435;-1:-1:-1;;;;;9401:435:24:o;9841:261::-;10020:2;10009:9;10002:21;9983:4;10040:56;10092:2;10081:9;10077:18;10069:6;10040:56;:::i;10107:1122::-;10234:6;10242;10250;10258;10266;10274;10282;10335:3;10323:9;10314:7;10310:23;10306:33;10303:53;;;10352:1;10349;10342:12;10303:53;10392:9;10379:23;-1:-1:-1;;;;;10462:2:24;10454:6;10451:14;10448:34;;;10478:1;10475;10468:12;10448:34;10517:58;10567:7;10558:6;10547:9;10543:22;10517:58;:::i;:::-;10594:8;;-1:-1:-1;10491:84:24;-1:-1:-1;10676:2:24;10661:18;;10648:32;;-1:-1:-1;10733:2:24;10718:18;;10705:32;;-1:-1:-1;10749:16:24;;;10746:36;;;10778:1;10775;10768:12;10746:36;10801:52;10845:7;10834:8;10823:9;10819:24;10801:52;:::i;:::-;10791:62;;10906:2;10895:9;10891:18;10878:32;10862:48;;10935:2;10925:8;10922:16;10919:36;;;10951:1;10948;10941:12;10919:36;;10990:60;11042:7;11031:8;11020:9;11016:24;10990:60;:::i;:::-;11069:8;;-1:-1:-1;10964:86:24;-1:-1:-1;;11154:3:24;11139:19;;11126:33;11168:31;11126:33;11168:31;:::i;:::-;11218:5;11208:15;;;10107:1122;;;;;;;;;;:::o;11234:730::-;11361:6;11369;11377;11430:2;11418:9;11409:7;11405:23;11401:32;11398:52;;;11446:1;11443;11436:12;11398:52;11485:9;11472:23;11504:31;11529:5;11504:31;:::i;:::-;11554:5;-1:-1:-1;11610:2:24;11595:18;;11582:32;-1:-1:-1;;;;;11663:14:24;;;11660:34;;;11690:1;11687;11680:12;11660:34;11713:61;11766:7;11757:6;11746:9;11742:22;11713:61;:::i;:::-;11703:71;;11827:2;11816:9;11812:18;11799:32;11783:48;;11856:2;11846:8;11843:16;11840:36;;;11872:1;11869;11862:12;11840:36;;11895:63;11950:7;11939:8;11928:9;11924:24;11895:63;:::i;:::-;11885:73;;;11234:730;;;;;:::o;12177:118::-;12263:5;12256:13;12249:21;12242:5;12239:32;12229:60;;12285:1;12282;12275:12;12300:382;12365:6;12373;12426:2;12414:9;12405:7;12401:23;12397:32;12394:52;;;12442:1;12439;12432:12;12394:52;12481:9;12468:23;12500:31;12525:5;12500:31;:::i;:::-;12550:5;-1:-1:-1;12607:2:24;12592:18;;12579:32;12620:30;12579:32;12620:30;:::i;12687:416::-;12780:6;12788;12841:2;12829:9;12820:7;12816:23;12812:32;12809:52;;;12857:1;12854;12847:12;12809:52;12893:9;12880:23;12870:33;;12954:2;12943:9;12939:18;12926:32;-1:-1:-1;;;;;12973:6:24;12970:30;12967:50;;;13013:1;13010;13003:12;12967:50;13036:61;13089:7;13080:6;13069:9;13065:22;13036:61;:::i;13108:388::-;13176:6;13184;13237:2;13225:9;13216:7;13212:23;13208:32;13205:52;;;13253:1;13250;13243:12;13205:52;13292:9;13279:23;13311:31;13336:5;13311:31;:::i;:::-;13361:5;-1:-1:-1;13418:2:24;13403:18;;13390:32;13431:33;13390:32;13431:33;:::i;13501:735::-;13605:6;13613;13621;13629;13637;13690:3;13678:9;13669:7;13665:23;13661:33;13658:53;;;13707:1;13704;13697:12;13658:53;13746:9;13733:23;13765:31;13790:5;13765:31;:::i;:::-;13815:5;-1:-1:-1;13872:2:24;13857:18;;13844:32;13885:33;13844:32;13885:33;:::i;:::-;13937:7;-1:-1:-1;13991:2:24;13976:18;;13963:32;;-1:-1:-1;14042:2:24;14027:18;;14014:32;;-1:-1:-1;14097:3:24;14082:19;;14069:33;-1:-1:-1;;;;;14114:30:24;;14111:50;;;14157:1;14154;14147:12;14111:50;14180;14222:7;14213:6;14202:9;14198:22;14180:50;:::i;14241:247::-;14300:6;14353:2;14341:9;14332:7;14328:23;14324:32;14321:52;;;14369:1;14366;14359:12;14321:52;14408:9;14395:23;14427:31;14452:5;14427:31;:::i;14493:383::-;14570:6;14578;14586;14639:2;14627:9;14618:7;14614:23;14610:32;14607:52;;;14655:1;14652;14645:12;14607:52;14694:9;14681:23;14713:31;14738:5;14713:31;:::i;:::-;14763:5;14815:2;14800:18;;14787:32;;-1:-1:-1;14866:2:24;14851:18;;;14838:32;;14493:383;-1:-1:-1;;;14493:383:24:o;15292:380::-;15371:1;15367:12;;;;15414;;;15435:61;;15489:4;15481:6;15477:17;15467:27;;15435:61;15542:2;15534:6;15531:14;15511:18;15508:38;15505:161;;15588:10;15583:3;15579:20;15576:1;15569:31;15623:4;15620:1;15613:15;15651:4;15648:1;15641:15;15505:161;;15292:380;;;:::o;16154:1527::-;16378:3;16416:6;16410:13;16442:4;16455:51;16499:6;16494:3;16489:2;16481:6;16477:15;16455:51;:::i;:::-;16569:13;;16528:16;;;;16591:55;16569:13;16528:16;16613:15;;;16591:55;:::i;:::-;16735:13;;16668:20;;;16708:1;;16795;16817:18;;;;16870;;;;16897:93;;16975:4;16965:8;16961:19;16949:31;;16897:93;17038:2;17028:8;17025:16;17005:18;17002:40;16999:167;;-1:-1:-1;;;17065:33:24;;17121:4;17118:1;17111:15;17151:4;17072:3;17139:17;16999:167;17182:18;17209:110;;;;17333:1;17328:328;;;;17175:481;;17209:110;-1:-1:-1;;17244:24:24;;17230:39;;17289:20;;;;-1:-1:-1;17209:110:24;;17328:328;16101:1;16094:14;;;16138:4;16125:18;;17423:1;17437:169;17451:8;17448:1;17445:15;17437:169;;;17533:14;;17518:13;;;17511:37;17576:16;;;;17468:10;;17437:169;;;17441:3;;17637:8;17630:5;17626:20;17619:27;;17175:481;-1:-1:-1;17672:3:24;;16154:1527;-1:-1:-1;;;;;;;;;;;16154:1527:24:o;17686:127::-;17747:10;17742:3;17738:20;17735:1;17728:31;17778:4;17775:1;17768:15;17802:4;17799:1;17792:15;17818:168;17858:7;17924:1;17920;17916:6;17912:14;17909:1;17906:21;17901:1;17894:9;17887:17;17883:45;17880:71;;;17931:18;;:::i;:::-;-1:-1:-1;17971:9:24;;17818:168::o;17991:127::-;18052:10;18047:3;18043:20;18040:1;18033:31;18083:4;18080:1;18073:15;18107:4;18104:1;18097:15;18123:120;18163:1;18189;18179:35;;18194:18;;:::i;:::-;-1:-1:-1;18228:9:24;;18123:120::o;18557:245::-;18624:6;18677:2;18665:9;18656:7;18652:23;18648:32;18645:52;;;18693:1;18690;18683:12;18645:52;18725:9;18719:16;18744:28;18766:5;18744:28;:::i;19710:128::-;19750:3;19781:1;19777:6;19774:1;19771:13;19768:39;;;19787:18;;:::i;:::-;-1:-1:-1;19823:9:24;;19710:128::o;20533:276::-;20664:3;20702:6;20696:13;20718:53;20764:6;20759:3;20752:4;20744:6;20740:17;20718:53;:::i;:::-;20787:16;;;;;20533:276;-1:-1:-1;;20533:276:24:o;21574:127::-;21635:10;21630:3;21626:20;21623:1;21616:31;21666:4;21663:1;21656:15;21690:4;21687:1;21680:15;21706:135;21745:3;21766:17;;;21763:43;;21786:18;;:::i;:::-;-1:-1:-1;21833:1:24;21822:13;;21706:135::o;21846:405::-;22048:2;22030:21;;;22087:2;22067:18;;;22060:30;22126:34;22121:2;22106:18;;22099:62;-1:-1:-1;;;22192:2:24;22177:18;;22170:39;22241:3;22226:19;;21846:405::o;23789:125::-;23829:4;23857:1;23854;23851:8;23848:34;;;23862:18;;:::i;:::-;-1:-1:-1;23899:9:24;;23789:125::o;23919:112::-;23951:1;23977;23967:35;;23982:18;;:::i;:::-;-1:-1:-1;24016:9:24;;23919:112::o;24036:410::-;24238:2;24220:21;;;24277:2;24257:18;;;24250:30;24316:34;24311:2;24296:18;;24289:62;-1:-1:-1;;;24382:2:24;24367:18;;24360:44;24436:3;24421:19;;24036:410::o;25815:399::-;26017:2;25999:21;;;26056:2;26036:18;;;26029:30;26095:34;26090:2;26075:18;;26068:62;-1:-1:-1;;;26161:2:24;26146:18;;26139:33;26204:3;26189:19;;25815:399::o;26219:404::-;26421:2;26403:21;;;26460:2;26440:18;;;26433:30;26499:34;26494:2;26479:18;;26472:62;-1:-1:-1;;;26565:2:24;26550:18;;26543:38;26613:3;26598:19;;26219:404::o;26628:400::-;26830:2;26812:21;;;26869:2;26849:18;;;26842:30;26908:34;26903:2;26888:18;;26881:62;-1:-1:-1;;;26974:2:24;26959:18;;26952:34;27018:3;27003:19;;26628:400::o;27033:465::-;27290:2;27279:9;27272:21;27253:4;27316:56;27368:2;27357:9;27353:18;27345:6;27316:56;:::i;:::-;27420:9;27412:6;27408:22;27403:2;27392:9;27388:18;27381:50;27448:44;27485:6;27477;27448:44;:::i;:::-;27440:52;27033:465;-1:-1:-1;;;;;27033:465:24:o;27503:401::-;27705:2;27687:21;;;27744:2;27724:18;;;27717:30;27783:34;27778:2;27763:18;;27756:62;-1:-1:-1;;;27849:2:24;27834:18;;27827:35;27894:3;27879:19;;27503:401::o;27909:406::-;28111:2;28093:21;;;28150:2;28130:18;;;28123:30;28189:34;28184:2;28169:18;;28162:62;-1:-1:-1;;;28255:2:24;28240:18;;28233:40;28305:3;28290:19;;27909:406::o;28320:561::-;-1:-1:-1;;;;;28617:15:24;;;28599:34;;28669:15;;28664:2;28649:18;;28642:43;28716:2;28701:18;;28694:34;;;28759:2;28744:18;;28737:34;;;28579:3;28802;28787:19;;28780:32;;;28542:4;;28829:46;;28855:19;;28847:6;28829:46;:::i;:::-;28821:54;28320:561;-1:-1:-1;;;;;;;28320:561:24:o;28886:249::-;28955:6;29008:2;28996:9;28987:7;28983:23;28979:32;28976:52;;;29024:1;29021;29014:12;28976:52;29056:9;29050:16;29075:30;29099:5;29075:30;:::i;29140:179::-;29175:3;29217:1;29199:16;29196:23;29193:120;;;29263:1;29260;29257;29242:23;-1:-1:-1;29300:1:24;29294:8;29289:3;29285:18;29193:120;29140:179;:::o;29324:671::-;29363:3;29405:4;29387:16;29384:26;29381:39;;;29324:671;:::o;29381:39::-;29447:2;29441:9;-1:-1:-1;;29512:16:24;29508:25;;29505:1;29441:9;29484:50;29563:4;29557:11;29587:16;-1:-1:-1;;;;;29693:2:24;29686:4;29678:6;29674:17;29671:25;29666:2;29658:6;29655:14;29652:45;29649:58;;;29700:5;;;;;29324:671;:::o;29649:58::-;29737:6;29731:4;29727:17;29716:28;;29773:3;29767:10;29800:2;29792:6;29789:14;29786:27;;;29806:5;;;;;;29324:671;:::o;29786:27::-;29890:2;29871:16;29865:4;29861:27;29857:36;29850:4;29841:6;29836:3;29832:16;29828:27;29825:69;29822:82;;;29897:5;;;;;;29324:671;:::o;29822:82::-;29913:57;29964:4;29955:6;29947;29943:19;29939:30;29933:4;29913:57;:::i;:::-;-1:-1:-1;29986:3:24;;29324:671;-1:-1:-1;;;;;29324:671:24:o;30421:404::-;30623:2;30605:21;;;30662:2;30642:18;;;30635:30;30701:34;30696:2;30681:18;;30674:62;-1:-1:-1;;;30767:2:24;30752:18;;30745:38;30815:3;30800:19;;30421:404::o;30830:826::-;31119:3;31108:9;31101:22;31160:6;31154:3;31143:9;31139:19;31132:35;31218:6;31210;31204:3;31193:9;31189:19;31176:49;31275:1;31269:3;31245:22;;;31241:32;;31234:43;;;-1:-1:-1;;;;;31417:15:24;;;31410:4;31395:20;;31388:45;31469:15;;31464:2;31449:18;;31442:43;31516:2;31501:18;;31494:34;;;31336:2;31315:15;;-1:-1:-1;;31311:29:24;31296:45;;31569:18;;;31565:28;;31559:3;31544:19;;31537:57;31296:45;31611:39;;31637:12;;31629:6;31611:39;:::i;:::-;31603:47;30830:826;-1:-1:-1;;;;;;;;;30830:826:24:o;32071:827::-;-1:-1:-1;;;;;32468:15:24;;;32450:34;;32520:15;;32515:2;32500:18;;32493:43;32430:3;32567:2;32552:18;;32545:31;;;32393:4;;32599:57;;32636:19;;32628:6;32599:57;:::i;:::-;32704:9;32696:6;32692:22;32687:2;32676:9;32672:18;32665:50;32738:44;32775:6;32767;32738:44;:::i;:::-;32724:58;;32831:9;32823:6;32819:22;32813:3;32802:9;32798:19;32791:51;32859:33;32885:6;32877;32859:33;:::i;33288:127::-;33349:10;33344:3;33340:20;33337:1;33330:31;33380:4;33377:1;33370:15;33404:4;33401:1;33394:15

Swarm Source

ipfs://72a796c25373e81786bed4d74bfb2229065905a0076cf702a1285fbe010bf1d7
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.