ETH Price: $2,550.64 (-1.94%)

Token

TXN (TXN)
 

Overview

Max Total Supply

23 TXN

Holders

23

Total Transfers

-

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
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:
TXNBOT

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-06-01
*/

// SPDX-License-Identifier: MIT
// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.6.0) (utils/cryptography/MerkleProof.sol)

pragma solidity ^0.8.0;

/**
 * @dev These functions deal with verification of Merkle Trees proofs.
 *
 * The proofs can be generated using the JavaScript library
 * https://github.com/miguelmota/merkletreejs[merkletreejs].
 * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.
 *
 * See `test/utils/cryptography/MerkleProof.test.js` for some examples.
 *
 * WARNING: You should avoid using leaf values that are 64 bytes long prior to
 * hashing, or use a hash function other than keccak256 for hashing leaves.
 * This is because the concatenation of a sorted pair of internal nodes in
 * the merkle tree could be reinterpreted as a leaf value.
 */
library MerkleProof {
    /**
     * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, a `proof` must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Each
     * pair of leaves and each pair of pre-images are assumed to be sorted.
     */
    function verify(
        bytes32[] memory proof,
        bytes32 root,
        bytes32 leaf
    ) internal pure returns (bool) {
        return processProof(proof, leaf) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt
     * hash matches the root of the tree. When processing the proof, the pairs
     * of leafs & pre-images are assumed to be sorted.
     *
     * _Available since v4.4._
     */
    function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {
        bytes32 computedHash = leaf;
        for (uint256 i = 0; i < proof.length; i++) {
            computedHash = _hashPair(computedHash, proof[i]);
        }
        return computedHash;
    }

    /**
     * @dev Returns true if a `leafs` can be proved to be a part of a Merkle tree
     * defined by `root`. For this, `proofs` for each leaf must be provided, containing
     * sibling hashes on the branch from the leaf to the root of the tree. Then
     * 'proofFlag' designates the nodes needed for the multi proof.
     *
     * _Available since v4.7._
     */
    function multiProofVerify(
        bytes32 root,
        bytes32[] memory leafs,
        bytes32[] memory proofs,
        bool[] memory proofFlag
    ) internal pure returns (bool) {
        return processMultiProof(leafs, proofs, proofFlag) == root;
    }

    /**
     * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up
     * from `leaf` using the multi proof as `proofFlag`. A multi proof is
     * valid if the final hash matches the root of the tree.
     *
     * _Available since v4.7._
     */
    function processMultiProof(
        bytes32[] memory leafs,
        bytes32[] memory proofs,
        bool[] memory proofFlag
    ) internal pure returns (bytes32 merkleRoot) {
        // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by
        // consuming and producing values on a queue. The queue starts with the `leafs` array, then goes onto the
        // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of
        // the merkle tree.
        uint256 leafsLen = leafs.length;
        uint256 proofsLen = proofs.length;
        uint256 totalHashes = proofFlag.length;

        // Check proof validity.
        require(leafsLen + proofsLen - 1 == totalHashes, "MerkleProof: invalid multiproof");

        // The xxxPos values are "pointers" to the next value to consume in each array. All accesses are done using
        // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's "pop".
        bytes32[] memory hashes = new bytes32[](totalHashes);
        uint256 leafPos = 0;
        uint256 hashPos = 0;
        uint256 proofPos = 0;
        // At each step, we compute the next hash using two values:
        // - a value from the "main queue". If not all leaves have been consumed, we get the next leaf, otherwise we
        //   get the next hash.
        // - depending on the flag, either another value for the "main queue" (merging branches) or an element from the
        //   `proofs` array.
        for (uint256 i = 0; i < totalHashes; i++) {
            bytes32 a = leafPos < leafsLen ? leafs[leafPos++] : hashes[hashPos++];
            bytes32 b = proofFlag[i] ? leafPos < leafsLen ? leafs[leafPos++] : hashes[hashPos++] : proofs[proofPos++];
            hashes[i] = _hashPair(a, b);
        }

        return hashes[totalHashes - 1];
    }

    function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {
        return a < b ? _efficientHash(a, b) : _efficientHash(b, a);
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        /// @solidity memory-safe-assembly
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Counters.sol


// OpenZeppelin Contracts v4.4.1 (utils/Counters.sol)

pragma solidity ^0.8.0;

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Context.sol


// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)

pragma solidity ^0.8.0;

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/access/Ownable.sol


// OpenZeppelin Contracts v4.4.1 (access/Ownable.sol)

pragma solidity ^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 Context {
    address private _owner;

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/Address.sol


// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)

pragma solidity ^0.8.1;

/**
 * @dev Collection of functions related to the address type
 */
library Address {
    /**
     * @dev Returns true if `account` is a contract.
     *
     * [IMPORTANT]
     * ====
     * It is unsafe to assume that an address for which this function returns
     * false is an externally-owned account (EOA) and not a contract.
     *
     * Among others, `isContract` will return false for the following
     * types of addresses:
     *
     *  - an externally-owned account
     *  - a contract in construction
     *  - an address where a contract will be created
     *  - an address where a contract lived, but was destroyed
     * ====
     *
     * [IMPORTANT]
     * ====
     * You shouldn't rely on `isContract` to protect against flash loan attacks!
     *
     * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets
     * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract
     * constructor.
     * ====
     */
    function isContract(address account) internal view returns (bool) {
        // This method relies on extcodesize/address.code.length, which returns 0
        // for contracts in construction, since the code is only stored at the end
        // of the constructor execution.

        return account.code.length > 0;
    }

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

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

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

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

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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/IERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)

pragma solidity ^0.8.0;

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/utils/introspection/ERC165.sol


// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;


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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155Receiver.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)

pragma solidity ^0.8.0;


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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/IERC1155.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/IERC1155.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/extensions/IERC1155MetadataURI.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)

pragma solidity ^0.8.0;


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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/ERC1155.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/ERC1155.sol)

pragma solidity ^0.8.0;







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

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

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

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

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

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

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

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

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

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

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

        return batchBalances;
    }

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

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

        address operator = _msgSender();

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

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

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

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

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

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

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

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

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

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

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

        return array;
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/extensions/ERC1155Burnable.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/ERC1155Burnable.sol)

pragma solidity ^0.8.0;


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

        _burn(account, id, value);
    }

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

        _burnBatch(account, ids, values);
    }
}

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/blob/master/contracts/token/ERC1155/extensions/ERC1155Supply.sol


// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC1155/extensions/ERC1155Supply.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

        if (to == address(0)) {
            for (uint256 i = 0; i < ids.length; ++i) {
                uint256 id = ids[i];
                uint256 amount = amounts[i];
                uint256 supply = _totalSupply[id];
                require(supply >= amount, "ERC1155: burn amount exceeds totalSupply");
                unchecked {
                    _totalSupply[id] = supply - amount;
                }
            }
        }
    }
}

// File: contracts/TXN.sol


pragma solidity ^0.8.5;



