ETH Price: $2,920.86 (+4.55%)
 

Overview

Max Total Supply

2,888

Holders

332

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
0x9Bce8de26c61B3EdB1E1BaF6d3E405a23Bc6b8ed
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:
TokenLaunchpadVouchers

Compiler Version
v0.7.6+commit.7338295f

Optimization Enabled:
Yes with 2000 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-12
*/

// Sources flattened with hardhat v2.6.5 https://hardhat.org

// File @animoca/ethereum-contracts-core-1.1.2/contracts/metatx/[email protected]

// SPDX-License-Identifier: MIT

pragma solidity >=0.7.6 <0.8.0;

/*
 * 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.
 */
abstract contract ManagedIdentity {
    function _msgSender() internal view virtual returns (address payable) {
        return msg.sender;
    }

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


// File @animoca/ethereum-contracts-core-1.1.2/contracts/access/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC-173 Contract Ownership Standard
 * Note: the ERC-165 identifier for this interface is 0x7f5828d0
 */
interface IERC173 {
    /**
     * Event emited when ownership of a contract changes.
     * @param previousOwner the previous owner.
     * @param newOwner the new owner.
     */
    event OwnershipTransferred(address indexed previousOwner, address indexed newOwner);

    /**
     * Get the address of the owner
     * @return The address of the owner.
     */
    function owner() external view returns (address);

    /**
     * Set the address of the new owner of the contract
     * Set newOwner to address(0) to renounce any ownership.
     * @dev Emits an {OwnershipTransferred} event.
     * @param newOwner The address of the new owner of the contract. Using the zero address means renouncing ownership.
     */
    function transferOwnership(address newOwner) external;
}


// File @animoca/ethereum-contracts-core-1.1.2/contracts/access/[email protected]

pragma solidity >=0.7.6 <0.8.0;


/**
 * @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 ManagedIdentity, IERC173 {
    address internal _owner;

    /**
     * Initializes the contract, setting the deployer as the initial owner.
     * @dev Emits an {IERC173-OwnershipTransferred(address,address)} event.
     */
    constructor(address owner_) {
        _owner = owner_;
        emit OwnershipTransferred(address(0), owner_);
    }

    /**
     * Gets the address of the current contract owner.
     */
    function owner() public view virtual override returns (address) {
        return _owner;
    }

    /**
     * See {IERC173-transferOwnership(address)}
     * @dev Reverts if the sender is not the current contract owner.
     * @param newOwner the address of the new owner. Use the zero address to renounce the ownership.
     */
    function transferOwnership(address newOwner) public virtual override {
        _requireOwnership(_msgSender());
        _owner = newOwner;
        emit OwnershipTransferred(_owner, newOwner);
    }

    /**
     * @dev Reverts if `account` is not the contract owner.
     * @param account the account to test.
     */
    function _requireOwnership(address account) internal virtual {
        require(account == this.owner(), "Ownable: not the owner");
    }
}


// File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/types/[email protected]

// Partially derived from OpenZeppelin:
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/406c83649bd6169fc1b578e08506d78f0873b276/contracts/utils/Address.sol

pragma solidity >=0.7.6 <0.8.0;

/**
 * @dev Upgrades the address type to check if it is a contract.
 */
library AddressIsContract {
    /**
     * @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;
    }
}


// File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC20Wrapper
 * Wraps ERC20 functions to support non-standard implementations which do not return a bool value.
 * Calls to the wrapped functions revert only if they throw or if they return false.
 */
library ERC20Wrapper {
    using AddressIsContract for address;

    function wrappedTransfer(
        IWrappedERC20 token,
        address to,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transfer.selector, to, value));
    }

    function wrappedTransferFrom(
        IWrappedERC20 token,
        address from,
        address to,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.transferFrom.selector, from, to, value));
    }

    function wrappedApprove(
        IWrappedERC20 token,
        address spender,
        uint256 value
    ) internal {
        _callWithOptionalReturnData(token, abi.encodeWithSelector(token.approve.selector, spender, value));
    }

    function _callWithOptionalReturnData(IWrappedERC20 token, bytes memory callData) internal {
        address target = address(token);
        require(target.isContract(), "ERC20Wrapper: non-contract");

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory data) = target.call(callData);
        if (success) {
            if (data.length != 0) {
                require(abi.decode(data, (bool)), "ERC20Wrapper: operation failed");
            }
        } else {
            // revert using a standard revert message
            if (data.length == 0) {
                revert("ERC20Wrapper: operation failed");
            }

            // revert using the revert message coming from the call
            assembly {
                let size := mload(data)
                revert(add(32, data), size)
            }
        }
    }
}

interface IWrappedERC20 {
    function transfer(address to, uint256 value) external returns (bool);

    function transferFrom(
        address from,
        address to,
        uint256 value
    ) external returns (bool);

    function approve(address spender, uint256 value) external returns (bool);
}


// File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/[email protected]

pragma solidity >=0.7.6 <0.8.0;



abstract contract Recoverable is ManagedIdentity, Ownable {
    using ERC20Wrapper for IWrappedERC20;

    /**
     * Extract ERC20 tokens which were accidentally sent to the contract to a list of accounts.
     * Warning: this function should be overriden for contracts which are supposed to hold ERC20 tokens
     * so that the extraction is limited to only amounts sent accidentally.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if `accounts`, `tokens` and `amounts` do not have the same length.
     * @dev Reverts if one of `tokens` is does not implement the ERC20 transfer function.
     * @dev Reverts if one of the ERC20 transfers fail for any reason.
     * @param accounts the list of accounts to transfer the tokens to.
     * @param tokens the list of ERC20 token addresses.
     * @param amounts the list of token amounts to transfer.
     */
    function recoverERC20s(
        address[] calldata accounts,
        address[] calldata tokens,
        uint256[] calldata amounts
    ) external virtual {
        _requireOwnership(_msgSender());
        uint256 length = accounts.length;
        require(length == tokens.length && length == amounts.length, "Recov: inconsistent arrays");
        for (uint256 i = 0; i != length; ++i) {
            IWrappedERC20(tokens[i]).wrappedTransfer(accounts[i], amounts[i]);
        }
    }

    /**
     * Extract ERC721 tokens which were accidentally sent to the contract to a list of accounts.
     * Warning: this function should be overriden for contracts which are supposed to hold ERC721 tokens
     * so that the extraction is limited to only tokens sent accidentally.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if `accounts`, `contracts` and `amounts` do not have the same length.
     * @dev Reverts if one of `contracts` is does not implement the ERC721 transferFrom function.
     * @dev Reverts if one of the ERC721 transfers fail for any reason.
     * @param accounts the list of accounts to transfer the tokens to.
     * @param contracts the list of ERC721 contract addresses.
     * @param tokenIds the list of token ids to transfer.
     */
    function recoverERC721s(
        address[] calldata accounts,
        address[] calldata contracts,
        uint256[] calldata tokenIds
    ) external virtual {
        _requireOwnership(_msgSender());
        uint256 length = accounts.length;
        require(length == contracts.length && length == tokenIds.length, "Recov: inconsistent arrays");
        for (uint256 i = 0; i != length; ++i) {
            IRecoverableERC721(contracts[i]).transferFrom(address(this), accounts[i], tokenIds[i]);
        }
    }
}

interface IRecoverableERC721 {
    /// See {IERC721-transferFrom(address,address,uint256)}
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;
}


// File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

abstract contract UsingAppendedCallData {
    function _lastAppendedDataAsSender() internal pure virtual returns (address payable sender) {
        // Copied from openzeppelin : https://github.com/OpenZeppelin/openzeppelin-contracts/blob/9d5f77db9da0604ce0b25148898a94ae2c20d70f/contracts/metatx/ERC2771Context.sol1
        // The assembly code is more direct than the Solidity version using `abi.decode`.
        // solhint-disable-next-line no-inline-assembly
        assembly {
            sender := shr(96, calldataload(sub(calldatasize(), 20)))
        }
    }

    function _msgDataAssuming20BytesAppendedData() internal pure virtual returns (bytes calldata) {
        return msg.data[:msg.data.length - 20];
    }
}


// File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

interface IERC2771 {
    function isTrustedForwarder(address forwarder) external view returns (bool);
}


// File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;

interface IForwarderRegistry {
    function isForwarderFor(address, address) external view returns (bool);
}


// File ethereum-universal-forwarder-1.0.0/src/solc_0.7/ERC2771/[email protected]
pragma solidity ^0.7.0;



abstract contract UsingUniversalForwarding is UsingAppendedCallData, IERC2771 {
    IForwarderRegistry internal immutable _forwarderRegistry;
    address internal immutable _universalForwarder;

    constructor(IForwarderRegistry forwarderRegistry, address universalForwarder) {
        _universalForwarder = universalForwarder;
        _forwarderRegistry = forwarderRegistry;
    }

    function isTrustedForwarder(address forwarder) external view virtual override returns (bool) {
        return forwarder == _universalForwarder || forwarder == address(_forwarderRegistry);
    }

    function _msgSender() internal view virtual returns (address payable) {
        address payable msgSender = msg.sender;
        address payable sender = _lastAppendedDataAsSender();
        if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) {
            // if forwarder use appended data
            return sender;
        }

        // if msg.sender is neither the registry nor the universal forwarder,
        // we have to check the last 20bytes of the call data intepreted as an address
        // and check if the msg.sender was registered as forewarder for that address
        // we check tx.origin to save gas in case where msg.sender == tx.origin
        // solhint-disable-next-line avoid-tx-origin
        if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(sender, msgSender)) {
            return sender;
        }

        return msgSender;
    }

    function _msgData() internal view virtual returns (bytes calldata) {
        address payable msgSender = msg.sender;
        if (msgSender == address(_forwarderRegistry) || msgSender == _universalForwarder) {
            // if forwarder use appended data
            return _msgDataAssuming20BytesAppendedData();
        }

        // we check tx.origin to save gas in case where msg.sender == tx.origin
        // solhint-disable-next-line avoid-tx-origin
        if (msgSender != tx.origin && _forwarderRegistry.isForwarderFor(_lastAppendedDataAsSender(), msgSender)) {
            return _msgDataAssuming20BytesAppendedData();
        }
        return msg.data;
    }
}


// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Inventory. optional extension: Burnable.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * @dev Note: The ERC-165 identifier for this interface is 0x921ed8d1.
 */
interface IERC1155InventoryBurnable {
    /**
     * Burns some token.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `id` does not represent a token.
     * @dev Reverts if `id` represents a Fungible Token and `value` is 0.
     * @dev Reverts if `id` represents a Fungible Token and `value` is higher than `from`'s balance.
     * @dev Reverts if `id` represents a Non-Fungible Token and `value` is not 1.
     * @dev Reverts if `id` represents a Non-Fungible Token which is not owned by `from`.
     * @dev Emits an {IERC1155-TransferSingle} event.
     * @param from Address of the current token owner.
     * @param id Identifier of the token to burn.
     * @param value Amount of token to burn.
     */
    function burnFrom(
        address from,
        uint256 id,
        uint256 value
    ) external;

    /**
     * Burns multiple tokens.
     * @dev Reverts if `ids` and `values` have different lengths.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if one of `ids` does not represent a token.
     * @dev Reverts if one of `ids` represents a Fungible Token and `value` is 0.
     * @dev Reverts if one of `ids` represents a Fungible Token and `value` is higher than `from`'s balance.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token and `value` is not 1.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token which is not owned by `from`.
     * @dev Emits an {IERC1155-TransferBatch} event.
     * @param from Address of the current tokens owner.
     * @param ids Identifiers of the tokens to burn.
     * @param values Amounts of tokens to burn.
     */
    function batchBurnFrom(
        address from,
        uint256[] calldata ids,
        uint256[] calldata values
    ) external;
}


// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155InventoryIdentifiersLib, a library to introspect inventory identifiers.
 * @dev With N=32, representing the Non-Fungible Collection mask length, identifiers are represented as follow:
 * (a) a Fungible Token:
 *     - most significant bit == 0
 * (b) a Non-Fungible Collection:
 *     - most significant bit == 1
 *     - (256-N) least significant bits == 0
 * (c) a Non-Fungible Token:
 *     - most significant bit == 1
 *     - (256-N) least significant bits != 0
 */
library ERC1155InventoryIdentifiersLib {
    // Non-Fungible bit. If an id has this bit set, it is a Non-Fungible (either Collection or Token)
    uint256 internal constant _NF_BIT = 1 << 255;

    // Mask for Non-Fungible Collection (including the nf bit)
    uint256 internal constant _NF_COLLECTION_MASK = uint256(type(uint32).max) << 224;
    uint256 internal constant _NF_TOKEN_MASK = ~_NF_COLLECTION_MASK;

    function isFungibleToken(uint256 id) internal pure returns (bool) {
        return id & _NF_BIT == 0;
    }

    function isNonFungibleToken(uint256 id) internal pure returns (bool) {
        return id & _NF_BIT != 0 && id & _NF_TOKEN_MASK != 0;
    }

    function getNonFungibleCollection(uint256 nftId) internal pure returns (uint256) {
        return nftId & _NF_COLLECTION_MASK;
    }
}


// File @animoca/ethereum-contracts-core-1.1.2/contracts/introspection/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @dev Interface of the ERC165 standard, as defined in the
 * https://eips.ethereum.org/EIPS/eip-165.
 */
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 @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Multi Token Standard, basic interface.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * @dev Note: The ERC-165 identifier for this interface is 0xd9b67a26.
 */
interface IERC1155 {
    event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _value);

    event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _values);

    event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved);

    event URI(string _value, uint256 indexed _id);

    /**
     * Safely transfers some token.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `from` has an insufficient balance.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155received} fails or is refused.
     * @dev Emits a `TransferSingle` event.
     * @param from Current token owner.
     * @param to Address of the new token owner.
     * @param id Identifier of the token to transfer.
     * @param value Amount of token to transfer.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external;

    /**
     * Safely transfers a batch of tokens.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `ids` and `values` have different lengths.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `from` has an insufficient balance for any of `ids`.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused.
     * @dev Emits a `TransferBatch` event.
     * @param from Current token owner.
     * @param to Address of the new token owner.
     * @param ids Identifiers of the tokens to transfer.
     * @param values Amounts of tokens to transfer.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external;

    /**
     * Retrieves the balance of `id` owned by account `owner`.
     * @param owner The account to retrieve the balance of.
     * @param id The identifier to retrieve the balance of.
     * @return The balance of `id` owned by account `owner`.
     */
    function balanceOf(address owner, uint256 id) external view returns (uint256);

    /**
     * Retrieves the balances of `ids` owned by accounts `owners`. For each pair:
     * @dev Reverts if `owners` and `ids` have different lengths.
     * @param owners The addresses of the token holders
     * @param ids The identifiers to retrieve the balance of.
     * @return The balances of `ids` owned by accounts `owners`.
     */
    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view returns (uint256[] memory);

    /**
     * Enables or disables an operator's approval.
     * @dev Emits an `ApprovalForAll` event.
     * @param operator Address of the operator.
     * @param approved True to approve the operator, false to revoke an approval.
     */
    function setApprovalForAll(address operator, bool approved) external;

    /**
     * Retrieves the approval status of an operator for a given owner.
     * @param owner Address of the authorisation giver.
     * @param operator Address of the operator.
     * @return True if the operator is approved, false if not.
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);
}


// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Multi Token Standard, optional extension: Inventory.
 * Interface for Fungible/Non-Fungible Tokens management on an ERC1155 contract.
 * @dev See https://eips.ethereum.org/EIPS/eip-xxxx
 * @dev Note: The ERC-165 identifier for this interface is 0x09ce5c46.
 */
interface IERC1155InventoryFunctions {
    function ownerOf(uint256 nftId) external view returns (address);

    function isFungible(uint256 id) external view returns (bool);

    function collectionOf(uint256 nftId) external view returns (uint256);
}


// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;