contract TXNBOT is ERC1155, ERC1155Supply, ERC1155Burnable, Ownable {

    string public name = "TXN";
    string public symbol = "TXN";

    uint256 public constant NOVA = 1;
    uint256 public constant SUPERNOVA = 2;

    using Counters for Counters.Counter;
    mapping(uint256 => string) private _tokenIdToUri;
    mapping(uint256 => Counters.Counter) private _tokenIdToCounter;
    mapping(uint256 => bool) public tokenIdToPrivateSaleOpen;
    mapping(uint256 => bool) public tokenIdToPublicSaleOpen;
    mapping(uint256 => uint) private _tokenIdToTokenLimit;
    mapping(uint256 => uint) private _tokenIdToMintPrice;
    mapping(uint256 => bytes32) private _tokenIdToMerkleRoot;
    mapping(uint256 => bool) private _tokenIdToCuratorAwardClaimed;
    bool burnMintEnabled;
    address payable internal curatorTeamAddress;
    address payable internal payoutTeamAddress;

    mapping(address => User) addressToUser;
    struct User {
        bool hasWhitelistMinted;
        mapping(uint => bool) tokenIdToWhitelistMinted;
        mapping(uint => bool) tokenIdToPublicMinted;
    }

    constructor(address curatorsAddress) ERC1155("") {
        curatorTeamAddress = payable(curatorsAddress);
    }

    /// The token id does not exist.
    error TokenIdDoesNotExist();
    /// This function has not been enabled yet.
    error FunctionNotEnabled();
    /// This token id cannot be used for this function.
    error TokenIdNotAllowed();
    /// Max tokens have been minted.
    error MaxTokensMinted();
    /// You are not on the whitelist
    error NotOnWhitelist();
    /// You have minted your allowance
    error MintedAllowance();
    /// msg.value too low
    error MintPayableTooLow();
    /// You dont own enough tokens for a burn mint.
    error NotEnoughOwnedTokens();
    /// Curator team award limit reached.
    error CuratorTeamAwardLimit();

    modifier isValidTokenId(uint256 tokenId) {
        if (tokenId != NOVA && tokenId != SUPERNOVA)
            revert TokenIdDoesNotExist(); // dev: tokenId unknown
        _;
    }

    modifier isBelowMaxSupply(uint256 tokenId) {
        uint256 tokenCount = _tokenIdToCounter[tokenId].current();
        if (tokenCount >= _tokenIdToTokenLimit[tokenId])
            revert MaxTokensMinted(); // dev: max token supply minted
        _;
    }

    modifier isNotBelowMintPrice(uint256 tokenId) {
        if (msg.value < _tokenIdToMintPrice[tokenId])
            revert MintPayableTooLow(); // dev: msg.value too low
        _;
    }


    function privateMint(uint256 tokenId, bytes32[] calldata _merkleProof) external
    isValidTokenId(tokenId)
    isBelowMaxSupply(tokenId)
    isNotBelowMintPrice(tokenId)
    payable {
        if (tokenIdToPrivateSaleOpen[tokenId] == false)
            revert FunctionNotEnabled(); // dev: sale is not open currently

        User storage user = addressToUser[msg.sender];
        if (user.hasWhitelistMinted == true)
            revert MintedAllowance(); // dev: whitelist allowance minted

        bytes32 leaf = keccak256(abi.encodePacked(msg.sender));
        if (MerkleProof.verify(_merkleProof, _tokenIdToMerkleRoot[tokenId], leaf) == false)
            revert NotOnWhitelist(); // dev: not on the whitelist

        user.hasWhitelistMinted = true;
        _tokenIdToCounter[tokenId].increment();
        _mint(msg.sender, tokenId, 1, "");
    }

    function publicMint(uint256 tokenId) external
    isValidTokenId(tokenId)
    isBelowMaxSupply(tokenId)
    isNotBelowMintPrice(tokenId)
    payable {
        if (tokenIdToPublicSaleOpen[tokenId] == false)
            revert FunctionNotEnabled(); // dev: public sale is not open
        
        User storage user = addressToUser[msg.sender];

        if (user.tokenIdToPublicMinted[tokenId] == true)
            revert MintedAllowance(); // dev: public allowance minted

        user.tokenIdToPublicMinted[tokenId] = true;
        _tokenIdToCounter[tokenId].increment();
        _mint(msg.sender, tokenId, 1, "");
    }

    function burnMint() external
        isBelowMaxSupply(NOVA)
    {
        if (burnMintEnabled == false)
            revert FunctionNotEnabled(); // dev: burn mint not enabled

        if (balanceOf(msg.sender, SUPERNOVA) < 4)
            revert NotEnoughOwnedTokens(); // dev: not enough tokens
        burn(msg.sender, SUPERNOVA, 4);
        _mint(msg.sender, NOVA, 1, "");
    }

    function curatorAward(uint256 tokenId, uint256 quantity) external
    isValidTokenId(tokenId)
    isBelowMaxSupply(tokenId)
    onlyOwner {
        if (_tokenIdToCuratorAwardClaimed[tokenId])
            revert CuratorTeamAwardLimit(); // dev: cannot claim curator award again
        _tokenIdToCuratorAwardClaimed[tokenId] = true;
        _mint(curatorTeamAddress, tokenId, quantity, "");
        _tokenIdToCounter[tokenId].increment();
    }

    function withdrawFunds() external virtual onlyOwner {
        curatorTeamAddress.transfer(address(this).balance);
    }

    /**
    * Settings
    */

    function togglePrivateSaleOpen(uint256 tokenId) external virtual onlyOwner {
        tokenIdToPrivateSaleOpen[tokenId] = !tokenIdToPrivateSaleOpen[tokenId];
    }

    function togglePublicSaleOpen(uint256 tokenId) external virtual onlyOwner {
        tokenIdToPublicSaleOpen[tokenId] = !tokenIdToPublicSaleOpen[tokenId];
    }

    function toggleBurnMint() external virtual onlyOwner {
        burnMintEnabled = !burnMintEnabled;
    }

    function setMaxTokenSupply(uint256 tokenId, uint256 maxSupply) external onlyOwner isValidTokenId(tokenId) {
        _tokenIdToTokenLimit[tokenId] = maxSupply;
    }

    function setTokenIdToMintPrice(uint256 tokenId, uint256 mintPrice) public onlyOwner isValidTokenId(tokenId) {
        _tokenIdToMintPrice[tokenId] = mintPrice;
    }

    function setTokenIdToMerkleRoot(uint256 tokenId, bytes32 merkleRoot) external onlyOwner isValidTokenId(tokenId) {
        _tokenIdToMerkleRoot[tokenId] = merkleRoot;
    }

    function setTokenIdToUri(uint256 tokenId, string memory uri) external onlyOwner {
        _tokenIdToUri[tokenId] = uri;
    }

    /**
    * views
    */

    function getTokenIdToRemainingMints(uint256 tokenId) external view returns (uint256) {
        return _tokenIdToTokenLimit[tokenId] - _tokenIdToCounter[tokenId].current();
    }

    function getTokenIdToMaxSupply(uint256 tokenId) external view returns (uint256) {
        return _tokenIdToTokenLimit[tokenId];
    }


    /**
    * @dev override default uri method to return separate uri for each token id
    */
    function uri(uint256 tokenId) override public view returns (string memory) {
        return (_tokenIdToUri[tokenId]);
    }

    // The following functions are overrides required by Solidity.
    function _beforeTokenTransfer(address operator, address from, address to, uint256[] memory ids, uint256[] memory amounts, bytes memory data)
    internal
    override(ERC1155, ERC1155Supply)
    {
        super._beforeTokenTransfer(operator, from, to, ids, amounts, data);
    }

}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"address","name":"curatorsAddress","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"CuratorTeamAwardLimit","type":"error"},{"inputs":[],"name":"FunctionNotEnabled","type":"error"},{"inputs":[],"name":"MaxTokensMinted","type":"error"},{"inputs":[],"name":"MintPayableTooLow","type":"error"},{"inputs":[],"name":"MintedAllowance","type":"error"},{"inputs":[],"name":"NotEnoughOwnedTokens","type":"error"},{"inputs":[],"name":"NotOnWhitelist","type":"error"},{"inputs":[],"name":"TokenIdDoesNotExist","type":"error"},{"inputs":[],"name":"TokenIdNotAllowed","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":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":[],"name":"NOVA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SUPERNOVA","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"accounts","type":"address[]"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"value","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"values","type":"uint256[]"}],"name":"burnBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"curatorAward","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"exists","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenIdToMaxSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getTokenIdToRemainingMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"account","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32[]","name":"_merkleProof","type":"bytes32[]"}],"name":"privateMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"publicMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"ids","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"maxSupply","type":"uint256"}],"name":"setMaxTokenSupply","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes32","name":"merkleRoot","type":"bytes32"}],"name":"setTokenIdToMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"mintPrice","type":"uint256"}],"name":"setTokenIdToMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"uri","type":"string"}],"name":"setTokenIdToUri","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"toggleBurnMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"togglePrivateSaleOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"togglePublicSaleOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToPrivateSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenIdToPublicSaleOpen","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":"tokenId","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdrawFunds","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040526040518060400160405280600381526020017f54584e0000000000000000000000000000000000000000000000000000000000815250600590805190602001906200005192919062000247565b506040518060400160405280600381526020017f54584e0000000000000000000000000000000000000000000000000000000000815250600690805190602001906200009f92919062000247565b50348015620000ad57600080fd5b506040516200564b3803806200564b8339818101604052810190620000d391906200030e565b60405180602001604052806000815250620000f4816200015d60201b60201c565b5062000115620001096200017960201b60201c565b6200018160201b60201c565b80600f60016101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050620003f8565b80600290805190602001906200017592919062000247565b5050565b600033905090565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b828054620002559062000374565b90600052602060002090601f016020900481019282620002795760008555620002c5565b82601f106200029457805160ff1916838001178555620002c5565b82800160010185558215620002c5579182015b82811115620002c4578251825591602001919060010190620002a7565b5b509050620002d49190620002d8565b5090565b5b80821115620002f3576000816000905550600101620002d9565b5090565b6000815190506200030881620003de565b92915050565b600060208284031215620003275762000326620003d9565b5b60006200033784828501620002f7565b91505092915050565b60006200034d8262000354565b9050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600060028204905060018216806200038d57607f821691505b60208210811415620003a457620003a3620003aa565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b620003e98162000340565b8114620003f557600080fd5b50565b61524380620004086000396000f3fe6080604052600436106102035760003560e01c80636c3a2b5f11610118578063ba45bcb3116100a0578063dca363f01161006f578063dca363f014610746578063e985e9c51461076f578063f242432a146107ac578063f2fde38b146107d5578063f5298aca146107fe57610203565b8063ba45bcb314610678578063bd85b039146106b5578063c6b97f2e146106f2578063c6fe62b01461072f57610203565b80638f38fbab116100e75780638f38fbab146105a257806393cde101146105cb57806395d89b4114610608578063a22cb46514610633578063b977fe551461065c57610203565b80636c3a2b5f146104f8578063715018a6146105235780638385c2aa1461053a5780638da5cb5b1461057757610203565b806324600fc31161019b578063464e03451161016a578063464e0345146104035780634e1273f41461042c5780634f558e79146104695780636455e188146104a65780636b20c454146104cf57610203565b806324600fc31461037e5780632db11544146103955780632eb2c2d6146103b15780633881f08f146103da57610203565b806306fdde03116101d757806306fdde03146102c45780630e89341c146102ef57806314a8c3171461032c5780631f9159c81461035557610203565b8062fdd58e1461020857806301ffc9a714610245578063057732461461028257806305ce13eb146102ad575b600080fd5b34801561021457600080fd5b5061022f600480360381019061022a9190613e30565b610827565b60405161023c91906147b4565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190613f3b565b6108f0565b6040516102799190614597565b60405180910390f35b34801561028e57600080fd5b506102976109d2565b6040516102a491906147b4565b60405180910390f35b3480156102b957600080fd5b506102c26109d7565b005b3480156102d057600080fd5b506102d9610a7f565b6040516102e691906145b2565b60405180910390f35b3480156102fb57600080fd5b5061031660048036038101906103119190613f95565b610b0d565b60405161032391906145b2565b60405180910390f35b34801561033857600080fd5b50610353600480360381019061034e91906140be565b610bb2565b005b34801561036157600080fd5b5061037c60048036038101906103779190613f95565b610c95565b005b34801561038a57600080fd5b50610393610d60565b005b6103af60048036038101906103aa9190613f95565b610e47565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190613bff565b6110bb565b005b3480156103e657600080fd5b5061040160048036038101906103fc91906140be565b61115c565b005b34801561040f57600080fd5b5061042a60048036038101906104259190613f95565b61123f565b005b34801561043857600080fd5b50610453600480360381019061044e9190613ec3565b61130a565b604051610460919061453e565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190613f95565b611423565b60405161049d9190614597565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c89190614022565b611437565b005b3480156104db57600080fd5b506104f660048036038101906104f19190613d65565b61151a565b005b34801561050457600080fd5b5061050d6115b7565b60405161051a91906147b4565b60405180910390f35b34801561052f57600080fd5b506105386115bc565b005b34801561054657600080fd5b50610561600480360381019061055c9190613f95565b611644565b60405161056e91906147b4565b60405180910390f35b34801561058357600080fd5b5061058c611686565b6040516105999190614461565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c49190614062565b6116b0565b005b3480156105d757600080fd5b506105f260048036038101906105ed9190613f95565b611758565b6040516105ff9190614597565b60405180910390f35b34801561061457600080fd5b5061061d611778565b60405161062a91906145b2565b60405180910390f35b34801561063f57600080fd5b5061065a60048036038101906106559190613df0565b611806565b005b61067660048036038101906106719190613fc2565b61181c565b005b34801561068457600080fd5b5061069f600480360381019061069a9190613f95565b611b39565b6040516106ac9190614597565b60405180910390f35b3480156106c157600080fd5b506106dc60048036038101906106d79190613f95565b611b59565b6040516106e991906147b4565b60405180910390f35b3480156106fe57600080fd5b5061071960048036038101906107149190613f95565b611b76565b60405161072691906147b4565b60405180910390f35b34801561073b57600080fd5b50610744611b93565b005b34801561075257600080fd5b5061076d600480360381019061076891906140be565b611cc0565b005b34801561077b57600080fd5b5061079660048036038101906107919190613bbf565b611ed5565b6040516107a39190614597565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce9190613cce565b611f69565b005b3480156107e157600080fd5b506107fc60048036038101906107f79190613b92565b61200a565b005b34801561080a57600080fd5b5061082560048036038101906108209190613e70565b612102565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088f90614674565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109bb57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109cb57506109ca8261219f565b5b9050919050565b600181565b6109df612209565b73ffffffffffffffffffffffffffffffffffffffff166109fd611686565b73ffffffffffffffffffffffffffffffffffffffff1614610a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a906146f4565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b60058054610a8c90614a92565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab890614a92565b8015610b055780601f10610ada57610100808354040283529160200191610b05565b820191906000526020600020905b815481529060010190602001808311610ae857829003601f168201915b505050505081565b6060600760008381526020019081526020016000208054610b2d90614a92565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5990614a92565b8015610ba65780601f10610b7b57610100808354040283529160200191610ba6565b820191906000526020600020905b815481529060010190602001808311610b8957829003601f168201915b50505050509050919050565b610bba612209565b73ffffffffffffffffffffffffffffffffffffffff16610bd8611686565b73ffffffffffffffffffffffffffffffffffffffff1614610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c25906146f4565b60405180910390fd5b8160018114158015610c41575060028114155b15610c78576040517f2dac9bb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600c600085815260200190815260200160002081905550505050565b610c9d612209565b73ffffffffffffffffffffffffffffffffffffffff16610cbb611686565b73ffffffffffffffffffffffffffffffffffffffff1614610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d08906146f4565b60405180910390fd5b6009600082815260200190815260200160002060009054906101000a900460ff16156009600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610d68612209565b73ffffffffffffffffffffffffffffffffffffffff16610d86611686565b73ffffffffffffffffffffffffffffffffffffffff1614610ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd3906146f4565b60405180910390fd5b600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e44573d6000803e3d6000fd5b50565b8060018114158015610e5a575060028114155b15610e91576040517f2dac9bb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000610eaf60086000848152602001908152602001600020612211565b9050600b6000838152602001908152602001600020548110610efd576040517fadb00a1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600c600082815260200190815260200160002054341015610f4b576040517fa7924a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600a600087815260200190815260200160002060009054906101000a900460ff1615151415610faa576040517f7d20a0ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506001151581600201600088815260200190815260200160002060009054906101000a900460ff161515141561104e576040517f17f0618d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181600201600088815260200190815260200160002060006101000a81548160ff0219169083151502179055506110976008600088815260200190815260200160002061221f565b6110b33387600160405180602001604052806000815250612235565b505050505050565b6110c3612209565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611109575061110885611103612209565b611ed5565b5b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f906145f4565b60405180910390fd5b61115585858585856123e6565b5050505050565b611164612209565b73ffffffffffffffffffffffffffffffffffffffff16611182611686565b73ffffffffffffffffffffffffffffffffffffffff16146111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf906146f4565b60405180910390fd5b81600181141580156111eb575060028114155b15611222576040517f2dac9bb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600b600085815260200190815260200160002081905550505050565b611247612209565b73ffffffffffffffffffffffffffffffffffffffff16611265611686565b73ffffffffffffffffffffffffffffffffffffffff16146112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b2906146f4565b60405180910390fd5b600a600082815260200190815260200160002060009054906101000a900460ff1615600a600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60608151835114611350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134790614754565b60405180910390fd5b6000835167ffffffffffffffff81111561136d5761136c614bef565b5b60405190808252806020026020018201604052801561139b5781602001602082028036833780820191505090505b50905060005b8451811015611418576113e88582815181106113c0576113bf614bc0565b5b60200260200101518583815181106113db576113da614bc0565b5b6020026020010151610827565b8282815181106113fb576113fa614bc0565b5b6020026020010181815250508061141190614af5565b90506113a1565b508091505092915050565b60008061142f83611b59565b119050919050565b61143f612209565b73ffffffffffffffffffffffffffffffffffffffff1661145d611686565b73ffffffffffffffffffffffffffffffffffffffff16146114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa906146f4565b60405180910390fd5b81600181141580156114c6575060028114155b156114fd576040517f2dac9bb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600d600085815260200190815260200160002081905550505050565b611522612209565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611568575061156783611562612209565b611ed5565b5b6115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e906145f4565b60405180910390fd5b6115b2838383612708565b505050565b600281565b6115c4612209565b73ffffffffffffffffffffffffffffffffffffffff166115e2611686565b73ffffffffffffffffffffffffffffffffffffffff1614611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f906146f4565b60405180910390fd5b61164260006129d7565b565b600061166160086000848152602001908152602001600020612211565b600b60008481526020019081526020016000205461167f919061499e565b9050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116b8612209565b73ffffffffffffffffffffffffffffffffffffffff166116d6611686565b73ffffffffffffffffffffffffffffffffffffffff161461172c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611723906146f4565b60405180910390fd5b806007600084815260200190815260200160002090805190602001906117539291906137ff565b505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b6006805461178590614a92565b80601f01602080910402602001604051908101604052809291908181526020018280546117b190614a92565b80156117fe5780601f106117d3576101008083540402835291602001916117fe565b820191906000526020600020905b8154815290600101906020018083116117e157829003601f168201915b505050505081565b611818611811612209565b8383612a9d565b5050565b826001811415801561182f575060028114155b15611866576040517f2dac9bb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600061188460086000848152602001908152602001600020612211565b9050600b60008381526020019081526020016000205481106118d2576040517fadb00a1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85600c600082815260200190815260200160002054341015611920576040517fa7924a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600015156009600089815260200190815260200160002060009054906101000a900460ff161515141561197f576040517f7d20a0ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600115158160000160009054906101000a900460ff1615151415611a12576040517f17f0618d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600033604051602001611a259190614446565b60405160208183030381529060405280519060200120905060001515611aa0898980806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d60008d81526020019081526020016000205484612c0a565b15151415611ada576040517f522fc3bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018260000160006101000a81548160ff021916908315150217905550611b12600860008b815260200190815260200160002061221f565b611b2e338a600160405180602001604052806000815250612235565b505050505050505050565b60096020528060005260406000206000915054906101000a900460ff1681565b600060036000838152602001908152602001600020549050919050565b6000600b6000838152602001908152602001600020549050919050565b60016000611bb260086000848152602001908152602001600020612211565b9050600b6000838152602001908152602001600020548110611c00576040517fadb00a1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600f60009054906101000a900460ff1615151415611c4e576040517f7d20a0ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004611c5b336002610827565b1015611c93576040517faca079a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ca03360026004612102565b611cbc3360018060405180602001604052806000815250612235565b5050565b8160018114158015611cd3575060028114155b15611d0a576040517f2dac9bb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826000611d2860086000848152602001908152602001600020612211565b9050600b6000838152602001908152602001600020548110611d76576040517fadb00a1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d7e612209565b73ffffffffffffffffffffffffffffffffffffffff16611d9c611686565b73ffffffffffffffffffffffffffffffffffffffff1614611df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de9906146f4565b60405180910390fd5b600e600086815260200190815260200160002060009054906101000a900460ff1615611e4a576040517f4541439b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600e600087815260200190815260200160002060006101000a81548160ff021916908315150217905550611eb3600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868660405180602001604052806000815250612235565b611ece6008600087815260200190815260200160002061221f565b5050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f71612209565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611fb75750611fb685611fb1612209565b611ed5565b5b611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed906145f4565b60405180910390fd5b6120038585858585612c21565b5050505050565b612012612209565b73ffffffffffffffffffffffffffffffffffffffff16612030611686565b73ffffffffffffffffffffffffffffffffffffffff1614612086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207d906146f4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ed90614634565b60405180910390fd5b6120ff816129d7565b50565b61210a612209565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612150575061214f8361214a612209565b611ed5565b5b61218f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612186906145f4565b60405180910390fd5b61219a838383612ebd565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081600001549050919050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229c90614794565b60405180910390fd5b60006122af612209565b905060006122bc85613104565b905060006122c985613104565b90506122da8360008985858961317e565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123399190614948565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516123b79291906147cf565b60405180910390a46123ce83600089858589613194565b6123dd8360008989898961319c565b50505050505050565b815183511461242a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242190614774565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561249a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249190614694565b60405180910390fd5b60006124a4612209565b90506124b481878787878761317e565b60005b84518110156126655760008582815181106124d5576124d4614bc0565b5b6020026020010151905060008583815181106124f4576124f3614bc0565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258c906146d4565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461264a9190614948565b925050819055505050508061265e90614af5565b90506124b7565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126dc929190614560565b60405180910390a46126f2818787878787613194565b612700818787878787613383565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276f906146b4565b60405180910390fd5b80518251146127bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b390614774565b60405180910390fd5b60006127c6612209565b90506127e68185600086866040518060200160405280600081525061317e565b60005b835181101561293357600084828151811061280757612806614bc0565b5b60200260200101519050600084838151811061282657612825614bc0565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156128c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128be90614654565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050808061292b90614af5565b9150506127e9565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516129ab929190614560565b60405180910390a46129d181856000868660405180602001604052806000815250613194565b50505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0390614734565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612bfd9190614597565b60405180910390a3505050565b600082612c17858461356a565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8890614694565b60405180910390fd5b6000612c9b612209565b90506000612ca885613104565b90506000612cb585613104565b9050612cc583898985858961317e565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d53906146d4565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e119190614948565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612e8e9291906147cf565b60405180910390a4612ea4848a8a86868a613194565b612eb2848a8a8a8a8a61319c565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f24906146b4565b60405180910390fd5b6000612f37612209565b90506000612f4484613104565b90506000612f5184613104565b9050612f718387600085856040518060200160405280600081525061317e565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015613008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fff90614654565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516130d59291906147cf565b60405180910390a46130fb84886000868660405180602001604052806000815250613194565b50505050505050565b60606000600167ffffffffffffffff81111561312357613122614bef565b5b6040519080825280602002602001820160405280156131515781602001602082028036833780820191505090505b509050828160008151811061316957613168614bc0565b5b60200260200101818152505080915050919050565b61318c8686868686866135c0565b505050505050565b505050505050565b6131bb8473ffffffffffffffffffffffffffffffffffffffff16613792565b1561337b578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016132019594939291906144e4565b602060405180830381600087803b15801561321b57600080fd5b505af192505050801561324c57506040513d601f19601f820116820180604052508101906132499190613f68565b60015b6132f257613258614c1e565b806308c379a014156132b5575061326d615104565b8061327857506132b7565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ac91906145b2565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e9906145d4565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337090614614565b60405180910390fd5b505b505050505050565b6133a28473ffffffffffffffffffffffffffffffffffffffff16613792565b15613562578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016133e895949392919061447c565b602060405180830381600087803b15801561340257600080fd5b505af192505050801561343357506040513d601f19601f820116820180604052508101906134309190613f68565b60015b6134d95761343f614c1e565b806308c379a0141561349c5750613454615104565b8061345f575061349e565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349391906145b2565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d0906145d4565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355790614614565b60405180910390fd5b505b505050505050565b60008082905060005b84518110156135b5576135a08286838151811061359357613592614bc0565b5b60200260200101516137b5565b915080806135ad90614af5565b915050613573565b508091505092915050565b6135ce8686868686866137e0565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156136805760005b835181101561367e5782818151811061362257613621614bc0565b5b60200260200101516003600086848151811061364157613640614bc0565b5b6020026020010151815260200190815260200160002060008282546136669190614948565b925050819055508061367790614af5565b9050613606565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561378a5760005b83518110156137885760008482815181106136d6576136d5614bc0565b5b6020026020010151905060008483815181106136f5576136f4614bc0565b5b602002602001015190506000600360008481526020019081526020016000205490508181101561375a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375190614714565b60405180910390fd5b81810360036000858152602001908152602001600020819055505050508061378190614af5565b90506136b8565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008183106137cd576137c882846137e8565b6137d8565b6137d783836137e8565b5b905092915050565b505050505050565b600082600052816020526040600020905092915050565b82805461380b90614a92565b90600052602060002090601f01602090048101928261382d5760008555613874565b82601f1061384657805160ff1916838001178555613874565b82800160010185558215613874579182015b82811115613873578251825591602001919060010190613858565b5b5090506138819190613885565b5090565b5b8082111561389e576000816000905550600101613886565b5090565b60006138b56138b08461481d565b6147f8565b905080838252602082019050828560208602820111156138d8576138d7614c4a565b5b60005b8581101561390857816138ee8882613a06565b8452602084019350602083019250506001810190506138db565b5050509392505050565b600061392561392084614849565b6147f8565b9050808382526020820190508285602086028201111561394857613947614c4a565b5b60005b85811015613978578161395e8882613b7d565b84526020840193506020830192505060018101905061394b565b5050509392505050565b600061399561399084614875565b6147f8565b9050828152602081018484840111156139b1576139b0614c4f565b5b6139bc848285614a50565b509392505050565b60006139d76139d2846148a6565b6147f8565b9050828152602081018484840111156139f3576139f2614c4f565b5b6139fe848285614a50565b509392505050565b600081359050613a158161519a565b92915050565b600082601f830112613a3057613a2f614c45565b5b8135613a408482602086016138a2565b91505092915050565b60008083601f840112613a5f57613a5e614c45565b5b8235905067ffffffffffffffff811115613a7c57613a7b614c40565b5b602083019150836020820283011115613a9857613a97614c4a565b5b9250929050565b600082601f830112613ab457613ab3614c45565b5b8135613ac4848260208601613912565b91505092915050565b600081359050613adc816151b1565b92915050565b600081359050613af1816151c8565b92915050565b600081359050613b06816151df565b92915050565b600081519050613b1b816151df565b92915050565b600082601f830112613b3657613b35614c45565b5b8135613b46848260208601613982565b91505092915050565b600082601f830112613b6457613b63614c45565b5b8135613b748482602086016139c4565b91505092915050565b600081359050613b8c816151f6565b92915050565b600060208284031215613ba857613ba7614c59565b5b6000613bb684828501613a06565b91505092915050565b60008060408385031215613bd657613bd5614c59565b5b6000613be485828601613a06565b9250506020613bf585828601613a06565b9150509250929050565b600080600080600060a08688031215613c1b57613c1a614c59565b5b6000613c2988828901613a06565b9550506020613c3a88828901613a06565b945050604086013567ffffffffffffffff811115613c5b57613c5a614c54565b5b613c6788828901613a9f565b935050606086013567ffffffffffffffff811115613c8857613c87614c54565b5b613c9488828901613a9f565b925050608086013567ffffffffffffffff811115613cb557613cb4614c54565b5b613cc188828901613b21565b9150509295509295909350565b600080600080600060a08688031215613cea57613ce9614c59565b5b6000613cf888828901613a06565b9550506020613d0988828901613a06565b9450506040613d1a88828901613b7d565b9350506060613d2b88828901613b7d565b925050608086013567ffffffffffffffff811115613d4c57613d4b614c54565b5b613d5888828901613b21565b9150509295509295909350565b600080600060608486031215613d7e57613d7d614c59565b5b6000613d8c86828701613a06565b935050602084013567ffffffffffffffff811115613dad57613dac614c54565b5b613db986828701613a9f565b925050604084013567ffffffffffffffff811115613dda57613dd9614c54565b5b613de686828701613a9f565b9150509250925092565b60008060408385031215613e0757613e06614c59565b5b6000613e1585828601613a06565b9250506020613e2685828601613acd565b9150509250929050565b60008060408385031215613e4757613e46614c59565b5b6000613e5585828601613a06565b9250506020613e6685828601613b7d565b9150509250929050565b600080600060608486031215613e8957613e88614c59565b5b6000613e9786828701613a06565b9350506020613ea886828701613b7d565b9250506040613eb986828701613b7d565b9150509250925092565b60008060408385031215613eda57613ed9614c59565b5b600083013567ffffffffffffffff811115613ef857613ef7614c54565b5b613f0485828601613a1b565b925050602083013567ffffffffffffffff811115613f2557613f24614c54565b5b613f3185828601613a9f565b9150509250929050565b600060208284031215613f5157613f50614c59565b5b6000613f5f84828501613af7565b91505092915050565b600060208284031215613f7e57613f7d614c59565b5b6000613f8c84828501613b0c565b91505092915050565b600060208284031215613fab57613faa614c59565b5b6000613fb984828501613b7d565b91505092915050565b600080600060408486031215613fdb57613fda614c59565b5b6000613fe986828701613b7d565b935050602084013567ffffffffffffffff81111561400a57614009614c54565b5b61401686828701613a49565b92509250509250925092565b6000806040838503121561403957614038614c59565b5b600061404785828601613b7d565b925050602061405885828601613ae2565b9150509250929050565b6000806040838503121561407957614078614c59565b5b600061408785828601613b7d565b925050602083013567ffffffffffffffff8111156140a8576140a7614c54565b5b6140b485828601613b4f565b9150509250929050565b600080604083850312156140d5576140d4614c59565b5b60006140e385828601613b7d565b92505060206140f485828601613b7d565b9150509250929050565b600061410a8383614428565b60208301905092915050565b61411f816149d2565b82525050565b614136614131826149d2565b614b3e565b82525050565b6000614147826148e7565b6141518185614915565b935061415c836148d7565b8060005b8381101561418d57815161417488826140fe565b975061417f83614908565b925050600181019050614160565b5085935050505092915050565b6141a3816149e4565b82525050565b60006141b4826148f2565b6141be8185614926565b93506141ce818560208601614a5f565b6141d781614c5e565b840191505092915050565b60006141ed826148fd565b6141f78185614937565b9350614207818560208601614a5f565b61421081614c5e565b840191505092915050565b6000614228603483614937565b915061423382614c89565b604082019050919050565b600061424b602f83614937565b915061425682614cd8565b604082019050919050565b600061426e602883614937565b915061427982614d27565b604082019050919050565b6000614291602683614937565b915061429c82614d76565b604082019050919050565b60006142b4602483614937565b91506142bf82614dc5565b604082019050919050565b60006142d7602a83614937565b91506142e282614e14565b604082019050919050565b60006142fa602583614937565b915061430582614e63565b604082019050919050565b600061431d602383614937565b915061432882614eb2565b604082019050919050565b6000614340602a83614937565b915061434b82614f01565b604082019050919050565b6000614363602083614937565b915061436e82614f50565b602082019050919050565b6000614386602883614937565b915061439182614f79565b604082019050919050565b60006143a9602983614937565b91506143b482614fc8565b604082019050919050565b60006143cc602983614937565b91506143d782615017565b604082019050919050565b60006143ef602883614937565b91506143fa82615066565b604082019050919050565b6000614412602183614937565b915061441d826150b5565b604082019050919050565b61443181614a46565b82525050565b61444081614a46565b82525050565b60006144528284614125565b60148201915081905092915050565b60006020820190506144766000830184614116565b92915050565b600060a0820190506144916000830188614116565b61449e6020830187614116565b81810360408301526144b0818661413c565b905081810360608301526144c4818561413c565b905081810360808301526144d881846141a9565b90509695505050505050565b600060a0820190506144f96000830188614116565b6145066020830187614116565b6145136040830186614437565b6145206060830185614437565b818103608083015261453281846141a9565b90509695505050505050565b60006020820190508181036000830152614558818461413c565b905092915050565b6000604082019050818103600083015261457a818561413c565b9050818103602083015261458e818461413c565b90509392505050565b60006020820190506145ac600083018461419a565b92915050565b600060208201905081810360008301526145cc81846141e2565b905092915050565b600060208201905081810360008301526145ed8161421b565b9050919050565b6000602082019050818103600083015261460d8161423e565b9050919050565b6000602082019050818103600083015261462d81614261565b9050919050565b6000602082019050818103600083015261464d81614284565b9050919050565b6000602082019050818103600083015261466d816142a7565b9050919050565b6000602082019050818103600083015261468d816142ca565b9050919050565b600060208201905081810360008301526146ad816142ed565b9050919050565b600060208201905081810360008301526146cd81614310565b9050919050565b600060208201905081810360008301526146ed81614333565b9050919050565b6000602082019050818103600083015261470d81614356565b9050919050565b6000602082019050818103600083015261472d81614379565b9050919050565b6000602082019050818103600083015261474d8161439c565b9050919050565b6000602082019050818103600083015261476d816143bf565b9050919050565b6000602082019050818103600083015261478d816143e2565b9050919050565b600060208201905081810360008301526147ad81614405565b9050919050565b60006020820190506147c96000830184614437565b92915050565b60006040820190506147e46000830185614437565b6147f16020830184614437565b9392505050565b6000614802614813565b905061480e8282614ac4565b919050565b6000604051905090565b600067ffffffffffffffff82111561483857614837614bef565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561486457614863614bef565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148905761488f614bef565b5b61489982614c5e565b9050602081019050919050565b600067ffffffffffffffff8211156148c1576148c0614bef565b5b6148ca82614c5e565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061495382614a46565b915061495e83614a46565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561499357614992614b62565b5b828201905092915050565b60006149a982614a46565b91506149b483614a46565b9250828210156149c7576149c6614b62565b5b828203905092915050565b60006149dd82614a26565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a7d578082015181840152602081019050614a62565b83811115614a8c576000848401525b50505050565b60006002820490506001821680614aaa57607f821691505b60208210811415614abe57614abd614b91565b5b50919050565b614acd82614c5e565b810181811067ffffffffffffffff82111715614aec57614aeb614bef565b5b80604052505050565b6000614b0082614a46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b3357614b32614b62565b5b600182019050919050565b6000614b4982614b50565b9050919050565b6000614b5b82614c6f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115614c3d5760046000803e614c3a600051614c7c565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d101561511457615197565b61511c614813565b60043d036004823e80513d602482011167ffffffffffffffff82111715615144575050615197565b808201805167ffffffffffffffff8111156151625750505050615197565b80602083010160043d03850181111561517f575050505050615197565b61518e82602001850186614ac4565b82955050505050505b90565b6151a3816149d2565b81146151ae57600080fd5b50565b6151ba816149e4565b81146151c557600080fd5b50565b6151d1816149f0565b81146151dc57600080fd5b50565b6151e8816149fa565b81146151f357600080fd5b50565b6151ff81614a46565b811461520a57600080fd5b5056fea26469706673582212208b742b73ef3ff4bcef6ce644b1ac4310f5e2c646b23302451a9226b5db70b1e064736f6c634300080700330000000000000000000000005d757edfd38efbe9e281766cb78a8fa005b5f0d2

Deployed Bytecode

0x6080604052600436106102035760003560e01c80636c3a2b5f11610118578063ba45bcb3116100a0578063dca363f01161006f578063dca363f014610746578063e985e9c51461076f578063f242432a146107ac578063f2fde38b146107d5578063f5298aca146107fe57610203565b8063ba45bcb314610678578063bd85b039146106b5578063c6b97f2e146106f2578063c6fe62b01461072f57610203565b80638f38fbab116100e75780638f38fbab146105a257806393cde101146105cb57806395d89b4114610608578063a22cb46514610633578063b977fe551461065c57610203565b80636c3a2b5f146104f8578063715018a6146105235780638385c2aa1461053a5780638da5cb5b1461057757610203565b806324600fc31161019b578063464e03451161016a578063464e0345146104035780634e1273f41461042c5780634f558e79146104695780636455e188146104a65780636b20c454146104cf57610203565b806324600fc31461037e5780632db11544146103955780632eb2c2d6146103b15780633881f08f146103da57610203565b806306fdde03116101d757806306fdde03146102c45780630e89341c146102ef57806314a8c3171461032c5780631f9159c81461035557610203565b8062fdd58e1461020857806301ffc9a714610245578063057732461461028257806305ce13eb146102ad575b600080fd5b34801561021457600080fd5b5061022f600480360381019061022a9190613e30565b610827565b60405161023c91906147b4565b60405180910390f35b34801561025157600080fd5b5061026c60048036038101906102679190613f3b565b6108f0565b6040516102799190614597565b60405180910390f35b34801561028e57600080fd5b506102976109d2565b6040516102a491906147b4565b60405180910390f35b3480156102b957600080fd5b506102c26109d7565b005b3480156102d057600080fd5b506102d9610a7f565b6040516102e691906145b2565b60405180910390f35b3480156102fb57600080fd5b5061031660048036038101906103119190613f95565b610b0d565b60405161032391906145b2565b60405180910390f35b34801561033857600080fd5b50610353600480360381019061034e91906140be565b610bb2565b005b34801561036157600080fd5b5061037c60048036038101906103779190613f95565b610c95565b005b34801561038a57600080fd5b50610393610d60565b005b6103af60048036038101906103aa9190613f95565b610e47565b005b3480156103bd57600080fd5b506103d860048036038101906103d39190613bff565b6110bb565b005b3480156103e657600080fd5b5061040160048036038101906103fc91906140be565b61115c565b005b34801561040f57600080fd5b5061042a60048036038101906104259190613f95565b61123f565b005b34801561043857600080fd5b50610453600480360381019061044e9190613ec3565b61130a565b604051610460919061453e565b60405180910390f35b34801561047557600080fd5b50610490600480360381019061048b9190613f95565b611423565b60405161049d9190614597565b60405180910390f35b3480156104b257600080fd5b506104cd60048036038101906104c89190614022565b611437565b005b3480156104db57600080fd5b506104f660048036038101906104f19190613d65565b61151a565b005b34801561050457600080fd5b5061050d6115b7565b60405161051a91906147b4565b60405180910390f35b34801561052f57600080fd5b506105386115bc565b005b34801561054657600080fd5b50610561600480360381019061055c9190613f95565b611644565b60405161056e91906147b4565b60405180910390f35b34801561058357600080fd5b5061058c611686565b6040516105999190614461565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c49190614062565b6116b0565b005b3480156105d757600080fd5b506105f260048036038101906105ed9190613f95565b611758565b6040516105ff9190614597565b60405180910390f35b34801561061457600080fd5b5061061d611778565b60405161062a91906145b2565b60405180910390f35b34801561063f57600080fd5b5061065a60048036038101906106559190613df0565b611806565b005b61067660048036038101906106719190613fc2565b61181c565b005b34801561068457600080fd5b5061069f600480360381019061069a9190613f95565b611b39565b6040516106ac9190614597565b60405180910390f35b3480156106c157600080fd5b506106dc60048036038101906106d79190613f95565b611b59565b6040516106e991906147b4565b60405180910390f35b3480156106fe57600080fd5b5061071960048036038101906107149190613f95565b611b76565b60405161072691906147b4565b60405180910390f35b34801561073b57600080fd5b50610744611b93565b005b34801561075257600080fd5b5061076d600480360381019061076891906140be565b611cc0565b005b34801561077b57600080fd5b5061079660048036038101906107919190613bbf565b611ed5565b6040516107a39190614597565b60405180910390f35b3480156107b857600080fd5b506107d360048036038101906107ce9190613cce565b611f69565b005b3480156107e157600080fd5b506107fc60048036038101906107f79190613b92565b61200a565b005b34801561080a57600080fd5b5061082560048036038101906108209190613e70565b612102565b005b60008073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610898576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161088f90614674565b60405180910390fd5b60008083815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905092915050565b60007fd9b67a26000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109bb57507f0e89341c000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806109cb57506109ca8261219f565b5b9050919050565b600181565b6109df612209565b73ffffffffffffffffffffffffffffffffffffffff166109fd611686565b73ffffffffffffffffffffffffffffffffffffffff1614610a53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a4a906146f4565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b60058054610a8c90614a92565b80601f0160208091040260200160405190810160405280929190818152602001828054610ab890614a92565b8015610b055780601f10610ada57610100808354040283529160200191610b05565b820191906000526020600020905b815481529060010190602001808311610ae857829003601f168201915b505050505081565b6060600760008381526020019081526020016000208054610b2d90614a92565b80601f0160208091040260200160405190810160405280929190818152602001828054610b5990614a92565b8015610ba65780601f10610b7b57610100808354040283529160200191610ba6565b820191906000526020600020905b815481529060010190602001808311610b8957829003601f168201915b50505050509050919050565b610bba612209565b73ffffffffffffffffffffffffffffffffffffffff16610bd8611686565b73ffffffffffffffffffffffffffffffffffffffff1614610c2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c25906146f4565b60405180910390fd5b8160018114158015610c41575060028114155b15610c78576040517f2dac9bb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600c600085815260200190815260200160002081905550505050565b610c9d612209565b73ffffffffffffffffffffffffffffffffffffffff16610cbb611686565b73ffffffffffffffffffffffffffffffffffffffff1614610d11576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d08906146f4565b60405180910390fd5b6009600082815260200190815260200160002060009054906101000a900460ff16156009600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b610d68612209565b73ffffffffffffffffffffffffffffffffffffffff16610d86611686565b73ffffffffffffffffffffffffffffffffffffffff1614610ddc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd3906146f4565b60405180910390fd5b600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc479081150290604051600060405180830381858888f19350505050158015610e44573d6000803e3d6000fd5b50565b8060018114158015610e5a575060028114155b15610e91576040517f2dac9bb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b816000610eaf60086000848152602001908152602001600020612211565b9050600b6000838152602001908152602001600020548110610efd576040517fadb00a1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600c600082815260200190815260200160002054341015610f4b576040517fa7924a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600a600087815260200190815260200160002060009054906101000a900460ff1615151415610faa576040517f7d20a0ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002090506001151581600201600088815260200190815260200160002060009054906101000a900460ff161515141561104e576040517f17f0618d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600181600201600088815260200190815260200160002060006101000a81548160ff0219169083151502179055506110976008600088815260200190815260200160002061221f565b6110b33387600160405180602001604052806000815250612235565b505050505050565b6110c3612209565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611109575061110885611103612209565b611ed5565b5b611148576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113f906145f4565b60405180910390fd5b61115585858585856123e6565b5050505050565b611164612209565b73ffffffffffffffffffffffffffffffffffffffff16611182611686565b73ffffffffffffffffffffffffffffffffffffffff16146111d8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111cf906146f4565b60405180910390fd5b81600181141580156111eb575060028114155b15611222576040517f2dac9bb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600b600085815260200190815260200160002081905550505050565b611247612209565b73ffffffffffffffffffffffffffffffffffffffff16611265611686565b73ffffffffffffffffffffffffffffffffffffffff16146112bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112b2906146f4565b60405180910390fd5b600a600082815260200190815260200160002060009054906101000a900460ff1615600a600083815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60608151835114611350576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161134790614754565b60405180910390fd5b6000835167ffffffffffffffff81111561136d5761136c614bef565b5b60405190808252806020026020018201604052801561139b5781602001602082028036833780820191505090505b50905060005b8451811015611418576113e88582815181106113c0576113bf614bc0565b5b60200260200101518583815181106113db576113da614bc0565b5b6020026020010151610827565b8282815181106113fb576113fa614bc0565b5b6020026020010181815250508061141190614af5565b90506113a1565b508091505092915050565b60008061142f83611b59565b119050919050565b61143f612209565b73ffffffffffffffffffffffffffffffffffffffff1661145d611686565b73ffffffffffffffffffffffffffffffffffffffff16146114b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114aa906146f4565b60405180910390fd5b81600181141580156114c6575060028114155b156114fd576040517f2dac9bb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b81600d600085815260200190815260200160002081905550505050565b611522612209565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480611568575061156783611562612209565b611ed5565b5b6115a7576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161159e906145f4565b60405180910390fd5b6115b2838383612708565b505050565b600281565b6115c4612209565b73ffffffffffffffffffffffffffffffffffffffff166115e2611686565b73ffffffffffffffffffffffffffffffffffffffff1614611638576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161162f906146f4565b60405180910390fd5b61164260006129d7565b565b600061166160086000848152602001908152602001600020612211565b600b60008481526020019081526020016000205461167f919061499e565b9050919050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b6116b8612209565b73ffffffffffffffffffffffffffffffffffffffff166116d6611686565b73ffffffffffffffffffffffffffffffffffffffff161461172c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611723906146f4565b60405180910390fd5b806007600084815260200190815260200160002090805190602001906117539291906137ff565b505050565b600a6020528060005260406000206000915054906101000a900460ff1681565b6006805461178590614a92565b80601f01602080910402602001604051908101604052809291908181526020018280546117b190614a92565b80156117fe5780601f106117d3576101008083540402835291602001916117fe565b820191906000526020600020905b8154815290600101906020018083116117e157829003601f168201915b505050505081565b611818611811612209565b8383612a9d565b5050565b826001811415801561182f575060028114155b15611866576040517f2dac9bb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b83600061188460086000848152602001908152602001600020612211565b9050600b60008381526020019081526020016000205481106118d2576040517fadb00a1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b85600c600082815260200190815260200160002054341015611920576040517fa7924a1300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600015156009600089815260200190815260200160002060009054906101000a900460ff161515141561197f576040517f7d20a0ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000601160003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000209050600115158160000160009054906101000a900460ff1615151415611a12576040517f17f0618d00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600033604051602001611a259190614446565b60405160208183030381529060405280519060200120905060001515611aa0898980806020026020016040519081016040528093929190818152602001838360200280828437600081840152601f19601f82011690508083019250505050505050600d60008d81526020019081526020016000205484612c0a565b15151415611ada576040517f522fc3bd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60018260000160006101000a81548160ff021916908315150217905550611b12600860008b815260200190815260200160002061221f565b611b2e338a600160405180602001604052806000815250612235565b505050505050505050565b60096020528060005260406000206000915054906101000a900460ff1681565b600060036000838152602001908152602001600020549050919050565b6000600b6000838152602001908152602001600020549050919050565b60016000611bb260086000848152602001908152602001600020612211565b9050600b6000838152602001908152602001600020548110611c00576040517fadb00a1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b60001515600f60009054906101000a900460ff1615151415611c4e576040517f7d20a0ff00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6004611c5b336002610827565b1015611c93576040517faca079a300000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611ca03360026004612102565b611cbc3360018060405180602001604052806000815250612235565b5050565b8160018114158015611cd3575060028114155b15611d0a576040517f2dac9bb200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b826000611d2860086000848152602001908152602001600020612211565b9050600b6000838152602001908152602001600020548110611d76576040517fadb00a1700000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b611d7e612209565b73ffffffffffffffffffffffffffffffffffffffff16611d9c611686565b73ffffffffffffffffffffffffffffffffffffffff1614611df2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de9906146f4565b60405180910390fd5b600e600086815260200190815260200160002060009054906101000a900460ff1615611e4a576040517f4541439b00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6001600e600087815260200190815260200160002060006101000a81548160ff021916908315150217905550611eb3600f60019054906101000a900473ffffffffffffffffffffffffffffffffffffffff16868660405180602001604052806000815250612235565b611ece6008600087815260200190815260200160002061221f565b5050505050565b6000600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611f71612209565b73ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161480611fb75750611fb685611fb1612209565b611ed5565b5b611ff6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611fed906145f4565b60405180910390fd5b6120038585858585612c21565b5050505050565b612012612209565b73ffffffffffffffffffffffffffffffffffffffff16612030611686565b73ffffffffffffffffffffffffffffffffffffffff1614612086576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161207d906146f4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120ed90614634565b60405180910390fd5b6120ff816129d7565b50565b61210a612209565b73ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161480612150575061214f8361214a612209565b611ed5565b5b61218f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612186906145f4565b60405180910390fd5b61219a838383612ebd565b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600033905090565b600081600001549050919050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614156122a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161229c90614794565b60405180910390fd5b60006122af612209565b905060006122bc85613104565b905060006122c985613104565b90506122da8360008985858961317e565b8460008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123399190614948565b925050819055508673ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516123b79291906147cf565b60405180910390a46123ce83600089858589613194565b6123dd8360008989898961319c565b50505050505050565b815183511461242a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242190614774565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561249a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161249190614694565b60405180910390fd5b60006124a4612209565b90506124b481878787878761317e565b60005b84518110156126655760008582815181106124d5576124d4614bc0565b5b6020026020010151905060008583815181106124f4576124f3614bc0565b5b60200260200101519050600080600084815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905081811015612595576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161258c906146d4565b60405180910390fd5b81810360008085815260200190815260200160002060008c73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508160008085815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461264a9190614948565b925050819055505050508061265e90614af5565b90506124b7565b508473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb87876040516126dc929190614560565b60405180910390a46126f2818787878787613194565b612700818787878787613383565b505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612778576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161276f906146b4565b60405180910390fd5b80518251146127bc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127b390614774565b60405180910390fd5b60006127c6612209565b90506127e68185600086866040518060200160405280600081525061317e565b60005b835181101561293357600084828151811061280757612806614bc0565b5b60200260200101519050600084838151811061282657612825614bc0565b5b60200260200101519050600080600084815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050818110156128c7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128be90614654565b60405180910390fd5b81810360008085815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550505050808061292b90614af5565b9150506127e9565b50600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb86866040516129ab929190614560565b60405180910390a46129d181856000868660405180602001604052806000815250613194565b50505050565b6000600460009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600460006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612b0c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b0390614734565b60405180910390fd5b80600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612bfd9190614597565b60405180910390a3505050565b600082612c17858461356a565b1490509392505050565b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612c91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8890614694565b60405180910390fd5b6000612c9b612209565b90506000612ca885613104565b90506000612cb585613104565b9050612cc583898985858961317e565b600080600088815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905085811015612d5c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d53906146d4565b60405180910390fd5b85810360008089815260200190815260200160002060008b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020819055508560008089815260200190815260200160002060008a73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612e119190614948565b925050819055508773ffffffffffffffffffffffffffffffffffffffff168973ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f628a8a604051612e8e9291906147cf565b60405180910390a4612ea4848a8a86868a613194565b612eb2848a8a8a8a8a61319c565b505050505050505050565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612f2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612f24906146b4565b60405180910390fd5b6000612f37612209565b90506000612f4484613104565b90506000612f5184613104565b9050612f718387600085856040518060200160405280600081525061317e565b600080600087815260200190815260200160002060008873ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054905084811015613008576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fff90614654565b60405180910390fd5b84810360008088815260200190815260200160002060008973ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002081905550600073ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff167fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f6289896040516130d59291906147cf565b60405180910390a46130fb84886000868660405180602001604052806000815250613194565b50505050505050565b60606000600167ffffffffffffffff81111561312357613122614bef565b5b6040519080825280602002602001820160405280156131515781602001602082028036833780820191505090505b509050828160008151811061316957613168614bc0565b5b60200260200101818152505080915050919050565b61318c8686868686866135c0565b505050505050565b505050505050565b6131bb8473ffffffffffffffffffffffffffffffffffffffff16613792565b1561337b578373ffffffffffffffffffffffffffffffffffffffff1663f23a6e6187878686866040518663ffffffff1660e01b81526004016132019594939291906144e4565b602060405180830381600087803b15801561321b57600080fd5b505af192505050801561324c57506040513d601f19601f820116820180604052508101906132499190613f68565b60015b6132f257613258614c1e565b806308c379a014156132b5575061326d615104565b8061327857506132b7565b806040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132ac91906145b2565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016132e9906145d4565b60405180910390fd5b63f23a6e6160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613379576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161337090614614565b60405180910390fd5b505b505050505050565b6133a28473ffffffffffffffffffffffffffffffffffffffff16613792565b15613562578373ffffffffffffffffffffffffffffffffffffffff1663bc197c8187878686866040518663ffffffff1660e01b81526004016133e895949392919061447c565b602060405180830381600087803b15801561340257600080fd5b505af192505050801561343357506040513d601f19601f820116820180604052508101906134309190613f68565b60015b6134d95761343f614c1e565b806308c379a0141561349c5750613454615104565b8061345f575061349e565b806040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161349391906145b2565b60405180910390fd5b505b6040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016134d0906145d4565b60405180910390fd5b63bc197c8160e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614613560576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161355790614614565b60405180910390fd5b505b505050505050565b60008082905060005b84518110156135b5576135a08286838151811061359357613592614bc0565b5b60200260200101516137b5565b915080806135ad90614af5565b915050613573565b508091505092915050565b6135ce8686868686866137e0565b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614156136805760005b835181101561367e5782818151811061362257613621614bc0565b5b60200260200101516003600086848151811061364157613640614bc0565b5b6020026020010151815260200190815260200160002060008282546136669190614948565b925050819055508061367790614af5565b9050613606565b505b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16141561378a5760005b83518110156137885760008482815181106136d6576136d5614bc0565b5b6020026020010151905060008483815181106136f5576136f4614bc0565b5b602002602001015190506000600360008481526020019081526020016000205490508181101561375a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161375190614714565b60405180910390fd5b81810360036000858152602001908152602001600020819055505050508061378190614af5565b90506136b8565b505b505050505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60008183106137cd576137c882846137e8565b6137d8565b6137d783836137e8565b5b905092915050565b505050505050565b600082600052816020526040600020905092915050565b82805461380b90614a92565b90600052602060002090601f01602090048101928261382d5760008555613874565b82601f1061384657805160ff1916838001178555613874565b82800160010185558215613874579182015b82811115613873578251825591602001919060010190613858565b5b5090506138819190613885565b5090565b5b8082111561389e576000816000905550600101613886565b5090565b60006138b56138b08461481d565b6147f8565b905080838252602082019050828560208602820111156138d8576138d7614c4a565b5b60005b8581101561390857816138ee8882613a06565b8452602084019350602083019250506001810190506138db565b5050509392505050565b600061392561392084614849565b6147f8565b9050808382526020820190508285602086028201111561394857613947614c4a565b5b60005b85811015613978578161395e8882613b7d565b84526020840193506020830192505060018101905061394b565b5050509392505050565b600061399561399084614875565b6147f8565b9050828152602081018484840111156139b1576139b0614c4f565b5b6139bc848285614a50565b509392505050565b60006139d76139d2846148a6565b6147f8565b9050828152602081018484840111156139f3576139f2614c4f565b5b6139fe848285614a50565b509392505050565b600081359050613a158161519a565b92915050565b600082601f830112613a3057613a2f614c45565b5b8135613a408482602086016138a2565b91505092915050565b60008083601f840112613a5f57613a5e614c45565b5b8235905067ffffffffffffffff811115613a7c57613a7b614c40565b5b602083019150836020820283011115613a9857613a97614c4a565b5b9250929050565b600082601f830112613ab457613ab3614c45565b5b8135613ac4848260208601613912565b91505092915050565b600081359050613adc816151b1565b92915050565b600081359050613af1816151c8565b92915050565b600081359050613b06816151df565b92915050565b600081519050613b1b816151df565b92915050565b600082601f830112613b3657613b35614c45565b5b8135613b46848260208601613982565b91505092915050565b600082601f830112613b6457613b63614c45565b5b8135613b748482602086016139c4565b91505092915050565b600081359050613b8c816151f6565b92915050565b600060208284031215613ba857613ba7614c59565b5b6000613bb684828501613a06565b91505092915050565b60008060408385031215613bd657613bd5614c59565b5b6000613be485828601613a06565b9250506020613bf585828601613a06565b9150509250929050565b600080600080600060a08688031215613c1b57613c1a614c59565b5b6000613c2988828901613a06565b9550506020613c3a88828901613a06565b945050604086013567ffffffffffffffff811115613c5b57613c5a614c54565b5b613c6788828901613a9f565b935050606086013567ffffffffffffffff811115613c8857613c87614c54565b5b613c9488828901613a9f565b925050608086013567ffffffffffffffff811115613cb557613cb4614c54565b5b613cc188828901613b21565b9150509295509295909350565b600080600080600060a08688031215613cea57613ce9614c59565b5b6000613cf888828901613a06565b9550506020613d0988828901613a06565b9450506040613d1a88828901613b7d565b9350506060613d2b88828901613b7d565b925050608086013567ffffffffffffffff811115613d4c57613d4b614c54565b5b613d5888828901613b21565b9150509295509295909350565b600080600060608486031215613d7e57613d7d614c59565b5b6000613d8c86828701613a06565b935050602084013567ffffffffffffffff811115613dad57613dac614c54565b5b613db986828701613a9f565b925050604084013567ffffffffffffffff811115613dda57613dd9614c54565b5b613de686828701613a9f565b9150509250925092565b60008060408385031215613e0757613e06614c59565b5b6000613e1585828601613a06565b9250506020613e2685828601613acd565b9150509250929050565b60008060408385031215613e4757613e46614c59565b5b6000613e5585828601613a06565b9250506020613e6685828601613b7d565b9150509250929050565b600080600060608486031215613e8957613e88614c59565b5b6000613e9786828701613a06565b9350506020613ea886828701613b7d565b9250506040613eb986828701613b7d565b9150509250925092565b60008060408385031215613eda57613ed9614c59565b5b600083013567ffffffffffffffff811115613ef857613ef7614c54565b5b613f0485828601613a1b565b925050602083013567ffffffffffffffff811115613f2557613f24614c54565b5b613f3185828601613a9f565b9150509250929050565b600060208284031215613f5157613f50614c59565b5b6000613f5f84828501613af7565b91505092915050565b600060208284031215613f7e57613f7d614c59565b5b6000613f8c84828501613b0c565b91505092915050565b600060208284031215613fab57613faa614c59565b5b6000613fb984828501613b7d565b91505092915050565b600080600060408486031215613fdb57613fda614c59565b5b6000613fe986828701613b7d565b935050602084013567ffffffffffffffff81111561400a57614009614c54565b5b61401686828701613a49565b92509250509250925092565b6000806040838503121561403957614038614c59565b5b600061404785828601613b7d565b925050602061405885828601613ae2565b9150509250929050565b6000806040838503121561407957614078614c59565b5b600061408785828601613b7d565b925050602083013567ffffffffffffffff8111156140a8576140a7614c54565b5b6140b485828601613b4f565b9150509250929050565b600080604083850312156140d5576140d4614c59565b5b60006140e385828601613b7d565b92505060206140f485828601613b7d565b9150509250929050565b600061410a8383614428565b60208301905092915050565b61411f816149d2565b82525050565b614136614131826149d2565b614b3e565b82525050565b6000614147826148e7565b6141518185614915565b935061415c836148d7565b8060005b8381101561418d57815161417488826140fe565b975061417f83614908565b925050600181019050614160565b5085935050505092915050565b6141a3816149e4565b82525050565b60006141b4826148f2565b6141be8185614926565b93506141ce818560208601614a5f565b6141d781614c5e565b840191505092915050565b60006141ed826148fd565b6141f78185614937565b9350614207818560208601614a5f565b61421081614c5e565b840191505092915050565b6000614228603483614937565b915061423382614c89565b604082019050919050565b600061424b602f83614937565b915061425682614cd8565b604082019050919050565b600061426e602883614937565b915061427982614d27565b604082019050919050565b6000614291602683614937565b915061429c82614d76565b604082019050919050565b60006142b4602483614937565b91506142bf82614dc5565b604082019050919050565b60006142d7602a83614937565b91506142e282614e14565b604082019050919050565b60006142fa602583614937565b915061430582614e63565b604082019050919050565b600061431d602383614937565b915061432882614eb2565b604082019050919050565b6000614340602a83614937565b915061434b82614f01565b604082019050919050565b6000614363602083614937565b915061436e82614f50565b602082019050919050565b6000614386602883614937565b915061439182614f79565b604082019050919050565b60006143a9602983614937565b91506143b482614fc8565b604082019050919050565b60006143cc602983614937565b91506143d782615017565b604082019050919050565b60006143ef602883614937565b91506143fa82615066565b604082019050919050565b6000614412602183614937565b915061441d826150b5565b604082019050919050565b61443181614a46565b82525050565b61444081614a46565b82525050565b60006144528284614125565b60148201915081905092915050565b60006020820190506144766000830184614116565b92915050565b600060a0820190506144916000830188614116565b61449e6020830187614116565b81810360408301526144b0818661413c565b905081810360608301526144c4818561413c565b905081810360808301526144d881846141a9565b90509695505050505050565b600060a0820190506144f96000830188614116565b6145066020830187614116565b6145136040830186614437565b6145206060830185614437565b818103608083015261453281846141a9565b90509695505050505050565b60006020820190508181036000830152614558818461413c565b905092915050565b6000604082019050818103600083015261457a818561413c565b9050818103602083015261458e818461413c565b90509392505050565b60006020820190506145ac600083018461419a565b92915050565b600060208201905081810360008301526145cc81846141e2565b905092915050565b600060208201905081810360008301526145ed8161421b565b9050919050565b6000602082019050818103600083015261460d8161423e565b9050919050565b6000602082019050818103600083015261462d81614261565b9050919050565b6000602082019050818103600083015261464d81614284565b9050919050565b6000602082019050818103600083015261466d816142a7565b9050919050565b6000602082019050818103600083015261468d816142ca565b9050919050565b600060208201905081810360008301526146ad816142ed565b9050919050565b600060208201905081810360008301526146cd81614310565b9050919050565b600060208201905081810360008301526146ed81614333565b9050919050565b6000602082019050818103600083015261470d81614356565b9050919050565b6000602082019050818103600083015261472d81614379565b9050919050565b6000602082019050818103600083015261474d8161439c565b9050919050565b6000602082019050818103600083015261476d816143bf565b9050919050565b6000602082019050818103600083015261478d816143e2565b9050919050565b600060208201905081810360008301526147ad81614405565b9050919050565b60006020820190506147c96000830184614437565b92915050565b60006040820190506147e46000830185614437565b6147f16020830184614437565b9392505050565b6000614802614813565b905061480e8282614ac4565b919050565b6000604051905090565b600067ffffffffffffffff82111561483857614837614bef565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561486457614863614bef565b5b602082029050602081019050919050565b600067ffffffffffffffff8211156148905761488f614bef565b5b61489982614c5e565b9050602081019050919050565b600067ffffffffffffffff8211156148c1576148c0614bef565b5b6148ca82614c5e565b9050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600061495382614a46565b915061495e83614a46565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561499357614992614b62565b5b828201905092915050565b60006149a982614a46565b91506149b483614a46565b9250828210156149c7576149c6614b62565b5b828203905092915050565b60006149dd82614a26565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015614a7d578082015181840152602081019050614a62565b83811115614a8c576000848401525b50505050565b60006002820490506001821680614aaa57607f821691505b60208210811415614abe57614abd614b91565b5b50919050565b614acd82614c5e565b810181811067ffffffffffffffff82111715614aec57614aeb614bef565b5b80604052505050565b6000614b0082614a46565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614b3357614b32614b62565b5b600182019050919050565b6000614b4982614b50565b9050919050565b6000614b5b82614c6f565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600060033d1115614c3d5760046000803e614c3a600051614c7c565b90505b90565b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b60008160e01c9050919050565b7f455243313135353a207472616e7366657220746f206e6f6e204552433131353560008201527f526563656976657220696d706c656d656e746572000000000000000000000000602082015250565b7f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60008201527f6572206e6f7220617070726f7665640000000000000000000000000000000000602082015250565b7f455243313135353a204552433131353552656365697665722072656a6563746560008201527f6420746f6b656e73000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e20616d6f756e7420657863656564732062616c60008201527f616e636500000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2061646472657373207a65726f206973206e6f742061207660008201527f616c6964206f776e657200000000000000000000000000000000000000000000602082015250565b7f455243313135353a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206275726e2066726f6d20746865207a65726f206164647260008201527f6573730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a20696e73756666696369656e742062616c616e636520666f60008201527f72207472616e7366657200000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f455243313135353a206275726e20616d6f756e74206578636565647320746f7460008201527f616c537570706c79000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2073657474696e6720617070726f76616c2073746174757360008201527f20666f722073656c660000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206163636f756e747320616e6420696473206c656e67746860008201527f206d69736d617463680000000000000000000000000000000000000000000000602082015250565b7f455243313135353a2069647320616e6420616d6f756e7473206c656e6774682060008201527f6d69736d61746368000000000000000000000000000000000000000000000000602082015250565b7f455243313135353a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b600060443d101561511457615197565b61511c614813565b60043d036004823e80513d602482011167ffffffffffffffff82111715615144575050615197565b808201805167ffffffffffffffff8111156151625750505050615197565b80602083010160043d03850181111561517f575050505050615197565b61518e82602001850186614ac4565b82955050505050505b90565b6151a3816149d2565b81146151ae57600080fd5b50565b6151ba816149e4565b81146151c557600080fd5b50565b6151d1816149f0565b81146151dc57600080fd5b50565b6151e8816149fa565b81146151f357600080fd5b50565b6151ff81614a46565b811461520a57600080fd5b5056fea26469706673582212208b742b73ef3ff4bcef6ce644b1ac4310f5e2c646b23302451a9226b5db70b1e064736f6c63430008070033

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