/**
 * @title ERC1155 Multi Token Standard, optional extension: Inventory.
 * Interface for Fungible/Non-Fungible Tokens management on an ERC1155 contract.
 *
 * This interface rationalizes the co-existence of Fungible and Non-Fungible Tokens
 * within the same contract. As several kinds of Fungible Tokens can be managed under
 * the Multi-Token standard, we consider that Non-Fungible Tokens can be classified
 * under their own specific type. We introduce the concept of Non-Fungible Collection
 * and consider the usage of 3 types of identifiers:
 * (a) Fungible Token identifiers, each representing a set of Fungible Tokens,
 * (b) Non-Fungible Collection identifiers, each representing a set of Non-Fungible Tokens (this is not a token),
 * (c) Non-Fungible Token identifiers.
 *
 * Identifiers nature
 * |       Type                | isFungible  | isCollection | isToken |
 * |  Fungible Token           |   true      |     true     |  true   |
 * |  Non-Fungible Collection  |   false     |     true     |  false  |
 * |  Non-Fungible Token       |   false     |     false    |  true   |
 *
 * Identifiers compatibilities
 * |       Type                |  transfer  |   balance    |   supply    |  owner  |
 * |  Fungible Token           |    OK      |     OK       |     OK      |   NOK   |
 * |  Non-Fungible Collection  |    NOK     |     OK       |     OK      |   NOK   |
 * |  Non-Fungible Token       |    OK      |   0 or 1     |   0 or 1    |   OK    |
 *
 * @dev See https://eips.ethereum.org/EIPS/eip-xxxx
 * @dev Note: The ERC-165 identifier for this interface is 0x09ce5c46.
 */
interface IERC1155Inventory is IERC1155, IERC1155InventoryFunctions {
    //================================================== ERC1155Inventory ===================================================//
    /**
     * Optional event emitted when a collection (Fungible Token or Non-Fungible Collection) is created.
     *  This event can be used by a client application to determine which identifiers are meaningful
     *  to track through the functions `balanceOf`, `balanceOfBatch` and `totalSupply`.
     * @dev This event MUST NOT be emitted twice for the same `collectionId`.
     */
    event CollectionCreated(uint256 indexed collectionId, bool indexed fungible);

    /**
     * Retrieves the owner of a Non-Fungible Token (ERC721-compatible).
     * @dev Reverts if `nftId` is owned by the zero address.
     * @param nftId Identifier of the token to query.
     * @return Address of the current owner of the token.
     */
    function ownerOf(uint256 nftId) external view override returns (address);

    /**
     * Introspects whether or not `id` represents a Fungible Token.
     *  This function MUST return true even for a Fungible Token which is not-yet created.
     * @param id The identifier to query.
     * @return bool True if `id` represents aFungible Token, false otherwise.
     */
    function isFungible(uint256 id) external view override returns (bool);

    /**
     * Introspects the Non-Fungible Collection to which `nftId` belongs.
     * @dev This function MUST return a value representing a Non-Fungible Collection.
     * @dev This function MUST return a value for a non-existing token, and SHOULD NOT be used to check the existence of a Non-Fungible Token.
     * @dev Reverts if `nftId` does not represent a Non-Fungible Token.
     * @param nftId The token identifier to query the collection of.
     * @return The Non-Fungible Collection identifier to which `nftId` belongs.
     */
    function collectionOf(uint256 nftId) external view override returns (uint256);

    //======================================================= ERC1155 =======================================================//

    /**
     * Retrieves the balance of `id` owned by account `owner`.
     * @param owner The account to retrieve the balance of.
     * @param id The identifier to retrieve the balance of.
     * @return
     *  If `id` represents a collection (Fungible Token or Non-Fungible Collection), the balance for this collection.
     *  If `id` represents a Non-Fungible Token, 1 if the token is owned by `owner`, else 0.
     */
    function balanceOf(address owner, uint256 id) external view override returns (uint256);

    /**
     * Retrieves the balances of `ids` owned by accounts `owners`.
     * @dev Reverts if `owners` and `ids` have different lengths.
     * @param owners The accounts to retrieve the balances of.
     * @param ids The identifiers to retrieve the balances of.
     * @return An array of elements such as for each pair `id`/`owner`:
     *  If `id` represents a collection (Fungible Token or Non-Fungible Collection), the balance for this collection.
     *  If `id` represents a Non-Fungible Token, 1 if the token is owned by `owner`, else 0.
     */
    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view override returns (uint256[] memory);

    /**
     * Safely transfers some token.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if `id` does not represent a token.
     * @dev Reverts if `id` represents a Non-Fungible Token and `value` is not 1.
     * @dev Reverts if `id` represents a Non-Fungible Token and is not owned by `from`.
     * @dev Reverts if `id` represents a Fungible Token and `value` is 0.
     * @dev Reverts if `id` represents a Fungible Token and `from` has an insufficient balance.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155received} fails or is refused.
     * @dev Emits an {IERC1155-TransferSingle} event.
     * @param from Current token owner.
     * @param to Address of the new token owner.
     * @param id Identifier of the token to transfer.
     * @param value Amount of token to transfer.
     * @param data Optional data to pass to the receiver contract.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external override;

    /**
     * @notice this documentation overrides its {IERC1155-safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)}.
     * Safely transfers a batch of tokens.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if the sender is not approved.
     * @dev Reverts if one of `ids` does not represent a token.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token and `value` is not 1.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token and is not owned by `from`.
     * @dev Reverts if one of `ids` represents a Fungible Token and `value` is 0.
     * @dev Reverts if one of `ids` represents a Fungible Token and `from` has an insufficient balance.
     * @dev Reverts if one of `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused.
     * @dev Emits an {IERC1155-TransferBatch} event.
     * @param from Current tokens owner.
     * @param to Address of the new tokens owner.
     * @param ids Identifiers of the tokens to transfer.
     * @param values Amounts of tokens to transfer.
     * @param data Optional data to pass to the receiver contract.
     */
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external override;
}


// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Multi Token Standard, optional extension: Metadata URI.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * @dev Note: The ERC-165 identifier for this interface is 0x0e89341c.
 */
interface IERC1155MetadataURI {
    /**
     * @notice A distinct Uniform Resource Identifier (URI) for a given token.
     * @dev URIs are defined in RFC 3986.
     * @dev The URI MUST point to a JSON file that conforms to the "ERC1155 Metadata URI JSON Schema".
     * @dev The uri function SHOULD be used to retrieve values if no event was emitted.
     * @dev The uri function MUST return the same value as the latest event for an _id if it was emitted.
     * @dev The uri function MUST NOT be used to check for the existence of a token as it is possible for
     *  an implementation to return a valid string even if the token does not exist.
     * @return URI string
     */
    function uri(uint256 id) external view returns (string memory);
}


// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Inventory, optional extension: Total Supply.
 * @dev See https://eips.ethereum.org/EIPS/eip-xxxx
 * @dev Note: The ERC-165 identifier for this interface is 0xbd85b039.
 */
interface IERC1155InventoryTotalSupply {
    /**
     * Retrieves the total supply of `id`.
     * @param id The identifier for which to retrieve the supply of.
     * @return
     *  If `id` represents a collection (Fungible Token or Non-Fungible Collection), the total supply for this collection.
     *  If `id` represents a Non-Fungible Token, 1 if the token exists, else 0.
     */
    function totalSupply(uint256 id) external view returns (uint256);
}


// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Multi Token Standard, Tokens Receiver.
 * Interface for any contract that wants to support transfers from ERC1155 asset contracts.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * @dev Note: The ERC-165 identifier for this interface is 0x4e2312e0.
 */
interface IERC1155TokenReceiver {
    /**
     * @notice Handle the receipt of a single ERC1155 token type.
     * An ERC1155 contract MUST call this function on a recipient contract, at the end of a `safeTransferFrom` after the balance update.
     * This function MUST return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     *  (i.e. 0xf23a6e61) to accept the transfer.
     * Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
     * @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   `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))`
     */
    function onERC1155Received(
        address operator,
        address from,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external returns (bytes4);

    /**
     * @notice Handle the receipt of multiple ERC1155 token types.
     * An ERC1155 contract MUST call this function on a recipient contract, at the end of a `safeBatchTransferFrom` after the balance updates.
     * This function MUST return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))`
     *  (i.e. 0xbc197c81) if to accept the transfer(s).
     * Return of any other value than the prescribed keccak256 generated value MUST result in the transaction being reverted by the caller.
     * @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)"))`
     */
    function onERC1155BatchReceived(
        address operator,
        address from,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external returns (bytes4);
}


// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;







/**
 * @title ERC1155 Inventory Base.
 * @dev The functions `safeTransferFrom(address,address,uint256,uint256,bytes)`
 *  and `safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)` need to be implemented by a child contract.
 * @dev The function `uri(uint256)` needs to be implemented by a child contract, for example with the help of `BaseMetadataURI`.
 */
abstract contract ERC1155InventoryBase is ManagedIdentity, IERC165, IERC1155Inventory, IERC1155MetadataURI, IERC1155InventoryTotalSupply {
    using ERC1155InventoryIdentifiersLib for uint256;

    // bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))
    bytes4 internal constant _ERC1155_RECEIVED = 0xf23a6e61;

    // bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))
    bytes4 internal constant _ERC1155_BATCH_RECEIVED = 0xbc197c81;

    // Burnt Non-Fungible Token owner's magic value
    uint256 internal constant _BURNT_NFT_OWNER = 0xdead000000000000000000000000000000000000000000000000000000000000;

    /* owner => operator => approved */
    mapping(address => mapping(address => bool)) internal _operators;

    /* collection ID => owner => balance */
    mapping(uint256 => mapping(address => uint256)) internal _balances;

    /* collection ID => supply */
    mapping(uint256 => uint256) internal _supplies;

    /* NFT ID => owner */
    mapping(uint256 => uint256) internal _owners;

    /* collection ID => creator */
    mapping(uint256 => address) internal _creators;

    //======================================================= ERC165 ========================================================//

    /// @inheritdoc IERC165
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return
            interfaceId == type(IERC165).interfaceId ||
            interfaceId == type(IERC1155).interfaceId ||
            interfaceId == type(IERC1155MetadataURI).interfaceId ||
            interfaceId == type(IERC1155InventoryFunctions).interfaceId ||
            interfaceId == type(IERC1155InventoryTotalSupply).interfaceId;
    }

    //======================================================= ERC1155 =======================================================//

    /// @inheritdoc IERC1155Inventory
    function balanceOf(address owner, uint256 id) public view virtual override returns (uint256) {
        require(owner != address(0), "Inventory: zero address");

        if (id.isNonFungibleToken()) {
            return address(uint160(_owners[id])) == owner ? 1 : 0;
        }

        return _balances[id][owner];
    }

    /// @inheritdoc IERC1155Inventory
    function balanceOfBatch(address[] calldata owners, uint256[] calldata ids) external view virtual override returns (uint256[] memory) {
        require(owners.length == ids.length, "Inventory: inconsistent arrays");

        uint256[] memory balances = new uint256[](owners.length);

        for (uint256 i = 0; i != owners.length; ++i) {
            balances[i] = balanceOf(owners[i], ids[i]);
        }

        return balances;
    }

    /// @inheritdoc IERC1155
    function setApprovalForAll(address operator, bool approved) public virtual override {
        address sender = _msgSender();
        require(operator != sender, "Inventory: self-approval");
        _operators[sender][operator] = approved;
        emit ApprovalForAll(sender, operator, approved);
    }

    /// @inheritdoc IERC1155
    function isApprovedForAll(address tokenOwner, address operator) public view virtual override returns (bool) {
        return _operators[tokenOwner][operator];
    }

    //================================================== ERC1155Inventory ===================================================//

    /// @inheritdoc IERC1155Inventory
    function isFungible(uint256 id) external pure virtual override returns (bool) {
        return id.isFungibleToken();
    }

    /// @inheritdoc IERC1155Inventory
    function collectionOf(uint256 nftId) external pure virtual override returns (uint256) {
        require(nftId.isNonFungibleToken(), "Inventory: not an NFT");
        return nftId.getNonFungibleCollection();
    }

    /// @inheritdoc IERC1155Inventory
    function ownerOf(uint256 nftId) public view virtual override returns (address) {
        address owner = address(uint160(_owners[nftId]));
        require(owner != address(0), "Inventory: non-existing NFT");
        return owner;
    }

    //============================================= ERC1155InventoryTotalSupply =============================================//

    /// @inheritdoc IERC1155InventoryTotalSupply
    function totalSupply(uint256 id) external view virtual override returns (uint256) {
        if (id.isNonFungibleToken()) {
            return address(uint160(_owners[id])) == address(0) ? 0 : 1;
        } else {
            return _supplies[id];
        }
    }

    //============================================ High-level Internal Functions ============================================//

    /**
     * Creates a collection (optional).
     * @dev Reverts if `collectionId` does not represent a collection.
     * @dev Reverts if `collectionId` has already been created.
     * @dev Emits a {IERC1155Inventory-CollectionCreated} event.
     * @param collectionId Identifier of the collection.
     */
    function _createCollection(uint256 collectionId) internal virtual {
        require(!collectionId.isNonFungibleToken(), "Inventory: not a collection");
        require(_creators[collectionId] == address(0), "Inventory: existing collection");
        _creators[collectionId] = _msgSender();
        emit CollectionCreated(collectionId, collectionId.isFungibleToken());
    }

    function _creator(uint256 collectionId) internal view virtual returns (address) {
        require(!collectionId.isNonFungibleToken(), "Inventory: not a collection");
        return _creators[collectionId];
    }

    //============================================== Helper Internal Functions ==============================================//

    /**
     * Returns whether `sender` is authorised to make a transfer on behalf of `from`.
     * @param from The address to check operatibility upon.
     * @param sender The sender address.
     * @return True if sender is `from` or an operator for `from`, false otherwise.
     */
    function _isOperatable(address from, address sender) internal view virtual returns (bool) {
        return (from == sender) || _operators[from][sender];
    }

    /**
     * Calls {IERC1155TokenReceiver-onERC1155Received} on a target contract.
     * @dev Reverts if `to` is not a contract.
     * @dev Reverts if the call to the target fails or is refused.
     * @param from Previous token owner.
     * @param to New token owner.
     * @param id Identifier of the token transferred.
     * @param value Amount of token transferred.
     * @param data Optional data to send along with the receiver contract call.
     */
    function _callOnERC1155Received(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) internal {
        require(IERC1155TokenReceiver(to).onERC1155Received(_msgSender(), from, id, value, data) == _ERC1155_RECEIVED, "Inventory: transfer refused");
    }

    /**
     * Calls {IERC1155TokenReceiver-onERC1155batchReceived} on a target contract.
     * @dev Reverts if `to` is not a contract.
     * @dev Reverts if the call to the target fails or is refused.
     * @param from Previous tokens owner.
     * @param to New tokens owner.
     * @param ids Identifiers of the tokens to transfer.
     * @param values Amounts of tokens to transfer.
     * @param data Optional data to send along with the receiver contract call.
     */
    function _callOnERC1155BatchReceived(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) internal {
        require(
            IERC1155TokenReceiver(to).onERC1155BatchReceived(_msgSender(), from, ids, values, data) == _ERC1155_BATCH_RECEIVED,
            "Inventory: transfer refused"
        );
    }
}


// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

// solhint-disable-next-line max-line-length

/**
 * @title ERC1155Inventory, a contract which manages up to multiple Collections of Fungible and Non-Fungible Tokens.
 * @dev The function `uri(uint256)` needs to be implemented by a child contract, for example with the help of `BaseMetadataURI`.
 */
abstract contract ERC1155Inventory is ERC1155InventoryBase {
    using AddressIsContract for address;
    using ERC1155InventoryIdentifiersLib for uint256;

    //======================================================= ERC1155 =======================================================//

    /// @inheritdoc IERC1155Inventory
    function safeTransferFrom(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) public virtual override {
        address sender = _msgSender();
        require(to != address(0), "Inventory: transfer to zero");
        require(_isOperatable(from, sender), "Inventory: non-approved sender");

        if (id.isFungibleToken()) {
            _transferFungible(from, to, id, value);
        } else if (id.isNonFungibleToken()) {
            _transferNFT(from, to, id, value, false);
        } else {
            revert("Inventory: not a token id");
        }

        emit TransferSingle(sender, from, to, id, value);
        if (to.isContract()) {
            _callOnERC1155Received(from, to, id, value, data);
        }
    }

    /// @inheritdoc IERC1155Inventory
    function safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) public virtual override {
        // internal function to avoid stack too deep error
        _safeBatchTransferFrom(from, to, ids, values, data);
    }