0000000000000000000000005d757edfd38efbe9e281766cb78a8fa005b5f0d2

-----Decoded View---------------
Arg [0] : curatorsAddress (address): 0x5D757EDfd38Efbe9E281766CB78A8fa005b5f0d2

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000005d757edfd38efbe9e281766cb78a8fa005b5f0d2


Deployed Bytecode Sourcemap

49816:7188:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;30902:230;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;29925:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49963:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55274:106;;;;;;;;;;;;;:::i;:::-;;49893:26;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56515:125;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55562:167;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54933:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54769:121;;;;;;;;;;;;;:::i;:::-;;53267:636;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32846:439;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55388:166;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;55105:161;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;31298:524;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48618:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55737:173;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47248:359;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50002:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9698:103;;;;;;;;;;;;;:::i;:::-;;56085:179;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;9047:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55918:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50277:55;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;49926:28;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31895:155;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52389:870;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50214:56;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48407:113;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56272:135;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53911:390;;;;;;;;;;;;;:::i;:::-;;54309:452;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32122:168;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32362:407;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;9956:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46913:327;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;30902:230;30988:7;31035:1;31016:21;;:7;:21;;;;31008:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;31102:9;:13;31112:2;31102:13;;;;;;;;;;;:22;31116:7;31102:22;;;;;;;;;;;;;;;;31095:29;;30902:230;;;;:::o;29925:310::-;30027:4;30079:26;30064:41;;;:11;:41;;;;:110;;;;30137:37;30122:52;;;:11;:52;;;;30064:110;:163;;;;30191:36;30215:11;30191:23;:36::i;:::-;30064:163;30044:183;;29925:310;;;:::o;49963:32::-;49994:1;49963:32;:::o;55274:106::-;9278:12;:10;:12::i;:::-;9267:23;;:7;:5;:7::i;:::-;:23;;;9259:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55357:15:::1;;;;;;;;;;;55356:16;55338:15;;:34;;;;;;;;;;;;;;;;;;55274:106::o:0;49893:26::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;56515:125::-;56575:13;56609;:22;56623:7;56609:22;;;;;;;;;;;56601:31;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56515:125;;;:::o;55562:167::-;9278:12;:10;:12::i;:::-;9267:23;;:7;:5;:7::i;:::-;:23;;;9259:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55661:7:::1;49994:1;51789:7;:15;;:39;;;;;50038:1;51808:7;:20;;51789:39;51785:86;;;51850:21;;;;;;;;;;;;;;51785:86;55712:9:::2;55681:19;:28;55701:7;55681:28;;;;;;;;;;;:40;;;;9338:1:::1;55562:167:::0;;:::o;54933:164::-;9278:12;:10;:12::i;:::-;9267:23;;:7;:5;:7::i;:::-;:23;;;9259:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55056:24:::1;:33;55081:7;55056:33;;;;;;;;;;;;;;;;;;;;;55055:34;55019:24;:33;55044:7;55019:33;;;;;;;;;;;;:70;;;;;;;;;;;;;;;;;;54933:164:::0;:::o;54769:121::-;9278:12;:10;:12::i;:::-;9267:23;;:7;:5;:7::i;:::-;:23;;;9259:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54832:18:::1;;;;;;;;;;;:27;;:50;54860:21;54832:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;54769:121::o:0;53267:636::-;53333:7;49994:1;51789:7;:15;;:39;;;;;50038:1;51808:7;:20;;51789:39;51785:86;;;51850:21;;;;;;;;;;;;;;51785:86;53364:7:::1;51977:18;51998:36;:17;:26;52016:7;51998:26;;;;;;;;;;;:34;:36::i;:::-;51977:57;;52063:20;:29;52084:7;52063:29;;;;;;;;;;;;52049:10;:43;52045:86;;52114:17;;;;;;;;;;;;;;52045:86;53398:7:::2;52264:19;:28;52284:7;52264:28;;;;;;;;;;;;52252:9;:40;52248:85;;;52314:19;;;;;;;;;;;;;;52248:85;53471:5:::3;53435:41;;:23;:32;53459:7;53435:32;;;;;;;;;;;;;;;;;;;;;:41;;;53431:87;;;53498:20;;;;;;;;;;;;;;53431:87;53571:17;53591:13;:25;53605:10;53591:25;;;;;;;;;;;;;;;53571:45;;53672:4;53633:43;;:4;:26;;:35;53660:7;53633:35;;;;;;;;;;;;;;;;;;;;;:43;;;53629:86;;;53698:17;;;;;;;;;;;;;;53629:86;53798:4;53760;:26;;:35;53787:7;53760:35;;;;;;;;;;;;:42;;;;;;;;;;;;;;;;;;53813:38;:17;:26;53831:7;53813:26;;;;;;;;;;;:36;:38::i;:::-;53862:33;53868:10;53880:7;53889:1;53862:33;;;;;;;;;;;::::0;:5:::3;:33::i;:::-;53420:483;52174:1:::2;51966:217:::1;51906:1;53267:636:::0;;:::o;32846:439::-;33087:12;:10;:12::i;:::-;33079:20;;:4;:20;;;:60;;;;33103:36;33120:4;33126:12;:10;:12::i;:::-;33103:16;:36::i;:::-;33079:60;33057:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;33225:52;33248:4;33254:2;33258:3;33263:7;33272:4;33225:22;:52::i;:::-;32846:439;;;;;:::o;55388:166::-;9278:12;:10;:12::i;:::-;9267:23;;:7;:5;:7::i;:::-;:23;;;9259:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55485:7:::1;49994:1;51789:7;:15;;:39;;;;;50038:1;51808:7;:20;;51789:39;51785:86;;;51850:21;;;;;;;;;;;;;;51785:86;55537:9:::2;55505:20;:29;55526:7;55505:29;;;;;;;;;;;:41;;;;9338:1:::1;55388:166:::0;;:::o;55105:161::-;9278:12;:10;:12::i;:::-;9267:23;;:7;:5;:7::i;:::-;:23;;;9259:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55226:23:::1;:32;55250:7;55226:32;;;;;;;;;;;;;;;;;;;;;55225:33;55190:23;:32;55214:7;55190:32;;;;;;;;;;;;:68;;;;;;;;;;;;;;;;;;55105:161:::0;:::o;31298:524::-;31454:16;31515:3;:10;31496:8;:15;:29;31488:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;31584:30;31631:8;:15;31617:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31584:63;;31665:9;31660:122;31684:8;:15;31680:1;:19;31660:122;;;31740:30;31750:8;31759:1;31750:11;;;;;;;;:::i;:::-;;;;;;;;31763:3;31767:1;31763:6;;;;;;;;:::i;:::-;;;;;;;;31740:9;:30::i;:::-;31721:13;31735:1;31721:16;;;;;;;;:::i;:::-;;;;;;;:49;;;;;31701:3;;;;:::i;:::-;;;31660:122;;;;31801:13;31794:20;;;31298:524;;;;:::o;48618:122::-;48675:4;48731:1;48699:29;48725:2;48699:25;:29::i;:::-;:33;48692:40;;48618:122;;;:::o;55737:173::-;9278:12;:10;:12::i;:::-;9267:23;;:7;:5;:7::i;:::-;:23;;;9259:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55840:7:::1;49994:1;51789:7;:15;;:39;;;;;50038:1;51808:7;:20;;51789:39;51785:86;;;51850:21;;;;;;;;;;;;;;51785:86;55892:10:::2;55860:20;:29;55881:7;55860:29;;;;;;;;;;;:42;;;;9338:1:::1;55737:173:::0;;:::o;47248:359::-;47424:12;:10;:12::i;:::-;47413:23;;:7;:23;;;:66;;;;47440:39;47457:7;47466:12;:10;:12::i;:::-;47440:16;:39::i;:::-;47413:66;47391:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;47567:32;47578:7;47587:3;47592:6;47567:10;:32::i;:::-;47248:359;;;:::o;50002:37::-;50038:1;50002:37;:::o;9698:103::-;9278:12;:10;:12::i;:::-;9267:23;;:7;:5;:7::i;:::-;:23;;;9259:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;9763:30:::1;9790:1;9763:18;:30::i;:::-;9698:103::o:0;56085:179::-;56161:7;56220:36;:17;:26;56238:7;56220:26;;;;;;;;;;;:34;:36::i;:::-;56188:20;:29;56209:7;56188:29;;;;;;;;;;;;:68;;;;:::i;:::-;56181:75;;56085:179;;;:::o;9047:87::-;9093:7;9120:6;;;;;;;;;;;9113:13;;9047:87;:::o;55918:127::-;9278:12;:10;:12::i;:::-;9267:23;;:7;:5;:7::i;:::-;:23;;;9259:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;56034:3:::1;56009:13;:22;56023:7;56009:22;;;;;;;;;;;:28;;;;;;;;;;;;:::i;:::-;;55918:127:::0;;:::o;50277:55::-;;;;;;;;;;;;;;;;;;;;;;:::o;49926:28::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;31895:155::-;31990:52;32009:12;:10;:12::i;:::-;32023:8;32033;31990:18;:52::i;:::-;31895:155;;:::o;52389:870::-;52489:7;49994:1;51789:7;:15;;:39;;;;;50038:1;51808:7;:20;;51789:39;51785:86;;;51850:21;;;;;;;;;;;;;;51785:86;52520:7:::1;51977:18;51998:36;:17;:26;52016:7;51998:26;;;;;;;;;;;:34;:36::i;:::-;51977:57;;52063:20;:29;52084:7;52063:29;;;;;;;;;;;;52049:10;:43;52045:86;;52114:17;;;;;;;;;;;;;;52045:86;52554:7:::2;52264:19;:28;52284:7;52264:28;;;;;;;;;;;;52252:9;:40;52248:85;;;52314:19;;;;;;;;;;;;;;52248:85;52628:5:::3;52591:42;;:24;:33;52616:7;52591:33;;;;;;;;;;;;;;;;;;;;;:42;;;52587:88;;;52655:20;;;;;;;;;;;;;;52587:88;52723:17;52743:13;:25;52757:10;52743:25;;;;;;;;;;;;;;;52723:45;;52810:4;52783:31;;:4;:23;;;;;;;;;;;;:31;;;52779:74;;;52836:17;;;;;;;;;;;;;;52779:74;52901:12;52943:10;52926:28;;;;;;;;:::i;:::-;;;;;;;;;;;;;52916:39;;;;;;52901:54;;53043:5;52970:78;;:69;52989:12;;52970:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53003:20;:29;53024:7;53003:29;;;;;;;;;;;;53034:4;52970:18;:69::i;:::-;:78;;;52966:120;;;53070:16;;;;;;;;;;;;;;52966:120;53154:4;53128;:23;;;:30;;;;;;;;;;;;;;;;;;53169:38;:17;:26;53187:7;53169:26;;;;;;;;;;;:36;:38::i;:::-;53218:33;53224:10;53236:7;53245:1;53218:33;;;;;;;;;;;::::0;:5:::3;:33::i;:::-;52576:683;;52174:1:::2;51966:217:::1;51906:1;52389:870:::0;;;;:::o;50214:56::-;;;;;;;;;;;;;;;;;;;;;;:::o;48407:113::-;48469:7;48496:12;:16;48509:2;48496:16;;;;;;;;;;;;48489:23;;48407:113;;;:::o;56272:135::-;56343:7;56370:20;:29;56391:7;56370:29;;;;;;;;;;;;56363:36;;56272:135;;;:::o;53911:390::-;49994:1;51977:18;51998:36;:17;:26;52016:7;51998:26;;;;;;;;;;;:34;:36::i;:::-;51977:57;;52063:20;:29;52084:7;52063:29;;;;;;;;;;;;52049:10;:43;52045:86;;52114:17;;;;;;;;;;;;;;52045:86;54011:5:::1;53992:24;;:15;;;;;;;;;;;:24;;;53988:70;;;54038:20;;;;;;;;;;;;;;53988:70;54140:1;54105:32;54115:10;50038:1;54105:9;:32::i;:::-;:36;54101:84;;;54163:22;;;;;;;;;;;;;;54101:84;54222:30;54227:10;50038:1;54250;54222:4;:30::i;:::-;54263;54269:10;49994:1;54287::::0;54263:30:::1;;;;;;;;;;;::::0;:5:::1;:30::i;:::-;51966:217:::0;53911:390;:::o;54309:452::-;54395:7;49994:1;51789:7;:15;;:39;;;;;50038:1;51808:7;:20;;51789:39;51785:86;;;51850:21;;;;;;;;;;;;;;51785:86;54426:7:::1;51977:18;51998:36;:17;:26;52016:7;51998:26;;;;;;;;;;;:34;:36::i;:::-;51977:57;;52063:20;:29;52084:7;52063:29;;;;;;;;;;;;52049:10;:43;52045:86;;52114:17;;;;;;;;;;;;;;52045:86;9278:12:::2;:10;:12::i;:::-;9267:23;;:7;:5;:7::i;:::-;:23;;;9259:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54465:29:::3;:38;54495:7;54465:38;;;;;;;;;;;;;;;;;;;;;54461:87;;;54525:23;;;;;;;;;;;;;;54461:87;54641:4;54600:29;:38;54630:7;54600:38;;;;;;;;;;;;:45;;;;;;;;;;;;;;;;;;54656:48;54662:18;;;;;;;;;;;54682:7;54691:8;54656:48;;;;;;;;;;;::::0;:5:::3;:48::i;:::-;54715:38;:17;:26;54733:7;54715:26;;;;;;;;;;;:36;:38::i;:::-;51966:217:::1;51906:1;54309:452:::0;;;:::o;32122:168::-;32221:4;32245:18;:27;32264:7;32245:27;;;;;;;;;;;;;;;:37;32273:8;32245:37;;;;;;;;;;;;;;;;;;;;;;;;;32238:44;;32122:168;;;;:::o;32362:407::-;32578:12;:10;:12::i;:::-;32570:20;;:4;:20;;;:60;;;;32594:36;32611:4;32617:12;:10;:12::i;:::-;32594:16;:36::i;:::-;32570:60;32548:157;;;;;;;;;;;;:::i;:::-;;;;;;;;;32716:45;32734:4;32740:2;32744;32748:6;32756:4;32716:17;:45::i;:::-;32362:407;;;;;:::o;9956:201::-;9278:12;:10;:12::i;:::-;9267:23;;:7;:5;:7::i;:::-;:23;;;9259:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;10065:1:::1;10045:22;;:8;:22;;;;10037:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;10121:28;10140:8;10121:18;:28::i;:::-;9956:201:::0;:::o;46913:327::-;47064:12;:10;:12::i;:::-;47053:23;;:7;:23;;;:66;;;;47080:39;47097:7;47106:12;:10;:12::i;:::-;47080:16;:39::i;:::-;47053:66;47031:163;;;;;;;;;;;;:::i;:::-;;;;;;;;;47207:25;47213:7;47222:2;47226:5;47207;:25::i;:::-;46913:327;;;:::o;21009:157::-;21094:4;21133:25;21118:40;;;:11;:40;;;;21111:47;;21009:157;;;:::o;7718:98::-;7771:7;7798:10;7791:17;;7718:98;:::o;6393:114::-;6458:7;6485;:14;;;6478:21;;6393:114;;;:::o;6515:127::-;6622:1;6604:7;:14;;;:19;;;;;;;;;;;6515:127;:::o;37545:729::-;37712:1;37698:16;;:2;:16;;;;37690:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;37765:16;37784:12;:10;:12::i;:::-;37765:31;;37807:20;37830:21;37848:2;37830:17;:21::i;:::-;37807:44;;37862:24;37889:25;37907:6;37889:17;:25::i;:::-;37862:52;;37927:66;37948:8;37966:1;37970:2;37974:3;37979:7;37988:4;37927:20;:66::i;:::-;38027:6;38006:9;:13;38016:2;38006:13;;;;;;;;;;;:17;38020:2;38006:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;38086:2;38049:52;;38082:1;38049:52;;38064:8;38049:52;;;38090:2;38094:6;38049:52;;;;;;;:::i;:::-;;;;;;;;38114:65;38134:8;38152:1;38156:2;38160:3;38165:7;38174:4;38114:19;:65::i;:::-;38192:74;38223:8;38241:1;38245:2;38249;38253:6;38261:4;38192:30;:74::i;:::-;37679:595;;;37545:729;;;;:::o;35081:1146::-;35308:7;:14;35294:3;:10;:28;35286:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;35400:1;35386:16;;:2;:16;;;;35378:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;35457:16;35476:12;:10;:12::i;:::-;35457:31;;35501:60;35522:8;35532:4;35538:2;35542:3;35547:7;35556:4;35501:20;:60::i;:::-;35579:9;35574:421;35598:3;:10;35594:1;:14;35574:421;;;35630:10;35643:3;35647:1;35643:6;;;;;;;;:::i;:::-;;;;;;;;35630:19;;35664:14;35681:7;35689:1;35681:10;;;;;;;;:::i;:::-;;;;;;;;35664:27;;35708:19;35730:9;:13;35740:2;35730:13;;;;;;;;;;;:19;35744:4;35730:19;;;;;;;;;;;;;;;;35708:41;;35787:6;35772:11;:21;;35764:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;35920:6;35906:11;:20;35884:9;:13;35894:2;35884:13;;;;;;;;;;;:19;35898:4;35884:19;;;;;;;;;;;;;;;:42;;;;35977:6;35956:9;:13;35966:2;35956:13;;;;;;;;;;;:17;35970:2;35956:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;35615:380;;;35610:3;;;;:::i;:::-;;;35574:421;;;;36042:2;36012:47;;36036:4;36012:47;;36026:8;36012:47;;;36046:3;36051:7;36012:47;;;;;;;:::i;:::-;;;;;;;;36072:59;36092:8;36102:4;36108:2;36112:3;36117:7;36126:4;36072:19;:59::i;:::-;36144:75;36180:8;36190:4;36196:2;36200:3;36205:7;36214:4;36144:35;:75::i;:::-;35275:952;35081:1146;;;;;:::o;40846:969::-;41014:1;40998:18;;:4;:18;;;;40990:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41089:7;:14;41075:3;:10;:28;41067:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;41161:16;41180:12;:10;:12::i;:::-;41161:31;;41205:66;41226:8;41236:4;41250:1;41254:3;41259:7;41205:66;;;;;;;;;;;;:20;:66::i;:::-;41289:9;41284:373;41308:3;:10;41304:1;:14;41284:373;;;41340:10;41353:3;41357:1;41353:6;;;;;;;;:::i;:::-;;;;;;;;41340:19;;41374:14;41391:7;41399:1;41391:10;;;;;;;;:::i;:::-;;;;;;;;41374:27;;41418:19;41440:9;:13;41450:2;41440:13;;;;;;;;;;;:19;41454:4;41440:19;;;;;;;;;;;;;;;;41418:41;;41497:6;41482:11;:21;;41474:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;41624:6;41610:11;:20;41588:9;:13;41598:2;41588:13;;;;;;;;;;;:19;41602:4;41588:19;;;;;;;;;;;;;;;:42;;;;41325:332;;;41320:3;;;;;:::i;:::-;;;;41284:373;;;;41712:1;41674:55;;41698:4;41674:55;;41688:8;41674:55;;;41716:3;41721:7;41674:55;;;;;;;:::i;:::-;;;;;;;;41742:65;41762:8;41772:4;41786:1;41790:3;41795:7;41742:65;;;;;;;;;;;;:19;:65::i;:::-;40979:836;40846:969;;;:::o;10317:191::-;10391:16;10410:6;;;;;;;;;;;10391:25;;10436:8;10427:6;;:17;;;;;;;;;;;;;;;;;;10491:8;10460:40;;10481:8;10460:40;;;;;;;;;;;;10380:128;10317:191;:::o;41958:331::-;42113:8;42104:17;;:5;:17;;;;42096:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;42216:8;42178:18;:25;42197:5;42178:25;;;;;;;;;;;;;;;:35;42204:8;42178:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;42262:8;42240:41;;42255:5;42240:41;;;42272:8;42240:41;;;;;;:::i;:::-;;;;;;;;41958:331;;;:::o;1306:190::-;1431:4;1484;1455:25;1468:5;1475:4;1455:12;:25::i;:::-;:33;1448:40;;1306:190;;;;;:::o;33749:974::-;33951:1;33937:16;;:2;:16;;;;33929:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;34008:16;34027:12;:10;:12::i;:::-;34008:31;;34050:20;34073:21;34091:2;34073:17;:21::i;:::-;34050:44;;34105:24;34132:25;34150:6;34132:17;:25::i;:::-;34105:52;;34170:60;34191:8;34201:4;34207:2;34211:3;34216:7;34225:4;34170:20;:60::i;:::-;34243:19;34265:9;:13;34275:2;34265:13;;;;;;;;;;;:19;34279:4;34265:19;;;;;;;;;;;;;;;;34243:41;;34318:6;34303:11;:21;;34295:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;34443:6;34429:11;:20;34407:9;:13;34417:2;34407:13;;;;;;;;;;;:19;34421:4;34407:19;;;;;;;;;;;;;;;:42;;;;34492:6;34471:9;:13;34481:2;34471:13;;;;;;;;;;;:17;34485:2;34471:17;;;;;;;;;;;;;;;;:27;;;;;;;:::i;:::-;;;;;;;;34547:2;34516:46;;34541:4;34516:46;;34531:8;34516:46;;;34551:2;34555:6;34516:46;;;;;;;:::i;:::-;;;;;;;;34575:59;34595:8;34605:4;34611:2;34615:3;34620:7;34629:4;34575:19;:59::i;:::-;34647:68;34678:8;34688:4;34694:2;34698;34702:6;34710:4;34647:30;:68::i;:::-;33918:805;;;;33749:974;;;;;:::o;39788:808::-;39931:1;39915:18;;:4;:18;;;;39907:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;39986:16;40005:12;:10;:12::i;:::-;39986:31;;40028:20;40051:21;40069:2;40051:17;:21::i;:::-;40028:44;;40083:24;40110:25;40128:6;40110:17;:25::i;:::-;40083:52;;40148:66;40169:8;40179:4;40193:1;40197:3;40202:7;40148:66;;;;;;;;;;;;:20;:66::i;:::-;40227:19;40249:9;:13;40259:2;40249:13;;;;;;;;;;;:19;40263:4;40249:19;;;;;;;;;;;;;;;;40227:41;;40302:6;40287:11;:21;;40279:70;;;;;;;;;;;;:::i;:::-;;;;;;;;;40421:6;40407:11;:20;40385:9;:13;40395:2;40385:13;;;;;;;;;;;:19;40399:4;40385:19;;;;;;;;;;;;;;;:42;;;;40495:1;40456:54;;40481:4;40456:54;;40471:8;40456:54;;;40499:2;40503:6;40456:54;;;;;;;:::i;:::-;;;;;;;;40523:65;40543:8;40553:4;40567:1;40571:3;40576:7;40523:65;;;;;;;;;;;;:19;:65::i;:::-;39896:700;;;;39788:808;;;:::o;46224:198::-;46290:16;46319:22;46358:1;46344:16;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46319:41;;46382:7;46371:5;46377:1;46371:8;;;;;;;;:::i;:::-;;;;;;;:18;;;;;46409:5;46402:12;;;46224:198;;;:::o;56716:283::-;56925:66;56952:8;56962:4;56968:2;56972:3;56977:7;56986:4;56925:26;:66::i;:::-;56716:283;;;;;;:::o;44423:220::-;;;;;;;:::o;44651:744::-;44866:15;:2;:13;;;:15::i;:::-;44862:526;;;44919:2;44902:38;;;44941:8;44951:4;44957:2;44961:6;44969:4;44902:72;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;44898:479;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;45250:6;45243:14;;;;;;;;;;;:::i;:::-;;;;;;;;44898:479;;;45299:62;;;;;;;;;;:::i;:::-;;;;;;;;44898:479;45036:43;;;45024:55;;;:8;:55;;;;45020:154;;45104:50;;;;;;;;;;:::i;:::-;;;;;;;;45020:154;44975:214;44862:526;44651:744;;;;;;:::o;45403:813::-;45643:15;:2;:13;;;:15::i;:::-;45639:570;;;45696:2;45679:43;;;45723:8;45733:4;45739:3;45744:7;45753:4;45679:79;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45675:523;;;;:::i;:::-;;;;;;;;;;:::i;:::-;;;;;;;;46071:6;46064:14;;;;;;;;;;;:::i;:::-;;;;;;;;45675:523;;;46120:62;;;;;;;;;;:::i;:::-;;;;;;;;45675:523;45852:48;;;45840:60;;;:8;:60;;;;45836:159;;45925:50;;;;;;;;;;:::i;:::-;;;;;;;;45836:159;45759:251;45639:570;45403:813;;;;;;:::o;1857:296::-;1940:7;1960:20;1983:4;1960:27;;2003:9;1998:118;2022:5;:12;2018:1;:16;1998:118;;;2071:33;2081:12;2095:5;2101:1;2095:8;;;;;;;;:::i;:::-;;;;;;;;2071:9;:33::i;:::-;2056:48;;2036:3;;;;;:::i;:::-;;;;1998:118;;;;2133:12;2126:19;;;1857:296;;;;:::o;48815:931::-;49054:66;49081:8;49091:4;49097:2;49101:3;49106:7;49115:4;49054:26;:66::i;:::-;49153:1;49137:18;;:4;:18;;;49133:160;;;49177:9;49172:110;49196:3;:10;49192:1;:14;49172:110;;;49256:7;49264:1;49256:10;;;;;;;;:::i;:::-;;;;;;;;49232:12;:20;49245:3;49249:1;49245:6;;;;;;;;:::i;:::-;;;;;;;;49232:20;;;;;;;;;;;;:34;;;;;;;:::i;:::-;;;;;;;;49208:3;;;;:::i;:::-;;;49172:110;;;;49133:160;49323:1;49309:16;;:2;:16;;;49305:434;;;49347:9;49342:386;49366:3;:10;49362:1;:14;49342:386;;;49402:10;49415:3;49419:1;49415:6;;;;;;;;:::i;:::-;;;;;;;;49402:19;;49440:14;49457:7;49465:1;49457:10;;;;;;;;:::i;:::-;;;;;;;;49440:27;;49486:14;49503:12;:16;49516:2;49503:16;;;;;;;;;;;;49486:33;;49556:6;49546;:16;;49538:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;49687:6;49678;:15;49659:12;:16;49672:2;49659:16;;;;;;;;;;;:34;;;;49383:345;;;49378:3;;;;:::i;:::-;;;49342:386;;;;49305:434;48815:931;;;;;;:::o;11801:326::-;11861:4;12118:1;12096:7;:19;;;:23;12089:30;;11801:326;;;:::o;5036:149::-;5099:7;5130:1;5126;:5;:51;;5157:20;5172:1;5175;5157:14;:20::i;:::-;5126:51;;;5134:20;5149:1;5152;5134:14;:20::i;:::-;5126:51;5119:58;;5036:149;;;;:::o;43247:221::-;;;;;;;:::o;5193:268::-;5261:13;5368:1;5362:4;5355:15;5397:1;5391:4;5384:15;5438:4;5432;5422:21;5413:30;;5193:268;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:722:1:-;120:5;145:81;161:64;218:6;161:64;:::i;:::-;145:81;:::i;:::-;136:90;;246:5;275:6;268:5;261:21;309:4;302:5;298:16;291:23;;335:6;385:3;377:4;369:6;365:17;360:3;356:27;353:36;350:143;;;404:79;;:::i;:::-;350:143;517:1;502:238;527:6;524:1;521:13;502:238;;;595:3;624:37;657:3;645:10;624:37;:::i;:::-;619:3;612:50;691:4;686:3;682:14;675:21;;725:4;720:3;716:14;709:21;;562:178;549:1;546;542:9;537:14;;502:238;;;506:14;126:620;;24:722;;;;;:::o;769:::-;865:5;890:81;906:64;963:6;906:64;:::i;:::-;890:81;:::i;:::-;881:90;;991:5;1020:6;1013:5;1006:21;1054:4;1047:5;1043:16;1036:23;;1080:6;1130:3;1122:4;1114:6;1110:17;1105:3;1101:27;1098:36;1095:143;;;1149:79;;:::i;:::-;1095:143;1262:1;1247:238;1272:6;1269:1;1266:13;1247:238;;;1340:3;1369:37;1402:3;1390:10;1369:37;:::i;:::-;1364:3;1357:50;1436:4;1431:3;1427:14;1420:21;;1470:4;1465:3;1461:14;1454:21;;1307:178;1294:1;1291;1287:9;1282:14;;1247:238;;;1251:14;871:620;;769:722;;;;;:::o;1497:410::-;1574:5;1599:65;1615:48;1656:6;1615:48;:::i;:::-;1599:65;:::i;:::-;1590:74;;1687:6;1680:5;1673:21;1725:4;1718:5;1714:16;1763:3;1754:6;1749:3;1745:16;1742:25;1739:112;;;1770:79;;:::i;:::-;1739:112;1860:41;1894:6;1889:3;1884;1860:41;:::i;:::-;1580:327;1497:410;;;;;:::o;1913:412::-;1991:5;2016:66;2032:49;2074:6;2032:49;:::i;:::-;2016:66;:::i;:::-;2007:75;;2105:6;2098:5;2091:21;2143:4;2136:5;2132:16;2181:3;2172:6;2167:3;2163:16;2160:25;2157:112;;;2188:79;;:::i;:::-;2157:112;2278:41;2312:6;2307:3;2302;2278:41;:::i;:::-;1997:328;1913:412;;;;;:::o;2331:139::-;2377:5;2415:6;2402:20;2393:29;;2431:33;2458:5;2431:33;:::i;:::-;2331:139;;;;:::o;2493:370::-;2564:5;2613:3;2606:4;2598:6;2594:17;2590:27;2580:122;;2621:79;;:::i;:::-;2580:122;2738:6;2725:20;2763:94;2853:3;2845:6;2838:4;2830:6;2826:17;2763:94;:::i;:::-;2754:103;;2570:293;2493:370;;;;:::o;2886:568::-;2959:8;2969:6;3019:3;3012:4;3004:6;3000:17;2996:27;2986:122;;3027:79;;:::i;:::-;2986:122;3140:6;3127:20;3117:30;;3170:18;3162:6;3159:30;3156:117;;;3192:79;;:::i;:::-;3156:117;3306:4;3298:6;3294:17;3282:29;;3360:3;3352:4;3344:6;3340:17;3330:8;3326:32;3323:41;3320:128;;;3367:79;;:::i;:::-;3320:128;2886:568;;;;;:::o;3477:370::-;3548:5;3597:3;3590:4;3582:6;3578:17;3574:27;3564:122;;3605:79;;:::i;:::-;3564:122;3722:6;3709:20;3747:94;3837:3;3829:6;3822:4;3814:6;3810:17;3747:94;:::i;:::-;3738:103;;3554:293;3477:370;;;;:::o;3853:133::-;3896:5;3934:6;3921:20;3912:29;;3950:30;3974:5;3950:30;:::i;:::-;3853:133;;;;:::o;3992:139::-;4038:5;4076:6;4063:20;4054:29;;4092:33;4119:5;4092:33;:::i;:::-;3992:139;;;;:::o;4137:137::-;4182:5;4220:6;4207:20;4198:29;;4236:32;4262:5;4236:32;:::i;:::-;4137:137;;;;:::o;4280:141::-;4336:5;4367:6;4361:13;4352:22;;4383:32;4409:5;4383:32;:::i;:::-;4280:141;;;;:::o;4440:338::-;4495:5;4544:3;4537:4;4529:6;4525:17;4521:27;4511:122;;4552:79;;:::i;:::-;4511:122;4669:6;4656:20;4694:78;4768:3;4760:6;4753:4;4745:6;4741:17;4694:78;:::i;:::-;4685:87;;4501:277;4440:338;;;;:::o;4798:340::-;4854:5;4903:3;4896:4;4888:6;4884:17;4880:27;4870:122;;4911:79;;:::i;:::-;4870:122;5028:6;5015:20;5053:79;5128:3;5120:6;5113:4;5105:6;5101:17;5053:79;:::i;:::-;5044:88;;4860:278;4798:340;;;;:::o;5144:139::-;5190:5;5228:6;5215:20;5206:29;;5244:33;5271:5;5244:33;:::i;:::-;5144:139;;;;:::o;5289:329::-;5348:6;5397:2;5385:9;5376:7;5372:23;5368:32;5365:119;;;5403:79;;:::i;:::-;5365:119;5523:1;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5494:117;5289:329;;;;:::o;5624:474::-;5692:6;5700;5749:2;5737:9;5728:7;5724:23;5720:32;5717:119;;;5755:79;;:::i;:::-;5717:119;5875:1;5900:53;5945:7;5936:6;5925:9;5921:22;5900:53;:::i;:::-;5890:63;;5846:117;6002:2;6028:53;6073:7;6064:6;6053:9;6049:22;6028:53;:::i;:::-;6018:63;;5973:118;5624:474;;;;;:::o;6104:1509::-;6258:6;6266;6274;6282;6290;6339:3;6327:9;6318:7;6314:23;6310:33;6307:120;;;6346:79;;:::i;:::-;6307:120;6466:1;6491:53;6536:7;6527:6;6516:9;6512:22;6491:53;:::i;:::-;6481:63;;6437:117;6593:2;6619:53;6664:7;6655:6;6644:9;6640:22;6619:53;:::i;:::-;6609:63;;6564:118;6749:2;6738:9;6734:18;6721:32;6780:18;6772:6;6769:30;6766:117;;;6802:79;;:::i;:::-;6766:117;6907:78;6977:7;6968:6;6957:9;6953:22;6907:78;:::i;:::-;6897:88;;6692:303;7062:2;7051:9;7047:18;7034:32;7093:18;7085:6;7082:30;7079:117;;;7115:79;;:::i;:::-;7079:117;7220:78;7290:7;7281:6;7270:9;7266:22;7220:78;:::i;:::-;7210:88;;7005:303;7375:3;7364:9;7360:19;7347:33;7407:18;7399:6;7396:30;7393:117;;;7429:79;;:::i;:::-;7393:117;7534:62;7588:7;7579:6;7568:9;7564:22;7534:62;:::i;:::-;7524:72;;7318:288;6104:1509;;;;;;;;:::o;7619:1089::-;7723:6;7731;7739;7747;7755;7804:3;7792:9;7783:7;7779:23;7775:33;7772:120;;;7811:79;;:::i;:::-;7772:120;7931:1;7956:53;8001:7;7992:6;7981:9;7977:22;7956:53;:::i;:::-;7946:63;;7902:117;8058:2;8084:53;8129:7;8120:6;8109:9;8105:22;8084:53;:::i;:::-;8074:63;;8029:118;8186:2;8212:53;8257:7;8248:6;8237:9;8233:22;8212:53;:::i;:::-;8202:63;;8157:118;8314:2;8340:53;8385:7;8376:6;8365:9;8361:22;8340:53;:::i;:::-;8330:63;;8285:118;8470:3;8459:9;8455:19;8442:33;8502:18;8494:6;8491:30;8488:117;;;8524:79;;:::i;:::-;8488:117;8629:62;8683:7;8674:6;8663:9;8659:22;8629:62;:::i;:::-;8619:72;;8413:288;7619:1089;;;;;;;;:::o;8714:1039::-;8841:6;8849;8857;8906:2;8894:9;8885:7;8881:23;8877:32;8874:119;;;8912:79;;:::i;:::-;8874:119;9032:1;9057:53;9102:7;9093:6;9082:9;9078:22;9057:53;:::i;:::-;9047:63;;9003:117;9187:2;9176:9;9172:18;9159:32;9218:18;9210:6;9207:30;9204:117;;;9240:79;;:::i;:::-;9204:117;9345:78;9415:7;9406:6;9395:9;9391:22;9345:78;:::i;:::-;9335:88;;9130:303;9500:2;9489:9;9485:18;9472:32;9531:18;9523:6;9520:30;9517:117;;;9553:79;;:::i;:::-;9517:117;9658:78;9728:7;9719:6;9708:9;9704:22;9658:78;:::i;:::-;9648:88;;9443:303;8714:1039;;;;;:::o;9759:468::-;9824:6;9832;9881:2;9869:9;9860:7;9856:23;9852:32;9849:119;;;9887:79;;:::i;:::-;9849:119;10007:1;10032:53;10077:7;10068:6;10057:9;10053:22;10032:53;:::i;:::-;10022:63;;9978:117;10134:2;10160:50;10202:7;10193:6;10182:9;10178:22;10160:50;:::i;:::-;10150:60;;10105:115;9759:468;;;;;:::o;10233:474::-;10301:6;10309;10358:2;10346:9;10337:7;10333:23;10329:32;10326:119;;;10364:79;;:::i;:::-;10326:119;10484:1;10509:53;10554:7;10545:6;10534:9;10530:22;10509:53;:::i;:::-;10499:63;;10455:117;10611:2;10637:53;10682:7;10673:6;10662:9;10658:22;10637:53;:::i;:::-;10627:63;;10582:118;10233:474;;;;;:::o;10713:619::-;10790:6;10798;10806;10855:2;10843:9;10834:7;10830:23;10826:32;10823:119;;;10861:79;;:::i;:::-;10823:119;10981:1;11006:53;11051:7;11042:6;11031:9;11027:22;11006:53;:::i;:::-;10996:63;;10952:117;11108:2;11134:53;11179:7;11170:6;11159:9;11155:22;11134:53;:::i;:::-;11124:63;;11079:118;11236:2;11262:53;11307:7;11298:6;11287:9;11283:22;11262:53;:::i;:::-;11252:63;;11207:118;10713:619;;;;;:::o;11338:894::-;11456:6;11464;11513:2;11501:9;11492:7;11488:23;11484:32;11481:119;;;11519:79;;:::i;:::-;11481:119;11667:1;11656:9;11652:17;11639:31;11697:18;11689:6;11686:30;11683:117;;;11719:79;;:::i;:::-;11683:117;11824:78;11894:7;11885:6;11874:9;11870:22;11824:78;:::i;:::-;11814:88;;11610:302;11979:2;11968:9;11964:18;11951:32;12010:18;12002:6;11999:30;11996:117;;;12032:79;;:::i;:::-;11996:117;12137:78;12207:7;12198:6;12187:9;12183:22;12137:78;:::i;:::-;12127:88;;11922:303;11338:894;;;;;:::o;12238:327::-;12296:6;12345:2;12333:9;12324:7;12320:23;12316:32;12313:119;;;12351:79;;:::i;:::-;12313:119;12471:1;12496:52;12540:7;12531:6;12520:9;12516:22;12496:52;:::i;:::-;12486:62;;12442:116;12238:327;;;;:::o;12571:349::-;12640:6;12689:2;12677:9;12668:7;12664:23;12660:32;12657:119;;;12695:79;;:::i;:::-;12657:119;12815:1;12840:63;12895:7;12886:6;12875:9;12871:22;12840:63;:::i;:::-;12830:73;;12786:127;12571:349;;;;:::o;12926:329::-;12985:6;13034:2;13022:9;13013:7;13009:23;13005:32;13002:119;;;13040:79;;:::i;:::-;13002:119;13160:1;13185:53;13230:7;13221:6;13210:9;13206:22;13185:53;:::i;:::-;13175:63;;13131:117;12926:329;;;;:::o;13261:704::-;13356:6;13364;13372;13421:2;13409:9;13400:7;13396:23;13392:32;13389:119;;;13427:79;;:::i;:::-;13389:119;13547:1;13572:53;13617:7;13608:6;13597:9;13593:22;13572:53;:::i;:::-;13562:63;;13518:117;13702:2;13691:9;13687:18;13674:32;13733:18;13725:6;13722:30;13719:117;;;13755:79;;:::i;:::-;13719:117;13868:80;13940:7;13931:6;13920:9;13916:22;13868:80;:::i;:::-;13850:98;;;;13645:313;13261:704;;;;;:::o;13971:474::-;14039:6;14047;14096:2;14084:9;14075:7;14071:23;14067:32;14064:119;;;14102:79;;:::i;:::-;14064:119;14222:1;14247:53;14292:7;14283:6;14272:9;14268:22;14247:53;:::i;:::-;14237:63;;14193:117;14349:2;14375:53;14420:7;14411:6;14400:9;14396:22;14375:53;:::i;:::-;14365:63;;14320:118;13971:474;;;;;:::o;14451:654::-;14529:6;14537;14586:2;14574:9;14565:7;14561:23;14557:32;14554:119;;;14592:79;;:::i;:::-;14554:119;14712:1;14737:53;14782:7;14773:6;14762:9;14758:22;14737:53;:::i;:::-;14727:63;;14683:117;14867:2;14856:9;14852:18;14839:32;14898:18;14890:6;14887:30;14884:117;;;14920:79;;:::i;:::-;14884:117;15025:63;15080:7;15071:6;15060:9;15056:22;15025:63;:::i;:::-;15015:73;;14810:288;14451:654;;;;;:::o;15111:474::-;15179:6;15187;15236:2;15224:9;15215:7;15211:23;15207:32;15204:119;;;15242:79;;:::i;:::-;15204:119;15362:1;15387:53;15432:7;15423:6;15412:9;15408:22;15387:53;:::i;:::-;15377:63;;15333:117;15489:2;15515:53;15560:7;15551:6;15540:9;15536:22;15515:53;:::i;:::-;15505:63;;15460:118;15111:474;;;;;:::o;15591:179::-;15660:10;15681:46;15723:3;15715:6;15681:46;:::i;:::-;15759:4;15754:3;15750:14;15736:28;;15591:179;;;;:::o;15776:118::-;15863:24;15881:5;15863:24;:::i;:::-;15858:3;15851:37;15776:118;;:::o;15900:157::-;16005:45;16025:24;16043:5;16025:24;:::i;:::-;16005:45;:::i;:::-;16000:3;15993:58;15900:157;;:::o;16093:732::-;16212:3;16241:54;16289:5;16241:54;:::i;:::-;16311:86;16390:6;16385:3;16311:86;:::i;:::-;16304:93;;16421:56;16471:5;16421:56;:::i;:::-;16500:7;16531:1;16516:284;16541:6;16538:1;16535:13;16516:284;;;16617:6;16611:13;16644:63;16703:3;16688:13;16644:63;:::i;:::-;16637:70;;16730:60;16783:6;16730:60;:::i;:::-;16720:70;;16576:224;16563:1;16560;16556:9;16551:14;;16516:284;;;16520:14;16816:3;16809:10;;16217:608;;;16093:732;;;;:::o;16831:109::-;16912:21;16927:5;16912:21;:::i;:::-;16907:3;16900:34;16831:109;;:::o;16946:360::-;17032:3;17060:38;17092:5;17060:38;:::i;:::-;17114:70;17177:6;17172:3;17114:70;:::i;:::-;17107:77;;17193:52;17238:6;17233:3;17226:4;17219:5;17215:16;17193:52;:::i;:::-;17270:29;17292:6;17270:29;:::i;:::-;17265:3;17261:39;17254:46;;17036:270;16946:360;;;;:::o;17312:364::-;17400:3;17428:39;17461:5;17428:39;:::i;:::-;17483:71;17547:6;17542:3;17483:71;:::i;:::-;17476:78;;17563:52;17608:6;17603:3;17596:4;17589:5;17585:16;17563:52;:::i;:::-;17640:29;17662:6;17640:29;:::i;:::-;17635:3;17631:39;17624:46;;17404:272;17312:364;;;;:::o;17682:366::-;17824:3;17845:67;17909:2;17904:3;17845:67;:::i;:::-;17838:74;;17921:93;18010:3;17921:93;:::i;:::-;18039:2;18034:3;18030:12;18023:19;;17682:366;;;:::o;18054:::-;18196:3;18217:67;18281:2;18276:3;18217:67;:::i;:::-;18210:74;;18293:93;18382:3;18293:93;:::i;:::-;18411:2;18406:3;18402:12;18395:19;;18054:366;;;:::o;18426:::-;18568:3;18589:67;18653:2;18648:3;18589:67;:::i;:::-;18582:74;;18665:93;18754:3;18665:93;:::i;:::-;18783:2;18778:3;18774:12;18767:19;;18426:366;;;:::o;18798:::-;18940:3;18961:67;19025:2;19020:3;18961:67;:::i;:::-;18954:74;;19037:93;19126:3;19037:93;:::i;:::-;19155:2;19150:3;19146:12;19139:19;;18798:366;;;:::o;19170:::-;19312:3;19333:67;19397:2;19392:3;19333:67;:::i;:::-;19326:74;;19409:93;19498:3;19409:93;:::i;:::-;19527:2;19522:3;19518:12;19511:19;;19170:366;;;:::o;19542:::-;19684:3;19705:67;19769:2;19764:3;19705:67;:::i;:::-;19698:74;;19781:93;19870:3;19781:93;:::i;:::-;19899:2;19894:3;19890:12;19883:19;;19542:366;;;:::o;19914:::-;20056:3;20077:67;20141:2;20136:3;20077:67;:::i;:::-;20070:74;;20153:93;20242:3;20153:93;:::i;:::-;20271:2;20266:3;20262:12;20255:19;;19914:366;;;:::o;20286:::-;20428:3;20449:67;20513:2;20508:3;20449:67;:::i;:::-;20442:74;;20525:93;20614:3;20525:93;:::i;:::-;20643:2;20638:3;20634:12;20627:19;;20286:366;;;:::o;20658:::-;20800:3;20821:67;20885:2;20880:3;20821:67;:::i;:::-;20814:74;;20897:93;20986:3;20897:93;:::i;:::-;21015:2;21010:3;21006:12;20999:19;;20658:366;;;:::o;21030:::-;21172:3;21193:67;21257:2;21252:3;21193:67;:::i;:::-;21186:74;;21269:93;21358:3;21269:93;:::i;:::-;21387:2;21382:3;21378:12;21371:19;;21030:366;;;:::o;21402:::-;21544:3;21565:67;21629:2;21624:3;21565:67;:::i;:::-;21558:74;;21641:93;21730:3;21641:93;:::i;:::-;21759:2;21754:3;21750:12;21743:19;;21402:366;;;:::o;21774:::-;21916:3;21937:67;22001:2;21996:3;21937:67;:::i;:::-;21930:74;;22013:93;22102:3;22013:93;:::i;:::-;22131:2;22126:3;22122:12;22115:19;;21774:366;;;:::o;22146:::-;22288:3;22309:67;22373:2;22368:3;22309:67;:::i;:::-;22302:74;;22385:93;22474:3;22385:93;:::i;:::-;22503:2;22498:3;22494:12;22487:19;;22146:366;;;:::o;22518:::-;22660:3;22681:67;22745:2;22740:3;22681:67;:::i;:::-;22674:74;;22757:93;22846:3;22757:93;:::i;:::-;22875:2;22870:3;22866:12;22859:19;;22518:366;;;:::o;22890:::-;23032:3;23053:67;23117:2;23112:3;23053:67;:::i;:::-;23046:74;;23129:93;23218:3;23129:93;:::i;:::-;23247:2;23242:3;23238:12;23231:19;;22890:366;;;:::o;23262:108::-;23339:24;23357:5;23339:24;:::i;:::-;23334:3;23327:37;23262:108;;:::o;23376:118::-;23463:24;23481:5;23463:24;:::i;:::-;23458:3;23451:37;23376:118;;:::o;23500:256::-;23612:3;23627:75;23698:3;23689:6;23627:75;:::i;:::-;23727:2;23722:3;23718:12;23711:19;;23747:3;23740:10;;23500:256;;;;:::o;23762:222::-;23855:4;23893:2;23882:9;23878:18;23870:26;;23906:71;23974:1;23963:9;23959:17;23950:6;23906:71;:::i;:::-;23762:222;;;;:::o;23990:1053::-;24313:4;24351:3;24340:9;24336:19;24328:27;;24365:71;24433:1;24422:9;24418:17;24409:6;24365:71;:::i;:::-;24446:72;24514:2;24503:9;24499:18;24490:6;24446:72;:::i;:::-;24565:9;24559:4;24555:20;24550:2;24539:9;24535:18;24528:48;24593:108;24696:4;24687:6;24593:108;:::i;:::-;24585:116;;24748:9;24742:4;24738:20;24733:2;24722:9;24718:18;24711:48;24776:108;24879:4;24870:6;24776:108;:::i;:::-;24768:116;;24932:9;24926:4;24922:20;24916:3;24905:9;24901:19;24894:49;24960:76;25031:4;25022:6;24960:76;:::i;:::-;24952:84;;23990:1053;;;;;;;;:::o;25049:751::-;25272:4;25310:3;25299:9;25295:19;25287:27;;25324:71;25392:1;25381:9;25377:17;25368:6;25324:71;:::i;:::-;25405:72;25473:2;25462:9;25458:18;25449:6;25405:72;:::i;:::-;25487;25555:2;25544:9;25540:18;25531:6;25487:72;:::i;:::-;25569;25637:2;25626:9;25622:18;25613:6;25569:72;:::i;:::-;25689:9;25683:4;25679:20;25673:3;25662:9;25658:19;25651:49;25717:76;25788:4;25779:6;25717:76;:::i;:::-;25709:84;;25049:751;;;;;;;;:::o;25806:373::-;25949:4;25987:2;25976:9;25972:18;25964:26;;26036:9;26030:4;26026:20;26022:1;26011:9;26007:17;26000:47;26064:108;26167:4;26158:6;26064:108;:::i;:::-;26056:116;;25806:373;;;;:::o;26185:634::-;26406:4;26444:2;26433:9;26429:18;26421:26;;26493:9;26487:4;26483:20;26479:1;26468:9;26464:17;26457:47;26521:108;26624:4;26615:6;26521:108;:::i;:::-;26513:116;;26676:9;26670:4;26666:20;26661:2;26650:9;26646:18;26639:48;26704:108;26807:4;26798:6;26704:108;:::i;:::-;26696:116;;26185:634;;;;;:::o;26825:210::-;26912:4;26950:2;26939:9;26935:18;26927:26;;26963:65;27025:1;27014:9;27010:17;27001:6;26963:65;:::i;:::-;26825:210;;;;:::o;27041:313::-;27154:4;27192:2;27181:9;27177:18;27169:26;;27241:9;27235:4;27231:20;27227:1;27216:9;27212:17;27205:47;27269:78;27342:4;27333:6;27269:78;:::i;:::-;27261:86;;27041:313;;;;:::o;27360:419::-;27526:4;27564:2;27553:9;27549:18;27541:26;;27613:9;27607:4;27603:20;27599:1;27588:9;27584:17;27577:47;27641:131;27767:4;27641:131;:::i;:::-;27633:139;;27360:419;;;:::o;27785:::-;27951:4;27989:2;27978:9;27974:18;27966:26;;28038:9;28032:4;28028:20;28024:1;28013:9;28009:17;28002:47;28066:131;28192:4;28066:131;:::i;:::-;28058:139;;27785:419;;;:::o;28210:::-;28376:4;28414:2;28403:9;28399:18;28391:26;;28463:9;28457:4;28453:20;28449:1;28438:9;28434:17;28427:47;28491:131;28617:4;28491:131;:::i;:::-;28483:139;;28210:419;;;:::o;28635:::-;28801:4;28839:2;28828:9;28824:18;28816:26;;28888:9;28882:4;28878:20;28874:1;28863:9;28859:17;28852:47;28916:131;29042:4;28916:131;:::i;:::-;28908:139;;28635:419;;;:::o;29060:::-;29226:4;29264:2;29253:9;29249:18;29241:26;;29313:9;29307:4;29303:20;29299:1;29288:9;29284:17;29277:47;29341:131;29467:4;29341:131;:::i;:::-;29333:139;;29060:419;;;:::o;29485:::-;29651:4;29689:2;29678:9;29674:18;29666:26;;29738:9;29732:4;29728:20;29724:1;29713:9;29709:17;29702:47;29766:131;29892:4;29766:131;:::i;:::-;29758:139;;29485:419;;;:::o;29910:::-;30076:4;30114:2;30103:9;30099:18;30091:26;;30163:9;30157:4;30153:20;30149:1;30138:9;30134:17;30127:47;30191:131;30317:4;30191:131;:::i;:::-;30183:139;;29910:419;;;:::o;30335:::-;30501:4;30539:2;30528:9;30524:18;30516:26;;30588:9;30582:4;30578:20;30574:1;30563:9;30559:17;30552:47;30616:131;30742:4;30616:131;:::i;:::-;30608:139;;30335:419;;;:::o;30760:::-;30926:4;30964:2;30953:9;30949:18;30941:26;;31013:9;31007:4;31003:20;30999:1;30988:9;30984:17;30977:47;31041:131;31167:4;31041:131;:::i;:::-;31033:139;;30760:419;;;:::o;31185:::-;31351:4;31389:2;31378:9;31374:18;31366:26;;31438:9;31432:4;31428:20;31424:1;31413:9;31409:17;31402:47;31466:131;31592:4;31466:131;:::i;:::-;31458:139;;31185:419;;;:::o;31610:::-;31776:4;31814:2;31803:9;31799:18;31791:26;;31863:9;31857:4;31853:20;31849:1;31838:9;31834:17;31827:47;31891:131;32017:4;31891:131;:::i;:::-;31883:139;;31610:419;;;:::o;32035:::-;32201:4;32239:2;32228:9;32224:18;32216:26;;32288:9;32282:4;32278:20;32274:1;32263:9;32259:17;32252:47;32316:131;32442:4;32316:131;:::i;:::-;32308:139;;32035:419;;;:::o;32460:::-;32626:4;32664:2;32653:9;32649:18;32641:26;;32713:9;32707:4;32703:20;32699:1;32688:9;32684:17;32677:47;32741:131;32867:4;32741:131;:::i;:::-;32733:139;;32460:419;;;:::o;32885:::-;33051:4;33089:2;33078:9;33074:18;33066:26;;33138:9;33132:4;33128:20;33124:1;33113:9;33109:17;33102:47;33166:131;33292:4;33166:131;:::i;:::-;33158:139;;32885:419;;;:::o;33310:::-;33476:4;33514:2;33503:9;33499:18;33491:26;;33563:9;33557:4;33553:20;33549:1;33538:9;33534:17;33527:47;33591:131;33717:4;33591:131;:::i;:::-;33583:139;;33310:419;;;:::o;33735:222::-;33828:4;33866:2;33855:9;33851:18;33843:26;;33879:71;33947:1;33936:9;33932:17;33923:6;33879:71;:::i;:::-;33735:222;;;;:::o;33963:332::-;34084:4;34122:2;34111:9;34107:18;34099:26;;34135:71;34203:1;34192:9;34188:17;34179:6;34135:71;:::i;:::-;34216:72;34284:2;34273:9;34269:18;34260:6;34216:72;:::i;:::-;33963:332;;;;;:::o;34301:129::-;34335:6;34362:20;;:::i;:::-;34352:30;;34391:33;34419:4;34411:6;34391:33;:::i;:::-;34301:129;;;:::o;34436:75::-;34469:6;34502:2;34496:9;34486:19;;34436:75;:::o;34517:311::-;34594:4;34684:18;34676:6;34673:30;34670:56;;;34706:18;;:::i;:::-;34670:56;34756:4;34748:6;34744:17;34736:25;;34816:4;34810;34806:15;34798:23;;34517:311;;;:::o;34834:::-;34911:4;35001:18;34993:6;34990:30;34987:56;;;35023:18;;:::i;:::-;34987:56;35073:4;35065:6;35061:17;35053:25;;35133:4;35127;35123:15;35115:23;;34834:311;;;:::o;35151:307::-;35212:4;35302:18;35294:6;35291:30;35288:56;;;35324:18;;:::i;:::-;35288:56;35362:29;35384:6;35362:29;:::i;:::-;35354:37;;35446:4;35440;35436:15;35428:23;;35151:307;;;:::o;35464:308::-;35526:4;35616:18;35608:6;35605:30;35602:56;;;35638:18;;:::i;:::-;35602:56;35676:29;35698:6;35676:29;:::i;:::-;35668:37;;35760:4;35754;35750:15;35742:23;;35464:308;;;:::o;35778:132::-;35845:4;35868:3;35860:11;;35898:4;35893:3;35889:14;35881:22;;35778:132;;;:::o;35916:114::-;35983:6;36017:5;36011:12;36001:22;;35916:114;;;:::o;36036:98::-;36087:6;36121:5;36115:12;36105:22;;36036:98;;;:::o;36140:99::-;36192:6;36226:5;36220:12;36210:22;;36140:99;;;:::o;36245:113::-;36315:4;36347;36342:3;36338:14;36330:22;;36245:113;;;:::o;36364:184::-;36463:11;36497:6;36492:3;36485:19;36537:4;36532:3;36528:14;36513:29;;36364:184;;;;:::o;36554:168::-;36637:11;36671:6;36666:3;36659:19;36711:4;36706:3;36702:14;36687:29;;36554:168;;;;:::o;36728:169::-;36812:11;36846:6;36841:3;36834:19;36886:4;36881:3;36877:14;36862:29;;36728:169;;;;:::o;36903:305::-;36943:3;36962:20;36980:1;36962:20;:::i;:::-;36957:25;;36996:20;37014:1;36996:20;:::i;:::-;36991:25;;37150:1;37082:66;37078:74;37075:1;37072:81;37069:107;;;37156:18;;:::i;:::-;37069:107;37200:1;37197;37193:9;37186:16;;36903:305;;;;:::o;37214:191::-;37254:4;37274:20;37292:1;37274:20;:::i;:::-;37269:25;;37308:20;37326:1;37308:20;:::i;:::-;37303:25;;37347:1;37344;37341:8;37338:34;;;37352:18;;:::i;:::-;37338:34;37397:1;37394;37390:9;37382:17;;37214:191;;;;:::o;37411:96::-;37448:7;37477:24;37495:5;37477:24;:::i;:::-;37466:35;;37411:96;;;:::o;37513:90::-;37547:7;37590:5;37583:13;37576:21;37565:32;;37513:90;;;:::o;37609:77::-;37646:7;37675:5;37664:16;;37609:77;;;:::o;37692:149::-;37728:7;37768:66;37761:5;37757:78;37746:89;;37692:149;;;:::o;37847:126::-;37884:7;37924:42;37917:5;37913:54;37902:65;;37847:126;;;:::o;37979:77::-;38016:7;38045:5;38034:16;;37979:77;;;:::o;38062:154::-;38146:6;38141:3;38136;38123:30;38208:1;38199:6;38194:3;38190:16;38183:27;38062:154;;;:::o;38222:307::-;38290:1;38300:113;38314:6;38311:1;38308:13;38300:113;;;38399:1;38394:3;38390:11;38384:18;38380:1;38375:3;38371:11;38364:39;38336:2;38333:1;38329:10;38324:15;;38300:113;;;38431:6;38428:1;38425:13;38422:101;;;38511:1;38502:6;38497:3;38493:16;38486:27;38422:101;38271:258;38222:307;;;:::o;38535:320::-;38579:6;38616:1;38610:4;38606:12;38596:22;;38663:1;38657:4;38653:12;38684:18;38674:81;;38740:4;38732:6;38728:17;38718:27;;38674:81;38802:2;38794:6;38791:14;38771:18;38768:38;38765:84;;;38821:18;;:::i;:::-;38765:84;38586:269;38535:320;;;:::o;38861:281::-;38944:27;38966:4;38944:27;:::i;:::-;38936:6;38932:40;39074:6;39062:10;39059:22;39038:18;39026:10;39023:34;39020:62;39017:88;;;39085:18;;:::i;:::-;39017:88;39125:10;39121:2;39114:22;38904:238;38861:281;;:::o;39148:233::-;39187:3;39210:24;39228:5;39210:24;:::i;:::-;39201:33;;39256:66;39249:5;39246:77;39243:103;;;39326:18;;:::i;:::-;39243:103;39373:1;39366:5;39362:13;39355:20;;39148:233;;;:::o;39387:100::-;39426:7;39455:26;39475:5;39455:26;:::i;:::-;39444:37;;39387:100;;;:::o;39493:94::-;39532:7;39561:20;39575:5;39561:20;:::i;:::-;39550:31;;39493:94;;;:::o;39593:180::-;39641:77;39638:1;39631:88;39738:4;39735:1;39728:15;39762:4;39759:1;39752:15;39779:180;39827:77;39824:1;39817:88;39924:4;39921:1;39914:15;39948:4;39945:1;39938:15;39965:180;40013:77;40010:1;40003:88;40110:4;40107:1;40100:15;40134:4;40131:1;40124:15;40151:180;40199:77;40196:1;40189:88;40296:4;40293:1;40286:15;40320:4;40317:1;40310:15;40337:183;40372:3;40410:1;40392:16;40389:23;40386:128;;;40448:1;40445;40442;40427:23;40470:34;40501:1;40495:8;40470:34;:::i;:::-;40463:41;;40386:128;40337:183;:::o;40526:117::-;40635:1;40632;40625:12;40649:117;40758:1;40755;40748:12;40772:117;40881:1;40878;40871:12;40895:117;41004:1;41001;40994:12;41018:117;41127:1;41124;41117:12;41141:117;41250:1;41247;41240:12;41264:102;41305:6;41356:2;41352:7;41347:2;41340:5;41336:14;41332:28;41322:38;;41264:102;;;:::o;41372:94::-;41405:8;41453:5;41449:2;41445:14;41424:35;;41372:94;;;:::o;41472:106::-;41516:8;41565:5;41560:3;41556:15;41535:36;;41472:106;;;:::o;41584:239::-;41724:34;41720:1;41712:6;41708:14;41701:58;41793:22;41788:2;41780:6;41776:15;41769:47;41584:239;:::o;41829:234::-;41969:34;41965:1;41957:6;41953:14;41946:58;42038:17;42033:2;42025:6;42021:15;42014:42;41829:234;:::o;42069:227::-;42209:34;42205:1;42197:6;42193:14;42186:58;42278:10;42273:2;42265:6;42261:15;42254:35;42069:227;:::o;42302:225::-;42442:34;42438:1;42430:6;42426:14;42419:58;42511:8;42506:2;42498:6;42494:15;42487:33;42302:225;:::o;42533:223::-;42673:34;42669:1;42661:6;42657:14;42650:58;42742:6;42737:2;42729:6;42725:15;42718:31;42533:223;:::o;42762:229::-;42902:34;42898:1;42890:6;42886:14;42879:58;42971:12;42966:2;42958:6;42954:15;42947:37;42762:229;:::o;42997:224::-;43137:34;43133:1;43125:6;43121:14;43114:58;43206:7;43201:2;43193:6;43189:15;43182:32;42997:224;:::o;43227:222::-;43367:34;43363:1;43355:6;43351:14;43344:58;43436:5;43431:2;43423:6;43419:15;43412:30;43227:222;:::o;43455:229::-;43595:34;43591:1;43583:6;43579:14;43572:58;43664:12;43659:2;43651:6;43647:15;43640:37;43455:229;:::o;43690:182::-;43830:34;43826:1;43818:6;43814:14;43807:58;43690:182;:::o;43878:227::-;44018:34;44014:1;44006:6;44002:14;43995:58;44087:10;44082:2;44074:6;44070:15;44063:35;43878:227;:::o;44111:228::-;44251:34;44247:1;44239:6;44235:14;44228:58;44320:11;44315:2;44307:6;44303:15;44296:36;44111:228;:::o;44345:::-;44485:34;44481:1;44473:6;44469:14;44462:58;44554:11;44549:2;44541:6;44537:15;44530:36;44345:228;:::o;44579:227::-;44719:34;44715:1;44707:6;44703:14;44696:58;44788:10;44783:2;44775:6;44771:15;44764:35;44579:227;:::o;44812:220::-;44952:34;44948:1;44940:6;44936:14;44929:58;45021:3;45016:2;45008:6;45004:15;44997:28;44812:220;:::o;45038:711::-;45077:3;45115:4;45097:16;45094:26;45091:39;;;45123:5;;45091:39;45152:20;;:::i;:::-;45227:1;45209:16;45205:24;45202:1;45196:4;45181:49;45260:4;45254:11;45359:16;45352:4;45344:6;45340:17;45337:39;45304:18;45296:6;45293:30;45277:113;45274:146;;;45405:5;;;;45274:146;45451:6;45445:4;45441:17;45487:3;45481:10;45514:18;45506:6;45503:30;45500:43;;;45536:5;;;;;;45500:43;45584:6;45577:4;45572:3;45568:14;45564:27;45643:1;45625:16;45621:24;45615:4;45611:35;45606:3;45603:44;45600:57;;;45650:5;;;;;;;45600:57;45667;45715:6;45709:4;45705:17;45697:6;45693:30;45687:4;45667:57;:::i;:::-;45740:3;45733:10;;45081:668;;;;;45038:711;;:::o;45755:122::-;45828:24;45846:5;45828:24;:::i;:::-;45821:5;45818:35;45808:63;;45867:1;45864;45857:12;45808:63;45755:122;:::o;45883:116::-;45953:21;45968:5;45953:21;:::i;:::-;45946:5;45943:32;45933:60;;45989:1;45986;45979:12;45933:60;45883:116;:::o;46005:122::-;46078:24;46096:5;46078:24;:::i;:::-;46071:5;46068:35;46058:63;;46117:1;46114;46107:12;46058:63;46005:122;:::o;46133:120::-;46205:23;46222:5;46205:23;:::i;:::-;46198:5;46195:34;46185:62;;46243:1;46240;46233:12;46185:62;46133:120;:::o;46259:122::-;46332:24;46350:5;46332:24;:::i;:::-;46325:5;46322:35;46312:63;;46371:1;46368;46361:12;46312:63;46259:122;:::o

Swarm Source

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