    //============================================ High-level Internal Functions ============================================//

    function _safeBatchTransferFrom(
        address from,
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) internal {
        require(to != address(0), "Inventory: transfer to zero");
        uint256 length = ids.length;
        require(length == values.length, "Inventory: inconsistent arrays");
        address sender = _msgSender();
        require(_isOperatable(from, sender), "Inventory: non-approved sender");

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        for (uint256 i; i != length; ++i) {
            uint256 id = ids[i];
            uint256 value = values[i];
            if (id.isFungibleToken()) {
                _transferFungible(from, to, id, value);
            } else if (id.isNonFungibleToken()) {
                _transferNFT(from, to, id, value, true);
                uint256 nextCollectionId = id.getNonFungibleCollection();
                if (nfCollectionId == 0) {
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    if (nextCollectionId != nfCollectionId) {
                        _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount);
                        nfCollectionId = nextCollectionId;
                        nfCollectionCount = 1;
                    } else {
                        ++nfCollectionCount;
                    }
                }
            } else {
                revert("Inventory: not a token id");
            }
        }

        if (nfCollectionId != 0) {
            _transferNFTUpdateCollection(from, to, nfCollectionId, nfCollectionCount);
        }

        emit TransferBatch(sender, from, to, ids, values);
        if (to.isContract()) {
            _callOnERC1155BatchReceived(from, to, ids, values, data);
        }
    }

    function _safeMint(
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) internal {
        require(to != address(0), "Inventory: mint to zero");

        if (id.isFungibleToken()) {
            _mintFungible(to, id, value);
        } else if (id.isNonFungibleToken()) {
            _mintNFT(to, id, value, false);
        } else {
            revert("Inventory: not a token id");
        }

        emit TransferSingle(_msgSender(), address(0), to, id, value);
        if (to.isContract()) {
            _callOnERC1155Received(address(0), to, id, value, data);
        }
    }

    function _safeBatchMint(
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) internal virtual {
        require(to != address(0), "Inventory: mint to zero");
        uint256 length = ids.length;
        require(length == values.length, "Inventory: inconsistent arrays");

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        for (uint256 i; i != length; ++i) {
            uint256 id = ids[i];
            uint256 value = values[i];
            if (id.isFungibleToken()) {
                _mintFungible(to, id, value);
            } else if (id.isNonFungibleToken()) {
                _mintNFT(to, id, value, true);
                uint256 nextCollectionId = id.getNonFungibleCollection();
                if (nfCollectionId == 0) {
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    if (nextCollectionId != nfCollectionId) {
                        _balances[nfCollectionId][to] += nfCollectionCount;
                        _supplies[nfCollectionId] += nfCollectionCount;
                        nfCollectionId = nextCollectionId;
                        nfCollectionCount = 1;
                    } else {
                        ++nfCollectionCount;
                    }
                }
            } else {
                revert("Inventory: not a token id");
            }
        }

        if (nfCollectionId != 0) {
            _balances[nfCollectionId][to] += nfCollectionCount;
            _supplies[nfCollectionId] += nfCollectionCount;
        }

        emit TransferBatch(_msgSender(), address(0), to, ids, values);
        if (to.isContract()) {
            _callOnERC1155BatchReceived(address(0), to, ids, values, data);
        }
    }

    //============================================== Helper Internal Functions ==============================================//

    function _mintFungible(
        address to,
        uint256 id,
        uint256 value
    ) internal {
        require(value != 0, "Inventory: zero value");
        uint256 supply = _supplies[id];
        uint256 newSupply = supply + value;
        require(newSupply > supply, "Inventory: supply overflow");
        _supplies[id] = newSupply;
        // cannot overflow as any balance is bounded up by the supply which cannot overflow
        _balances[id][to] += value;
    }

    function _mintNFT(
        address to,
        uint256 id,
        uint256 value,
        bool isBatch
    ) internal {
        require(value == 1, "Inventory: wrong NFT value");
        require(_owners[id] == 0, "Inventory: existing/burnt NFT");

        _owners[id] = uint256(uint160(to));

        if (!isBatch) {
            uint256 collectionId = id.getNonFungibleCollection();
            // it is virtually impossible that a Non-Fungible Collection supply
            // overflows due to the cost of minting individual tokens
            ++_supplies[collectionId];
            // cannot overflow as supply cannot overflow
            ++_balances[collectionId][to];
        }
    }

    function _transferFungible(
        address from,
        address to,
        uint256 id,
        uint256 value
    ) internal {
        require(value != 0, "Inventory: zero value");
        uint256 balance = _balances[id][from];
        require(balance >= value, "Inventory: not enough balance");
        if (from != to) {
            _balances[id][from] = balance - value;
            // cannot overflow as supply cannot overflow
            _balances[id][to] += value;
        }
    }

    function _transferNFT(
        address from,
        address to,
        uint256 id,
        uint256 value,
        bool isBatch
    ) internal {
        require(value == 1, "Inventory: wrong NFT value");
        require(from == address(uint160(_owners[id])), "Inventory: non-owned NFT");
        _owners[id] = uint256(uint160(to));
        if (!isBatch) {
            uint256 collectionId = id.getNonFungibleCollection();
            // cannot underflow as balance is verified through ownership
            _balances[collectionId][from] -= 1;
            // cannot overflow as supply cannot overflow
            _balances[collectionId][to] += 1;
        }
    }

    function _transferNFTUpdateCollection(
        address from,
        address to,
        uint256 collectionId,
        uint256 amount
    ) internal virtual {
        if (from != to) {
            // cannot underflow as balance is verified through ownership
            _balances[collectionId][from] -= amount;
            // cannot overflow as supply cannot overflow
            _balances[collectionId][to] += amount;
        }
    }
}


// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;


/**
 * @title ERC1155Inventory, burnable version.
 * @dev The function `uri(uint256)` needs to be implemented by a child contract, for example with the help of `BaseMetadataURI`.
 */
abstract contract ERC1155InventoryBurnable is IERC1155InventoryBurnable, ERC1155Inventory {
    using ERC1155InventoryIdentifiersLib for uint256;

    //======================================================= ERC165 ========================================================//

    /// @inheritdoc IERC165
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC1155InventoryBurnable).interfaceId || super.supportsInterface(interfaceId);
    }

    //============================================== ERC1155InventoryBurnable ===============================================//

    /// @inheritdoc IERC1155InventoryBurnable
    function burnFrom(
        address from,
        uint256 id,
        uint256 value
    ) public virtual override {
        address sender = _msgSender();
        require(_isOperatable(from, sender), "Inventory: non-approved sender");

        if (id.isFungibleToken()) {
            _burnFungible(from, id, value);
        } else if (id.isNonFungibleToken()) {
            _burnNFT(from, id, value, false);
        } else {
            revert("Inventory: not a token id");
        }

        emit TransferSingle(sender, from, address(0), id, value);
    }

    /// @inheritdoc IERC1155InventoryBurnable
    function batchBurnFrom(
        address from,
        uint256[] memory ids,
        uint256[] memory values
    ) public virtual override {
        uint256 length = ids.length;
        require(length == values.length, "Inventory: inconsistent arrays");

        address sender = _msgSender();
        require(_isOperatable(from, sender), "Inventory: non-approved sender");

        uint256 nfCollectionId;
        uint256 nfCollectionCount;
        for (uint256 i; i != length; ++i) {
            uint256 id = ids[i];
            uint256 value = values[i];
            if (id.isFungibleToken()) {
                _burnFungible(from, id, value);
            } else if (id.isNonFungibleToken()) {
                _burnNFT(from, id, value, true);
                uint256 nextCollectionId = id.getNonFungibleCollection();
                if (nfCollectionId == 0) {
                    nfCollectionId = nextCollectionId;
                    nfCollectionCount = 1;
                } else {
                    if (nextCollectionId != nfCollectionId) {
                        _balances[nfCollectionId][from] -= nfCollectionCount;
                        _supplies[nfCollectionId] -= nfCollectionCount;
                        nfCollectionId = nextCollectionId;
                        nfCollectionCount = 1;
                    } else {
                        ++nfCollectionCount;
                    }
                }
            } else {
                revert("Inventory: not a token id");
            }
        }

        if (nfCollectionId != 0) {
            _balances[nfCollectionId][from] -= nfCollectionCount;
            _supplies[nfCollectionId] -= nfCollectionCount;
        }

        emit TransferBatch(sender, from, address(0), ids, values);
    }

    //============================================== Helper Internal Functions ==============================================//

    function _burnFungible(
        address from,
        uint256 id,
        uint256 value
    ) internal {
        require(value != 0, "Inventory: zero value");
        uint256 balance = _balances[id][from];
        require(balance >= value, "Inventory: not enough balance");
        _balances[id][from] = balance - value;
        // Cannot underflow
        _supplies[id] -= value;
    }

    function _burnNFT(
        address from,
        uint256 id,
        uint256 value,
        bool isBatch
    ) internal {
        require(value == 1, "Inventory: wrong NFT value");
        require(from == address(uint160(_owners[id])), "Inventory: non-owned NFT");
        _owners[id] = _BURNT_NFT_OWNER;

        if (!isBatch) {
            uint256 collectionId = id.getNonFungibleCollection();
            // cannot underflow as balance is confirmed through ownership
            --_balances[collectionId][from];
            // Cannot underflow
            --_supplies[collectionId];
        }
    }
}


// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Inventory, optional extension: Mintable.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 */
interface IERC1155InventoryMintable {
    /**
     * Safely mints some token.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if `id` is not a token.
     * @dev Reverts if `id` represents a Non-Fungible Token and `value` is not 1.
     * @dev Reverts if `id` represents a Non-Fungible Token which has already been minted.
     * @dev Reverts if `id` represents a Fungible Token and `value` is 0.
     * @dev Reverts if `id` represents a Fungible Token and there is an overflow of supply.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155Received} fails or is refused.
     * @dev Emits an {IERC1155-TransferSingle} event.
     * @param to Address of the new token owner.
     * @param id Identifier of the token to mint.
     * @param value Amount of token to mint.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeMint(
        address to,
        uint256 id,
        uint256 value,
        bytes calldata data
    ) external;

    /**
     * Safely mints a batch of tokens.
     * @dev Reverts if `ids` and `values` have different lengths.
     * @dev Reverts if `to` is the zero address.
     * @dev Reverts if one of `ids` is not a token.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token and its paired value is not 1.
     * @dev Reverts if one of `ids` represents a Non-Fungible Token which has already been minted.
     * @dev Reverts if one of `ids` represents a Fungible Token and its paired value is 0.
     * @dev Reverts if one of `ids` represents a Fungible Token and there is an overflow of supply.
     * @dev Reverts if `to` is a contract and the call to {IERC1155TokenReceiver-onERC1155batchReceived} fails or is refused.
     * @dev Emits an {IERC1155-TransferBatch} event.
     * @param to Address of the new tokens owner.
     * @param ids Identifiers of the tokens to mint.
     * @param values Amounts of tokens to mint.
     * @param data Optional data to send along to a receiver contract.
     */
    function safeBatchMint(
        address to,
        uint256[] calldata ids,
        uint256[] calldata values,
        bytes calldata data
    ) external;
}


// File @animoca/ethereum-contracts-assets-2.0.0/contracts/token/ERC1155/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * @title ERC1155 Inventory, optional extension: Creator.
 * @dev See https://eips.ethereum.org/EIPS/eip-1155
 * @dev Note: The ERC-165 identifier for this interface is 0x510b5158.
 */
interface IERC1155InventoryCreator {
    /**
     * Returns the creator of a collection, or the zero address if the collection has not been created.
     * @dev Reverts if `collectionId` does not represent a collection.
     * @param collectionId Identifier of the collection.
     * @return The creator of a collection, or the zero address if the collection has not been created.
     */
    function creator(uint256 collectionId) external view returns (address);
}


// File @animoca/ethereum-contracts-core-1.1.2/contracts/utils/types/[email protected]

// Partially derived from OpenZeppelin:
// https://github.com/OpenZeppelin/openzeppelin-contracts/blob/8b10cb38d8fedf34f2d89b0ed604f2dceb76d6a9/contracts/utils/Strings.sol

pragma solidity >=0.7.6 <0.8.0;

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


// File @animoca/ethereum-contracts-assets-2.0.0/contracts/metadata/[email protected]

pragma solidity >=0.7.6 <0.8.0;


abstract contract BaseMetadataURI is ManagedIdentity, Ownable {
    using UInt256ToDecimalString for uint256;

    event BaseMetadataURISet(string baseMetadataURI);

    string public baseMetadataURI;

    function setBaseMetadataURI(string calldata baseMetadataURI_) external {
        _requireOwnership(_msgSender());
        baseMetadataURI = baseMetadataURI_;
        emit BaseMetadataURISet(baseMetadataURI_);
    }

    function _uri(uint256 id) internal view virtual returns (string memory) {
        return string(abi.encodePacked(baseMetadataURI, id.toDecimalString()));
    }
}


// File @animoca/ethereum-contracts-core-1.1.2/contracts/access/[email protected]

pragma solidity >=0.7.6 <0.8.0;

/**
 * Contract which allows derived contracts access control over token minting operations.
 */
contract MinterRole is Ownable {
    event MinterAdded(address indexed account);
    event MinterRemoved(address indexed account);

    mapping(address => bool) public isMinter;

    /**
     * Constructor.
     */
    constructor(address owner_) Ownable(owner_) {
        _addMinter(owner_);
    }

    /**
     * Grants the minter role to a non-minter.
     * @dev reverts if the sender is not the contract owner.
     * @param account The account to grant the minter role to.
     */
    function addMinter(address account) public {
        _requireOwnership(_msgSender());
        _addMinter(account);
    }

    /**
     * Renounces the granted minter role.
     * @dev reverts if the sender is not a minter.
     */
    function renounceMinter() public {
        address account = _msgSender();
        _requireMinter(account);
        isMinter[account] = false;
        emit MinterRemoved(account);
    }

    function _requireMinter(address account) internal view {
        require(isMinter[account], "MinterRole: not a Minter");
    }

    function _addMinter(address account) internal {
        isMinter[account] = true;
        emit MinterAdded(account);
    }
}


// File contracts/token/ERC1155/TokenLaunchpadVouchers.sol

pragma solidity >=0.7.6 <0.8.0;


// solhint-disable-next-line max-line-length





/**
 * @title TokenLaunchpadVouchers
 */
contract TokenLaunchpadVouchers is
    Recoverable,
    UsingUniversalForwarding,
    ERC1155InventoryBurnable,
    IERC1155InventoryMintable,
    IERC1155InventoryCreator,
    BaseMetadataURI,
    MinterRole
{
    constructor(IForwarderRegistry forwarderRegistry, address universalForwarder)
        UsingUniversalForwarding(forwarderRegistry, universalForwarder)
        MinterRole(msg.sender)
    {}

    //======================================================= ERC165 ========================================================//

    /// @inheritdoc IERC165
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return interfaceId == type(IERC1155InventoryCreator).interfaceId || super.supportsInterface(interfaceId);
    }

    //================================================= ERC1155MetadataURI ==================================================//

    /// @inheritdoc IERC1155MetadataURI
    function uri(uint256 id) external view virtual override returns (string memory) {
        return _uri(id);
    }

    //=============================================== ERC1155InventoryCreator ===============================================//

    /// @inheritdoc IERC1155InventoryCreator
    function creator(uint256 collectionId) external view override returns (address) {
        return _creator(collectionId);
    }

    //=========================================== ERC1155InventoryCreator (admin) ===========================================//

    /**
     * Creates a collection.
     * @dev Reverts if the sender is not the contract owner.
     * @dev Reverts if `collectionId` does not represent a collection.
     * @dev Reverts if `collectionId` has already been created.
     * @dev Emits a {IERC1155Inventory-CollectionCreated} event.
     * @param collectionId Identifier of the collection.
     */
    function createCollection(uint256 collectionId) external {
        _requireOwnership(_msgSender());
        _createCollection(collectionId);
    }

    //============================================== ERC1155InventoryMintable ===============================================//

    /// @inheritdoc IERC1155InventoryMintable
    /// @dev Reverts if the sender is not a minter.
    function safeMint(
        address to,
        uint256 id,
        uint256 value,
        bytes memory data
    ) public virtual override {
        _requireMinter(_msgSender());
        _safeMint(to, id, value, data);
    }

    /// @inheritdoc IERC1155InventoryMintable
    /// @dev Reverts if the sender is not a minter.
    function safeBatchMint(
        address to,
        uint256[] memory ids,
        uint256[] memory values,
        bytes memory data
    ) public virtual override {
        _requireMinter(_msgSender());
        _safeBatchMint(to, ids, values, data);
    }

    //======================================== Meta Transactions Internal Functions =========================================//

    function _msgSender() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (address payable) {
        return UsingUniversalForwarding._msgSender();
    }

    function _msgData() internal view virtual override(ManagedIdentity, UsingUniversalForwarding) returns (bytes memory ret) {
        return UsingUniversalForwarding._msgData();
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"contract IForwarderRegistry","name":"forwarderRegistry","type":"address"},{"internalType":"address","name":"universalForwarder","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_owner","type":"address"},{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":false,"internalType":"bool","name":"_approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"baseMetadataURI","type":"string"}],"name":"BaseMetadataURISet","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"collectionId","type":"uint256"},{"indexed":true,"internalType":"bool","name":"fungible","type":"bool"}],"name":"CollectionCreated","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterAdded","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"}],"name":"MinterRemoved","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_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"},{"inputs":[{"internalType":"address","name":"account","type":"address"}],"name":"addMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"owners","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseMetadataURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"batchBurnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burnFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"collectionOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"createCollection","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"collectionId","type":"uint256"}],"name":"creator","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"tokenOwner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"isFungible","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isMinter","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"forwarder","type":"address"}],"name":"isTrustedForwarder","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"tokens","type":"address[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"recoverERC20s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"address[]","name":"contracts","type":"address[]"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"recoverERC721s","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceMinter","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseMetadataURI_","type":"string"}],"name":"setBaseMetadataURI","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":[{"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":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]

60c06040523480156200001157600080fd5b5060405162003c6b38038062003c6b833981810160405260408110156200003757600080fd5b508051602090910151600080546001600160a01b03191633908117825560405190918491849184918291907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0908290a3506001600160601b0319606091821b811660a05291901b16608052620000ad81620000b6565b50505062000102565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b60805160601c60a05160601c613b306200013b6000398061128852806132425250806112c35280613207528061329a5250613b306000f3fe608060405234801561001057600080fd5b50600436106101c35760003560e01c806380534934116100f9578063bd85b03911610097578063d0011d9d11610071578063d0011d9d14610d94578063e985e9c514610db1578063f242432a14610ddf578063f2fde38b14610eaa576101c3565b8063bd85b03914610c46578063c3666c3614610c63578063c7778baa14610d77576101c3565b806398650275116100d35780639865027514610bcd578063a22cb46514610bd5578063aa271e1a14610c03578063adebf6f214610c29576101c3565b80638053493414610a685780638da5cb5b14610b9f578063983b2d5614610ba7576101c3565b8063510b5158116101665780635cfa9297116101405780635cfa9297146108055780636352211e146108c757806373c8a958146108e45780637e518ec8146109f8576101c3565b8063510b51581461079e578063572b6c05146107d75780635b2bd79e146107fd576101c3565b80630e89341c116101a25780630e89341c14610401578063124d91e5146104935780632eb2c2d6146104c55780634e1273f41461068c576101c3565b8062fdd58e146101c857806301ffc9a7146102065780630d6a5bbb14610241575b600080fd5b6101f4600480360360408110156101de57600080fd5b506001600160a01b038135169060200135610ed0565b60408051918252519081900360200190f35b61022d6004803603602081101561021c57600080fd5b50356001600160e01b031916610f9b565b604080519115158252519081900360200190f35b6103ff6004803603608081101561025757600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561028257600080fd5b82018360208201111561029457600080fd5b803590602001918460208302840111640100000000831117156102b657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561030657600080fd5b82018360208201111561031857600080fd5b8035906020019184602083028401116401000000008311171561033a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561038a57600080fd5b82018360208201111561039c57600080fd5b803590602001918460018302840111640100000000831117156103be57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fe1945050505050565b005b61041e6004803603602081101561041757600080fd5b5035611003565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610458578181015183820152602001610440565b50505050905090810190601f1680156104855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103ff600480360360608110156104a957600080fd5b506001600160a01b03813516906020810135906040013561100e565b6103ff600480360360a08110156104db57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561050f57600080fd5b82018360208201111561052157600080fd5b8035906020019184602083028401116401000000008311171561054357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561059357600080fd5b8201836020820111156105a557600080fd5b803590602001918460208302840111640100000000831117156105c757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561061757600080fd5b82018360208201111561062957600080fd5b8035906020019184600183028401116401000000008311171561064b57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061115f945050505050565b61074e600480360360408110156106a257600080fd5b8101906020810181356401000000008111156106bd57600080fd5b8201836020820111156106cf57600080fd5b803590602001918460208302840111640100000000831117156106f157600080fd5b91939092909160208101903564010000000081111561070f57600080fd5b82018360208201111561072157600080fd5b8035906020019184602083028401116401000000008311171561074357600080fd5b509092509050611173565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561078a578181015183820152602001610772565b505050509050019250505060405180910390f35b6107bb600480360360208110156107b457600080fd5b5035611279565b604080516001600160a01b039092168252519081900360200190f35b61022d600480360360208110156107ed57600080fd5b50356001600160a01b0316611284565b61041e6112fd565b6103ff6004803603608081101561081b57600080fd5b6001600160a01b03823516916020810135916040820135919081019060808101606082013564010000000081111561085257600080fd5b82018360208201111561086457600080fd5b8035906020019184600183028401116401000000008311171561088657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061138b945050505050565b6107bb600480360360208110156108dd57600080fd5b50356113a2565b6103ff600480360360608110156108fa57600080fd5b81019060208101813564010000000081111561091557600080fd5b82018360208201111561092757600080fd5b8035906020019184602083028401116401000000008311171561094957600080fd5b91939092909160208101903564010000000081111561096757600080fd5b82018360208201111561097957600080fd5b8035906020019184602083028401116401000000008311171561099b57600080fd5b9193909290916020810190356401000000008111156109b957600080fd5b8201836020820111156109cb57600080fd5b803590602001918460208302840111640100000000831117156109ed57600080fd5b50909250905061140c565b6103ff60048036036020811015610a0e57600080fd5b810190602081018135640100000000811115610a2957600080fd5b820183602082011115610a3b57600080fd5b80359060200191846001830284011164010000000083111715610a5d57600080fd5b5090925090506114fe565b6103ff60048036036060811015610a7e57600080fd5b6001600160a01b038235169190810190604081016020820135640100000000811115610aa957600080fd5b820183602082011115610abb57600080fd5b80359060200191846020830284011164010000000083111715610add57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610b2d57600080fd5b820183602082011115610b3f57600080fd5b80359060200191846020830284011164010000000083111715610b6157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061157a945050505050565b6107bb611851565b6103ff60048036036020811015610bbd57600080fd5b50356001600160a01b0316611861565b6103ff611878565b6103ff60048036036040811015610beb57600080fd5b506001600160a01b03813516906020013515156118d6565b61022d60048036036020811015610c1957600080fd5b50356001600160a01b03166119b7565b61022d60048036036020811015610c3f57600080fd5b50356119cc565b6101f460048036036020811015610c5c57600080fd5b50356119d7565b6103ff60048036036060811015610c7957600080fd5b810190602081018135640100000000811115610c9457600080fd5b820183602082011115610ca657600080fd5b80359060200191846020830284011164010000000083111715610cc857600080fd5b919390929091602081019035640100000000811115610ce657600080fd5b820183602082011115610cf857600080fd5b80359060200191846020830284011164010000000083111715610d1a57600080fd5b919390929091602081019035640100000000811115610d3857600080fd5b820183602082011115610d4a57600080fd5b80359060200191846020830284011164010000000083111715610d6c57600080fd5b509092509050611a2d565b6101f460048036036020811015610d8d57600080fd5b5035611b75565b6103ff60048036036020811015610daa57600080fd5b5035611bda565b61022d60048036036040811015610dc757600080fd5b506001600160a01b0381358116916020013516611bee565b6103ff600480360360a0811015610df557600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135640100000000811115610e3557600080fd5b820183602082011115610e4757600080fd5b80359060200191846001830284011164010000000083111715610e6957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611c1c945050505050565b6103ff60048036036020811015610ec057600080fd5b50356001600160a01b0316611da2565b60006001600160a01b038316610f2d576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b610f3682611e13565b15610f70576000828152600460205260409020546001600160a01b03848116911614610f63576000610f66565b60015b60ff169050610f95565b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b031982167f510b5158000000000000000000000000000000000000000000000000000000001480610fd95750610fd982611e65565b90505b919050565b610ff1610fec611ea3565b611eb2565b610ffd84848484611f1f565b50505050565b6060610fd982612209565b6000611018611ea3565b905061102484826122dc565b611075576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b61107e8361232a565b156110935761108e848484612350565b6110fb565b61109c83611e13565b156110ae5761108e8484846000612459565b6040805162461bcd60e51b815260206004820152601960248201527f496e76656e746f72793a206e6f74206120746f6b656e20696400000000000000604482015290519081900360640190fd5b60006001600160a01b0316846001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a450505050565b61116c85858585856125a2565b5050505050565b60608382146111c9576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60008467ffffffffffffffff811180156111e257600080fd5b5060405190808252806020026020018201604052801561120c578160200160208202803683370190505b50905060005b80861461126f5761125087878381811061122857fe5b905060200201356001600160a01b031686868481811061124457fe5b90506020020135610ed0565b82828151811061125c57fe5b6020908102919091010152600101611212565b5095945050505050565b6000610fd98261289e565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610fd957507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316149050919050565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113835780601f1061135857610100808354040283529160200191611383565b820191906000526020600020905b81548152906001019060200180831161136657829003601f168201915b505050505081565b611396610fec611ea3565b610ffd84848484612917565b6000818152600460205260408120546001600160a01b038116610fd9576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b61141c611417611ea3565b612a2c565b84838114801561142b57508082145b61147c576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b8181146114f4576114ec88888381811061149557fe5b905060200201356001600160a01b03168585848181106114b157fe5b905060200201358888858181106114c457fe5b905060200201356001600160a01b03166001600160a01b0316612af09092919063ffffffff16565b60010161147f565b5050505050505050565b611509611417611ea3565b61151560068383613a59565b507f04b1dc5c136a3ce9fded8db0ce3d3366c58764ec3a8e4c2b9e52e4ddfe5ebbf7828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b8151815181146115d1576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60006115db611ea3565b90506115e785826122dc565b611638576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008060005b84811461172c57600087828151811061165357fe5b60200260200101519050600087838151811061166b57fe5b6020026020010151905061167e8261232a565b156116935761168e8a8383612350565b611722565b61169c82611e13565b156110ae576116ae8a83836001612459565b60006116b983612b75565b9050856116cc5780955060019450611720565b8581146117195760008681526002602090815260408083206001600160a01b038f168452825280832080548990039055978252600390529590952080549490940390935560019284611720565b8460010194505b505b505060010161163e565b50811561176e5760008281526002602090815260408083206001600160a01b038b16845282528083208054859003905584835260039091529020805482900390555b60006001600160a01b0316876001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156117f45781810151838201526020016117dc565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561183357818101518382015260200161181b565b5050505090500194505050505060405180910390a450505050505050565b6000546001600160a01b03165b90565b61186c611417611ea3565b61187581612b82565b50565b6000611882611ea3565b905061188d81611eb2565b6001600160a01b038116600081815260076020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b60006118e0611ea3565b9050806001600160a01b0316836001600160a01b03161415611949576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6001600160a01b03818116600081815260016020908152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b60076020526000908152604090205460ff1681565b6000610fd98261232a565b60006119e282611e13565b15611a18576000828152600460205260409020546001600160a01b031615611a0b576001611a0e565b60005b60ff169050610fdc565b50600081815260036020526040902054610fdc565b611a38611417611ea3565b848381148015611a4757508082145b611a98576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b8181146114f457858582818110611aae57fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a85818110611ad957fe5b905060200201356001600160a01b0316878786818110611af557fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611b5257600080fd5b505af1158015611b66573d6000803e3d6000fd5b50505050806001019050611a9b565b6000611b8082611e13565b611bd1576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b610fd982612b75565b611be5611417611ea3565b61187581612bce565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6000611c26611ea3565b90506001600160a01b038516611c83576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b611c8d86826122dc565b611cde576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b611ce78461232a565b15611cfd57611cf886868686612d1a565b611d19565b611d0684611e13565b156110ae57611cf8868686866000612e38565b846001600160a01b0316866001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4611d88856001600160a01b0316612f66565b15611d9a57611d9a8686868686612f6c565b505050505050565b611dad611417611ea3565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821780845560405192939116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60007f8000000000000000000000000000000000000000000000000000000000000000821615801590610fd95750507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16151590565b60006001600160e01b031982167f921ed8d1000000000000000000000000000000000000000000000000000000001480610fd95750610fd9826130f6565b6000611ead6131f7565b905090565b6001600160a01b03811660009081526007602052604090205460ff16611875576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b6001600160a01b038416611f7a576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b825182518114611fd1576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60008060005b8381146120c3576000878281518110611fec57fe5b60200260200101519050600087838151811061200457fe5b602002602001015190506120178261232a565b1561202c576120278a8383613357565b6120b9565b61203582611e13565b156110ae576120478a83836001613449565b600061205283612b75565b90508561206557809550600194506120b7565b8581146120b05760008681526002602090815260408083206001600160a01b038f168452825280832080548901905597825260039052959095208054909401909355600192846120b7565b8460010194505b505b5050600101611fd7565b5081156121035760008281526002602090815260408083206001600160a01b038b1684528252808320805485019055848352600390915290208054820190555b6001600160a01b0387166000612117611ea3565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561218757818101518382015260200161216f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156121c65781810151838201526020016121ae565b5050505090500194505050505060405180910390a46121ed876001600160a01b0316612f66565b156122005761220060008888888861356b565b50505050505050565b60606006612216836136e9565b60405160200180838054600181600116156101000203166002900480156122745780601f10612252576101008083540402835291820191612274565b820191906000526020600020905b815481529060010190602001808311612260575b5050825160208401908083835b602083106122a05780518252601f199092019160209182019101612281565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b6000816001600160a01b0316836001600160a01b0316148061232357506001600160a01b0380841660009081526001602090815260408083209386168352929052205460ff165b9392505050565b7f8000000000000000000000000000000000000000000000000000000000000000161590565b806123a2576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b03871684529091529020548181101561241a576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b60008381526002602090815260408083206001600160a01b03909716835295815285822092849003909255928352600390529190208054919091039055565b816001146124ae576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b0385811691161461251c576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b60008381526004602052604090207fdead000000000000000000000000000000000000000000000000000000000000905580610ffd57600061255d84612b75565b60008181526002602090815260408083206001600160a01b038a1684528252808320805460001990810190915593835260039091529020805490910190555050505050565b6001600160a01b0384166125fd576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b825182518114612654576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b600061265e611ea3565b905061266a87826122dc565b6126bb576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008060005b8481146127835760008882815181106126d657fe5b6020026020010151905060008883815181106126ee57fe5b602002602001015190506127018261232a565b15612717576127128c8c8484612d1a565b612779565b61272082611e13565b156110ae576127338c8c84846001612e38565b600061273e83612b75565b9050856127515780955060019450612777565b858114612770576127648d8d88886137f8565b80955060019450612777565b8460010194505b505b50506001016126c1565b50811561279657612796898984846137f8565b876001600160a01b0316896001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561281b578181015183820152602001612803565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561285a578181015183820152602001612842565b5050505090500194505050505060405180910390a4612881886001600160a01b0316612f66565b1561289357612893898989898961356b565b505050505050505050565b60006128a982611e13565b156128fb576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b506000908152600560205260409020546001600160a01b031690565b6001600160a01b038416612972576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b61297b8361232a565b156129905761298b848484613357565b6129ab565b61299983611e13565b156110ae5761298b8484846000613449565b6001600160a01b03841660006129bf611ea3565b6001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a4612a19846001600160a01b0316612f66565b15610ffd57610ffd600085858585612f6c565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a6557600080fd5b505afa158015612a79573d6000803e3d6000fd5b505050506040513d6020811015612a8f57600080fd5b50516001600160a01b03828116911614611875576040805162461bcd60e51b815260206004820152601660248201527f4f776e61626c653a206e6f7420746865206f776e657200000000000000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612b7090849061384c565b505050565b6001600160e01b03191690565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b612bd781611e13565b15612c29576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b6000818152600560205260409020546001600160a01b031615612c93576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206578697374696e6720636f6c6c656374696f6e0000604482015290519081900360640190fd5b612c9b611ea3565b600082815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612ce88161232a565b1515817f4ebf8ad0df535ba5e487bc9cb27fe44120ca81c3a95d3eba79c0bd1df2ab2d5d60405160405180910390a350565b80612d6c576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b038816845290915290205481811015612de4576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03161461116c5760009283526002602090815260408085206001600160a01b039788168652909152808420918390039091559290931681522080549091019055565b81600114612e8d576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b03868116911614612efb576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b03851690558061116c576000612f2584612b75565b60009081526002602090815260408083206001600160a01b03998a168452909152808220805460001901905595909616865250505091208054600101905550565b3b151590565b7ff23a6e61000000000000000000000000000000000000000000000000000000006001600160a01b03851663f23a6e61612fa4611ea3565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561301e578181015183820152602001613006565b50505050905090810190601f16801561304b5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561306e57600080fd5b505af1158015613082573d6000803e3d6000fd5b505050506040513d602081101561309857600080fd5b50516001600160e01b0319161461116c576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b60006001600160e01b031982167f01ffc9a700000000000000000000000000000000000000000000000000000000148061315957506001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000145b8061318d57506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b806131c157506001600160e01b031982167f09ce5c4600000000000000000000000000000000000000000000000000000000145b80610fd95750506001600160e01b0319167fbd85b039000000000000000000000000000000000000000000000000000000001490565b60003381613203613a2f565b90507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316148061327657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b1561328457915061185e9050565b6001600160a01b038216321480159061334357507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561331657600080fd5b505afa15801561332a573d6000803e3d6000fd5b505050506040513d602081101561334057600080fd5b50515b1561335157915061185e9050565b50905090565b806133a9576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008281526003602052604090205481810181811161340f576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a20737570706c79206f766572666c6f77000000000000604482015290519081900360640190fd5b600093845260036020908152604080862092909255600281528185206001600160a01b039096168552949094525091902080549091019055565b8160011461349e576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b600083815260046020526040902054156134ff576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206578697374696e672f6275726e74204e4654000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b038516905580610ffd57600061352984612b75565b600090815260036020908152604080832080546001908101909155600283528184206001600160a01b038a168552909252909120805490910190555050505050565b7fbc197c81000000000000000000000000000000000000000000000000000000006001600160a01b03851663bc197c816135a3611ea3565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561361c578181015183820152602001613604565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561365b578181015183820152602001613643565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561369757818101518382015260200161367f565b50505050905090810190601f1680156136c45780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561306e57600080fd5b60608161372a575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610fdc565b8160005b811561374257600101600a8204915061372e565b60008167ffffffffffffffff8111801561375b57600080fd5b506040519080825280601f01601f191660200182016040528015613786576020820181803683370190505b50859350905060001982015b83156137ef57600a840660300160f81b828280600190039350815181106137b557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350613792565b50949350505050565b826001600160a01b0316846001600160a01b031614610ffd5760009182526002602090815260408084206001600160a01b039687168552909152808320805483900390559290931681522080549091019055565b8161385f6001600160a01b038216612f66565b6138b0576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b602083106138ed5780518252601f1990920191602091820191016138ce565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461394f576040519150601f19603f3d011682016040523d82523d6000602084013e613954565b606091505b509150915081156139d3578051156139ce5780806020019051602081101561397b57600080fd5b50516139ce576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b61116c565b8051613a26576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613a8f5760008555613ad5565b82601f10613aa85782800160ff19823516178555613ad5565b82800160010185558215613ad5579182015b82811115613ad5578235825591602001919060010190613aba565b50613ae1929150613ae5565b5090565b5b80821115613ae15760008155600101613ae656fea2646970667358221220d77b226555abdc3eaeb897b36079c6aba265c6dea8b9f1b2079a1553b5e712b664736f6c63430007060033000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f0000000000000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101c35760003560e01c806380534934116100f9578063bd85b03911610097578063d0011d9d11610071578063d0011d9d14610d94578063e985e9c514610db1578063f242432a14610ddf578063f2fde38b14610eaa576101c3565b8063bd85b03914610c46578063c3666c3614610c63578063c7778baa14610d77576101c3565b806398650275116100d35780639865027514610bcd578063a22cb46514610bd5578063aa271e1a14610c03578063adebf6f214610c29576101c3565b80638053493414610a685780638da5cb5b14610b9f578063983b2d5614610ba7576101c3565b8063510b5158116101665780635cfa9297116101405780635cfa9297146108055780636352211e146108c757806373c8a958146108e45780637e518ec8146109f8576101c3565b8063510b51581461079e578063572b6c05146107d75780635b2bd79e146107fd576101c3565b80630e89341c116101a25780630e89341c14610401578063124d91e5146104935780632eb2c2d6146104c55780634e1273f41461068c576101c3565b8062fdd58e146101c857806301ffc9a7146102065780630d6a5bbb14610241575b600080fd5b6101f4600480360360408110156101de57600080fd5b506001600160a01b038135169060200135610ed0565b60408051918252519081900360200190f35b61022d6004803603602081101561021c57600080fd5b50356001600160e01b031916610f9b565b604080519115158252519081900360200190f35b6103ff6004803603608081101561025757600080fd5b6001600160a01b03823516919081019060408101602082013564010000000081111561028257600080fd5b82018360208201111561029457600080fd5b803590602001918460208302840111640100000000831117156102b657600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561030657600080fd5b82018360208201111561031857600080fd5b8035906020019184602083028401116401000000008311171561033a57600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561038a57600080fd5b82018360208201111561039c57600080fd5b803590602001918460018302840111640100000000831117156103be57600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550610fe1945050505050565b005b61041e6004803603602081101561041757600080fd5b5035611003565b6040805160208082528351818301528351919283929083019185019080838360005b83811015610458578181015183820152602001610440565b50505050905090810190601f1680156104855780820380516001836020036101000a031916815260200191505b509250505060405180910390f35b6103ff600480360360608110156104a957600080fd5b506001600160a01b03813516906020810135906040013561100e565b6103ff600480360360a08110156104db57600080fd5b6001600160a01b03823581169260208101359091169181019060608101604082013564010000000081111561050f57600080fd5b82018360208201111561052157600080fd5b8035906020019184602083028401116401000000008311171561054357600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561059357600080fd5b8201836020820111156105a557600080fd5b803590602001918460208302840111640100000000831117156105c757600080fd5b919080806020026020016040519081016040528093929190818152602001838360200280828437600092019190915250929594936020810193503591505064010000000081111561061757600080fd5b82018360208201111561062957600080fd5b8035906020019184600183028401116401000000008311171561064b57600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061115f945050505050565b61074e600480360360408110156106a257600080fd5b8101906020810181356401000000008111156106bd57600080fd5b8201836020820111156106cf57600080fd5b803590602001918460208302840111640100000000831117156106f157600080fd5b91939092909160208101903564010000000081111561070f57600080fd5b82018360208201111561072157600080fd5b8035906020019184602083028401116401000000008311171561074357600080fd5b509092509050611173565b60408051602080825283518183015283519192839290830191858101910280838360005b8381101561078a578181015183820152602001610772565b505050509050019250505060405180910390f35b6107bb600480360360208110156107b457600080fd5b5035611279565b604080516001600160a01b039092168252519081900360200190f35b61022d600480360360208110156107ed57600080fd5b50356001600160a01b0316611284565b61041e6112fd565b6103ff6004803603608081101561081b57600080fd5b6001600160a01b03823516916020810135916040820135919081019060808101606082013564010000000081111561085257600080fd5b82018360208201111561086457600080fd5b8035906020019184600183028401116401000000008311171561088657600080fd5b91908080601f01602080910402602001604051908101604052809392919081815260200183838082843760009201919091525092955061138b945050505050565b6107bb600480360360208110156108dd57600080fd5b50356113a2565b6103ff600480360360608110156108fa57600080fd5b81019060208101813564010000000081111561091557600080fd5b82018360208201111561092757600080fd5b8035906020019184602083028401116401000000008311171561094957600080fd5b91939092909160208101903564010000000081111561096757600080fd5b82018360208201111561097957600080fd5b8035906020019184602083028401116401000000008311171561099b57600080fd5b9193909290916020810190356401000000008111156109b957600080fd5b8201836020820111156109cb57600080fd5b803590602001918460208302840111640100000000831117156109ed57600080fd5b50909250905061140c565b6103ff60048036036020811015610a0e57600080fd5b810190602081018135640100000000811115610a2957600080fd5b820183602082011115610a3b57600080fd5b80359060200191846001830284011164010000000083111715610a5d57600080fd5b5090925090506114fe565b6103ff60048036036060811015610a7e57600080fd5b6001600160a01b038235169190810190604081016020820135640100000000811115610aa957600080fd5b820183602082011115610abb57600080fd5b80359060200191846020830284011164010000000083111715610add57600080fd5b9190808060200260200160405190810160405280939291908181526020018383602002808284376000920191909152509295949360208101935035915050640100000000811115610b2d57600080fd5b820183602082011115610b3f57600080fd5b80359060200191846020830284011164010000000083111715610b6157600080fd5b91908080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525092955061157a945050505050565b6107bb611851565b6103ff60048036036020811015610bbd57600080fd5b50356001600160a01b0316611861565b6103ff611878565b6103ff60048036036040811015610beb57600080fd5b506001600160a01b03813516906020013515156118d6565b61022d60048036036020811015610c1957600080fd5b50356001600160a01b03166119b7565b61022d60048036036020811015610c3f57600080fd5b50356119cc565b6101f460048036036020811015610c5c57600080fd5b50356119d7565b6103ff60048036036060811015610c7957600080fd5b810190602081018135640100000000811115610c9457600080fd5b820183602082011115610ca657600080fd5b80359060200191846020830284011164010000000083111715610cc857600080fd5b919390929091602081019035640100000000811115610ce657600080fd5b820183602082011115610cf857600080fd5b80359060200191846020830284011164010000000083111715610d1a57600080fd5b919390929091602081019035640100000000811115610d3857600080fd5b820183602082011115610d4a57600080fd5b80359060200191846020830284011164010000000083111715610d6c57600080fd5b509092509050611a2d565b6101f460048036036020811015610d8d57600080fd5b5035611b75565b6103ff60048036036020811015610daa57600080fd5b5035611bda565b61022d60048036036040811015610dc757600080fd5b506001600160a01b0381358116916020013516611bee565b6103ff600480360360a0811015610df557600080fd5b6001600160a01b03823581169260208101359091169160408201359160608101359181019060a081016080820135640100000000811115610e3557600080fd5b820183602082011115610e4757600080fd5b80359060200191846001830284011164010000000083111715610e6957600080fd5b91908080601f016020809104026020016040519081016040528093929190818152602001838380828437600092019190915250929550611c1c945050505050565b6103ff60048036036020811015610ec057600080fd5b50356001600160a01b0316611da2565b60006001600160a01b038316610f2d576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a207a65726f2061646472657373000000000000000000604482015290519081900360640190fd5b610f3682611e13565b15610f70576000828152600460205260409020546001600160a01b03848116911614610f63576000610f66565b60015b60ff169050610f95565b5060008181526002602090815260408083206001600160a01b03861684529091529020545b92915050565b60006001600160e01b031982167f510b5158000000000000000000000000000000000000000000000000000000001480610fd95750610fd982611e65565b90505b919050565b610ff1610fec611ea3565b611eb2565b610ffd84848484611f1f565b50505050565b6060610fd982612209565b6000611018611ea3565b905061102484826122dc565b611075576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b61107e8361232a565b156110935761108e848484612350565b6110fb565b61109c83611e13565b156110ae5761108e8484846000612459565b6040805162461bcd60e51b815260206004820152601960248201527f496e76656e746f72793a206e6f74206120746f6b656e20696400000000000000604482015290519081900360640190fd5b60006001600160a01b0316846001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a450505050565b61116c85858585856125a2565b5050505050565b60608382146111c9576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60008467ffffffffffffffff811180156111e257600080fd5b5060405190808252806020026020018201604052801561120c578160200160208202803683370190505b50905060005b80861461126f5761125087878381811061122857fe5b905060200201356001600160a01b031686868481811061124457fe5b90506020020135610ed0565b82828151811061125c57fe5b6020908102919091010152600101611212565b5095945050505050565b6000610fd98261289e565b60007f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b03161480610fd957507f000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f6001600160a01b0316826001600160a01b0316149050919050565b6006805460408051602060026001851615610100026000190190941693909304601f810184900484028201840190925281815292918301828280156113835780601f1061135857610100808354040283529160200191611383565b820191906000526020600020905b81548152906001019060200180831161136657829003601f168201915b505050505081565b611396610fec611ea3565b610ffd84848484612917565b6000818152600460205260408120546001600160a01b038116610fd9576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f6e2d6578697374696e67204e46540000000000604482015290519081900360640190fd5b61141c611417611ea3565b612a2c565b84838114801561142b57508082145b61147c576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b8181146114f4576114ec88888381811061149557fe5b905060200201356001600160a01b03168585848181106114b157fe5b905060200201358888858181106114c457fe5b905060200201356001600160a01b03166001600160a01b0316612af09092919063ffffffff16565b60010161147f565b5050505050505050565b611509611417611ea3565b61151560068383613a59565b507f04b1dc5c136a3ce9fded8db0ce3d3366c58764ec3a8e4c2b9e52e4ddfe5ebbf7828260405180806020018281038252848482818152602001925080828437600083820152604051601f909101601f19169092018290039550909350505050a15050565b8151815181146115d1576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60006115db611ea3565b90506115e785826122dc565b611638576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008060005b84811461172c57600087828151811061165357fe5b60200260200101519050600087838151811061166b57fe5b6020026020010151905061167e8261232a565b156116935761168e8a8383612350565b611722565b61169c82611e13565b156110ae576116ae8a83836001612459565b60006116b983612b75565b9050856116cc5780955060019450611720565b8581146117195760008681526002602090815260408083206001600160a01b038f168452825280832080548990039055978252600390529590952080549490940390935560019284611720565b8460010194505b505b505060010161163e565b50811561176e5760008281526002602090815260408083206001600160a01b038b16845282528083208054859003905584835260039091529020805482900390555b60006001600160a01b0316876001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b838110156117f45781810151838201526020016117dc565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561183357818101518382015260200161181b565b5050505090500194505050505060405180910390a450505050505050565b6000546001600160a01b03165b90565b61186c611417611ea3565b61187581612b82565b50565b6000611882611ea3565b905061188d81611eb2565b6001600160a01b038116600081815260076020526040808220805460ff19169055517fe94479a9f7e1952cc78f2d6baab678adc1b772d936c6583def489e524cb666929190a250565b60006118e0611ea3565b9050806001600160a01b0316836001600160a01b03161415611949576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a2073656c662d617070726f76616c0000000000000000604482015290519081900360640190fd5b6001600160a01b03818116600081815260016020908152604080832094881680845294825291829020805460ff1916871515908117909155825190815291517f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c319281900390910190a3505050565b60076020526000908152604090205460ff1681565b6000610fd98261232a565b60006119e282611e13565b15611a18576000828152600460205260409020546001600160a01b031615611a0b576001611a0e565b60005b60ff169050610fdc565b50600081815260036020526040902054610fdc565b611a38611417611ea3565b848381148015611a4757508082145b611a98576040805162461bcd60e51b815260206004820152601a60248201527f5265636f763a20696e636f6e73697374656e7420617272617973000000000000604482015290519081900360640190fd5b60005b8181146114f457858582818110611aae57fe5b905060200201356001600160a01b03166001600160a01b03166323b872dd308a8a85818110611ad957fe5b905060200201356001600160a01b0316878786818110611af557fe5b905060200201356040518463ffffffff1660e01b815260040180846001600160a01b03168152602001836001600160a01b031681526020018281526020019350505050600060405180830381600087803b158015611b5257600080fd5b505af1158015611b66573d6000803e3d6000fd5b50505050806001019050611a9b565b6000611b8082611e13565b611bd1576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a206e6f7420616e204e46540000000000000000000000604482015290519081900360640190fd5b610fd982612b75565b611be5611417611ea3565b61187581612bce565b6001600160a01b03918216600090815260016020908152604080832093909416825291909152205460ff1690565b6000611c26611ea3565b90506001600160a01b038516611c83576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b611c8d86826122dc565b611cde576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b611ce78461232a565b15611cfd57611cf886868686612d1a565b611d19565b611d0684611e13565b156110ae57611cf8868686866000612e38565b846001600160a01b0316866001600160a01b0316826001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628787604051808381526020018281526020019250505060405180910390a4611d88856001600160a01b0316612f66565b15611d9a57611d9a8686868686612f6c565b505050505050565b611dad611417611ea3565b600080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0383811691821780845560405192939116917f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e09190a350565b60007f8000000000000000000000000000000000000000000000000000000000000000821615801590610fd95750507bffffffffffffffffffffffffffffffffffffffffffffffffffffffff16151590565b60006001600160e01b031982167f921ed8d1000000000000000000000000000000000000000000000000000000001480610fd95750610fd9826130f6565b6000611ead6131f7565b905090565b6001600160a01b03811660009081526007602052604090205460ff16611875576040805162461bcd60e51b815260206004820152601860248201527f4d696e746572526f6c653a206e6f742061204d696e7465720000000000000000604482015290519081900360640190fd5b6001600160a01b038416611f7a576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b825182518114611fd1576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b60008060005b8381146120c3576000878281518110611fec57fe5b60200260200101519050600087838151811061200457fe5b602002602001015190506120178261232a565b1561202c576120278a8383613357565b6120b9565b61203582611e13565b156110ae576120478a83836001613449565b600061205283612b75565b90508561206557809550600194506120b7565b8581146120b05760008681526002602090815260408083206001600160a01b038f168452825280832080548901905597825260039052959095208054909401909355600192846120b7565b8460010194505b505b5050600101611fd7565b5081156121035760008281526002602090815260408083206001600160a01b038b1684528252808320805485019055848352600390915290208054820190555b6001600160a01b0387166000612117611ea3565b6001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8989604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561218757818101518382015260200161216f565b50505050905001838103825284818151815260200191508051906020019060200280838360005b838110156121c65781810151838201526020016121ae565b5050505090500194505050505060405180910390a46121ed876001600160a01b0316612f66565b156122005761220060008888888861356b565b50505050505050565b60606006612216836136e9565b60405160200180838054600181600116156101000203166002900480156122745780601f10612252576101008083540402835291820191612274565b820191906000526020600020905b815481529060010190602001808311612260575b5050825160208401908083835b602083106122a05780518252601f199092019160209182019101612281565b6001836020036101000a038019825116818451168082178552505050505050905001925050506040516020818303038152906040529050919050565b6000816001600160a01b0316836001600160a01b0316148061232357506001600160a01b0380841660009081526001602090815260408083209386168352929052205460ff165b9392505050565b7f8000000000000000000000000000000000000000000000000000000000000000161590565b806123a2576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b03871684529091529020548181101561241a576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b60008381526002602090815260408083206001600160a01b03909716835295815285822092849003909255928352600390529190208054919091039055565b816001146124ae576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b0385811691161461251c576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b60008381526004602052604090207fdead000000000000000000000000000000000000000000000000000000000000905580610ffd57600061255d84612b75565b60008181526002602090815260408083206001600160a01b038a1684528252808320805460001990810190915593835260039091529020805490910190555050505050565b6001600160a01b0384166125fd576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220746f207a65726f0000000000604482015290519081900360640190fd5b825182518114612654576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a20696e636f6e73697374656e74206172726179730000604482015290519081900360640190fd5b600061265e611ea3565b905061266a87826122dc565b6126bb576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206e6f6e2d617070726f7665642073656e6465720000604482015290519081900360640190fd5b60008060005b8481146127835760008882815181106126d657fe5b6020026020010151905060008883815181106126ee57fe5b602002602001015190506127018261232a565b15612717576127128c8c8484612d1a565b612779565b61272082611e13565b156110ae576127338c8c84846001612e38565b600061273e83612b75565b9050856127515780955060019450612777565b858114612770576127648d8d88886137f8565b80955060019450612777565b8460010194505b505b50506001016126c1565b50811561279657612796898984846137f8565b876001600160a01b0316896001600160a01b0316846001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8a8a604051808060200180602001838103835285818151815260200191508051906020019060200280838360005b8381101561281b578181015183820152602001612803565b50505050905001838103825284818151815260200191508051906020019060200280838360005b8381101561285a578181015183820152602001612842565b5050505090500194505050505060405180910390a4612881886001600160a01b0316612f66565b1561289357612893898989898961356b565b505050505050505050565b60006128a982611e13565b156128fb576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b506000908152600560205260409020546001600160a01b031690565b6001600160a01b038416612972576040805162461bcd60e51b815260206004820152601760248201527f496e76656e746f72793a206d696e7420746f207a65726f000000000000000000604482015290519081900360640190fd5b61297b8361232a565b156129905761298b848484613357565b6129ab565b61299983611e13565b156110ae5761298b8484846000613449565b6001600160a01b03841660006129bf611ea3565b6001600160a01b03167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628686604051808381526020018281526020019250505060405180910390a4612a19846001600160a01b0316612f66565b15610ffd57610ffd600085858585612f6c565b306001600160a01b0316638da5cb5b6040518163ffffffff1660e01b815260040160206040518083038186803b158015612a6557600080fd5b505afa158015612a79573d6000803e3d6000fd5b505050506040513d6020811015612a8f57600080fd5b50516001600160a01b03828116911614611875576040805162461bcd60e51b815260206004820152601660248201527f4f776e61626c653a206e6f7420746865206f776e657200000000000000000000604482015290519081900360640190fd5b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180517bffffffffffffffffffffffffffffffffffffffffffffffffffffffff167fa9059cbb00000000000000000000000000000000000000000000000000000000179052612b7090849061384c565b505050565b6001600160e01b03191690565b6001600160a01b038116600081815260076020526040808220805460ff19166001179055517f6ae172837ea30b801fbfcdd4108aa1d5bf8ff775444fd70256b44e6bf3dfc3f69190a250565b612bd781611e13565b15612c29576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a206e6f74206120636f6c6c656374696f6e0000000000604482015290519081900360640190fd5b6000818152600560205260409020546001600160a01b031615612c93576040805162461bcd60e51b815260206004820152601e60248201527f496e76656e746f72793a206578697374696e6720636f6c6c656374696f6e0000604482015290519081900360640190fd5b612c9b611ea3565b600082815260056020526040902080547fffffffffffffffffffffffff0000000000000000000000000000000000000000166001600160a01b0392909216919091179055612ce88161232a565b1515817f4ebf8ad0df535ba5e487bc9cb27fe44120ca81c3a95d3eba79c0bd1df2ab2d5d60405160405180910390a350565b80612d6c576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008281526002602090815260408083206001600160a01b038816845290915290205481811015612de4576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206e6f7420656e6f7567682062616c616e6365000000604482015290519081900360640190fd5b836001600160a01b0316856001600160a01b03161461116c5760009283526002602090815260408085206001600160a01b039788168652909152808420918390039091559290931681522080549091019055565b81600114612e8d576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b6000838152600460205260409020546001600160a01b03868116911614612efb576040805162461bcd60e51b815260206004820152601860248201527f496e76656e746f72793a206e6f6e2d6f776e6564204e46540000000000000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b03851690558061116c576000612f2584612b75565b60009081526002602090815260408083206001600160a01b03998a168452909152808220805460001901905595909616865250505091208054600101905550565b3b151590565b7ff23a6e61000000000000000000000000000000000000000000000000000000006001600160a01b03851663f23a6e61612fa4611ea3565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b0316815260200184815260200183815260200180602001828103825283818151815260200191508051906020019080838360005b8381101561301e578181015183820152602001613006565b50505050905090810190601f16801561304b5780820380516001836020036101000a031916815260200191505b509650505050505050602060405180830381600087803b15801561306e57600080fd5b505af1158015613082573d6000803e3d6000fd5b505050506040513d602081101561309857600080fd5b50516001600160e01b0319161461116c576040805162461bcd60e51b815260206004820152601b60248201527f496e76656e746f72793a207472616e7366657220726566757365640000000000604482015290519081900360640190fd5b60006001600160e01b031982167f01ffc9a700000000000000000000000000000000000000000000000000000000148061315957506001600160e01b031982167fd9b67a2600000000000000000000000000000000000000000000000000000000145b8061318d57506001600160e01b031982167f0e89341c00000000000000000000000000000000000000000000000000000000145b806131c157506001600160e01b031982167f09ce5c4600000000000000000000000000000000000000000000000000000000145b80610fd95750506001600160e01b0319167fbd85b039000000000000000000000000000000000000000000000000000000001490565b60003381613203613a2f565b90507f000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f6001600160a01b0316826001600160a01b0316148061327657507f00000000000000000000000000000000000000000000000000000000000000006001600160a01b0316826001600160a01b0316145b1561328457915061185e9050565b6001600160a01b038216321480159061334357507f000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f6001600160a01b031663e60125d682846040518363ffffffff1660e01b815260040180836001600160a01b03168152602001826001600160a01b031681526020019250505060206040518083038186803b15801561331657600080fd5b505afa15801561332a573d6000803e3d6000fd5b505050506040513d602081101561334057600080fd5b50515b1561335157915061185e9050565b50905090565b806133a9576040805162461bcd60e51b815260206004820152601560248201527f496e76656e746f72793a207a65726f2076616c75650000000000000000000000604482015290519081900360640190fd5b60008281526003602052604090205481810181811161340f576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a20737570706c79206f766572666c6f77000000000000604482015290519081900360640190fd5b600093845260036020908152604080862092909255600281528185206001600160a01b039096168552949094525091902080549091019055565b8160011461349e576040805162461bcd60e51b815260206004820152601a60248201527f496e76656e746f72793a2077726f6e67204e46542076616c7565000000000000604482015290519081900360640190fd5b600083815260046020526040902054156134ff576040805162461bcd60e51b815260206004820152601d60248201527f496e76656e746f72793a206578697374696e672f6275726e74204e4654000000604482015290519081900360640190fd5b60008381526004602052604090206001600160a01b038516905580610ffd57600061352984612b75565b600090815260036020908152604080832080546001908101909155600283528184206001600160a01b038a168552909252909120805490910190555050505050565b7fbc197c81000000000000000000000000000000000000000000000000000000006001600160a01b03851663bc197c816135a3611ea3565b888787876040518663ffffffff1660e01b815260040180866001600160a01b03168152602001856001600160a01b03168152602001806020018060200180602001848103845287818151815260200191508051906020019060200280838360005b8381101561361c578181015183820152602001613604565b50505050905001848103835286818151815260200191508051906020019060200280838360005b8381101561365b578181015183820152602001613643565b50505050905001848103825285818151815260200191508051906020019080838360005b8381101561369757818101518382015260200161367f565b50505050905090810190601f1680156136c45780820380516001836020036101000a031916815260200191505b5098505050505050505050602060405180830381600087803b15801561306e57600080fd5b60608161372a575060408051808201909152600181527f30000000000000000000000000000000000000000000000000000000000000006020820152610fdc565b8160005b811561374257600101600a8204915061372e565b60008167ffffffffffffffff8111801561375b57600080fd5b506040519080825280601f01601f191660200182016040528015613786576020820181803683370190505b50859350905060001982015b83156137ef57600a840660300160f81b828280600190039350815181106137b557fe5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a84049350613792565b50949350505050565b826001600160a01b0316846001600160a01b031614610ffd5760009182526002602090815260408084206001600160a01b039687168552909152808320805483900390559290931681522080549091019055565b8161385f6001600160a01b038216612f66565b6138b0576040805162461bcd60e51b815260206004820152601a60248201527f4552433230577261707065723a206e6f6e2d636f6e7472616374000000000000604482015290519081900360640190fd5b600080826001600160a01b0316846040518082805190602001908083835b602083106138ed5780518252601f1990920191602091820191016138ce565b6001836020036101000a0380198251168184511680821785525050505050509050019150506000604051808303816000865af19150503d806000811461394f576040519150601f19603f3d011682016040523d82523d6000602084013e613954565b606091505b509150915081156139d3578051156139ce5780806020019051602081101561397b57600080fd5b50516139ce576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b61116c565b8051613a26576040805162461bcd60e51b815260206004820152601e60248201527f4552433230577261707065723a206f7065726174696f6e206661696c65640000604482015290519081900360640190fd5b80518082602001fd5b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffec36013560601c90565b828054600181600116156101000203166002900490600052602060002090601f016020900481019282613a8f5760008555613ad5565b82601f10613aa85782800160ff19823516178555613ad5565b82800160010185558215613ad5579182015b82811115613ad5578235825591602001919060010190613aba565b50613ae1929150613ae5565b5090565b5b80821115613ae15760008155600101613ae656fea2646970667358221220d77b226555abdc3eaeb897b36079c6aba265c6dea8b9f1b2079a1553b5e712b664736f6c63430007060033

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

000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f0000000000000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : forwarderRegistry (address): 0xB87EbEB1f4aA317bd3eEc04704D3fFD6e3BC4b8f
Arg [1] : universalForwarder (address): 0x0000000000000000000000000000000000000000

-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 000000000000000000000000b87ebeb1f4aa317bd3eec04704d3ffd6e3bc4b8f
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

65562:3420:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;38618:328;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;38618:328:0;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;66144:214;;;;;;;;;;;;;;;;-1:-1:-1;66144:214:0;-1:-1:-1;;;;;;66144:214:0;;:::i;:::-;;;;;;;;;;;;;;;;;;68202:263;;;;;;;;;;;;;;;;-1:-1:-1;;;;;68202:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68202:263:0;;;;;;;;-1:-1:-1;68202:263:0;;-1:-1:-1;;68202:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68202:263:0;;;;;;;;-1:-1:-1;68202:263:0;;-1:-1:-1;;68202:263:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;68202:263:0;;-1:-1:-1;68202:263:0;;-1:-1:-1;;;;;68202:263:0:i;:::-;;66538:114;;;;;;;;;;;;;;;;-1:-1:-1;66538:114:0;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55290:572;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;55290:572:0;;;;;;;;;;;;;:::i;46294:329::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;46294:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46294:329:0;;;;;;;;-1:-1:-1;46294:329:0;;-1:-1:-1;;46294:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46294:329:0;;;;;;;;-1:-1:-1;46294:329:0;;-1:-1:-1;;46294:329:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;46294:329:0;;-1:-1:-1;46294:329:0;;-1:-1:-1;;;;;46294:329:0:i;38993:445::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;38993:445:0;;-1:-1:-1;38993:445:0;-1:-1:-1;38993:445:0;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66837:128;;;;;;;;;;;;;;;;-1:-1:-1;66837:128:0;;:::i;:::-;;;;-1:-1:-1;;;;;66837:128:0;;;;;;;;;;;;;;12466:195;;;;;;;;;;;;;;;;-1:-1:-1;12466:195:0;-1:-1:-1;;;;;12466:195:0;;:::i;63484:29::-;;;:::i;67863:231::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;67863:231:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;67863:231:0;;-1:-1:-1;67863:231:0;;-1:-1:-1;;;;;67863:231:0:i;40597:239::-;;;;;;;;;;;;;;;;-1:-1:-1;40597:239:0;;:::i;8549:492::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;8549:492:0;;-1:-1:-1;8549:492:0;-1:-1:-1;8549:492:0;:::i;63522:218::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;63522:218:0;;-1:-1:-1;63522:218:0;-1:-1:-1;63522:218:0;:::i;55917:1804::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;55917:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55917:1804:0;;;;;;;;-1:-1:-1;55917:1804:0;;-1:-1:-1;;55917:1804:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;55917:1804:0;;-1:-1:-1;55917:1804:0;;-1:-1:-1;;;;;55917:1804:0:i;2894:96::-;;;:::i;64651:123::-;;;;;;;;;;;;;;;;-1:-1:-1;64651:123:0;-1:-1:-1;;;;;64651:123:0;;:::i;64895:190::-;;;:::i;39476:306::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39476:306:0;;;;;;;;;;:::i;64282:40::-;;;;;;;;;;;;;;;;-1:-1:-1;64282:40:0;-1:-1:-1;;;;;64282:40:0;;:::i;40164:124::-;;;;;;;;;;;;;;;;-1:-1:-1;40164:124:0;;:::i;41025:267::-;;;;;;;;;;;;;;;;-1:-1:-1;41025:267:0;;:::i;9867:522::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;9867:522:0;;-1:-1:-1;9867:522:0;-1:-1:-1;9867:522:0;:::i;40335:215::-;;;;;;;;;;;;;;;;-1:-1:-1;40335:215:0;;:::i;67475:149::-;;;;;;;;;;;;;;;;-1:-1:-1;67475:149:0;;:::i;39820:166::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;;39820:166:0;;;;;;;;;;:::i;45436:811::-;;;;;;;;;;;;;;;;-1:-1:-1;;;;;45436:811:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;45436:811:0;;-1:-1:-1;45436:811:0;;-1:-1:-1;;;;;45436:811:0:i;3237:201::-;;;;;;;;;;;;;;;;-1:-1:-1;3237:201:0;-1:-1:-1;;;;;3237:201:0;;:::i;38618:328::-;38702:7;-1:-1:-1;;;;;38730:19:0;;38722:55;;;;;-1:-1:-1;;;38722:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;38794:23;:2;:21;:23::i;:::-;38790:109;;;38857:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;38841:38:0;;;;;;:46;;38886:1;38841:46;;;38882:1;38841:46;38834:53;;;;;;38790:109;-1:-1:-1;38918:13:0;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;38918:20:0;;;;;;;;;;38618:328;;;;;:::o;66144:214::-;66229:4;-1:-1:-1;;;;;;66253:57:0;;66268:42;66253:57;;:97;;;66314:36;66338:11;66314:23;:36::i;:::-;66246:104;;66144:214;;;;:::o;68202:263::-;68381:28;68396:12;:10;:12::i;:::-;68381:14;:28::i;:::-;68420:37;68435:2;68439:3;68444:6;68452:4;68420:14;:37::i;:::-;68202:263;;;;:::o;66538:114::-;66603:13;66636:8;66641:2;66636:4;:8::i;55290:572::-;55418:14;55435:12;:10;:12::i;:::-;55418:29;;55466:27;55480:4;55486:6;55466:13;:27::i;:::-;55458:70;;;;;-1:-1:-1;;;55458:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;55545:20;:2;:18;:20::i;:::-;55541:245;;;55582:30;55596:4;55602:2;55606:5;55582:13;:30::i;:::-;55541:245;;;55634:23;:2;:21;:23::i;:::-;55630:156;;;55674:32;55683:4;55689:2;55693:5;55700;55674:8;:32::i;55630:156::-;55739:35;;;-1:-1:-1;;;55739:35:0;;;;;;;;;;;;;;;;;;;;;;;;;;;55630:156;55840:1;-1:-1:-1;;;;;55803:51:0;55826:4;-1:-1:-1;;;;;55803:51:0;55818:6;-1:-1:-1;;;;;55803:51:0;;55844:2;55848:5;55803:51;;;;;;;;;;;;;;;;;;;;;;;;55290:572;;;;:::o;46294:329::-;46564:51;46587:4;46593:2;46597:3;46602:6;46610:4;46564:22;:51::i;:::-;46294:329;;;;;:::o;38993:445::-;39108:16;39145:27;;;39137:70;;;;;-1:-1:-1;;;39137:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;39220:25;39262:6;39248:28;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;39248:28:0;;39220:56;;39294:9;39289:114;39309:18;;;39289:114;;39363:28;39373:6;;39380:1;39373:9;;;;;;;;;;;;;-1:-1:-1;;;;;39373:9:0;39384:3;;39388:1;39384:6;;;;;;;;;;;;;39363:9;:28::i;:::-;39349:8;39358:1;39349:11;;;;;;;;;;;;;;;;;:42;39329:3;;39289:114;;;-1:-1:-1;39422:8:0;38993:445;-1:-1:-1;;;;;38993:445:0:o;66837:128::-;66908:7;66935:22;66944:12;66935:8;:22::i;12466:195::-;12553:4;12590:19;-1:-1:-1;;;;;12577:32:0;:9;-1:-1:-1;;;;;12577:32:0;;:76;;;;12634:18;-1:-1:-1;;;;;12613:40:0;:9;-1:-1:-1;;;;;12613:40:0;;12570:83;;12466:195;;;:::o;63484:29::-;;;;;;;;;;;;;;;-1:-1:-1;;63484:29:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67863:231::-;68017:28;68032:12;:10;:12::i;68017:28::-;68056:30;68066:2;68070;68074:5;68081:4;68056:9;:30::i;40597:239::-;40667:7;40719:14;;;:7;:14;;;;;;-1:-1:-1;;;;;40754:19:0;;40746:59;;;;;-1:-1:-1;;;40746:59:0;;;;;;;;;;;;;;;;;;;;;;;;;;;8549:492;8718:31;8736:12;:10;:12::i;:::-;8718:17;:31::i;:::-;8777:8;8811:23;;;:51;;;;-1:-1:-1;8838:24:0;;;8811:51;8803:90;;;;;-1:-1:-1;;;8803:90:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;8909:9;8904:130;8929:6;8924:1;:11;8904:130;;8957:65;8998:8;;9007:1;8998:11;;;;;;;;;;;;;-1:-1:-1;;;;;8998:11:0;9011:7;;9019:1;9011:10;;;;;;;;;;;;;8971:6;;8978:1;8971:9;;;;;;;;;;;;;-1:-1:-1;;;;;8971:9:0;-1:-1:-1;;;;;8957:40:0;;;:65;;;;;:::i;:::-;8937:3;;8904:130;;;;8549:492;;;;;;;:::o;63522:218::-;63604:31;63622:12;:10;:12::i;63604:31::-;63646:34;:15;63664:16;;63646:34;:::i;:::-;;63696:36;63715:16;;63696:36;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63696:36:0;;;;;;;;-1:-1:-1;63696:36:0;;-1:-1:-1;;;;63696:36:0;63522:218;;:::o;55917:1804::-;56087:10;;56126:13;;56116:23;;56108:66;;;;;-1:-1:-1;;;56108:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56187:14;56204:12;:10;:12::i;:::-;56187:29;;56235:27;56249:4;56255:6;56235:13;:27::i;:::-;56227:70;;;;;-1:-1:-1;;;56227:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;56310:22;56343:25;56384:9;56379:1088;56400:6;56395:1;:11;56379:1088;;56428:10;56441:3;56445:1;56441:6;;;;;;;;;;;;;;56428:19;;56462:13;56478:6;56485:1;56478:9;;;;;;;;;;;;;;56462:25;;56506:20;:2;:18;:20::i;:::-;56502:954;;;56547:30;56561:4;56567:2;56571:5;56547:13;:30::i;:::-;56502:954;;;56603:23;:2;:21;:23::i;:::-;56599:857;;;56647:31;56656:4;56662:2;56666:5;56673:4;56647:8;:31::i;:::-;56697:24;56724:29;:2;:27;:29::i;:::-;56697:56;-1:-1:-1;56776:19:0;56772:593;;56837:16;56820:33;;56896:1;56876:21;;56772:593;;;56970:14;56950:16;:34;56946:400;;57013:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;57013:31:0;;;;;;;;;:52;;;;;;;57092:25;;;:9;:25;;;;;;:46;;;;;;;;;-1:-1:-1;;57182:16:0;56946:400;;;57303:19;;;;;56946:400;56599:857;;-1:-1:-1;;56408:3:0;;56379:1088;;;-1:-1:-1;57483:19:0;;57479:165;;57519:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;57519:31:0;;;;;;;;;:52;;;;;;;57586:25;;;:9;:25;;;;;:46;;;;;;;57479:165;57697:1;-1:-1:-1;;;;;57661:52:0;57683:4;-1:-1:-1;;;;;57661:52:0;57675:6;-1:-1:-1;;;;;57661:52:0;;57701:3;57706:6;57661:52;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55917:1804;;;;;;;:::o;2894:96::-;2949:7;2976:6;-1:-1:-1;;;;;2976:6:0;2894:96;;:::o;64651:123::-;64705:31;64723:12;:10;:12::i;64705:31::-;64747:19;64758:7;64747:10;:19::i;:::-;64651:123;:::o;64895:190::-;64939:15;64957:12;:10;:12::i;:::-;64939:30;;64980:23;64995:7;64980:14;:23::i;:::-;-1:-1:-1;;;;;65014:17:0;;65034:5;65014:17;;;:8;:17;;;;;;:25;;-1:-1:-1;;65014:25:0;;;65055:22;;;65034:5;65055:22;64895:190;:::o;39476:306::-;39571:14;39588:12;:10;:12::i;:::-;39571:29;;39631:6;-1:-1:-1;;;;;39619:18:0;:8;-1:-1:-1;;;;;39619:18:0;;;39611:55;;;;;-1:-1:-1;;;39611:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;;;;39677:18:0;;;;;;;:10;:18;;;;;;;;:28;;;;;;;;;;;;;:39;;-1:-1:-1;;39677:39:0;;;;;;;;;;39732:42;;;;;;;;;;;;;;;;;39476:306;;;:::o;64282:40::-;;;;;;;;;;;;;;;:::o;40164:124::-;40236:4;40260:20;:2;:18;:20::i;41025:267::-;41098:7;41122:23;:2;:21;:23::i;:::-;41118:167;;;41210:1;41185:11;;;:7;:11;;;;;;-1:-1:-1;;;;;41169:43:0;;:51;;41219:1;41169:51;;;41215:1;41169:51;41162:58;;;;;;41118:167;-1:-1:-1;41260:13:0;;;;:9;:13;;;;;;41253:20;;9867:522;10041:31;10059:12;:10;:12::i;10041:31::-;10100:8;10134:26;;;:55;;;;-1:-1:-1;10164:25:0;;;10134:55;10126:94;;;;;-1:-1:-1;;;10126:94:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;10236:9;10231:151;10256:6;10251:1;:11;10231:151;;10303:9;;10313:1;10303:12;;;;;;;;;;;;;-1:-1:-1;;;;;10303:12:0;-1:-1:-1;;;;;10284:45:0;;10338:4;10345:8;;10354:1;10345:11;;;;;;;;;;;;;-1:-1:-1;;;;;10345:11:0;10358:8;;10367:1;10358:11;;;;;;;;;;;;;10284:86;;;;;;;;;;;;;-1:-1:-1;;;;;10284:86:0;;;;;;-1:-1:-1;;;;;10284:86:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;10264:3;;;;;10231:151;;40335:215;40412:7;40440:26;:5;:24;:26::i;:::-;40432:60;;;;;-1:-1:-1;;;40432:60:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;40510:32;:5;:30;:32::i;67475:149::-;67543:31;67561:12;:10;:12::i;67543:31::-;67585;67603:12;67585:17;:31::i;39820:166::-;-1:-1:-1;;;;;39946:22:0;;;39922:4;39946:22;;;:10;:22;;;;;;;;:32;;;;;;;;;;;;;;;39820:166::o;45436:811::-;45621:14;45638:12;:10;:12::i;:::-;45621:29;-1:-1:-1;;;;;;45669:16:0;;45661:56;;;;;-1:-1:-1;;;45661:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45736:27;45750:4;45756:6;45736:13;:27::i;:::-;45728:70;;;;;-1:-1:-1;;;45728:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;45815:20;:2;:18;:20::i;:::-;45811:261;;;45852:38;45870:4;45876:2;45880;45884:5;45852:17;:38::i;:::-;45811:261;;;45912:23;:2;:21;:23::i;:::-;45908:164;;;45952:40;45965:4;45971:2;45975;45979:5;45986;45952:12;:40::i;45908:164::-;46118:2;-1:-1:-1;;;;;46089:43:0;46112:4;-1:-1:-1;;;;;46089:43:0;46104:6;-1:-1:-1;;;;;46089:43:0;;46122:2;46126:5;46089:43;;;;;;;;;;;;;;;;;;;;;;;;46147:15;:2;-1:-1:-1;;;;;46147:13:0;;:15::i;:::-;46143:97;;;46179:49;46202:4;46208:2;46212;46216:5;46223:4;46179:22;:49::i;:::-;45436:811;;;;;;:::o;3237:201::-;3317:31;3335:12;:10;:12::i;3317:31::-;3359:6;:17;;;;-1:-1:-1;;;;;3359:17:0;;;;;;;;;3392:38;;3359:17;;3413:6;;;3392:38;;3359:6;3392:38;3237:201;:::o;17668:140::-;17731:4;17311:8;17755:12;;:17;;;;:45;;-1:-1:-1;;17522:20:0;17776:19;:24;;;17668:140::o;54889:215::-;54974:4;-1:-1:-1;;;;;;54998:58:0;;55013:43;54998:58;;:98;;;55060:36;55084:11;55060:23;:36::i;68604:185::-;68709:15;68744:37;:35;:37::i;:::-;68737:44;;68604:185;:::o;65093:128::-;-1:-1:-1;;;;;65167:17:0;;;;;;:8;:17;;;;;;;;65159:54;;;;;-1:-1:-1;;;65159:54:0;;;;;;;;;;;;;;;;;;;;;;;;;;;49359:1880;-1:-1:-1;;;;;49540:16:0;;49532:52;;;;;-1:-1:-1;;;49532:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49612:10;;49651:13;;49641:23;;49633:66;;;;;-1:-1:-1;;;49633:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;49712:22;49745:25;49786:9;49781:1082;49802:6;49797:1;:11;49781:1082;;49830:10;49843:3;49847:1;49843:6;;;;;;;;;;;;;;49830:19;;49864:13;49880:6;49887:1;49880:9;;;;;;;;;;;;;;49864:25;;49908:20;:2;:18;:20::i;:::-;49904:948;;;49949:28;49963:2;49967;49971:5;49949:13;:28::i;:::-;49904:948;;;50003:23;:2;:21;:23::i;:::-;49999:853;;;50047:29;50056:2;50060;50064:5;50071:4;50047:8;:29::i;:::-;50095:24;50122:29;:2;:27;:29::i;:::-;50095:56;-1:-1:-1;50174:19:0;50170:591;;50235:16;50218:33;;50294:1;50274:21;;50170:591;;;50368:14;50348:16;:34;50344:398;;50411:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;50411:29:0;;;;;;;;;:50;;;;;;50488:25;;;:9;:25;;;;;;:46;;;;;;;;-1:-1:-1;;50578:16:0;50344:398;;;50699:19;;;;;50344:398;49999:853;;-1:-1:-1;;49810:3:0;;49781:1082;;;-1:-1:-1;50879:19:0;;50875:163;;50915:25;;;;:9;:25;;;;;;;;-1:-1:-1;;;;;50915:29:0;;;;;;;;;:50;;;;;;50980:25;;;:9;:25;;;;;:46;;;;;;50875:163;-1:-1:-1;;;;;51055:56:0;;51091:1;51069:12;:10;:12::i;:::-;-1:-1:-1;;;;;51055:56:0;;51099:3;51104:6;51055:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51126:15;:2;-1:-1:-1;;;;;51126:13:0;;:15::i;:::-;51122:110;;;51158:62;51194:1;51198:2;51202:3;51207:6;51215:4;51158:27;:62::i;:::-;49359:1880;;;;;;;:::o;63748:161::-;63805:13;63862:15;63879:20;:2;:18;:20::i;:::-;63845:55;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63845:55:0;;;;;;;;;;;;;;;;;;;-1:-1:-1;;63845:55:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;63831:70;;63748:161;;;:::o;42783:160::-;42867:4;42900:6;-1:-1:-1;;;;;42892:14:0;:4;-1:-1:-1;;;;;42892:14:0;;42891:44;;;-1:-1:-1;;;;;;42911:16:0;;;;;;;:10;:16;;;;;;;;:24;;;;;;;;;;;;42891:44;42884:51;42783:160;-1:-1:-1;;;42783:160:0:o;17551:109::-;17311:8;17635:12;:17;;17551:109::o;57860:397::-;57986:10;57978:44;;;;;-1:-1:-1;;;57978:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58033:15;58051:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;58051:19:0;;;;;;;;;;58089:16;;;;58081:58;;;;;-1:-1:-1;;;58081:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58150:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;58150:19:0;;;;;;;;;;;58172:15;;;;58150:37;;;58227:13;;;:9;:13;;;;;:22;;;;;;;;57860:397::o;58265:618::-;58409:5;58418:1;58409:10;58401:49;;;;;-1:-1:-1;;;58401:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58493:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;58469:37:0;;;;;;58461:74;;;;;-1:-1:-1;;;58461:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;58546:11;;;;:7;:11;;;;;37259:66;58546:30;;58594:7;58589:287;;58618:20;58641:29;:2;:27;:29::i;:::-;58762:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;58762:29:0;;;;;;;;;58760:31;;-1:-1:-1;;58760:31:0;;;;;;58841:23;;;:9;:23;;;;;58839:25;;;;;;;-1:-1:-1;58265:618:0;;;;:::o;46762:1942::-;-1:-1:-1;;;;;46966:16:0;;46958:56;;;;;-1:-1:-1;;;46958:56:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47042:10;;47081:13;;47071:23;;47063:66;;;;;-1:-1:-1;;;47063:66:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47140:14;47157:12;:10;:12::i;:::-;47140:29;;47188:27;47202:4;47208:6;47188:13;:27::i;:::-;47180:70;;;;;-1:-1:-1;;;47180:70:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;47263:22;47296:25;47337:9;47332:1052;47353:6;47348:1;:11;47332:1052;;47381:10;47394:3;47398:1;47394:6;;;;;;;;;;;;;;47381:19;;47415:13;47431:6;47438:1;47431:9;;;;;;;;;;;;;;47415:25;;47459:20;:2;:18;:20::i;:::-;47455:918;;;47500:38;47518:4;47524:2;47528;47532:5;47500:17;:38::i;:::-;47455:918;;;47564:23;:2;:21;:23::i;:::-;47560:813;;;47608:39;47621:4;47627:2;47631;47635:5;47642:4;47608:12;:39::i;:::-;47666:24;47693:29;:2;:27;:29::i;:::-;47666:56;-1:-1:-1;47745:19:0;47741:541;;47806:16;47789:33;;47865:1;47845:21;;47741:541;;;47939:14;47919:16;:34;47915:348;;47982:73;48011:4;48017:2;48021:14;48037:17;47982:28;:73::i;:::-;48099:16;48082:33;;48162:1;48142:21;;47915:348;;;48220:19;;;;;47915:348;47560:813;;-1:-1:-1;;47361:3:0;;47332:1052;;;-1:-1:-1;48400:19:0;;48396:125;;48436:73;48465:4;48471:2;48475:14;48491:17;48436:28;:73::i;:::-;48566:2;-1:-1:-1;;;;;48538:44:0;48560:4;-1:-1:-1;;;;;48538:44:0;48552:6;-1:-1:-1;;;;;48538:44:0;;48570:3;48575:6;48538:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;48597:15;:2;-1:-1:-1;;;;;48597:13:0;;:15::i;:::-;48593:104;;;48629:56;48657:4;48663:2;48667:3;48672:6;48680:4;48629:27;:56::i;:::-;46762:1942;;;;;;;;;:::o;42137:214::-;42208:7;42237:33;:12;:31;:33::i;:::-;42236:34;42228:74;;;;;-1:-1:-1;;;42228:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;42320:23:0;;;;:9;:23;;;;;;-1:-1:-1;;;;;42320:23:0;;42137:214::o;48712:639::-;-1:-1:-1;;;;;48860:16:0;;48852:52;;;;;-1:-1:-1;;;48852:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;48921:20;:2;:18;:20::i;:::-;48917:241;;;48958:28;48972:2;48976;48980:5;48958:13;:28::i;:::-;48917:241;;;49008:23;:2;:21;:23::i;:::-;49004:154;;;49048:30;49057:2;49061;49065:5;49072;49048:8;:30::i;49004:154::-;-1:-1:-1;;;;;49175:55:0;;49212:1;49190:12;:10;:12::i;:::-;-1:-1:-1;;;;;49175:55:0;;49220:2;49224:5;49175:55;;;;;;;;;;;;;;;;;;;;;;;;49245:15;:2;-1:-1:-1;;;;;49245:13:0;;:15::i;:::-;49241:103;;;49277:55;49308:1;49312:2;49316;49320:5;49327:4;49277:22;:55::i;3569:138::-;3660:4;-1:-1:-1;;;;;3660:10:0;;:12;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;3660:12:0;-1:-1:-1;;;;;3649:23:0;;;;;;3641:58;;;;;-1:-1:-1;;;3641:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;5536:229;5698:58;;;-1:-1:-1;;;;;5698:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;5721:23;5698:58;;;5663:94;;5691:5;;5663:27;:94::i;:::-;5536:229;;;:::o;17816:134::-;-1:-1:-1;;;;;;17915:27:0;;17816:134::o;65229:125::-;-1:-1:-1;;;;;65286:17:0;;;;;;:8;:17;;;;;;:24;;-1:-1:-1;;65286:24:0;65306:4;65286:24;;;65326:20;;;65286:17;65326:20;65229:125;:::o;41751:378::-;41837:33;:12;:31;:33::i;:::-;41836:34;41828:74;;;;;-1:-1:-1;;;41828:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;41956:1;41921:23;;;:9;:23;;;;;;-1:-1:-1;;;;;41921:23:0;:37;41913:80;;;;;-1:-1:-1;;;41913:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;42030:12;:10;:12::i;:::-;42004:23;;;;:9;:23;;;;;:38;;;;-1:-1:-1;;;;;42004:38:0;;;;;;;;;;42090:30;42004:23;42090:28;:30::i;:::-;42058:63;;42076:12;42058:63;;;;;;;;;;41751:378;:::o;52588:501::-;52739:10;52731:44;;;;;-1:-1:-1;;;52731:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52786:15;52804:13;;;:9;:13;;;;;;;;-1:-1:-1;;;;;52804:19:0;;;;;;;;;;52842:16;;;;52834:58;;;;;-1:-1:-1;;;52834:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52915:2;-1:-1:-1;;;;;52907:10:0;:4;-1:-1:-1;;;;;52907:10:0;;52903:179;;52934:13;;;;:9;:13;;;;;;;;-1:-1:-1;;;;;52934:19:0;;;;;;;;;;;52956:15;;;;52934:37;;;53044:17;;;;;;;:26;;;;;;;52588:501::o;53097:679::-;53266:5;53275:1;53266:10;53258:49;;;;;-1:-1:-1;;;53258:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53350:11;;;;:7;:11;;;;;;-1:-1:-1;;;;;53326:37:0;;;;;;53318:74;;;;;-1:-1:-1;;;53318:74:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;53403:11;;;;:7;:11;;;;;-1:-1:-1;;;;;53417:20:0;;53403:34;;53453:7;53448:321;;53477:20;53500:29;:2;:27;:29::i;:::-;53618:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;53618:29:0;;;;;;;;;;;:34;;-1:-1:-1;;53618:34:0;;;53725:27;;;;;;-1:-1:-1;;;53725:27:0;;:32;;-1:-1:-1;53725:32:0;;;-1:-1:-1;53097:679:0:o;4723:387::-;5046:20;5094:8;;;4723:387::o;43426:325::-;43694:17;-1:-1:-1;;;;;43610:43:0;;36977:10;43654:12;:10;:12::i;:::-;43668:4;43674:2;43678:5;43685:4;43610:80;;;;;;;;;;;;;-1:-1:-1;;;;;43610:80:0;;;;;;-1:-1:-1;;;;;43610:80:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43610:80:0;-1:-1:-1;;;;;;43610:101:0;;43602:141;;;;;-1:-1:-1;;;43602:141:0;;;;;;;;;;;;;;;;;;;;;;;;;;;37989:451;38074:4;-1:-1:-1;;;;;;38111:40:0;;38126:25;38111:40;;:98;;-1:-1:-1;;;;;;;38168:41:0;;38183:26;38168:41;38111:98;:167;;;-1:-1:-1;;;;;;;38226:52:0;;38241:37;38226:52;38111:167;:243;;;-1:-1:-1;;;;;;;38295:59:0;;38310:44;38295:59;38111:243;:321;;;-1:-1:-1;;;;;;;;38371:61:0;38386:46;38371:61;;37989:451::o;12669:922::-;12722:15;12778:10;12722:15;12824:27;:25;:27::i;:::-;12799:52;;12887:18;-1:-1:-1;;;;;12866:40:0;:9;-1:-1:-1;;;;;12866:40:0;;:76;;;;12923:19;-1:-1:-1;;;;;12910:32:0;:9;-1:-1:-1;;;;;12910:32:0;;12866:76;12862:169;;;13013:6;-1:-1:-1;13006:13:0;;-1:-1:-1;13006:13:0;12862:169;-1:-1:-1;;;;;13435:22:0;;13448:9;13435:22;;;;:78;;;13461:18;-1:-1:-1;;;;;13461:33:0;;13495:6;13503:9;13461:52;;;;;;;;;;;;;-1:-1:-1;;;;;13461:52:0;;;;;;-1:-1:-1;;;;;13461:52:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;13461:52:0;13435:78;13431:124;;;13537:6;-1:-1:-1;13530:13:0;;-1:-1:-1;13530:13:0;13431:124;-1:-1:-1;13574:9:0;-1:-1:-1;12669:922:0;:::o;51378:488::-;51502:10;51494:44;;;;;-1:-1:-1;;;51494:44:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51549:14;51566:13;;;:9;:13;;;;;;51610:14;;;51643:18;;;51635:57;;;;;-1:-1:-1;;;51635:57:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;51703:13;;;;:9;:13;;;;;;;;:25;;;;51832:9;:13;;;;;-1:-1:-1;;;;;51832:17:0;;;;;;;;;-1:-1:-1;51832:17:0;;;:26;;;;;;;51378:488::o;51874:706::-;52016:5;52025:1;52016:10;52008:49;;;;;-1:-1:-1;;;52008:49:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52076:11;;;;:7;:11;;;;;;:16;52068:58;;;;;-1:-1:-1;;;52068:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;52139:11;;;;:7;:11;;;;;-1:-1:-1;;;;;52153:20:0;;52139:34;;52191:7;52186:387;;52215:20;52238:29;:2;:27;:29::i;:::-;52436:23;;;;:9;:23;;;;;;;;52434:25;;;;;;;;;52534:9;:23;;;;;-1:-1:-1;;;;;52534:27:0;;;;;;;;;;52532:29;;;;;;;-1:-1:-1;51874:706:0;;;;:::o;44247:400::-;44561:23;-1:-1:-1;;;;;44470:48:0;;37142:10;44519:12;:10;:12::i;:::-;44533:4;44539:3;44544:6;44552:4;44470:87;;;;;;;;;;;;;-1:-1:-1;;;;;44470:87:0;;;;;;-1:-1:-1;;;;;44470:87:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62601:564;62664:13;62694:10;62690:53;;-1:-1:-1;62721:10:0;;;;;;;;;;;;;;;;;;;62690:53;62768:5;62753:12;62809:78;62816:9;;62809:78;;62842:8;;62873:2;62865:10;;;;62809:78;;;62897:19;62929:6;62919:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;62919:17:0;-1:-1:-1;62991:5:0;;-1:-1:-1;62897:39:0;-1:-1:-1;;;62963:10:0;;63007:119;63014:9;;63007:119;;63084:2;63077:4;:9;63071:2;:16;63058:31;;63040:6;63047:7;;;;;;;63040:15;;;;;;;;;;;:49;;;;;;;;;;-1:-1:-1;63112:2:0;63104:10;;;;63007:119;;;-1:-1:-1;63150:6:0;62601:564;-1:-1:-1;;;;62601:564:0:o;53784:446::-;53969:2;-1:-1:-1;;;;;53961:10:0;:4;-1:-1:-1;;;;;53961:10:0;;53957:266;;54062:23;;;;:9;:23;;;;;;;;-1:-1:-1;;;;;54062:29:0;;;;;;;;;;;:39;;;;;;;54174:27;;;;;;;:37;;;;;;;53784:446::o;6292:892::-;6418:5;6443:19;-1:-1:-1;;;;;6443:17:0;;;:19::i;:::-;6435:58;;;;;-1:-1:-1;;;6435:58:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6567:12;6581:17;6602:6;-1:-1:-1;;;;;6602:11:0;6614:8;6602:21;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;;6602:21:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;6566:57;;;;6638:7;6634:543;;;6666:11;;:16;6662:124;;6722:4;6711:24;;;;;;;;;;;;;;;-1:-1:-1;6711:24:0;6703:67;;;;;-1:-1:-1;;;6703:67:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;6634:543;;;6877:11;;6873:97;;6914:40;;;-1:-1:-1;;;6914:40:0;;;;;;;;;;;;;;;;;;;;;;;;;;;6873:97;7101:4;7095:11;7146:4;7139;7135:2;7131:13;7124:27;10782:526;11265:23;11269:14;11265:23;11252:37;11248:2;11244:46;;11219:82::o;-1:-1:-1:-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;

Swarm Source

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