ETH Price: $3,463.94 (-1.50%)
Gas: 4 Gwei

Token

TheDivergents (DVRG)
 

Overview

Max Total Supply

1,762 DVRG

Holders

410

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
2 DVRG
0xc56679F316A6e181b58a856C56661c1D4906b840
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:
Divergents

Compiler Version
v0.8.12+commit.f00d7308

Optimization Enabled:
Yes with 200 runs

Other Settings:
default evmVersion, Unlicense license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-02-22
*/

// File: @openzeppelin/contracts/utils/cryptography/MerkleProof.sol


// OpenZeppelin Contracts (last updated v4.5.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.
 */
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 Merklee 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++) {
            bytes32 proofElement = proof[i];
            if (computedHash <= proofElement) {
                // Hash(current computed hash + current element of the proof)
                computedHash = _efficientHash(computedHash, proofElement);
            } else {
                // Hash(current element of the proof + current computed hash)
                computedHash = _efficientHash(proofElement, computedHash);
            }
        }
        return computedHash;
    }

    function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {
        assembly {
            mstore(0x00, a)
            mstore(0x20, b)
            value := keccak256(0x00, 0x40)
        }
    }
}

// File: @openzeppelin/contracts/security/ReentrancyGuard.sol


// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

    /**
     * @dev Prevents a contract from calling itself, directly or indirectly.
     * Calling a `nonReentrant` function from another `nonReentrant`
     * function is not supported. It is possible to prevent this from happening
     * by making the `nonReentrant` function external, and making it call a
     * `private` function that does the actual work.
     */
    modifier nonReentrant() {
        // On the first call to nonReentrant, _notEntered will be true
        require(_status != _ENTERED, "ReentrancyGuard: reentrant call");

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

        _;

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

// File: @openzeppelin/contracts/utils/Strings.sol


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

pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/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: @openzeppelin/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: @openzeppelin/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

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

// File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

// File: @openzeppelin/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: @openzeppelin/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: @openzeppelin/contracts/token/ERC721/IERC721.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


/**
 * @dev Required interface of an ERC721 compliant contract.
 */
interface IERC721 is IERC165 {
    /**
     * @dev Emitted when `tokenId` token is transferred from `from` to `to`.
     */
    event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.
     */
    event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);

    /**
     * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.
     */
    event ApprovalForAll(address indexed owner, address indexed operator, bool approved);

    /**
     * @dev Returns the number of tokens in ``owner``'s account.
     */
    function balanceOf(address owner) external view returns (uint256 balance);

    /**
     * @dev Returns the owner of the `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function ownerOf(uint256 tokenId) external view returns (address owner);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Transfers `tokenId` token from `from` to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     *
     * Emits a {Transfer} event.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) external;

    /**
     * @dev Gives permission to `to` to transfer `tokenId` token to another account.
     * The approval is cleared when the token is transferred.
     *
     * Only a single account can be approved at a time, so approving the zero address clears previous approvals.
     *
     * Requirements:
     *
     * - The caller must own the token or be an approved operator.
     * - `tokenId` must exist.
     *
     * Emits an {Approval} event.
     */
    function approve(address to, uint256 tokenId) external;

    /**
     * @dev Returns the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

    /**
     * @dev Approve or remove `operator` as an operator for the caller.
     * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.
     *
     * Requirements:
     *
     * - The `operator` cannot be the caller.
     *
     * Emits an {ApprovalForAll} event.
     */
    function setApprovalForAll(address operator, bool _approved) external;

    /**
     * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.
     *
     * See {setApprovalForAll}
     */
    function isApprovedForAll(address owner, address operator) external view returns (bool);

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes calldata data
    ) external;
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {
    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256);

    /**
     * @dev Returns a token ID at a given `index` of all the tokens stored by the contract.
     * Use along with {totalSupply} to enumerate all tokens.
     */
    function tokenByIndex(uint256 index) external view returns (uint256);
}

// File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol


// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional metadata extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Metadata is IERC721 {
    /**
     * @dev Returns the token collection name.
     */
    function name() external view returns (string memory);

    /**
     * @dev Returns the token collection symbol.
     */
    function symbol() external view returns (string memory);

    /**
     * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.
     */
    function tokenURI(uint256 tokenId) external view returns (string memory);
}

// File: contracts/ERC721A.sol



pragma solidity ^0.8.0;









/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata and Enumerable extension. Built to optimize for lower gas during batch mints.
 *
 * Assumes serials are sequentially minted starting at 0 (e.g. 0, 1, 2, 3..).
 *
 * Assumes the number of issuable tokens (collection size) is capped and fits in a uint128.
 *
 * Does not support burning tokens to address(0).
 */
contract ERC721A is
  Context,
  ERC165,
  IERC721,
  IERC721Metadata,
  IERC721Enumerable
{
  using Address for address;
  using Strings for uint256;

  struct TokenOwnership {
    address addr;
    uint64 startTimestamp;
  }

  struct AddressData {
    uint128 balance;
    uint128 numberMinted;
  }

  uint256 private currentIndex = 0;

  uint256 internal immutable collectionSize;
  uint256 internal immutable maxBatchSize;

  // Token name
  string private _name;

  // Token symbol
  string private _symbol;

  // Mapping from token ID to ownership details
  // An empty struct value does not necessarily mean the token is unowned. See ownershipOf implementation for details.
  mapping(uint256 => TokenOwnership) private _ownerships;

  // Mapping owner address to address data
  mapping(address => AddressData) private _addressData;

  // Mapping from token ID to approved address
  mapping(uint256 => address) private _tokenApprovals;

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

  /**
   * @dev
   * `maxBatchSize` refers to how much a minter can mint at a time.
   * `collectionSize_` refers to how many tokens are in the collection.
   */
  constructor(
    string memory name_,
    string memory symbol_,
    uint256 maxBatchSize_,
    uint256 collectionSize_
  ) {
    require(
      collectionSize_ > 0,
      "ERC721A: collection must have a nonzero supply"
    );
    require(maxBatchSize_ > 0, "ERC721A: max batch size must be nonzero");
    _name = name_;
    _symbol = symbol_;
    maxBatchSize = maxBatchSize_;
    collectionSize = collectionSize_;
  }

  /**
   * @dev See {IERC721Enumerable-totalSupply}.
   */
  function totalSupply() public view override returns (uint256) {
    return currentIndex;
  }

  /**
   * @dev See {IERC721Enumerable-tokenByIndex}.
   */
  function tokenByIndex(uint256 index) public view override returns (uint256) {
    require(index < totalSupply(), "ERC721A: global index out of bounds");
    return index;
  }

  /**
   * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
   * This read function is O(collectionSize). If calling from a separate contract, be sure to test gas first.
   * It may also degrade with extremely large collection sizes (e.g >> 10000), test for your use case.
   */
  function tokenOfOwnerByIndex(address owner, uint256 index)
    public
    view
    override
    returns (uint256)
  {
    require(index < balanceOf(owner), "ERC721A: owner index out of bounds");
    uint256 numMintedSoFar = totalSupply();
    uint256 tokenIdsIdx = 0;
    address currOwnershipAddr = address(0);
    for (uint256 i = 0; i < numMintedSoFar; i++) {
      TokenOwnership memory ownership = _ownerships[i];
      if (ownership.addr != address(0)) {
        currOwnershipAddr = ownership.addr;
      }
      if (currOwnershipAddr == owner) {
        if (tokenIdsIdx == index) {
          return i;
        }
        tokenIdsIdx++;
      }
    }
    revert("ERC721A: unable to get token of owner by index");
  }

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

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

  function _numberMinted(address owner) internal view returns (uint256) {
    require(
      owner != address(0),
      "ERC721A: number minted query for the zero address"
    );
    return uint256(_addressData[owner].numberMinted);
  }

  function ownershipOf(uint256 tokenId)
    internal
    view
    returns (TokenOwnership memory)
  {
    require(_exists(tokenId), "ERC721A: owner query for nonexistent token");

    uint256 lowestTokenToCheck;
    if (tokenId >= maxBatchSize) {
      lowestTokenToCheck = tokenId - maxBatchSize + 1;
    }

    for (uint256 curr = tokenId; curr >= lowestTokenToCheck; curr--) {
      TokenOwnership memory ownership = _ownerships[curr];
      if (ownership.addr != address(0)) {
        return ownership;
      }
    }

    revert("ERC721A: unable to determine the owner of token");
  }

  /**
   * @dev See {IERC721-ownerOf}.
   */
  function ownerOf(uint256 tokenId) public view override returns (address) {
    return ownershipOf(tokenId).addr;
  }

  /**
   * @dev See {IERC721Metadata-name}.
   */
  function name() public view virtual override returns (string memory) {
    return _name;
  }

  /**
   * @dev See {IERC721Metadata-symbol}.
   */
  function symbol() public view virtual override returns (string memory) {
    return _symbol;
  }

  /**
   * @dev See {IERC721Metadata-tokenURI}.
   */
  function tokenURI(uint256 tokenId)
    public
    view
    virtual
    override
    returns (string memory)
  {
    require(
      _exists(tokenId),
      "ERC721Metadata: URI query for nonexistent token"
    );

    string memory baseURI = _baseURI();
    return
      bytes(baseURI).length > 0
        ? string(abi.encodePacked(baseURI, tokenId.toString()))
        : "";
  }

  /**
   * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each
   * token will be the concatenation of the `baseURI` and the `tokenId`. Empty
   * by default, can be overriden in child contracts.
   */
  function _baseURI() internal view virtual returns (string memory) {
    return "";
  }

  /**
   * @dev See {IERC721-approve}.
   */
  function approve(address to, uint256 tokenId) public override {
    address owner = ERC721A.ownerOf(tokenId);
    require(to != owner, "ERC721A: approval to current owner");

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

    _approve(to, tokenId, owner);
  }

  /**
   * @dev See {IERC721-getApproved}.
   */
  function getApproved(uint256 tokenId) public view override returns (address) {
    require(_exists(tokenId), "ERC721A: approved query for nonexistent token");

    return _tokenApprovals[tokenId];
  }

  /**
   * @dev See {IERC721-setApprovalForAll}.
   */
  function setApprovalForAll(address operator, bool approved) public override {
    require(operator != _msgSender(), "ERC721A: approve to caller");

    _operatorApprovals[_msgSender()][operator] = approved;
    emit ApprovalForAll(_msgSender(), operator, approved);
  }

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

  /**
   * @dev See {IERC721-transferFrom}.
   */
  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public override {
    _transfer(from, to, tokenId);
  }

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

  /**
   * @dev See {IERC721-safeTransferFrom}.
   */
  function safeTransferFrom(
    address from,
    address to,
    uint256 tokenId,
    bytes memory _data
  ) public override {
    _transfer(from, to, tokenId);
    require(
      _checkOnERC721Received(from, to, tokenId, _data),
      "ERC721A: transfer to non ERC721Receiver implementer"
    );
  }

  /**
   * @dev Returns whether `tokenId` exists.
   *
   * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
   *
   * Tokens start existing when they are minted (`_mint`),
   */
  function _exists(uint256 tokenId) internal view returns (bool) {
    return tokenId < currentIndex;
  }

  function _safeMint(address to, uint256 quantity) internal {
    _safeMint(to, quantity, "");
  }

  /**
   * @dev Mints `quantity` tokens and transfers them to `to`.
   *
   * Requirements:
   *
   * - there must be `quantity` tokens remaining unminted in the total collection.
   * - `to` cannot be the zero address.
   * - `quantity` cannot be larger than the max batch size.
   *
   * Emits a {Transfer} event.
   */
  function _safeMint(
    address to,
    uint256 quantity,
    bytes memory _data
  ) internal {
    uint256 startTokenId = currentIndex;
    require(to != address(0), "ERC721A: mint to the zero address");
    // We know if the first token in the batch doesn't exist, the other ones don't as well, because of serial ordering.
    require(!_exists(startTokenId), "ERC721A: token already minted");
    require(quantity <= maxBatchSize, "ERC721A: quantity to mint too high");

    _beforeTokenTransfers(address(0), to, startTokenId, quantity);

    AddressData memory addressData = _addressData[to];
    _addressData[to] = AddressData(
      addressData.balance + uint128(quantity),
      addressData.numberMinted + uint128(quantity)
    );
    _ownerships[startTokenId] = TokenOwnership(to, uint64(block.timestamp));

    uint256 updatedIndex = startTokenId;

    for (uint256 i = 0; i < quantity; i++) {
      emit Transfer(address(0), to, updatedIndex);
      require(
        _checkOnERC721Received(address(0), to, updatedIndex, _data),
        "ERC721A: transfer to non ERC721Receiver implementer"
      );
      updatedIndex++;
    }

    currentIndex = updatedIndex;
    _afterTokenTransfers(address(0), to, startTokenId, quantity);
  }

  /**
   * @dev Transfers `tokenId` from `from` to `to`.
   *
   * Requirements:
   *
   * - `to` cannot be the zero address.
   * - `tokenId` token must be owned by `from`.
   *
   * Emits a {Transfer} event.
   */
  function _transfer(
    address from,
    address to,
    uint256 tokenId
  ) private {
    TokenOwnership memory prevOwnership = ownershipOf(tokenId);

    bool isApprovedOrOwner = (_msgSender() == prevOwnership.addr ||
      getApproved(tokenId) == _msgSender() ||
      isApprovedForAll(prevOwnership.addr, _msgSender()));

    require(
      isApprovedOrOwner,
      "ERC721A: transfer caller is not owner nor approved"
    );

    require(
      prevOwnership.addr == from,
      "ERC721A: transfer from incorrect owner"
    );
    require(to != address(0), "ERC721A: transfer to the zero address");

    _beforeTokenTransfers(from, to, tokenId, 1);

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

    _addressData[from].balance -= 1;
    _addressData[to].balance += 1;
    _ownerships[tokenId] = TokenOwnership(to, uint64(block.timestamp));

    // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.
    // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.
    uint256 nextTokenId = tokenId + 1;
    if (_ownerships[nextTokenId].addr == address(0)) {
      if (_exists(nextTokenId)) {
        _ownerships[nextTokenId] = TokenOwnership(
          prevOwnership.addr,
          prevOwnership.startTimestamp
        );
      }
    }

    emit Transfer(from, to, tokenId);
    _afterTokenTransfers(from, to, tokenId, 1);
  }

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

  uint256 public nextOwnerToExplicitlySet = 0;

  /**
   * @dev Explicitly set `owners` to eliminate loops in future calls of ownerOf().
   */
  function _setOwnersExplicit(uint256 quantity) internal {
    uint256 oldNextOwnerToSet = nextOwnerToExplicitlySet;
    require(quantity > 0, "quantity must be nonzero");
    uint256 endIndex = oldNextOwnerToSet + quantity - 1;
    if (endIndex > collectionSize - 1) {
      endIndex = collectionSize - 1;
    }
    // We know if the last one in the group exists, all in the group exist, due to serial ordering.
    require(_exists(endIndex), "not enough minted yet for this cleanup");
    for (uint256 i = oldNextOwnerToSet; i <= endIndex; i++) {
      if (_ownerships[i].addr == address(0)) {
        TokenOwnership memory ownership = ownershipOf(i);
        _ownerships[i] = TokenOwnership(
          ownership.addr,
          ownership.startTimestamp
        );
      }
    }
    nextOwnerToExplicitlySet = endIndex + 1;
  }

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

  /**
   * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
   * transferred to `to`.
   * - When `from` is zero, `tokenId` will be minted for `to`.
   */
  function _beforeTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}

  /**
   * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes
   * minting.
   *
   * startTokenId - the first token id to be transferred
   * quantity - the amount to be transferred
   *
   * Calling conditions:
   *
   * - when `from` and `to` are both non-zero.
   * - `from` and `to` are never both zero.
   */
  function _afterTokenTransfers(
    address from,
    address to,
    uint256 startTokenId,
    uint256 quantity
  ) internal virtual {}
}
// File: contracts/Divergents.sol



// WAGMI

pragma solidity ^0.8.4;






contract Divergents is ERC721A, Ownable, ReentrancyGuard {


    // metadata URI
    string private _baseTokenURI;
    string private _contractMetadataURI;

    //Tracked Variables
    bool public isPublicSaleOpen;
    bool public isWhitelistSaleOpen;

    // Approved Minters
    mapping(address => bool) public approvedTeamMinters;
    // mapping(address => uint) public approvedGuruMinters;

    // Whitelist Merkle
    bytes32 public merkleRoot;

    // payable wallet addresses
    address payable private _divergentsAddress;
    address payable private _devAddress;

    uint public discountedMints = 100;
    uint public discountedMintPrice = 80000000 gwei;
    uint public mintPrice = 100000000 gwei;
    uint private constant PAYMENT_GAS_LIMIT = 5000;
    uint private constant MAX_MINT = 2000; // Maximum that can be minted for sale (not including Guru mints)
    uint public constant MAX_PER_ORDER_SALE_MINT = 10;
    uint public constant MAX_PER_WALLET_WHITELIST_MINT = 3;
    mapping (address => uint) public totalMintedByAddress;
    uint public maxSupplyInSaleWave = 500;



    // Getter Functions
    function _baseURI() internal view virtual override returns (string memory) {
        return _baseTokenURI;
    }

    function numberMinted(address owner) public view returns (uint256) {
        return _numberMinted(owner);
    }

    function getOwnershipData(uint256 tokenId) public view returns (TokenOwnership memory) {
        return ownershipOf(tokenId);
    }

    function contractURI() public view returns (string memory) {
        return _contractMetadataURI;
    }

    function charactersRemaining() public view returns (uint16[10] memory) {
        return divergentCharacters;
    }



    // Setter functions (all must be onlyowner)

    function setBaseURI(string calldata baseURI) external onlyOwner {
        _baseTokenURI = baseURI;
    }

    function setContractMetadataURI(string memory contractMetadataURI) external onlyOwner {
        _contractMetadataURI = contractMetadataURI;
    }

    function setOwnersExplicit(uint256 quantity) external onlyOwner {
        _setOwnersExplicit(quantity);
    }

    function setIsPublicSaleOpen(bool locked) external onlyOwner {
        isPublicSaleOpen = locked;
    }

    function setIsWhitelistSaleOpen(bool locked) external onlyOwner {
        isWhitelistSaleOpen = locked;
    }

    function addToApprovedTeamMinters(address[] memory add) external onlyOwner {
        for (uint i = 0; i < add.length; i++) {
            approvedTeamMinters[add[i]] = true;
        }
    }

    function setMerkleRoot(bytes32 _merkleRoot) external onlyOwner {
        merkleRoot = _merkleRoot;
    }

    function setPayableAddresses(address payable divergentsAddress, address payable devAddress) external onlyOwner {
        _divergentsAddress = divergentsAddress;
        _devAddress = devAddress;
    }

    function setMintPrice (uint mintPriceInWei) external onlyOwner {
        mintPrice = mintPriceInWei;
    }

    function setDiscountedMintPrice (uint discMintPriceInWei) external onlyOwner {
        discountedMintPrice = discMintPriceInWei;
    }

    function setMaxSupplyInSaleWave (uint increaseWave) external onlyOwner {
        maxSupplyInSaleWave = increaseWave;
    }



    //Constructor
    constructor() ERC721A("TheDivergents", "DVRG", 25, 2022) {
        _baseTokenURI = "https://api.thedivergents.io/";
        _contractMetadataURI = "ipfs://QmUmQW3n8k79dEd4Wtjx1ujjdx1WB2dcoifnCDyu8v21hh";

    }



    // Characters Tracker
    uint16[10] public divergentCharacters = [200,200,200,200,200,200,200,200,200,200];
    uint public divergentGuru = 22;
    uint private reservedMint = 200;


    // Helper functions
    // Sum of arrays
    function sumOfArray (uint[10] memory array) internal pure returns (uint sum) { 
        for(uint i = 0; i < array.length; i++) {
            sum = sum + array[i];
        }
    }

    // Generate Merkle Leaf (to verify whitelisted address)
    function generateMerkleLeaf (address account) internal pure returns (bytes32) {
        return keccak256(abi.encodePacked(account));
    }

    // Calculate amount that needs to be paid
    function totalPaymentRequired (uint amountMinted) internal returns (uint) {
        uint discountedMintsRemaining = discountedMints;
        uint totalPrice;
        
        if(discountedMintsRemaining == 0) {
            totalPrice = amountMinted * mintPrice;
        } else if (discountedMintsRemaining >= amountMinted) { 
            totalPrice = amountMinted * discountedMintPrice;
            discountedMintsRemaining -= amountMinted; 
        } else {
            totalPrice = (discountedMintsRemaining * discountedMintPrice) + ((amountMinted-discountedMintsRemaining) * mintPrice);
            discountedMintsRemaining = 0;
        }

        discountedMints = discountedMintsRemaining;
        return totalPrice;
    }

    // Mint event - this is used to emit event indicating mint and what is minted
    event Minted (uint[10] charactersMinted, address receiver);
    event GuruMinted (uint totalGuruMinted, address receiver);

    // promoMultiMint - this mint is for marketing ,etc, minted directly to the wallet of the recepient
    // for each item, a random character is chosen and minted. Max inclusing team mint is 200 (tracking reserved mint)
    // only approved wallets
    function promoMultiMint (address receiver, uint quantity) public nonReentrant {
        require(approvedTeamMinters[msg.sender], "Minter not approved");
        require(reservedMint > 0, "No reserved mint remaining");

        uint16[10] memory characterTracker = divergentCharacters;
        uint[10] memory mintedCharacters;

        for (uint i= 0; i < quantity; i++ ){
            bytes32 newRandomSelection = keccak256(abi.encodePacked(block.difficulty, block.coinbase, i));
            uint pickCharacter = uint(newRandomSelection)%10;
            mintedCharacters[pickCharacter] += 1;
            characterTracker[pickCharacter] -= 1;
        }

        _safeMint(receiver, quantity);

        divergentCharacters = characterTracker;

        reservedMint -= quantity;

        emit Minted(mintedCharacters, receiver);

    }

    // promoMint
    function promoMint (address[] calldata receiver) public nonReentrant {
        require(approvedTeamMinters[msg.sender], "Minter not approved");
        require(reservedMint > 0, "No reserved mint remaining");

        uint16[10] memory characterTracker = divergentCharacters;
        

        for (uint i = 0; i < receiver.length; i++) {
            bytes32 newRandomSelection = keccak256(abi.encodePacked(block.difficulty, block.coinbase, i));
            uint pickCharacter = uint(newRandomSelection)%10;
            uint[10] memory mintedCharacters;
            mintedCharacters[pickCharacter] += 1;
            characterTracker[pickCharacter] -= 1;

            _safeMint(receiver[i], 1);

            emit Minted(mintedCharacters, receiver[i]);
        }

        divergentCharacters = characterTracker;

        reservedMint -= receiver.length;

    }


    //Guru minting
    function guruMint(address receiver, uint quantity) public nonReentrant {
        require(approvedTeamMinters[msg.sender], "Minter not approved");
        require(divergentGuru >= quantity, "Insufficient remaining Guru");

        // Mint
        _safeMint(msg.sender, quantity);

        // Net off against guruminted
        divergentGuru -= quantity;

        // emit event
        emit GuruMinted(quantity, receiver);

    }


    // whitelist mint

    function whitelistMint (uint[10] calldata mintList, bytes32[] calldata proof) public payable nonReentrant {
        require (isWhitelistSaleOpen, "WL sale not open");
        uint currentTotalSupply = totalSupply();
        require (currentTotalSupply < maxSupplyInSaleWave, "Sale wave filled");
        require (MerkleProof.verify(proof, merkleRoot, generateMerkleLeaf(msg.sender)), "User not in WL");
        uint totalRequested = sumOfArray(mintList);
        require ((totalMintedByAddress[msg.sender] + totalRequested) <= MAX_PER_WALLET_WHITELIST_MINT, "Insufficient WL allocation");
        require (msg.value >= (totalRequested * mintPrice), "Insufficient payment");
        require (currentTotalSupply < MAX_MINT, "Sold Out" );

        uint16[10] memory characterTracker = divergentCharacters;
        uint[10] memory mintedCharacters;

        for (uint i = 0; i < 10; i++) {
            
            if (mintList[i] != 0) {
                if(characterTracker[i] != 0){
                    if (characterTracker[i] >= mintList[i]) {
                        mintedCharacters[i] += mintList[i];
                        characterTracker[i] -= uint16(mintList[i]);

                    } else { 
                        mintedCharacters[i] += uint(characterTracker[i]);
                        characterTracker[i] -= characterTracker[i];
                    }

                }
            }
        }

        uint totalMinted = sumOfArray(mintedCharacters);
        require (totalMinted != 0, "No items to be minted");

        // Calculate how much to charge
        uint paymentRequired = totalPaymentRequired(totalMinted);

        _safeMint(msg.sender, totalMinted); // Only after all calculations

        // Pay
        // calculate amounts to transfer
        uint devAmount = (paymentRequired / 10000) * 1600;
        uint divergentsAmount = paymentRequired - devAmount;
        
        // transfer amounts to dev wallet
        (bool devSuccess, ) = _devAddress.call{ value:devAmount, gas: PAYMENT_GAS_LIMIT }("");
        require(devSuccess, "Dev payment failed");
        
        // transfer amounts to divergents wallet
        (bool divergentsSuccess, ) = _divergentsAddress.call{ value:divergentsAmount, gas: PAYMENT_GAS_LIMIT }("");
        require(divergentsSuccess, "Divergents payment failed");

        // Return any unneeded sum
        if (msg.value - paymentRequired > 0) {
            uint returnValue = msg.value - paymentRequired;
            (bool returnSuccess, ) = msg.sender.call{ value:returnValue, gas: PAYMENT_GAS_LIMIT }("");
            require(returnSuccess, "Return payment failed");
        }

        // Add to totalMintedByAddress
        totalMintedByAddress[msg.sender] += totalMinted;

        // Update divergentCharacters
        divergentCharacters = characterTracker;

        // Emit minted items
        emit Minted(mintedCharacters, msg.sender);
    }

    // Public Sale mint
    function saleMint (uint[10] calldata mintList) public payable nonReentrant {
        require(isPublicSaleOpen, "Public sale not open");
        uint currentTotalSupply = totalSupply();
        require (currentTotalSupply < maxSupplyInSaleWave, "Sale wave filled");
        uint totalRequested = sumOfArray(mintList);
        require(msg.value >= totalRequested * mintPrice, "Insufficient payment");
        require(totalRequested <= MAX_PER_ORDER_SALE_MINT, "Max purchase limit");
        require(currentTotalSupply < MAX_MINT, "Sold Out");

        uint16[10] memory characterTracker = divergentCharacters;
        uint[10] memory mintedCharacters;

        for (uint i = 0; i < 10; i++) {
            
            if (mintList[i] != 0) {
                if(characterTracker[i] != 0){
                    if (characterTracker[i] >= mintList[i]) {
                        mintedCharacters[i] += mintList[i];
                        characterTracker[i] -= uint16(mintList[i]);

                    } else { 
                        mintedCharacters[i] += uint(characterTracker[i]);
                        characterTracker[i] -= characterTracker[i];
                    }

                }
            }
        }

        uint totalMinted = sumOfArray(mintedCharacters);
        require (totalMinted != 0, "No items to be minted");

        // Calculate how much to charge
        uint paymentRequired = totalPaymentRequired(totalMinted);

        _safeMint(msg.sender, totalMinted); // Only after all calculations

        // Pay
        // calculate amounts to transfer
        uint devAmount = (paymentRequired / 10000) * 1600;
        uint divergentsAmount = paymentRequired - devAmount;
        
        // transfer amounts to dev wallet
        (bool devSuccess, ) = _devAddress.call{ value:devAmount, gas: PAYMENT_GAS_LIMIT }("");
        require(devSuccess, "Dev payment failed");
        
        // transfer amounts to divergents wallet
        (bool divergentsSuccess, ) = _divergentsAddress.call{ value:divergentsAmount, gas: PAYMENT_GAS_LIMIT }("");
        require(divergentsSuccess, "Divergents payment failed");

        // Return any unneeded sum
        if (msg.value - paymentRequired > 0) {
            uint returnValue = msg.value - paymentRequired;
            (bool returnSuccess, ) = msg.sender.call{ value:returnValue, gas: PAYMENT_GAS_LIMIT }("");
            require(returnSuccess, "Return payment failed");
        }

        // Add to totalMintedByAddress
        totalMintedByAddress[msg.sender] += totalMinted;

        // Update divergentCharacters
        divergentCharacters = characterTracker;

        // Emit minted items
        emit Minted(mintedCharacters, msg.sender);

    }

   

}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"totalGuruMinted","type":"uint256"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"GuruMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256[10]","name":"charactersMinted","type":"uint256[10]"},{"indexed":false,"internalType":"address","name":"receiver","type":"address"}],"name":"Minted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_ORDER_SALE_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_PER_WALLET_WHITELIST_MINT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"add","type":"address[]"}],"name":"addToApprovedTeamMinters","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"approvedTeamMinters","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"charactersRemaining","outputs":[{"internalType":"uint16[10]","name":"","type":"uint16[10]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"discountedMintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"discountedMints","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"divergentCharacters","outputs":[{"internalType":"uint16","name":"","type":"uint16"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"divergentGuru","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getOwnershipData","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"}],"internalType":"struct ERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"guruMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isWhitelistSaleOpen","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"maxSupplyInSaleWave","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"merkleRoot","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintPrice","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"nextOwnerToExplicitlySet","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"numberMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"receiver","type":"address[]"}],"name":"promoMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"promoMultiMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[10]","name":"mintList","type":"uint256[10]"}],"name":"saleMint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"contractMetadataURI","type":"string"}],"name":"setContractMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"discMintPriceInWei","type":"uint256"}],"name":"setDiscountedMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"locked","type":"bool"}],"name":"setIsPublicSaleOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"locked","type":"bool"}],"name":"setIsWhitelistSaleOpen","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"increaseWave","type":"uint256"}],"name":"setMaxSupplyInSaleWave","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"_merkleRoot","type":"bytes32"}],"name":"setMerkleRoot","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"mintPriceInWei","type":"uint256"}],"name":"setMintPrice","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"quantity","type":"uint256"}],"name":"setOwnersExplicit","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address payable","name":"divergentsAddress","type":"address"},{"internalType":"address payable","name":"devAddress","type":"address"}],"name":"setPayableAddresses","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"totalMintedByAddress","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256[10]","name":"mintList","type":"uint256[10]"},{"internalType":"bytes32[]","name":"proof","type":"bytes32[]"}],"name":"whitelistMint","outputs":[],"stateMutability":"payable","type":"function"}]

6000808055600755606460115567011c37937e08000060125567016345785d8a00006013556101f460155561020060405260c860c081815260e08290526101008290526101208290526101408290526101608290526101808290526101a08290526101c08290526101e0919091526200007d90601690600a620002c5565b50601660175560c86018553480156200009557600080fd5b506040518060400160405280600d81526020016c546865446976657267656e747360981b815250604051806040016040528060048152602001634456524760e01b81525060196107e6600081116200014b5760405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20636f6c6c656374696f6e206d757374206861766520612060448201526d6e6f6e7a65726f20737570706c7960901b60648201526084015b60405180910390fd5b60008211620001ad5760405162461bcd60e51b815260206004820152602760248201527f455243373231413a206d61782062617463682073697a65206d757374206265206044820152666e6f6e7a65726f60c81b606482015260840162000142565b8351620001c290600190602087019062000361565b508251620001d890600290602086019062000361565b5060a09190915260805250620001f090503362000273565b600160095560408051808201909152601d8082527f68747470733a2f2f6170692e746865646976657267656e74732e696f2f00000060209092019182526200023b91600a9162000361565b50604051806060016040528060358152602001620047936035913980516200026c91600b9160209091019062000361565b5062000432565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b6001830191839082156200034f5791602002820160005b838211156200031d57835183826101000a81548161ffff021916908360ff1602179055509260200192600201602081600101049283019260010302620002dc565b80156200034d5782816101000a81549061ffff02191690556002016020816001010492830192600103026200031d565b505b506200035d929150620003de565b5090565b8280546200036f90620003f5565b90600052602060002090601f0160209004810192826200039357600085556200034f565b82601f10620003ae57805160ff19168380011785556200034f565b828001600101855582156200034f579182015b828111156200034f578251825591602001919060010190620003c1565b5b808211156200035d5760008155600101620003df565b600181811c908216806200040a57607f821691505b602082108114156200042c57634e487b7160e01b600052602260045260246000fd5b50919050565b60805160a0516143266200046d600039600081816130b4015281816130de0152613607015260008181612dba0152612dec01526143266000f3fe60806040526004361061031a5760003560e01c8063903f16a3116101ab578063bc57d223116100f7578063e7755f0511610095578063eb25f1251161006f578063eb25f12514610962578063f1e3e60614610977578063f2fde38b14610997578063f4a0a528146109b757600080fd5b8063e7755f05146108e4578063e8a3d48514610904578063e985e9c51461091957600080fd5b8063d7224ba0116100d1578063d7224ba01461086f578063dc12bbf714610885578063dc33e681146108a4578063dc38882e146108c457600080fd5b8063bc57d223146107fd578063c87b56dd1461082d578063d6c4f4c01461084d57600080fd5b8063a22cb46511610164578063b2d7ed0c1161013e578063b2d7ed0c1461076a578063b3f9da091461078a578063b6d18c67146107bd578063b88d4fde146107dd57600080fd5b8063a22cb46514610714578063ac3d490314610734578063ad2bd70c1461075457600080fd5b8063903f16a31461063c5780639231ab2a1461065257806395d89b411461069f57806397b5aaee146106b457806397cf84fc146106c7578063a201fc50146106f457600080fd5b806342842e0e1161026a5780636817c76c11610223578063715018a6116101fd578063715018a6146105c95780637ba506f1146105de5780637cb64759146105fe5780638da5cb5b1461061e57600080fd5b80636817c76c146105735780636d1a13081461058957806370a08231146105a957600080fd5b806342842e0e146104c75780634f6ccce7146104e757806355f804b31461050757806358eda0f1146105275780635f61f11a1461053d5780636352211e1461055357600080fd5b80631aa1a460116102d75780632eb4a7ab116102b15780632eb4a7ab1461045e5780632f148bfe146104745780632f745c5914610487578063355b14cd146104a757600080fd5b80631aa1a4601461040957806323b872dd1461041e5780632d20fb601461043e57600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae57806318160ddd146103d05780631a6949e3146103ef575b600080fd5b34801561032b57600080fd5b5061033f61033a3660046139e8565b6109d7565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b50610369610a44565b60405161034b9190613a5d565b34801561038257600080fd5b50610396610391366004613a70565b610ad6565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c9366004613a9e565b610b66565b005b3480156103dc57600080fd5b506000545b60405190815260200161034b565b3480156103fb57600080fd5b50600c5461033f9060ff1681565b34801561041557600080fd5b506103e1600381565b34801561042a57600080fd5b506103ce610439366004613aca565b610c7e565b34801561044a57600080fd5b506103ce610459366004613a70565b610c89565b34801561046a57600080fd5b506103e1600e5481565b6103ce610482366004613b68565b610cbf565b34801561049357600080fd5b506103e16104a2366004613a9e565b611451565b3480156104b357600080fd5b506103ce6104c2366004613a70565b6115be565b3480156104d357600080fd5b506103ce6104e2366004613aca565b6115ed565b3480156104f357600080fd5b506103e1610502366004613a70565b611608565b34801561051357600080fd5b506103ce610522366004613bbd565b61166a565b34801561053357600080fd5b506103e160175481565b34801561054957600080fd5b506103e160115481565b34801561055f57600080fd5b5061039661056e366004613a70565b6116a0565b34801561057f57600080fd5b506103e160135481565b34801561059557600080fd5b506103ce6105a4366004613c43565b6116b2565b3480156105b557600080fd5b506103e16105c4366004613c5e565b6116f6565b3480156105d557600080fd5b506103ce611787565b3480156105ea57600080fd5b506103ce6105f9366004613a9e565b6117bd565b34801561060a57600080fd5b506103ce610619366004613a70565b6119ed565b34801561062a57600080fd5b506008546001600160a01b0316610396565b34801561064857600080fd5b506103e160125481565b34801561065e57600080fd5b5061067261066d366004613a70565b611a1c565b6040805182516001600160a01b031681526020928301516001600160401b0316928101929092520161034b565b3480156106ab57600080fd5b50610369611a39565b6103ce6106c2366004613c7b565b611a48565b3480156106d357600080fd5b506103e16106e2366004613c5e565b60146020526000908152604090205481565b34801561070057600080fd5b506103ce61070f366004613d35565b612101565b34801561072057600080fd5b506103ce61072f366004613d7d565b612142565b34801561074057600080fd5b506103ce61074f366004613db2565b612207565b34801561076057600080fd5b506103e160155481565b34801561077657600080fd5b506103ce610785366004613df3565b612485565b34801561079657600080fd5b506107aa6107a5366004613a70565b6124dd565b60405161ffff909116815260200161034b565b3480156107c957600080fd5b506103ce6107d8366004613a70565b61250b565b3480156107e957600080fd5b506103ce6107f8366004613e2c565b61253a565b34801561080957600080fd5b5061033f610818366004613c5e565b600d6020526000908152604090205460ff1681565b34801561083957600080fd5b50610369610848366004613a70565b612573565b34801561085957600080fd5b50610862612640565b60405161034b9190613eab565b34801561087b57600080fd5b506103e160075481565b34801561089157600080fd5b50600c5461033f90610100900460ff1681565b3480156108b057600080fd5b506103e16108bf366004613c5e565b6126a3565b3480156108d057600080fd5b506103ce6108df366004613c43565b6126ae565b3480156108f057600080fd5b506103ce6108ff366004613ee1565b6126eb565b34801561091057600080fd5b5061036961277d565b34801561092557600080fd5b5061033f610934366004613df3565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561096e57600080fd5b506103e1600a81565b34801561098357600080fd5b506103ce610992366004613a9e565b61278c565b3480156109a357600080fd5b506103ce6109b2366004613c5e565b6128a0565b3480156109c357600080fd5b506103ce6109d2366004613a70565b612938565b60006001600160e01b031982166380ac58cd60e01b1480610a0857506001600160e01b03198216635b5e139f60e01b145b80610a2357506001600160e01b0319821663780e9d6360e01b145b80610a3e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610a5390613f92565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7f90613f92565b8015610acc5780601f10610aa157610100808354040283529160200191610acc565b820191906000526020600020905b815481529060010190602001808311610aaf57829003601f168201915b5050505050905090565b6000610ae3826000541190565b610b4a5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610b71826116a0565b9050806001600160a01b0316836001600160a01b03161415610be05760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610b41565b336001600160a01b0382161480610bfc5750610bfc8133610934565b610c6e5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610b41565b610c79838383612967565b505050565b610c798383836129c3565b6008546001600160a01b03163314610cb35760405162461bcd60e51b8152600401610b4190613fc7565b610cbc81612d49565b50565b60026009541415610ce25760405162461bcd60e51b8152600401610b4190613ffc565b6002600955600c54610100900460ff16610d315760405162461bcd60e51b815260206004820152601060248201526f2ba61039b0b632903737ba1037b832b760811b6044820152606401610b41565b6000546015548110610d785760405162461bcd60e51b815260206004820152601060248201526f14d85b19481dd85d9948199a5b1b195960821b6044820152606401610b41565b610deb83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e54604080513360601b6001600160601b03191660208083019190915282516014818403018152603490920190925280519101209092509050612f32565b610e285760405162461bcd60e51b815260206004820152600e60248201526d155cd95c881b9bdd081a5b8815d360921b6044820152606401610b41565b6000610e5c85600a806020026040519081016040528092919082600a60200280828437600092019190915250612f48915050565b33600090815260146020526040902054909150600390610e7d908390614049565b1115610ecb5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420574c20616c6c6f636174696f6e0000000000006044820152606401610b41565b601354610ed89082614061565b341015610f1e5760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b6044820152606401610b41565b6107d08210610f5a5760405162461bcd60e51b815260206004820152600860248201526714dbdb190813dd5d60c21b6044820152606401610b41565b60408051610140810191829052600091601690600a908285855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411610f7457905050505050509050610fbb613824565b60005b600a811015611152578781600a8110610fd957610fd9614080565b602002013515611140578281600a8110610ff557610ff5614080565b602002015161ffff1615611140578781600a811061101557611015614080565b60200201358382600a811061102c5761102c614080565b602002015161ffff16106110bd578781600a811061104c5761104c614080565b60200201358282600a811061106357611063614080565b602002018181516110749190614049565b9052508781600a811061108957611089614080565b60200201358382600a81106110a0576110a0614080565b602002018181516110b19190614096565b61ffff16905250611140565b8281600a81106110cf576110cf614080565b602002015161ffff168282600a81106110ea576110ea614080565b602002018181516110fb9190614049565b9052508281600a811061111057611110614080565b60200201518382600a811061112757611127614080565b602002018181516111389190614096565b61ffff169052505b8061114a816140b9565b915050610fbe565b50600061115e82612f48565b9050806111a55760405162461bcd60e51b8152602060048201526015602482015274139bc81a5d195b5cc81d1bc81899481b5a5b9d1959605a1b6044820152606401610b41565b60006111b082612f90565b90506111bc3383613018565b60006111ca612710836140ea565b6111d690610640614061565b905060006111e482846140fe565b6010546040519192506000916001600160a01b039091169061138890859084818181858888f193505050503d806000811461123b576040519150601f19603f3d011682016040523d82523d6000602084013e611240565b606091505b50509050806112865760405162461bcd60e51b815260206004820152601260248201527111195d881c185e5b595b9d0819985a5b195960721b6044820152606401610b41565b600f546040516000916001600160a01b03169061138890859084818181858888f193505050503d80600081146112d8576040519150601f19603f3d011682016040523d82523d6000602084013e6112dd565b606091505b505090508061132a5760405162461bcd60e51b8152602060048201526019602482015278111a5d995c99d95b9d1cc81c185e5b595b9d0819985a5b1959603a1b6044820152606401610b41565b600061133686346140fe565b11156113e357600061134886346140fe565b604051909150600090339061138890849084818181858888f193505050503d8060008114611392576040519150601f19603f3d011682016040523d82523d6000602084013e611397565b606091505b50509050806113e05760405162461bcd60e51b815260206004820152601560248201527414995d1d5c9b881c185e5b595b9d0819985a5b1959605a1b6044820152606401610b41565b50505b3360009081526014602052604081208054889290611402908490614049565b909155506114159050601689600a613843565b506000805160206142d18339815191528733604051611435929190614115565b60405180910390a1505060016009555050505050505050505050565b600061145c836116f6565b82106114b55760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610b41565b600080549080805b8381101561155e576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561150f57805192505b876001600160a01b0316836001600160a01b0316141561154b578684141561153d57509350610a3e92505050565b83611547816140b9565b9450505b5080611556816140b9565b9150506114bd565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610b41565b6008546001600160a01b031633146115e85760405162461bcd60e51b8152600401610b4190613fc7565b601255565b610c798383836040518060200160405280600081525061253a565b6000805482106116665760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610b41565b5090565b6008546001600160a01b031633146116945760405162461bcd60e51b8152600401610b4190613fc7565b610c79600a83836138d5565b60006116ab82613032565b5192915050565b6008546001600160a01b031633146116dc5760405162461bcd60e51b8152600401610b4190613fc7565b600c80549115156101000261ff0019909216919091179055565b60006001600160a01b0382166117625760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610b41565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b031633146117b15760405162461bcd60e51b8152600401610b4190613fc7565b6117bb60006131db565b565b600260095414156117e05760405162461bcd60e51b8152600401610b4190613ffc565b6002600955336000908152600d602052604090205460ff166118145760405162461bcd60e51b8152600401610b419061415a565b6000601854116118665760405162461bcd60e51b815260206004820152601a60248201527f4e6f207265736572766564206d696e742072656d61696e696e670000000000006044820152606401610b41565b60408051610140810191829052600091601690600a908285855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611880579050505050505090506118c7613824565b60005b8381101561198a5760408051446020808301919091524160601b6001600160601b0319168284015260548083018590528351808403909101815260749092019092528051910120600061191e600a83614187565b905060018482600a811061193457611934614080565b602002018181516119459190614049565b90525060018582600a811061195c5761195c614080565b6020020181815161196d9190614096565b61ffff169052508291506119829050816140b9565b9150506118ca565b506119958484613018565b6119a2601683600a613843565b5082601860008282546119b591906140fe565b90915550506040516000805160206142d1833981519152906119da9083908790614115565b60405180910390a1505060016009555050565b6008546001600160a01b03163314611a175760405162461bcd60e51b8152600401610b4190613fc7565b600e55565b6040805180820190915260008082526020820152610a3e82613032565b606060028054610a5390613f92565b60026009541415611a6b5760405162461bcd60e51b8152600401610b4190613ffc565b6002600955600c5460ff16611ab95760405162461bcd60e51b8152602060048201526014602482015273283ab13634b19039b0b632903737ba1037b832b760611b6044820152606401610b41565b6000546015548110611b005760405162461bcd60e51b815260206004820152601060248201526f14d85b19481dd85d9948199a5b1b195960821b6044820152606401610b41565b6000611b3483600a806020026040519081016040528092919082600a60200280828437600092019190915250612f48915050565b905060135481611b449190614061565b341015611b8a5760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b6044820152606401610b41565b600a811115611bd05760405162461bcd60e51b815260206004820152601260248201527113585e081c1d5c98da185cd9481b1a5b5a5d60721b6044820152606401610b41565b6107d08210611c0c5760405162461bcd60e51b815260206004820152600860248201526714dbdb190813dd5d60c21b6044820152606401610b41565b60408051610140810191829052600091601690600a908285855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611c2657905050505050509050611c6d613824565b60005b600a811015611e04578581600a8110611c8b57611c8b614080565b602002013515611df2578281600a8110611ca757611ca7614080565b602002015161ffff1615611df2578581600a8110611cc757611cc7614080565b60200201358382600a8110611cde57611cde614080565b602002015161ffff1610611d6f578581600a8110611cfe57611cfe614080565b60200201358282600a8110611d1557611d15614080565b60200201818151611d269190614049565b9052508581600a8110611d3b57611d3b614080565b60200201358382600a8110611d5257611d52614080565b60200201818151611d639190614096565b61ffff16905250611df2565b8281600a8110611d8157611d81614080565b602002015161ffff168282600a8110611d9c57611d9c614080565b60200201818151611dad9190614049565b9052508281600a8110611dc257611dc2614080565b60200201518382600a8110611dd957611dd9614080565b60200201818151611dea9190614096565b61ffff169052505b80611dfc816140b9565b915050611c70565b506000611e1082612f48565b905080611e575760405162461bcd60e51b8152602060048201526015602482015274139bc81a5d195b5cc81d1bc81899481b5a5b9d1959605a1b6044820152606401610b41565b6000611e6282612f90565b9050611e6e3383613018565b6000611e7c612710836140ea565b611e8890610640614061565b90506000611e9682846140fe565b6010546040519192506000916001600160a01b039091169061138890859084818181858888f193505050503d8060008114611eed576040519150601f19603f3d011682016040523d82523d6000602084013e611ef2565b606091505b5050905080611f385760405162461bcd60e51b815260206004820152601260248201527111195d881c185e5b595b9d0819985a5b195960721b6044820152606401610b41565b600f546040516000916001600160a01b03169061138890859084818181858888f193505050503d8060008114611f8a576040519150601f19603f3d011682016040523d82523d6000602084013e611f8f565b606091505b5050905080611fdc5760405162461bcd60e51b8152602060048201526019602482015278111a5d995c99d95b9d1cc81c185e5b595b9d0819985a5b1959603a1b6044820152606401610b41565b6000611fe886346140fe565b1115612095576000611ffa86346140fe565b604051909150600090339061138890849084818181858888f193505050503d8060008114612044576040519150601f19603f3d011682016040523d82523d6000602084013e612049565b606091505b50509050806120925760405162461bcd60e51b815260206004820152601560248201527414995d1d5c9b881c185e5b595b9d0819985a5b1959605a1b6044820152606401610b41565b50505b33600090815260146020526040812080548892906120b4908490614049565b909155506120c79050601689600a613843565b506000805160206142d183398151915287336040516120e7929190614115565b60405180910390a150506001600955505050505050505050565b6008546001600160a01b0316331461212b5760405162461bcd60e51b8152600401610b4190613fc7565b805161213e90600b906020840190613949565b5050565b6001600160a01b03821633141561219b5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610b41565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002600954141561222a5760405162461bcd60e51b8152600401610b4190613ffc565b6002600955336000908152600d602052604090205460ff1661225e5760405162461bcd60e51b8152600401610b419061415a565b6000601854116122b05760405162461bcd60e51b815260206004820152601a60248201527f4e6f207265736572766564206d696e742072656d61696e696e670000000000006044820152606401610b41565b60408051610140810191829052600091601690600a908285855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116122ca5790505050505050905060005b828110156124525760408051446020808301919091524160601b6001600160601b03191682840152605480830185905283518084039091018152607490920190925280519101206000612360600a83614187565b905061236a613824565b60018183600a811061237e5761237e614080565b6020020181815161238f9190614049565b90525060018583600a81106123a6576123a6614080565b602002018181516123b79190614096565b61ffff169052506123ef8787868181106123d3576123d3614080565b90506020020160208101906123e89190613c5e565b6001613018565b6000805160206142d18339815191528188888781811061241157612411614080565b90506020020160208101906124269190613c5e565b604051612434929190614115565b60405180910390a1505050808061244a906140b9565b91505061230c565b50612460601682600a613843565b50828290506018600082825461247691906140fe565b90915550506001600955505050565b6008546001600160a01b031633146124af5760405162461bcd60e51b8152600401610b4190613fc7565b600f80546001600160a01b039384166001600160a01b03199182161790915560108054929093169116179055565b601681600a81106124ed57600080fd5b60109182820401919006600202915054906101000a900461ffff1681565b6008546001600160a01b031633146125355760405162461bcd60e51b8152600401610b4190613fc7565b601555565b6125458484846129c3565b6125518484848461322d565b61256d5760405162461bcd60e51b8152600401610b419061419b565b50505050565b6060612580826000541190565b6125e45760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b41565b60006125ee61332c565b9050600081511161260e5760405180602001604052806000815250612639565b806126188461333b565b6040516020016126299291906141ee565b6040516020818303038152906040525b9392505050565b612648613824565b6040805161014081019182905290601690600a90826000855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116126615790505050505050905090565b6000610a3e82613438565b6008546001600160a01b031633146126d85760405162461bcd60e51b8152600401610b4190613fc7565b600c805460ff1916911515919091179055565b6008546001600160a01b031633146127155760405162461bcd60e51b8152600401610b4190613fc7565b60005b815181101561213e576001600d600084848151811061273957612739614080565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580612775816140b9565b915050612718565b6060600b8054610a5390613f92565b600260095414156127af5760405162461bcd60e51b8152600401610b4190613ffc565b6002600955336000908152600d602052604090205460ff166127e35760405162461bcd60e51b8152600401610b419061415a565b8060175410156128355760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e742072656d61696e696e67204775727500000000006044820152606401610b41565b61283f3382613018565b806017600082825461285191906140fe565b9091555050604080518281526001600160a01b03841660208201527f24cd8e7669b2f098129502a2276a7886bccc58e81a86c3c1b57a3213d54eb166910160405180910390a150506001600955565b6008546001600160a01b031633146128ca5760405162461bcd60e51b8152600401610b4190613fc7565b6001600160a01b03811661292f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b41565b610cbc816131db565b6008546001600160a01b031633146129625760405162461bcd60e51b8152600401610b4190613fc7565b601355565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006129ce82613032565b80519091506000906001600160a01b0316336001600160a01b03161480612a055750336129fa84610ad6565b6001600160a01b0316145b80612a1757508151612a179033610934565b905080612a815760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610b41565b846001600160a01b031682600001516001600160a01b031614612af55760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610b41565b6001600160a01b038416612b595760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b41565b612b696000848460000151612967565b6001600160a01b0385166000908152600460205260408120805460019290612b9b9084906001600160801b031661421d565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092612be79185911661423d565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055612c6e846001614049565b6000818152600360205260409020549091506001600160a01b0316612cff57612c98816000541190565b15612cff5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60075481612d995760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610b41565b60006001612da78484614049565b612db191906140fe565b9050612dde60017f00000000000000000000000000000000000000000000000000000000000000006140fe565b811115612e1357612e1060017f00000000000000000000000000000000000000000000000000000000000000006140fe565b90505b612e1e816000541190565b612e795760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b6064820152608401610b41565b815b818111612f1e576000818152600360205260409020546001600160a01b0316612f0c576000612ea982613032565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600390965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80612f16816140b9565b915050612e7b565b50612f2a816001614049565b600755505050565b600082612f3f85846134d6565b14949350505050565b6000805b600a811015612f8a578281600a8110612f6757612f67614080565b6020020151612f769083614049565b915080612f82816140b9565b915050612f4c565b50919050565b6011546000908181612fb057601354612fa99085614061565b905061300c565b838210612fd757601254612fc49085614061565b9050612fd084836140fe565b915061300c565b601354612fe483866140fe565b612fee9190614061565b601254612ffb9084614061565b6130059190614049565b9050600091505b60119190915592915050565b61213e82826040518060200160405280600081525061354a565b6040805180820190915260008082526020820152613051826000541190565b6130b05760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610b41565b60007f00000000000000000000000000000000000000000000000000000000000000008310613111576131037f0000000000000000000000000000000000000000000000000000000000000000846140fe565b61310e906001614049565b90505b825b81811061317a576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561316757949350505050565b50806131728161425f565b915050613113565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610b41565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b1561332057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613271903390899088908890600401614276565b6020604051808303816000875af19250505080156132ac575060408051601f3d908101601f191682019092526132a9918101906142b3565b60015b613306573d8080156132da576040519150601f19603f3d011682016040523d82523d6000602084013e6132df565b606091505b5080516132fe5760405162461bcd60e51b8152600401610b419061419b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613324565b5060015b949350505050565b6060600a8054610a5390613f92565b60608161335f5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156133895780613373816140b9565b91506133829050600a836140ea565b9150613363565b6000816001600160401b038111156133a3576133a3613c98565b6040519080825280601f01601f1916602001820160405280156133cd576020820181803683370190505b5090505b8415613324576133e26001836140fe565b91506133ef600a86614187565b6133fa906030614049565b60f81b81838151811061340f5761340f614080565b60200101906001600160f81b031916908160001a905350613431600a866140ea565b94506133d1565b60006001600160a01b0382166134aa5760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610b41565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b600081815b84518110156135425760008582815181106134f8576134f8614080565b6020026020010151905080831161351e576000838152602082905260409020925061352f565b600081815260208490526040902092505b508061353a816140b9565b9150506134db565b509392505050565b6000546001600160a01b0384166135ad5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b41565b6135b8816000541190565b156136055760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610b41565b7f00000000000000000000000000000000000000000000000000000000000000008311156136805760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610b41565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906136dc90879061423d565b6001600160801b031681526020018583602001516136fa919061423d565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156138195760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46137dd600088848861322d565b6137f95760405162461bcd60e51b8152600401610b419061419b565b81613803816140b9565b9250508080613811906140b9565b915050613790565b506000819055612d41565b604051806101400160405280600a906020820280368337509192915050565b6001830191839082156138c95791602002820160005b8382111561389957835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302613859565b80156138c75782816101000a81549061ffff0219169055600201602081600101049283019260010302613899565b505b506116669291506139bd565b8280546138e190613f92565b90600052602060002090601f01602090048101928261390357600085556138c9565b82601f1061391c5782800160ff198235161785556138c9565b828001600101855582156138c9579182015b828111156138c957823582559160200191906001019061392e565b82805461395590613f92565b90600052602060002090601f01602090048101928261397757600085556138c9565b82601f1061399057805160ff19168380011785556138c9565b828001600101855582156138c9579182015b828111156138c95782518255916020019190600101906139a2565b5b8082111561166657600081556001016139be565b6001600160e01b031981168114610cbc57600080fd5b6000602082840312156139fa57600080fd5b8135612639816139d2565b60005b83811015613a20578181015183820152602001613a08565b8381111561256d5750506000910152565b60008151808452613a49816020860160208601613a05565b601f01601f19169290920160200192915050565b6020815260006126396020830184613a31565b600060208284031215613a8257600080fd5b5035919050565b6001600160a01b0381168114610cbc57600080fd5b60008060408385031215613ab157600080fd5b8235613abc81613a89565b946020939093013593505050565b600080600060608486031215613adf57600080fd5b8335613aea81613a89565b92506020840135613afa81613a89565b929592945050506040919091013590565b806101408101831015610a3e57600080fd5b60008083601f840112613b2f57600080fd5b5081356001600160401b03811115613b4657600080fd5b6020830191508360208260051b8501011115613b6157600080fd5b9250929050565b60008060006101608486031215613b7e57600080fd5b613b888585613b0b565b92506101408401356001600160401b03811115613ba457600080fd5b613bb086828701613b1d565b9497909650939450505050565b60008060208385031215613bd057600080fd5b82356001600160401b0380821115613be757600080fd5b818501915085601f830112613bfb57600080fd5b813581811115613c0a57600080fd5b866020828501011115613c1c57600080fd5b60209290920196919550909350505050565b80358015158114613c3e57600080fd5b919050565b600060208284031215613c5557600080fd5b61263982613c2e565b600060208284031215613c7057600080fd5b813561263981613a89565b60006101408284031215613c8e57600080fd5b6126398383613b0b565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613cd657613cd6613c98565b604052919050565b60006001600160401b03831115613cf757613cf7613c98565b613d0a601f8401601f1916602001613cae565b9050828152838383011115613d1e57600080fd5b828260208301376000602084830101529392505050565b600060208284031215613d4757600080fd5b81356001600160401b03811115613d5d57600080fd5b8201601f81018413613d6e57600080fd5b61332484823560208401613cde565b60008060408385031215613d9057600080fd5b8235613d9b81613a89565b9150613da960208401613c2e565b90509250929050565b60008060208385031215613dc557600080fd5b82356001600160401b03811115613ddb57600080fd5b613de785828601613b1d565b90969095509350505050565b60008060408385031215613e0657600080fd5b8235613e1181613a89565b91506020830135613e2181613a89565b809150509250929050565b60008060008060808587031215613e4257600080fd5b8435613e4d81613a89565b93506020850135613e5d81613a89565b92506040850135915060608501356001600160401b03811115613e7f57600080fd5b8501601f81018713613e9057600080fd5b613e9f87823560208401613cde565b91505092959194509250565b6101408101818360005b600a811015613ed857815161ffff16835260209283019290910190600101613eb5565b50505092915050565b60006020808385031215613ef457600080fd5b82356001600160401b0380821115613f0b57600080fd5b818501915085601f830112613f1f57600080fd5b813581811115613f3157613f31613c98565b8060051b9150613f42848301613cae565b8181529183018401918481019088841115613f5c57600080fd5b938501935b83851015613f865784359250613f7683613a89565b8282529385019390850190613f61565b98975050505050505050565b600181811c90821680613fa657607f821691505b60208210811415612f8a57634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561405c5761405c614033565b500190565b600081600019048311821515161561407b5761407b614033565b500290565b634e487b7160e01b600052603260045260246000fd5b600061ffff838116908316818110156140b1576140b1614033565b039392505050565b60006000198214156140cd576140cd614033565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826140f9576140f96140d4565b500490565b60008282101561411057614110614033565b500390565b6101608101818460005b600a81101561413e57815183526020928301929091019060010161411f565b5050506001600160a01b03929092166101409190910152919050565b602080825260139082015272135a5b9d195c881b9bdd08185c1c1c9bdd9959606a1b604082015260600190565b600082614196576141966140d4565b500690565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351614200818460208801613a05565b835190830190614214818360208801613a05565b01949350505050565b60006001600160801b03838116908316818110156140b1576140b1614033565b60006001600160801b0380831681851680830382111561421457614214614033565b60008161426e5761426e614033565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906142a990830184613a31565b9695505050505050565b6000602082840312156142c557600080fd5b8151612639816139d256feb239c7c83dc51681a54573bc4d9d61e0660b0ddefaa9eaada51aec258cb89962a2646970667358221220114191d6da7128dcb9c313e35f68933ab46792198e3fac6d96be8bd9909e427464736f6c634300080c0033697066733a2f2f516d556d5157336e386b37396445643457746a7831756a6a64783157423264636f69666e43447975387632316868

Deployed Bytecode

0x60806040526004361061031a5760003560e01c8063903f16a3116101ab578063bc57d223116100f7578063e7755f0511610095578063eb25f1251161006f578063eb25f12514610962578063f1e3e60614610977578063f2fde38b14610997578063f4a0a528146109b757600080fd5b8063e7755f05146108e4578063e8a3d48514610904578063e985e9c51461091957600080fd5b8063d7224ba0116100d1578063d7224ba01461086f578063dc12bbf714610885578063dc33e681146108a4578063dc38882e146108c457600080fd5b8063bc57d223146107fd578063c87b56dd1461082d578063d6c4f4c01461084d57600080fd5b8063a22cb46511610164578063b2d7ed0c1161013e578063b2d7ed0c1461076a578063b3f9da091461078a578063b6d18c67146107bd578063b88d4fde146107dd57600080fd5b8063a22cb46514610714578063ac3d490314610734578063ad2bd70c1461075457600080fd5b8063903f16a31461063c5780639231ab2a1461065257806395d89b411461069f57806397b5aaee146106b457806397cf84fc146106c7578063a201fc50146106f457600080fd5b806342842e0e1161026a5780636817c76c11610223578063715018a6116101fd578063715018a6146105c95780637ba506f1146105de5780637cb64759146105fe5780638da5cb5b1461061e57600080fd5b80636817c76c146105735780636d1a13081461058957806370a08231146105a957600080fd5b806342842e0e146104c75780634f6ccce7146104e757806355f804b31461050757806358eda0f1146105275780635f61f11a1461053d5780636352211e1461055357600080fd5b80631aa1a460116102d75780632eb4a7ab116102b15780632eb4a7ab1461045e5780632f148bfe146104745780632f745c5914610487578063355b14cd146104a757600080fd5b80631aa1a4601461040957806323b872dd1461041e5780632d20fb601461043e57600080fd5b806301ffc9a71461031f57806306fdde0314610354578063081812fc14610376578063095ea7b3146103ae57806318160ddd146103d05780631a6949e3146103ef575b600080fd5b34801561032b57600080fd5b5061033f61033a3660046139e8565b6109d7565b60405190151581526020015b60405180910390f35b34801561036057600080fd5b50610369610a44565b60405161034b9190613a5d565b34801561038257600080fd5b50610396610391366004613a70565b610ad6565b6040516001600160a01b03909116815260200161034b565b3480156103ba57600080fd5b506103ce6103c9366004613a9e565b610b66565b005b3480156103dc57600080fd5b506000545b60405190815260200161034b565b3480156103fb57600080fd5b50600c5461033f9060ff1681565b34801561041557600080fd5b506103e1600381565b34801561042a57600080fd5b506103ce610439366004613aca565b610c7e565b34801561044a57600080fd5b506103ce610459366004613a70565b610c89565b34801561046a57600080fd5b506103e1600e5481565b6103ce610482366004613b68565b610cbf565b34801561049357600080fd5b506103e16104a2366004613a9e565b611451565b3480156104b357600080fd5b506103ce6104c2366004613a70565b6115be565b3480156104d357600080fd5b506103ce6104e2366004613aca565b6115ed565b3480156104f357600080fd5b506103e1610502366004613a70565b611608565b34801561051357600080fd5b506103ce610522366004613bbd565b61166a565b34801561053357600080fd5b506103e160175481565b34801561054957600080fd5b506103e160115481565b34801561055f57600080fd5b5061039661056e366004613a70565b6116a0565b34801561057f57600080fd5b506103e160135481565b34801561059557600080fd5b506103ce6105a4366004613c43565b6116b2565b3480156105b557600080fd5b506103e16105c4366004613c5e565b6116f6565b3480156105d557600080fd5b506103ce611787565b3480156105ea57600080fd5b506103ce6105f9366004613a9e565b6117bd565b34801561060a57600080fd5b506103ce610619366004613a70565b6119ed565b34801561062a57600080fd5b506008546001600160a01b0316610396565b34801561064857600080fd5b506103e160125481565b34801561065e57600080fd5b5061067261066d366004613a70565b611a1c565b6040805182516001600160a01b031681526020928301516001600160401b0316928101929092520161034b565b3480156106ab57600080fd5b50610369611a39565b6103ce6106c2366004613c7b565b611a48565b3480156106d357600080fd5b506103e16106e2366004613c5e565b60146020526000908152604090205481565b34801561070057600080fd5b506103ce61070f366004613d35565b612101565b34801561072057600080fd5b506103ce61072f366004613d7d565b612142565b34801561074057600080fd5b506103ce61074f366004613db2565b612207565b34801561076057600080fd5b506103e160155481565b34801561077657600080fd5b506103ce610785366004613df3565b612485565b34801561079657600080fd5b506107aa6107a5366004613a70565b6124dd565b60405161ffff909116815260200161034b565b3480156107c957600080fd5b506103ce6107d8366004613a70565b61250b565b3480156107e957600080fd5b506103ce6107f8366004613e2c565b61253a565b34801561080957600080fd5b5061033f610818366004613c5e565b600d6020526000908152604090205460ff1681565b34801561083957600080fd5b50610369610848366004613a70565b612573565b34801561085957600080fd5b50610862612640565b60405161034b9190613eab565b34801561087b57600080fd5b506103e160075481565b34801561089157600080fd5b50600c5461033f90610100900460ff1681565b3480156108b057600080fd5b506103e16108bf366004613c5e565b6126a3565b3480156108d057600080fd5b506103ce6108df366004613c43565b6126ae565b3480156108f057600080fd5b506103ce6108ff366004613ee1565b6126eb565b34801561091057600080fd5b5061036961277d565b34801561092557600080fd5b5061033f610934366004613df3565b6001600160a01b03918216600090815260066020908152604080832093909416825291909152205460ff1690565b34801561096e57600080fd5b506103e1600a81565b34801561098357600080fd5b506103ce610992366004613a9e565b61278c565b3480156109a357600080fd5b506103ce6109b2366004613c5e565b6128a0565b3480156109c357600080fd5b506103ce6109d2366004613a70565b612938565b60006001600160e01b031982166380ac58cd60e01b1480610a0857506001600160e01b03198216635b5e139f60e01b145b80610a2357506001600160e01b0319821663780e9d6360e01b145b80610a3e57506301ffc9a760e01b6001600160e01b03198316145b92915050565b606060018054610a5390613f92565b80601f0160208091040260200160405190810160405280929190818152602001828054610a7f90613f92565b8015610acc5780601f10610aa157610100808354040283529160200191610acc565b820191906000526020600020905b815481529060010190602001808311610aaf57829003601f168201915b5050505050905090565b6000610ae3826000541190565b610b4a5760405162461bcd60e51b815260206004820152602d60248201527f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560448201526c3c34b9ba32b73a103a37b5b2b760991b60648201526084015b60405180910390fd5b506000908152600560205260409020546001600160a01b031690565b6000610b71826116a0565b9050806001600160a01b0316836001600160a01b03161415610be05760405162461bcd60e51b815260206004820152602260248201527f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60448201526132b960f11b6064820152608401610b41565b336001600160a01b0382161480610bfc5750610bfc8133610934565b610c6e5760405162461bcd60e51b815260206004820152603960248201527f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60448201527f776e6572206e6f7220617070726f76656420666f7220616c6c000000000000006064820152608401610b41565b610c79838383612967565b505050565b610c798383836129c3565b6008546001600160a01b03163314610cb35760405162461bcd60e51b8152600401610b4190613fc7565b610cbc81612d49565b50565b60026009541415610ce25760405162461bcd60e51b8152600401610b4190613ffc565b6002600955600c54610100900460ff16610d315760405162461bcd60e51b815260206004820152601060248201526f2ba61039b0b632903737ba1037b832b760811b6044820152606401610b41565b6000546015548110610d785760405162461bcd60e51b815260206004820152601060248201526f14d85b19481dd85d9948199a5b1b195960821b6044820152606401610b41565b610deb83838080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e54604080513360601b6001600160601b03191660208083019190915282516014818403018152603490920190925280519101209092509050612f32565b610e285760405162461bcd60e51b815260206004820152600e60248201526d155cd95c881b9bdd081a5b8815d360921b6044820152606401610b41565b6000610e5c85600a806020026040519081016040528092919082600a60200280828437600092019190915250612f48915050565b33600090815260146020526040902054909150600390610e7d908390614049565b1115610ecb5760405162461bcd60e51b815260206004820152601a60248201527f496e73756666696369656e7420574c20616c6c6f636174696f6e0000000000006044820152606401610b41565b601354610ed89082614061565b341015610f1e5760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b6044820152606401610b41565b6107d08210610f5a5760405162461bcd60e51b815260206004820152600860248201526714dbdb190813dd5d60c21b6044820152606401610b41565b60408051610140810191829052600091601690600a908285855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411610f7457905050505050509050610fbb613824565b60005b600a811015611152578781600a8110610fd957610fd9614080565b602002013515611140578281600a8110610ff557610ff5614080565b602002015161ffff1615611140578781600a811061101557611015614080565b60200201358382600a811061102c5761102c614080565b602002015161ffff16106110bd578781600a811061104c5761104c614080565b60200201358282600a811061106357611063614080565b602002018181516110749190614049565b9052508781600a811061108957611089614080565b60200201358382600a81106110a0576110a0614080565b602002018181516110b19190614096565b61ffff16905250611140565b8281600a81106110cf576110cf614080565b602002015161ffff168282600a81106110ea576110ea614080565b602002018181516110fb9190614049565b9052508281600a811061111057611110614080565b60200201518382600a811061112757611127614080565b602002018181516111389190614096565b61ffff169052505b8061114a816140b9565b915050610fbe565b50600061115e82612f48565b9050806111a55760405162461bcd60e51b8152602060048201526015602482015274139bc81a5d195b5cc81d1bc81899481b5a5b9d1959605a1b6044820152606401610b41565b60006111b082612f90565b90506111bc3383613018565b60006111ca612710836140ea565b6111d690610640614061565b905060006111e482846140fe565b6010546040519192506000916001600160a01b039091169061138890859084818181858888f193505050503d806000811461123b576040519150601f19603f3d011682016040523d82523d6000602084013e611240565b606091505b50509050806112865760405162461bcd60e51b815260206004820152601260248201527111195d881c185e5b595b9d0819985a5b195960721b6044820152606401610b41565b600f546040516000916001600160a01b03169061138890859084818181858888f193505050503d80600081146112d8576040519150601f19603f3d011682016040523d82523d6000602084013e6112dd565b606091505b505090508061132a5760405162461bcd60e51b8152602060048201526019602482015278111a5d995c99d95b9d1cc81c185e5b595b9d0819985a5b1959603a1b6044820152606401610b41565b600061133686346140fe565b11156113e357600061134886346140fe565b604051909150600090339061138890849084818181858888f193505050503d8060008114611392576040519150601f19603f3d011682016040523d82523d6000602084013e611397565b606091505b50509050806113e05760405162461bcd60e51b815260206004820152601560248201527414995d1d5c9b881c185e5b595b9d0819985a5b1959605a1b6044820152606401610b41565b50505b3360009081526014602052604081208054889290611402908490614049565b909155506114159050601689600a613843565b506000805160206142d18339815191528733604051611435929190614115565b60405180910390a1505060016009555050505050505050505050565b600061145c836116f6565b82106114b55760405162461bcd60e51b815260206004820152602260248201527f455243373231413a206f776e657220696e646578206f7574206f6620626f756e604482015261647360f01b6064820152608401610b41565b600080549080805b8381101561155e576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561150f57805192505b876001600160a01b0316836001600160a01b0316141561154b578684141561153d57509350610a3e92505050565b83611547816140b9565b9450505b5080611556816140b9565b9150506114bd565b5060405162461bcd60e51b815260206004820152602e60248201527f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060448201526d0deeedccae440c4f240d2dcc8caf60931b6064820152608401610b41565b6008546001600160a01b031633146115e85760405162461bcd60e51b8152600401610b4190613fc7565b601255565b610c798383836040518060200160405280600081525061253a565b6000805482106116665760405162461bcd60e51b815260206004820152602360248201527f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f756044820152626e647360e81b6064820152608401610b41565b5090565b6008546001600160a01b031633146116945760405162461bcd60e51b8152600401610b4190613fc7565b610c79600a83836138d5565b60006116ab82613032565b5192915050565b6008546001600160a01b031633146116dc5760405162461bcd60e51b8152600401610b4190613fc7565b600c80549115156101000261ff0019909216919091179055565b60006001600160a01b0382166117625760405162461bcd60e51b815260206004820152602b60248201527f455243373231413a2062616c616e636520717565727920666f7220746865207a60448201526a65726f206164647265737360a81b6064820152608401610b41565b506001600160a01b03166000908152600460205260409020546001600160801b031690565b6008546001600160a01b031633146117b15760405162461bcd60e51b8152600401610b4190613fc7565b6117bb60006131db565b565b600260095414156117e05760405162461bcd60e51b8152600401610b4190613ffc565b6002600955336000908152600d602052604090205460ff166118145760405162461bcd60e51b8152600401610b419061415a565b6000601854116118665760405162461bcd60e51b815260206004820152601a60248201527f4e6f207265736572766564206d696e742072656d61696e696e670000000000006044820152606401610b41565b60408051610140810191829052600091601690600a908285855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611880579050505050505090506118c7613824565b60005b8381101561198a5760408051446020808301919091524160601b6001600160601b0319168284015260548083018590528351808403909101815260749092019092528051910120600061191e600a83614187565b905060018482600a811061193457611934614080565b602002018181516119459190614049565b90525060018582600a811061195c5761195c614080565b6020020181815161196d9190614096565b61ffff169052508291506119829050816140b9565b9150506118ca565b506119958484613018565b6119a2601683600a613843565b5082601860008282546119b591906140fe565b90915550506040516000805160206142d1833981519152906119da9083908790614115565b60405180910390a1505060016009555050565b6008546001600160a01b03163314611a175760405162461bcd60e51b8152600401610b4190613fc7565b600e55565b6040805180820190915260008082526020820152610a3e82613032565b606060028054610a5390613f92565b60026009541415611a6b5760405162461bcd60e51b8152600401610b4190613ffc565b6002600955600c5460ff16611ab95760405162461bcd60e51b8152602060048201526014602482015273283ab13634b19039b0b632903737ba1037b832b760611b6044820152606401610b41565b6000546015548110611b005760405162461bcd60e51b815260206004820152601060248201526f14d85b19481dd85d9948199a5b1b195960821b6044820152606401610b41565b6000611b3483600a806020026040519081016040528092919082600a60200280828437600092019190915250612f48915050565b905060135481611b449190614061565b341015611b8a5760405162461bcd60e51b8152602060048201526014602482015273125b9cdd59999a58da595b9d081c185e5b595b9d60621b6044820152606401610b41565b600a811115611bd05760405162461bcd60e51b815260206004820152601260248201527113585e081c1d5c98da185cd9481b1a5b5a5d60721b6044820152606401610b41565b6107d08210611c0c5760405162461bcd60e51b815260206004820152600860248201526714dbdb190813dd5d60c21b6044820152606401610b41565b60408051610140810191829052600091601690600a908285855b82829054906101000a900461ffff1661ffff1681526020019060020190602082600101049283019260010382029150808411611c2657905050505050509050611c6d613824565b60005b600a811015611e04578581600a8110611c8b57611c8b614080565b602002013515611df2578281600a8110611ca757611ca7614080565b602002015161ffff1615611df2578581600a8110611cc757611cc7614080565b60200201358382600a8110611cde57611cde614080565b602002015161ffff1610611d6f578581600a8110611cfe57611cfe614080565b60200201358282600a8110611d1557611d15614080565b60200201818151611d269190614049565b9052508581600a8110611d3b57611d3b614080565b60200201358382600a8110611d5257611d52614080565b60200201818151611d639190614096565b61ffff16905250611df2565b8281600a8110611d8157611d81614080565b602002015161ffff168282600a8110611d9c57611d9c614080565b60200201818151611dad9190614049565b9052508281600a8110611dc257611dc2614080565b60200201518382600a8110611dd957611dd9614080565b60200201818151611dea9190614096565b61ffff169052505b80611dfc816140b9565b915050611c70565b506000611e1082612f48565b905080611e575760405162461bcd60e51b8152602060048201526015602482015274139bc81a5d195b5cc81d1bc81899481b5a5b9d1959605a1b6044820152606401610b41565b6000611e6282612f90565b9050611e6e3383613018565b6000611e7c612710836140ea565b611e8890610640614061565b90506000611e9682846140fe565b6010546040519192506000916001600160a01b039091169061138890859084818181858888f193505050503d8060008114611eed576040519150601f19603f3d011682016040523d82523d6000602084013e611ef2565b606091505b5050905080611f385760405162461bcd60e51b815260206004820152601260248201527111195d881c185e5b595b9d0819985a5b195960721b6044820152606401610b41565b600f546040516000916001600160a01b03169061138890859084818181858888f193505050503d8060008114611f8a576040519150601f19603f3d011682016040523d82523d6000602084013e611f8f565b606091505b5050905080611fdc5760405162461bcd60e51b8152602060048201526019602482015278111a5d995c99d95b9d1cc81c185e5b595b9d0819985a5b1959603a1b6044820152606401610b41565b6000611fe886346140fe565b1115612095576000611ffa86346140fe565b604051909150600090339061138890849084818181858888f193505050503d8060008114612044576040519150601f19603f3d011682016040523d82523d6000602084013e612049565b606091505b50509050806120925760405162461bcd60e51b815260206004820152601560248201527414995d1d5c9b881c185e5b595b9d0819985a5b1959605a1b6044820152606401610b41565b50505b33600090815260146020526040812080548892906120b4908490614049565b909155506120c79050601689600a613843565b506000805160206142d183398151915287336040516120e7929190614115565b60405180910390a150506001600955505050505050505050565b6008546001600160a01b0316331461212b5760405162461bcd60e51b8152600401610b4190613fc7565b805161213e90600b906020840190613949565b5050565b6001600160a01b03821633141561219b5760405162461bcd60e51b815260206004820152601a60248201527f455243373231413a20617070726f766520746f2063616c6c65720000000000006044820152606401610b41565b3360008181526006602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6002600954141561222a5760405162461bcd60e51b8152600401610b4190613ffc565b6002600955336000908152600d602052604090205460ff1661225e5760405162461bcd60e51b8152600401610b419061415a565b6000601854116122b05760405162461bcd60e51b815260206004820152601a60248201527f4e6f207265736572766564206d696e742072656d61696e696e670000000000006044820152606401610b41565b60408051610140810191829052600091601690600a908285855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116122ca5790505050505050905060005b828110156124525760408051446020808301919091524160601b6001600160601b03191682840152605480830185905283518084039091018152607490920190925280519101206000612360600a83614187565b905061236a613824565b60018183600a811061237e5761237e614080565b6020020181815161238f9190614049565b90525060018583600a81106123a6576123a6614080565b602002018181516123b79190614096565b61ffff169052506123ef8787868181106123d3576123d3614080565b90506020020160208101906123e89190613c5e565b6001613018565b6000805160206142d18339815191528188888781811061241157612411614080565b90506020020160208101906124269190613c5e565b604051612434929190614115565b60405180910390a1505050808061244a906140b9565b91505061230c565b50612460601682600a613843565b50828290506018600082825461247691906140fe565b90915550506001600955505050565b6008546001600160a01b031633146124af5760405162461bcd60e51b8152600401610b4190613fc7565b600f80546001600160a01b039384166001600160a01b03199182161790915560108054929093169116179055565b601681600a81106124ed57600080fd5b60109182820401919006600202915054906101000a900461ffff1681565b6008546001600160a01b031633146125355760405162461bcd60e51b8152600401610b4190613fc7565b601555565b6125458484846129c3565b6125518484848461322d565b61256d5760405162461bcd60e51b8152600401610b419061419b565b50505050565b6060612580826000541190565b6125e45760405162461bcd60e51b815260206004820152602f60248201527f4552433732314d657461646174613a2055524920717565727920666f72206e6f60448201526e3732bc34b9ba32b73a103a37b5b2b760891b6064820152608401610b41565b60006125ee61332c565b9050600081511161260e5760405180602001604052806000815250612639565b806126188461333b565b6040516020016126299291906141ee565b6040516020818303038152906040525b9392505050565b612648613824565b6040805161014081019182905290601690600a90826000855b82829054906101000a900461ffff1661ffff16815260200190600201906020826001010492830192600103820291508084116126615790505050505050905090565b6000610a3e82613438565b6008546001600160a01b031633146126d85760405162461bcd60e51b8152600401610b4190613fc7565b600c805460ff1916911515919091179055565b6008546001600160a01b031633146127155760405162461bcd60e51b8152600401610b4190613fc7565b60005b815181101561213e576001600d600084848151811061273957612739614080565b6020908102919091018101516001600160a01b03168252810191909152604001600020805460ff191691151591909117905580612775816140b9565b915050612718565b6060600b8054610a5390613f92565b600260095414156127af5760405162461bcd60e51b8152600401610b4190613ffc565b6002600955336000908152600d602052604090205460ff166127e35760405162461bcd60e51b8152600401610b419061415a565b8060175410156128355760405162461bcd60e51b815260206004820152601b60248201527f496e73756666696369656e742072656d61696e696e67204775727500000000006044820152606401610b41565b61283f3382613018565b806017600082825461285191906140fe565b9091555050604080518281526001600160a01b03841660208201527f24cd8e7669b2f098129502a2276a7886bccc58e81a86c3c1b57a3213d54eb166910160405180910390a150506001600955565b6008546001600160a01b031633146128ca5760405162461bcd60e51b8152600401610b4190613fc7565b6001600160a01b03811661292f5760405162461bcd60e51b815260206004820152602660248201527f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160448201526564647265737360d01b6064820152608401610b41565b610cbc816131db565b6008546001600160a01b031633146129625760405162461bcd60e51b8152600401610b4190613fc7565b601355565b60008281526005602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b60006129ce82613032565b80519091506000906001600160a01b0316336001600160a01b03161480612a055750336129fa84610ad6565b6001600160a01b0316145b80612a1757508151612a179033610934565b905080612a815760405162461bcd60e51b815260206004820152603260248201527f455243373231413a207472616e736665722063616c6c6572206973206e6f74206044820152711bdddb995c881b9bdc88185c1c1c9bdd995960721b6064820152608401610b41565b846001600160a01b031682600001516001600160a01b031614612af55760405162461bcd60e51b815260206004820152602660248201527f455243373231413a207472616e736665722066726f6d20696e636f72726563746044820152651037bbb732b960d11b6064820152608401610b41565b6001600160a01b038416612b595760405162461bcd60e51b815260206004820152602560248201527f455243373231413a207472616e7366657220746f20746865207a65726f206164604482015264647265737360d81b6064820152608401610b41565b612b696000848460000151612967565b6001600160a01b0385166000908152600460205260408120805460019290612b9b9084906001600160801b031661421d565b82546101009290920a6001600160801b038181021990931691831602179091556001600160a01b03861660009081526004602052604081208054600194509092612be79185911661423d565b82546001600160801b039182166101009390930a9283029190920219909116179055506040805180820182526001600160a01b0380871682526001600160401b03428116602080850191825260008981526003909152948520935184549151909216600160a01b026001600160e01b03199091169190921617179055612c6e846001614049565b6000818152600360205260409020549091506001600160a01b0316612cff57612c98816000541190565b15612cff5760408051808201825284516001600160a01b0390811682526020808701516001600160401b039081168285019081526000878152600390935294909120925183549451909116600160a01b026001600160e01b03199094169116179190911790555b83856001600160a01b0316876001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45b505050505050565b60075481612d995760405162461bcd60e51b815260206004820152601860248201527f7175616e74697479206d757374206265206e6f6e7a65726f00000000000000006044820152606401610b41565b60006001612da78484614049565b612db191906140fe565b9050612dde60017f00000000000000000000000000000000000000000000000000000000000007e66140fe565b811115612e1357612e1060017f00000000000000000000000000000000000000000000000000000000000007e66140fe565b90505b612e1e816000541190565b612e795760405162461bcd60e51b815260206004820152602660248201527f6e6f7420656e6f756768206d696e7465642079657420666f722074686973206360448201526506c65616e75760d41b6064820152608401610b41565b815b818111612f1e576000818152600360205260409020546001600160a01b0316612f0c576000612ea982613032565b60408051808201825282516001600160a01b0390811682526020938401516001600160401b039081168584019081526000888152600390965293909420915182549351909416600160a01b026001600160e01b0319909316931692909217179055505b80612f16816140b9565b915050612e7b565b50612f2a816001614049565b600755505050565b600082612f3f85846134d6565b14949350505050565b6000805b600a811015612f8a578281600a8110612f6757612f67614080565b6020020151612f769083614049565b915080612f82816140b9565b915050612f4c565b50919050565b6011546000908181612fb057601354612fa99085614061565b905061300c565b838210612fd757601254612fc49085614061565b9050612fd084836140fe565b915061300c565b601354612fe483866140fe565b612fee9190614061565b601254612ffb9084614061565b6130059190614049565b9050600091505b60119190915592915050565b61213e82826040518060200160405280600081525061354a565b6040805180820190915260008082526020820152613051826000541190565b6130b05760405162461bcd60e51b815260206004820152602a60248201527f455243373231413a206f776e657220717565727920666f72206e6f6e657869736044820152693a32b73a103a37b5b2b760b11b6064820152608401610b41565b60007f00000000000000000000000000000000000000000000000000000000000000198310613111576131037f0000000000000000000000000000000000000000000000000000000000000019846140fe565b61310e906001614049565b90505b825b81811061317a576000818152600360209081526040918290208251808401909352546001600160a01b038116808452600160a01b9091046001600160401b0316918301919091521561316757949350505050565b50806131728161425f565b915050613113565b5060405162461bcd60e51b815260206004820152602f60248201527f455243373231413a20756e61626c6520746f2064657465726d696e652074686560448201526e1037bbb732b91037b3103a37b5b2b760891b6064820152608401610b41565b600880546001600160a01b038381166001600160a01b0319831681179093556040519116919082907f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e090600090a35050565b60006001600160a01b0384163b1561332057604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290613271903390899088908890600401614276565b6020604051808303816000875af19250505080156132ac575060408051601f3d908101601f191682019092526132a9918101906142b3565b60015b613306573d8080156132da576040519150601f19603f3d011682016040523d82523d6000602084013e6132df565b606091505b5080516132fe5760405162461bcd60e51b8152600401610b419061419b565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050613324565b5060015b949350505050565b6060600a8054610a5390613f92565b60608161335f5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156133895780613373816140b9565b91506133829050600a836140ea565b9150613363565b6000816001600160401b038111156133a3576133a3613c98565b6040519080825280601f01601f1916602001820160405280156133cd576020820181803683370190505b5090505b8415613324576133e26001836140fe565b91506133ef600a86614187565b6133fa906030614049565b60f81b81838151811061340f5761340f614080565b60200101906001600160f81b031916908160001a905350613431600a866140ea565b94506133d1565b60006001600160a01b0382166134aa5760405162461bcd60e51b815260206004820152603160248201527f455243373231413a206e756d626572206d696e74656420717565727920666f7260448201527020746865207a65726f206164647265737360781b6064820152608401610b41565b506001600160a01b0316600090815260046020526040902054600160801b90046001600160801b031690565b600081815b84518110156135425760008582815181106134f8576134f8614080565b6020026020010151905080831161351e576000838152602082905260409020925061352f565b600081815260208490526040902092505b508061353a816140b9565b9150506134db565b509392505050565b6000546001600160a01b0384166135ad5760405162461bcd60e51b815260206004820152602160248201527f455243373231413a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b6064820152608401610b41565b6135b8816000541190565b156136055760405162461bcd60e51b815260206004820152601d60248201527f455243373231413a20746f6b656e20616c7265616479206d696e7465640000006044820152606401610b41565b7f00000000000000000000000000000000000000000000000000000000000000198311156136805760405162461bcd60e51b815260206004820152602260248201527f455243373231413a207175616e7469747920746f206d696e7420746f6f2068696044820152610ced60f31b6064820152608401610b41565b6001600160a01b0384166000908152600460209081526040918290208251808401845290546001600160801b038082168352600160801b90910416918101919091528151808301909252805190919081906136dc90879061423d565b6001600160801b031681526020018583602001516136fa919061423d565b6001600160801b039081169091526001600160a01b0380881660008181526004602090815260408083208751978301518716600160801b029790961696909617909455845180860186529182526001600160401b034281168386019081528883526003909552948120915182549451909516600160a01b026001600160e01b031990941694909216939093179190911790915582905b858110156138195760405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a46137dd600088848861322d565b6137f95760405162461bcd60e51b8152600401610b419061419b565b81613803816140b9565b9250508080613811906140b9565b915050613790565b506000819055612d41565b604051806101400160405280600a906020820280368337509192915050565b6001830191839082156138c95791602002820160005b8382111561389957835183826101000a81548161ffff021916908361ffff1602179055509260200192600201602081600101049283019260010302613859565b80156138c75782816101000a81549061ffff0219169055600201602081600101049283019260010302613899565b505b506116669291506139bd565b8280546138e190613f92565b90600052602060002090601f01602090048101928261390357600085556138c9565b82601f1061391c5782800160ff198235161785556138c9565b828001600101855582156138c9579182015b828111156138c957823582559160200191906001019061392e565b82805461395590613f92565b90600052602060002090601f01602090048101928261397757600085556138c9565b82601f1061399057805160ff19168380011785556138c9565b828001600101855582156138c9579182015b828111156138c95782518255916020019190600101906139a2565b5b8082111561166657600081556001016139be565b6001600160e01b031981168114610cbc57600080fd5b6000602082840312156139fa57600080fd5b8135612639816139d2565b60005b83811015613a20578181015183820152602001613a08565b8381111561256d5750506000910152565b60008151808452613a49816020860160208601613a05565b601f01601f19169290920160200192915050565b6020815260006126396020830184613a31565b600060208284031215613a8257600080fd5b5035919050565b6001600160a01b0381168114610cbc57600080fd5b60008060408385031215613ab157600080fd5b8235613abc81613a89565b946020939093013593505050565b600080600060608486031215613adf57600080fd5b8335613aea81613a89565b92506020840135613afa81613a89565b929592945050506040919091013590565b806101408101831015610a3e57600080fd5b60008083601f840112613b2f57600080fd5b5081356001600160401b03811115613b4657600080fd5b6020830191508360208260051b8501011115613b6157600080fd5b9250929050565b60008060006101608486031215613b7e57600080fd5b613b888585613b0b565b92506101408401356001600160401b03811115613ba457600080fd5b613bb086828701613b1d565b9497909650939450505050565b60008060208385031215613bd057600080fd5b82356001600160401b0380821115613be757600080fd5b818501915085601f830112613bfb57600080fd5b813581811115613c0a57600080fd5b866020828501011115613c1c57600080fd5b60209290920196919550909350505050565b80358015158114613c3e57600080fd5b919050565b600060208284031215613c5557600080fd5b61263982613c2e565b600060208284031215613c7057600080fd5b813561263981613a89565b60006101408284031215613c8e57600080fd5b6126398383613b0b565b634e487b7160e01b600052604160045260246000fd5b604051601f8201601f191681016001600160401b0381118282101715613cd657613cd6613c98565b604052919050565b60006001600160401b03831115613cf757613cf7613c98565b613d0a601f8401601f1916602001613cae565b9050828152838383011115613d1e57600080fd5b828260208301376000602084830101529392505050565b600060208284031215613d4757600080fd5b81356001600160401b03811115613d5d57600080fd5b8201601f81018413613d6e57600080fd5b61332484823560208401613cde565b60008060408385031215613d9057600080fd5b8235613d9b81613a89565b9150613da960208401613c2e565b90509250929050565b60008060208385031215613dc557600080fd5b82356001600160401b03811115613ddb57600080fd5b613de785828601613b1d565b90969095509350505050565b60008060408385031215613e0657600080fd5b8235613e1181613a89565b91506020830135613e2181613a89565b809150509250929050565b60008060008060808587031215613e4257600080fd5b8435613e4d81613a89565b93506020850135613e5d81613a89565b92506040850135915060608501356001600160401b03811115613e7f57600080fd5b8501601f81018713613e9057600080fd5b613e9f87823560208401613cde565b91505092959194509250565b6101408101818360005b600a811015613ed857815161ffff16835260209283019290910190600101613eb5565b50505092915050565b60006020808385031215613ef457600080fd5b82356001600160401b0380821115613f0b57600080fd5b818501915085601f830112613f1f57600080fd5b813581811115613f3157613f31613c98565b8060051b9150613f42848301613cae565b8181529183018401918481019088841115613f5c57600080fd5b938501935b83851015613f865784359250613f7683613a89565b8282529385019390850190613f61565b98975050505050505050565b600181811c90821680613fa657607f821691505b60208210811415612f8a57634e487b7160e01b600052602260045260246000fd5b6020808252818101527f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572604082015260600190565b6020808252601f908201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604082015260600190565b634e487b7160e01b600052601160045260246000fd5b6000821982111561405c5761405c614033565b500190565b600081600019048311821515161561407b5761407b614033565b500290565b634e487b7160e01b600052603260045260246000fd5b600061ffff838116908316818110156140b1576140b1614033565b039392505050565b60006000198214156140cd576140cd614033565b5060010190565b634e487b7160e01b600052601260045260246000fd5b6000826140f9576140f96140d4565b500490565b60008282101561411057614110614033565b500390565b6101608101818460005b600a81101561413e57815183526020928301929091019060010161411f565b5050506001600160a01b03929092166101409190910152919050565b602080825260139082015272135a5b9d195c881b9bdd08185c1c1c9bdd9959606a1b604082015260600190565b600082614196576141966140d4565b500690565b60208082526033908201527f455243373231413a207472616e7366657220746f206e6f6e204552433732315260408201527232b1b2b4bb32b91034b6b83632b6b2b73a32b960691b606082015260800190565b60008351614200818460208801613a05565b835190830190614214818360208801613a05565b01949350505050565b60006001600160801b03838116908316818110156140b1576140b1614033565b60006001600160801b0380831681851680830382111561421457614214614033565b60008161426e5761426e614033565b506000190190565b6001600160a01b03858116825284166020820152604081018390526080606082018190526000906142a990830184613a31565b9695505050505050565b6000602082840312156142c557600080fd5b8151612639816139d256feb239c7c83dc51681a54573bc4d9d61e0660b0ddefaa9eaada51aec258cb89962a2646970667358221220114191d6da7128dcb9c313e35f68933ab46792198e3fac6d96be8bd9909e427464736f6c634300080c0033

Deployed Bytecode Sourcemap

45077:13593:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32685:370;;;;;;;;;;-1:-1:-1;32685:370:0;;;;;:::i;:::-;;:::i;:::-;;;565:14:1;;558:22;540:41;;528:2;513:18;32685:370:0;;;;;;;;34411:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;35936:204::-;;;;;;;;;;-1:-1:-1;35936:204:0;;;;;:::i;:::-;;:::i;:::-;;;-1:-1:-1;;;;;1692:32:1;;;1674:51;;1662:2;1647:18;35936:204:0;1528:203:1;35499:379:0;;;;;;;;;;-1:-1:-1;35499:379:0;;;;;:::i;:::-;;:::i;:::-;;31246:94;;;;;;;;;;-1:-1:-1;31299:7:0;31322:12;31246:94;;;2338:25:1;;;2326:2;2311:18;31246:94:0;2192:177:1;45270:28:0;;;;;;;;;;-1:-1:-1;45270:28:0;;;;;;;;46034:54;;;;;;;;;;;;46087:1;46034:54;;36786:142;;;;;;;;;;-1:-1:-1;36786:142:0;;;;;:::i;:::-;;:::i;47175:111::-;;;;;;;;;;-1:-1:-1;47175:111:0;;;;;:::i;:::-;;:::i;45516:25::-;;;;;;;;;;;;;;;;52865:2977;;;;;;:::i;:::-;;:::i;31877:744::-;;;;;;;;;;-1:-1:-1;31877:744:0;;;;;:::i;:::-;;:::i;48167:136::-;;;;;;;;;;-1:-1:-1;48167:136:0;;;;;:::i;:::-;;:::i;36991:157::-;;;;;;;;;;-1:-1:-1;36991:157:0;;;;;:::i;:::-;;:::i;31409:177::-;;;;;;;;;;-1:-1:-1;31409:177:0;;;;;:::i;:::-;;:::i;46906:106::-;;;;;;;;;;-1:-1:-1;46906:106:0;;;;;:::i;:::-;;:::i;48807:30::-;;;;;;;;;;;;;;;;45676:33;;;;;;;;;;;;;;;;34234:118;;;;;;;;;;-1:-1:-1;34234:118:0;;;;;:::i;:::-;;:::i;45770:38::-;;;;;;;;;;;;;;;;47407:111;;;;;;;;;;-1:-1:-1;47407:111:0;;;;;:::i;:::-;;:::i;33111:211::-;;;;;;;;;;-1:-1:-1;33111:211:0;;;;;:::i;:::-;;:::i;9878:103::-;;;;;;;;;;;;;:::i;50599:854::-;;;;;;;;;;-1:-1:-1;50599:854:0;;;;;:::i;:::-;;:::i;47726:106::-;;;;;;;;;;-1:-1:-1;47726:106:0;;;;;:::i;:::-;;:::i;9227:87::-;;;;;;;;;;-1:-1:-1;9300:6:0;;-1:-1:-1;;;;;9300:6:0;9227:87;;45716:47;;;;;;;;;;;;;;;;46473:133;;;;;;;;;;-1:-1:-1;46473:133:0;;;;;:::i;:::-;;:::i;:::-;;;;5736:13:1;;-1:-1:-1;;;;;5732:39:1;5714:58;;5832:4;5820:17;;;5814:24;-1:-1:-1;;;;;5810:49:1;5788:20;;;5781:79;;;;5687:18;46473:133:0;5506:360:1;34566:98:0;;;;;;;;;;;;;:::i;55875:2783::-;;;;;;:::i;:::-;;:::i;46095:53::-;;;;;;;;;;-1:-1:-1;46095:53:0;;;;;:::i;:::-;;;;;;;;;;;;;;47020:147;;;;;;;;;;-1:-1:-1;47020:147:0;;;;;:::i;:::-;;:::i;36204:274::-;;;;;;;;;;-1:-1:-1;36204:274:0;;;;;:::i;:::-;;:::i;51479:881::-;;;;;;;;;;-1:-1:-1;51479:881:0;;;;;:::i;:::-;;:::i;46155:37::-;;;;;;;;;;;;;;;;47840:203;;;;;;;;;;-1:-1:-1;47840:203:0;;;;;:::i;:::-;;:::i;48719:81::-;;;;;;;;;;-1:-1:-1;48719:81:0;;;;;:::i;:::-;;:::i;:::-;;;8738:6:1;8726:19;;;8708:38;;8696:2;8681:18;48719:81:0;8564:188:1;48311:124:0;;;;;;;;;;-1:-1:-1;48311:124:0;;;;;:::i;:::-;;:::i;37211:311::-;;;;;;;;;;-1:-1:-1;37211:311:0;;;;;:::i;:::-;;:::i;45370:51::-;;;;;;;;;;-1:-1:-1;45370:51:0;;;;;:::i;:::-;;;;;;;;;;;;;;;;34727:394;;;;;;;;;;-1:-1:-1;34727:394:0;;;;;:::i;:::-;;:::i;46727:116::-;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;41626:43::-;;;;;;;;;;;;;;;;45305:31;;;;;;;;;;-1:-1:-1;45305:31:0;;;;;;;;;;;46352:113;;;;;;;;;;-1:-1:-1;46352:113:0;;;;;:::i;:::-;;:::i;47294:105::-;;;;;;;;;;-1:-1:-1;47294:105:0;;;;;:::i;:::-;;:::i;47526:192::-;;;;;;;;;;-1:-1:-1;47526:192:0;;;;;:::i;:::-;;:::i;46614:105::-;;;;;;;;;;;;;:::i;36541:186::-;;;;;;;;;;-1:-1:-1;36541:186:0;;;;;:::i;:::-;-1:-1:-1;;;;;36686:25:0;;;36663:4;36686:25;;;:18;:25;;;;;;;;:35;;;;;;;;;;;;;;;36541:186;45978:49;;;;;;;;;;;;46025:2;45978:49;;52390:440;;;;;;;;;;-1:-1:-1;52390:440:0;;;;;:::i;:::-;;:::i;10136:201::-;;;;;;;;;;-1:-1:-1;10136:201:0;;;;;:::i;:::-;;:::i;48051:108::-;;;;;;;;;;-1:-1:-1;48051:108:0;;;;;:::i;:::-;;:::i;32685:370::-;32812:4;-1:-1:-1;;;;;;32842:40:0;;-1:-1:-1;;;32842:40:0;;:99;;-1:-1:-1;;;;;;;32893:48:0;;-1:-1:-1;;;32893:48:0;32842:99;:160;;;-1:-1:-1;;;;;;;32952:50:0;;-1:-1:-1;;;32952:50:0;32842:160;:207;;;-1:-1:-1;;;;;;;;;;22120:40:0;;;33013:36;32828:221;32685:370;-1:-1:-1;;32685:370:0:o;34411:94::-;34465:13;34494:5;34487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34411:94;:::o;35936:204::-;36004:7;36028:16;36036:7;37818:4;37848:12;-1:-1:-1;37838:22:0;37761:105;36028:16;36020:74;;;;-1:-1:-1;;;36020:74:0;;12076:2:1;36020:74:0;;;12058:21:1;12115:2;12095:18;;;12088:30;12154:34;12134:18;;;12127:62;-1:-1:-1;;;12205:18:1;;;12198:43;12258:19;;36020:74:0;;;;;;;;;-1:-1:-1;36110:24:0;;;;:15;:24;;;;;;-1:-1:-1;;;;;36110:24:0;;35936:204::o;35499:379::-;35568:13;35584:24;35600:7;35584:15;:24::i;:::-;35568:40;;35629:5;-1:-1:-1;;;;;35623:11:0;:2;-1:-1:-1;;;;;35623:11:0;;;35615:58;;;;-1:-1:-1;;;35615:58:0;;12490:2:1;35615:58:0;;;12472:21:1;12529:2;12509:18;;;12502:30;12568:34;12548:18;;;12541:62;-1:-1:-1;;;12619:18:1;;;12612:32;12661:19;;35615:58:0;12288:398:1;35615:58:0;8031:10;-1:-1:-1;;;;;35698:21:0;;;;:62;;-1:-1:-1;35723:37:0;35740:5;8031:10;36541:186;:::i;35723:37::-;35682:153;;;;-1:-1:-1;;;35682:153:0;;12893:2:1;35682:153:0;;;12875:21:1;12932:2;12912:18;;;12905:30;12971:34;12951:18;;;12944:62;13042:27;13022:18;;;13015:55;13087:19;;35682:153:0;12691:421:1;35682:153:0;35844:28;35853:2;35857:7;35866:5;35844:8;:28::i;:::-;35561:317;35499:379;;:::o;36786:142::-;36894:28;36904:4;36910:2;36914:7;36894:9;:28::i;47175:111::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;47250:28:::1;47269:8;47250:18;:28::i;:::-;47175:111:::0;:::o;52865:2977::-;4201:1;4799:7;;:19;;4791:63;;;;-1:-1:-1;;;4791:63:0;;;;;;;:::i;:::-;4201:1;4932:7;:18;52991:19:::1;::::0;::::1;::::0;::::1;;;52982:49;;;::::0;-1:-1:-1;;;52982:49:0;;14040:2:1;52982:49:0::1;::::0;::::1;14022:21:1::0;14079:2;14059:18;;;14052:30;-1:-1:-1;;;14098:18:1;;;14091:46;14154:18;;52982:49:0::1;13838:340:1::0;52982:49:0::1;53042:23;31322:12:::0;53122:19:::1;::::0;53101:40;::::1;53092:70;;;::::0;-1:-1:-1;;;53092:70:0;;14385:2:1;53092:70:0::1;::::0;::::1;14367:21:1::0;14424:2;14404:18;;;14397:30;-1:-1:-1;;;14443:18:1;;;14436:46;14499:18;;53092:70:0::1;14183:340:1::0;53092:70:0::1;53182:69;53201:5;;53182:69;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;;53208:10:0::1;::::0;49290:25;;;53239:10:::1;28329:2:1::0;28325:15;-1:-1:-1;;;;;;28321:53:1;49290:25:0;;;;28309:66:1;;;;49290:25:0;;;;;;;;;28391:12:1;;;;49290:25:0;;;49280:36;;;;;53208:10;;-1:-1:-1;49280:36:0;-1:-1:-1;53182:18:0::1;:69::i;:::-;53173:97;;;::::0;-1:-1:-1;;;53173:97:0;;14730:2:1;53173:97:0::1;::::0;::::1;14712:21:1::0;14769:2;14749:18;;;14742:30;-1:-1:-1;;;14788:18:1;;;14781:44;14842:18;;53173:97:0::1;14528:338:1::0;53173:97:0::1;53281:19;53303:20;53314:8;53303:20;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;53303:10:0::1;::::0;-1:-1:-1;;53303:20:0:i:1;:::-;53365:10;53344:32;::::0;;;:20:::1;:32;::::0;;;;;53281:42;;-1:-1:-1;46087:1:0::1;::::0;53344:49:::1;::::0;53281:42;;53344:49:::1;:::i;:::-;53343:84;;53334:124;;;::::0;-1:-1:-1;;;53334:124:0;;15338:2:1;53334:124:0::1;::::0;::::1;15320:21:1::0;15377:2;15357:18;;;15350:30;15416:28;15396:18;;;15389:56;15462:18;;53334:124:0::1;15136:350:1::0;53334:124:0::1;53509:9;::::0;53492:26:::1;::::0;:14;:26:::1;:::i;:::-;53478:9;:41;;53469:75;;;::::0;-1:-1:-1;;;53469:75:0;;15866:2:1;53469:75:0::1;::::0;::::1;15848:21:1::0;15905:2;15885:18;;;15878:30;-1:-1:-1;;;15924:18:1;;;15917:50;15984:18;;53469:75:0::1;15664:344:1::0;53469:75:0::1;45901:4;53564:18;:29;53555:52;;;::::0;-1:-1:-1;;;53555:52:0;;16215:2:1;53555:52:0::1;::::0;::::1;16197:21:1::0;16254:1;16234:18;;;16227:29;-1:-1:-1;;;16272:18:1;;;16265:38;16320:18;;53555:52:0::1;16013:331:1::0;53555:52:0::1;53620:56;::::0;;;;::::1;::::0;;;;-1:-1:-1;;53657:19:0::1;::::0;53620:56:::1;::::0;53657:19;-1:-1:-1;53620:56:0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53687:32;;:::i;:::-;53737:6;53732:569;53753:2;53749:1;:6;53732:569;;;53795:8;53804:1;53795:11;;;;;;;:::i;:::-;;;;;:16:::0;53791:499:::1;;53835:16;53852:1;53835:19;;;;;;;:::i;:::-;;;;::::0;:24:::1;;::::0;53832:443:::1;;53910:8;53919:1;53910:11;;;;;;;:::i;:::-;;;;;53887:16;53904:1;53887:19;;;;;;;:::i;:::-;;;;;:34;;;53883:371;;53973:8;53982:1;53973:11;;;;;;;:::i;:::-;;;;;53950:16;53967:1;53950:19;;;;;;;:::i;:::-;;;;:34;;;;;;;:::i;:::-;::::0;;-1:-1:-1;54041:8:0;54050:1;54041:11:::1;::::0;::::1;;;;;:::i;:::-;;;;;54011:16;54028:1;54011:19;;;;;;;:::i;:::-;;;;:42;;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;53883:371:0::1;;;54141:16;54158:1;54141:19;;;;;;;:::i;:::-;;;;;54136:25;;54113:16;54130:1;54113:19;;;;;;;:::i;:::-;;;;:48;;;;;;;:::i;:::-;::::0;;-1:-1:-1;54211:16:0;54228:1;54211:19:::1;::::0;::::1;;;;;:::i;:::-;;;;;54188:16;54205:1;54188:19;;;;;;;:::i;:::-;;;;:42;;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;53883:371:0::1;53757:3:::0;::::1;::::0;::::1;:::i;:::-;;;;53732:569;;;;54313:16;54332:28;54343:16;54332:10;:28::i;:::-;54313:47:::0;-1:-1:-1;54380:16:0;54371:51:::1;;;::::0;-1:-1:-1;;;54371:51:0;;17045:2:1;54371:51:0::1;::::0;::::1;17027:21:1::0;17084:2;17064:18;;;17057:30;-1:-1:-1;;;17103:18:1;;;17096:51;17164:18;;54371:51:0::1;16843:345:1::0;54371:51:0::1;54476:20;54499:33;54520:11;54499:20;:33::i;:::-;54476:56;;54545:34;54555:10;54567:11;54545:9;:34::i;:::-;54681:14;54699:23;54717:5;54699:15:::0;:23:::1;:::i;:::-;54698:32;::::0;54726:4:::1;54698:32;:::i;:::-;54681:49:::0;-1:-1:-1;54741:21:0::1;54765:27;54681:49:::0;54765:15;:27:::1;:::i;:::-;54878:11;::::0;:63:::1;::::0;54741:51;;-1:-1:-1;54857:15:0::1;::::0;-1:-1:-1;;;;;54878:11:0;;::::1;::::0;45857:4:::1;::::0;54902:9;;54857:15;54878:63;54857:15;54878:63;54902:9;54878:11;45857:4;54878:63:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54856:85;;;54960:10;54952:41;;;::::0;-1:-1:-1;;;54952:41:0;;17992:2:1;54952:41:0::1;::::0;::::1;17974:21:1::0;18031:2;18011:18;;;18004:30;-1:-1:-1;;;18050:18:1;;;18043:48;18108:18;;54952:41:0::1;17790:342:1::0;54952:41:0::1;55093:18;::::0;:77:::1;::::0;55065:22:::1;::::0;-1:-1:-1;;;;;55093:18:0::1;::::0;45857:4:::1;::::0;55124:16;;55065:22;55093:77;55065:22;55093:77;55124:16;55093:18;45857:4;55093:77:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55064:106;;;55189:17;55181:55;;;::::0;-1:-1:-1;;;55181:55:0;;18339:2:1;55181:55:0::1;::::0;::::1;18321:21:1::0;18378:2;18358:18;;;18351:30;-1:-1:-1;;;18397:18:1;;;18390:55;18462:18;;55181:55:0::1;18137:349:1::0;55181:55:0::1;55319:1;55289:27;55301:15:::0;55289:9:::1;:27;:::i;:::-;:31;55285:276;;;55337:16;55356:27;55368:15:::0;55356:9:::1;:27;:::i;:::-;55423:64;::::0;55337:46;;-1:-1:-1;55399:18:0::1;::::0;55423:10:::1;::::0;45857:4:::1;::::0;55337:46;;55399:18;55423:64;55399:18;55423:64;55337:46;55423:10;45857:4;55423:64:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55398:89;;;55510:13;55502:47;;;::::0;-1:-1:-1;;;55502:47:0;;18693:2:1;55502:47:0::1;::::0;::::1;18675:21:1::0;18732:2;18712:18;;;18705:30;-1:-1:-1;;;18751:18:1;;;18744:51;18812:18;;55502:47:0::1;18491:345:1::0;55502:47:0::1;55322:239;;55285:276;55634:10;55613:32;::::0;;;:20:::1;:32;::::0;;;;:47;;55649:11;;55613:32;:47:::1;::::0;55649:11;;55613:47:::1;:::i;:::-;::::0;;;-1:-1:-1;55712:38:0::1;::::0;-1:-1:-1;55712:19:0::1;55734:16:::0;55712:38:::1;;:::i;:::-;;-1:-1:-1::0;;;;;;;;;;;55805:16:0::1;55823:10;55798:36;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;4157:1:0;5111:7;:22;-1:-1:-1;;;;;;;;;;;52865:2977:0:o;31877:744::-;31986:7;32021:16;32031:5;32021:9;:16::i;:::-;32013:5;:24;32005:71;;;;-1:-1:-1;;;32005:71:0;;19643:2:1;32005:71:0;;;19625:21:1;19682:2;19662:18;;;19655:30;19721:34;19701:18;;;19694:62;-1:-1:-1;;;19772:18:1;;;19765:32;19814:19;;32005:71:0;19441:398:1;32005:71:0;32083:22;31322:12;;;32083:22;;32203:350;32227:14;32223:1;:18;32203:350;;;32257:31;32291:14;;;:11;:14;;;;;;;;;32257:48;;;;;;;;;-1:-1:-1;;;;;32257:48:0;;;;;-1:-1:-1;;;32257:48:0;;;-1:-1:-1;;;;;32257:48:0;;;;;;;;32318:28;32314:89;;32379:14;;;-1:-1:-1;32314:89:0;32436:5;-1:-1:-1;;;;;32415:26:0;:17;-1:-1:-1;;;;;32415:26:0;;32411:135;;;32473:5;32458:11;:20;32454:59;;;-1:-1:-1;32500:1:0;-1:-1:-1;32493:8:0;;-1:-1:-1;;;32493:8:0;32454:59;32523:13;;;;:::i;:::-;;;;32411:135;-1:-1:-1;32243:3:0;;;;:::i;:::-;;;;32203:350;;;-1:-1:-1;32559:56:0;;-1:-1:-1;;;32559:56:0;;20046:2:1;32559:56:0;;;20028:21:1;20085:2;20065:18;;;20058:30;20124:34;20104:18;;;20097:62;-1:-1:-1;;;20175:18:1;;;20168:44;20229:19;;32559:56:0;19844:410:1;48167:136:0;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;48255:19:::1;:40:::0;48167:136::o;36991:157::-;37103:39;37120:4;37126:2;37130:7;37103:39;;;;;;;;;;;;:16;:39::i;31409:177::-;31476:7;31322:12;;31500:5;:21;31492:69;;;;-1:-1:-1;;;31492:69:0;;20461:2:1;31492:69:0;;;20443:21:1;20500:2;20480:18;;;20473:30;20539:34;20519:18;;;20512:62;-1:-1:-1;;;20590:18:1;;;20583:33;20633:19;;31492:69:0;20259:399:1;31492:69:0;-1:-1:-1;31575:5:0;31409:177::o;46906:106::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;46981:23:::1;:13;46997:7:::0;;46981:23:::1;:::i;34234:118::-:0;34298:7;34321:20;34333:7;34321:11;:20::i;:::-;:25;;34234:118;-1:-1:-1;;34234:118:0:o;47407:111::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;47482:19:::1;:28:::0;;;::::1;;;;-1:-1:-1::0;;47482:28:0;;::::1;::::0;;;::::1;::::0;;47407:111::o;33111:211::-;33175:7;-1:-1:-1;;;;;33199:19:0;;33191:75;;;;-1:-1:-1;;;33191:75:0;;20865:2:1;33191:75:0;;;20847:21:1;20904:2;20884:18;;;20877:30;20943:34;20923:18;;;20916:62;-1:-1:-1;;;20994:18:1;;;20987:41;21045:19;;33191:75:0;20663:407:1;33191:75:0;-1:-1:-1;;;;;;33288:19:0;;;;;:12;:19;;;;;:27;-1:-1:-1;;;;;33288:27:0;;33111:211::o;9878:103::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;9943:30:::1;9970:1;9943:18;:30::i;:::-;9878:103::o:0;50599:854::-;4201:1;4799:7;;:19;;4791:63;;;;-1:-1:-1;;;4791:63:0;;;;;;;:::i;:::-;4201:1;4932:7;:18;50716:10:::1;50696:31;::::0;;;:19:::1;:31;::::0;;;;;::::1;;50688:63;;;;-1:-1:-1::0;;;50688:63:0::1;;;;;;;:::i;:::-;50785:1;50770:12;;:16;50762:55;;;::::0;-1:-1:-1;;;50762:55:0;;21625:2:1;50762:55:0::1;::::0;::::1;21607:21:1::0;21664:2;21644:18;;;21637:30;21703:28;21683:18;;;21676:56;21749:18;;50762:55:0::1;21423:350:1::0;50762:55:0::1;50830:56;::::0;;;;::::1;::::0;;;;-1:-1:-1;;50867:19:0::1;::::0;50830:56:::1;::::0;50867:19;-1:-1:-1;50830:56:0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50897:32;;:::i;:::-;50947:6;50942:320;50962:8;50958:1;:12;50942:320;;;51031:53;::::0;;51048:16:::1;51031:53;::::0;;::::1;21979:19:1::0;;;;51066:14:0::1;22036:2:1::0;22032:15;-1:-1:-1;;;;;;22028:53:1;22014:12;;;22007:75;22098:12;;;;22091:28;;;51031:53:0;;;;;;;;;;22135:12:1;;;;51031:53:0;;;51021:64;;;::::1;::::0;-1:-1:-1;51121:27:0::1;51146:2;51021:64:::0;51121:27:::1;:::i;:::-;51100:48;;51198:1;51163:16;51180:13;51163:31;;;;;;;:::i;:::-;;;;:36;;;;;;;:::i;:::-;::::0;;-1:-1:-1;51249:1:0::1;51214:16:::0;51231:13;51214:31:::1;::::0;::::1;;;;;:::i;:::-;;;;:36;;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;50972:3:0;;-1:-1:-1;50972:3:0::1;::::0;-1:-1:-1;50972:3:0;::::1;:::i;:::-;;;;50942:320;;;;51274:29;51284:8;51294;51274:9;:29::i;:::-;51316:38;:19;51338:16:::0;51316:38:::1;;:::i;:::-;;51383:8;51367:12;;:24;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;51409:34:0::1;::::0;-1:-1:-1;;;;;;;;;;;51409:34:0;::::1;::::0;51416:16;;51434:8;;51409:34:::1;:::i;:::-;;;;;;;;-1:-1:-1::0;;4157:1:0;5111:7;:22;-1:-1:-1;;50599:854:0:o;47726:106::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;47800:10:::1;:24:::0;47726:106::o;46473:133::-;-1:-1:-1;;;;;;;;;;;;;;;;;46578:20:0;46590:7;46578:11;:20::i;34566:98::-;34622:13;34651:7;34644:14;;;;;:::i;55875:2783::-;4201:1;4799:7;;:19;;4791:63;;;;-1:-1:-1;;;4791:63:0;;;;;;;:::i;:::-;4201:1;4932:7;:18;55969:16:::1;::::0;::::1;;55961:49;;;::::0;-1:-1:-1;;;55961:49:0;;22477:2:1;55961:49:0::1;::::0;::::1;22459:21:1::0;22516:2;22496:18;;;22489:30;-1:-1:-1;;;22535:18:1;;;22528:50;22595:18;;55961:49:0::1;22275:344:1::0;55961:49:0::1;56021:23;31322:12:::0;56101:19:::1;::::0;56080:40;::::1;56071:70;;;::::0;-1:-1:-1;;;56071:70:0;;14385:2:1;56071:70:0::1;::::0;::::1;14367:21:1::0;14424:2;14404:18;;;14397:30;-1:-1:-1;;;14443:18:1;;;14436:46;14499:18;;56071:70:0::1;14183:340:1::0;56071:70:0::1;56152:19;56174:20;56185:8;56174:20;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;::::0;;;;-1:-1:-1;56174:10:0::1;::::0;-1:-1:-1;;56174:20:0:i:1;:::-;56152:42;;56243:9;;56226:14;:26;;;;:::i;:::-;56213:9;:39;;56205:72;;;::::0;-1:-1:-1;;;56205:72:0;;15866:2:1;56205:72:0::1;::::0;::::1;15848:21:1::0;15905:2;15885:18;;;15878:30;-1:-1:-1;;;15924:18:1;;;15917:50;15984:18;;56205:72:0::1;15664:344:1::0;56205:72:0::1;46025:2;56296:14;:41;;56288:72;;;::::0;-1:-1:-1;;;56288:72:0;;22826:2:1;56288:72:0::1;::::0;::::1;22808:21:1::0;22865:2;22845:18;;;22838:30;-1:-1:-1;;;22884:18:1;;;22877:48;22942:18;;56288:72:0::1;22624:342:1::0;56288:72:0::1;45901:4;56379:18;:29;56371:50;;;::::0;-1:-1:-1;;;56371:50:0;;16215:2:1;56371:50:0::1;::::0;::::1;16197:21:1::0;16254:1;16234:18;;;16227:29;-1:-1:-1;;;16272:18:1;;;16265:38;16320:18;;56371:50:0::1;16013:331:1::0;56371:50:0::1;56434:56;::::0;;;;::::1;::::0;;;;-1:-1:-1;;56471:19:0::1;::::0;56434:56:::1;::::0;56471:19;-1:-1:-1;56434:56:0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56501:32;;:::i;:::-;56551:6;56546:569;56567:2;56563:1;:6;56546:569;;;56609:8;56618:1;56609:11;;;;;;;:::i;:::-;;;;;:16:::0;56605:499:::1;;56649:16;56666:1;56649:19;;;;;;;:::i;:::-;;;;::::0;:24:::1;;::::0;56646:443:::1;;56724:8;56733:1;56724:11;;;;;;;:::i;:::-;;;;;56701:16;56718:1;56701:19;;;;;;;:::i;:::-;;;;;:34;;;56697:371;;56787:8;56796:1;56787:11;;;;;;;:::i;:::-;;;;;56764:16;56781:1;56764:19;;;;;;;:::i;:::-;;;;:34;;;;;;;:::i;:::-;::::0;;-1:-1:-1;56855:8:0;56864:1;56855:11:::1;::::0;::::1;;;;;:::i;:::-;;;;;56825:16;56842:1;56825:19;;;;;;;:::i;:::-;;;;:42;;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;56697:371:0::1;;;56955:16;56972:1;56955:19;;;;;;;:::i;:::-;;;;;56950:25;;56927:16;56944:1;56927:19;;;;;;;:::i;:::-;;;;:48;;;;;;;:::i;:::-;::::0;;-1:-1:-1;57025:16:0;57042:1;57025:19:::1;::::0;::::1;;;;;:::i;:::-;;;;;57002:16;57019:1;57002:19;;;;;;;:::i;:::-;;;;:42;;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;56697:371:0::1;56571:3:::0;::::1;::::0;::::1;:::i;:::-;;;;56546:569;;;;57127:16;57146:28;57157:16;57146:10;:28::i;:::-;57127:47:::0;-1:-1:-1;57194:16:0;57185:51:::1;;;::::0;-1:-1:-1;;;57185:51:0;;17045:2:1;57185:51:0::1;::::0;::::1;17027:21:1::0;17084:2;17064:18;;;17057:30;-1:-1:-1;;;17103:18:1;;;17096:51;17164:18;;57185:51:0::1;16843:345:1::0;57185:51:0::1;57290:20;57313:33;57334:11;57313:20;:33::i;:::-;57290:56;;57359:34;57369:10;57381:11;57359:9;:34::i;:::-;57495:14;57513:23;57531:5;57513:15:::0;:23:::1;:::i;:::-;57512:32;::::0;57540:4:::1;57512:32;:::i;:::-;57495:49:::0;-1:-1:-1;57555:21:0::1;57579:27;57495:49:::0;57579:15;:27:::1;:::i;:::-;57692:11;::::0;:63:::1;::::0;57555:51;;-1:-1:-1;57671:15:0::1;::::0;-1:-1:-1;;;;;57692:11:0;;::::1;::::0;45857:4:::1;::::0;57716:9;;57671:15;57692:63;57671:15;57692:63;57716:9;57692:11;45857:4;57692:63:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57670:85;;;57774:10;57766:41;;;::::0;-1:-1:-1;;;57766:41:0;;17992:2:1;57766:41:0::1;::::0;::::1;17974:21:1::0;18031:2;18011:18;;;18004:30;-1:-1:-1;;;18050:18:1;;;18043:48;18108:18;;57766:41:0::1;17790:342:1::0;57766:41:0::1;57907:18;::::0;:77:::1;::::0;57879:22:::1;::::0;-1:-1:-1;;;;;57907:18:0::1;::::0;45857:4:::1;::::0;57938:16;;57879:22;57907:77;57879:22;57907:77;57938:16;57907:18;45857:4;57907:77:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57878:106;;;58003:17;57995:55;;;::::0;-1:-1:-1;;;57995:55:0;;18339:2:1;57995:55:0::1;::::0;::::1;18321:21:1::0;18378:2;18358:18;;;18351:30;-1:-1:-1;;;18397:18:1;;;18390:55;18462:18;;57995:55:0::1;18137:349:1::0;57995:55:0::1;58133:1;58103:27;58115:15:::0;58103:9:::1;:27;:::i;:::-;:31;58099:276;;;58151:16;58170:27;58182:15:::0;58170:9:::1;:27;:::i;:::-;58237:64;::::0;58151:46;;-1:-1:-1;58213:18:0::1;::::0;58237:10:::1;::::0;45857:4:::1;::::0;58151:46;;58213:18;58237:64;58213:18;58237:64;58151:46;58237:10;45857:4;58237:64:::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58212:89;;;58324:13;58316:47;;;::::0;-1:-1:-1;;;58316:47:0;;18693:2:1;58316:47:0::1;::::0;::::1;18675:21:1::0;18732:2;18712:18;;;18705:30;-1:-1:-1;;;18751:18:1;;;18744:51;18812:18;;58316:47:0::1;18491:345:1::0;58316:47:0::1;58136:239;;58099:276;58448:10;58427:32;::::0;;;:20:::1;:32;::::0;;;;:47;;58463:11;;58427:32;:47:::1;::::0;58463:11;;58427:47:::1;:::i;:::-;::::0;;;-1:-1:-1;58526:38:0::1;::::0;-1:-1:-1;58526:19:0::1;58548:16:::0;58526:38:::1;;:::i;:::-;;-1:-1:-1::0;;;;;;;;;;;58619:16:0::1;58637:10;58612:36;;;;;;;:::i;:::-;;;;;;;;-1:-1:-1::0;;4157:1:0;5111:7;:22;-1:-1:-1;;;;;;;;;55875:2783:0:o;47020:147::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;47117:42;;::::1;::::0;:20:::1;::::0;:42:::1;::::0;::::1;::::0;::::1;:::i;:::-;;47020:147:::0;:::o;36204:274::-;-1:-1:-1;;;;;36295:24:0;;8031:10;36295:24;;36287:63;;;;-1:-1:-1;;;36287:63:0;;23173:2:1;36287:63:0;;;23155:21:1;23212:2;23192:18;;;23185:30;23251:28;23231:18;;;23224:56;23297:18;;36287:63:0;22971:350:1;36287:63:0;8031:10;36359:32;;;;:18;:32;;;;;;;;-1:-1:-1;;;;;36359:42:0;;;;;;;;;;;;:53;;-1:-1:-1;;36359:53:0;;;;;;;;;;36424:48;;540:41:1;;;36359:42:0;;8031:10;36424:48;;513:18:1;36424:48:0;;;;;;;36204:274;;:::o;51479:881::-;4201:1;4799:7;;:19;;4791:63;;;;-1:-1:-1;;;4791:63:0;;;;;;;:::i;:::-;4201:1;4932:7;:18;51587:10:::1;51567:31;::::0;;;:19:::1;:31;::::0;;;;;::::1;;51559:63;;;;-1:-1:-1::0;;;51559:63:0::1;;;;;;;:::i;:::-;51656:1;51641:12;;:16;51633:55;;;::::0;-1:-1:-1;;;51633:55:0;;21625:2:1;51633:55:0::1;::::0;::::1;21607:21:1::0;21664:2;21644:18;;;21637:30;21703:28;21683:18;;;21676:56;21749:18;;51633:55:0::1;21423:350:1::0;51633:55:0::1;51701:56;::::0;;;;::::1;::::0;;;;-1:-1:-1;;51738:19:0::1;::::0;51701:56:::1;::::0;51738:19;-1:-1:-1;51701:56:0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51785:6;51780:476;51797:19:::0;;::::1;51780:476;;;51877:53;::::0;;51894:16:::1;51877:53;::::0;;::::1;21979:19:1::0;;;;51912:14:0::1;22036:2:1::0;22032:15;-1:-1:-1;;;;;;22028:53:1;22014:12;;;22007:75;22098:12;;;;22091:28;;;51877:53:0;;;;;;;;;;22135:12:1;;;;51877:53:0;;;51867:64;;;::::1;::::0;-1:-1:-1;51967:27:0::1;51992:2;51867:64:::0;51967:27:::1;:::i;:::-;51946:48;;52009:32;;:::i;:::-;52091:1;52056:16;52073:13;52056:31;;;;;;;:::i;:::-;;;;:36;;;;;;;:::i;:::-;::::0;;-1:-1:-1;52142:1:0::1;52107:16:::0;52124:13;52107:31:::1;::::0;::::1;;;;;:::i;:::-;;;;:36;;;;;;;:::i;:::-;;;::::0;;-1:-1:-1;52160:25:0::1;52170:8:::0;;52179:1;52170:11;;::::1;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;52183:1;52160:9;:25::i;:::-;-1:-1:-1::0;;;;;;;;;;;52214:16:0::1;52232:8;;52241:1;52232:11;;;;;;;:::i;:::-;;;;;;;;;;;;;;:::i;:::-;52207:37;;;;;;;:::i;:::-;;;;;;;;51823:433;;;51818:3;;;;;:::i;:::-;;;;51780:476;;;-1:-1:-1::0;52268:38:0::1;:19;52290:16:::0;52268:38:::1;;:::i;:::-;;52335:8;;:15;;52319:12;;:31;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;4157:1:0;5111:7;:22;-1:-1:-1;;;51479:881:0:o;47840:203::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;47962:18:::1;:38:::0;;-1:-1:-1;;;;;47962:38:0;;::::1;-1:-1:-1::0;;;;;;47962:38:0;;::::1;;::::0;;;48011:11:::1;:24:::0;;;;;::::1;::::0;::::1;;::::0;;47840:203::o;48719:81::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;48311:124::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;48393:19:::1;:34:::0;48311:124::o;37211:311::-;37348:28;37358:4;37364:2;37368:7;37348:9;:28::i;:::-;37399:48;37422:4;37428:2;37432:7;37441:5;37399:22;:48::i;:::-;37383:133;;;;-1:-1:-1;;;37383:133:0;;;;;;;:::i;:::-;37211:311;;;;:::o;34727:394::-;34825:13;34866:16;34874:7;37818:4;37848:12;-1:-1:-1;37838:22:0;37761:105;34866:16;34850:97;;;;-1:-1:-1;;;34850:97:0;;23948:2:1;34850:97:0;;;23930:21:1;23987:2;23967:18;;;23960:30;24026:34;24006:18;;;23999:62;-1:-1:-1;;;24077:18:1;;;24070:45;24132:19;;34850:97:0;23746:411:1;34850:97:0;34956:21;34980:10;:8;:10::i;:::-;34956:34;;35035:1;35017:7;35011:21;:25;:104;;;;;;;;;;;;;;;;;35072:7;35081:18;:7;:16;:18::i;:::-;35055:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35011:104;34997:118;34727:394;-1:-1:-1;;;34727:394:0:o;46727:116::-;46779:17;;:::i;:::-;46809:26;;;;;;;;;;;46816:19;;46809:26;;46816:19;-1:-1:-1;46809:26:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46727:116;:::o;46352:113::-;46410:7;46437:20;46451:5;46437:13;:20::i;47294:105::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;47366:16:::1;:25:::0;;-1:-1:-1;;47366:25:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47294:105::o;47526:192::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;47617:6:::1;47612:99;47633:3;:10;47629:1;:14;47612:99;;;47695:4;47665:19;:27;47685:3;47689:1;47685:6;;;;;;;;:::i;:::-;;::::0;;::::1;::::0;;;;;;;-1:-1:-1;;;;;47665:27:0::1;::::0;;;::::1;::::0;;;;;;-1:-1:-1;47665:27:0;:34;;-1:-1:-1;;47665:34:0::1;::::0;::::1;;::::0;;;::::1;::::0;;47645:3;::::1;::::0;::::1;:::i;:::-;;;;47612:99;;46614:105:::0;46658:13;46691:20;46684:27;;;;;:::i;52390:440::-;4201:1;4799:7;;:19;;4791:63;;;;-1:-1:-1;;;4791:63:0;;;;;;;:::i;:::-;4201:1;4932:7;:18;52500:10:::1;52480:31;::::0;;;:19:::1;:31;::::0;;;;;::::1;;52472:63;;;;-1:-1:-1::0;;;52472:63:0::1;;;;;;;:::i;:::-;52571:8;52554:13;;:25;;52546:65;;;::::0;-1:-1:-1;;;52546:65:0;;24839:2:1;52546:65:0::1;::::0;::::1;24821:21:1::0;24878:2;24858:18;;;24851:30;24917:29;24897:18;;;24890:57;24964:18;;52546:65:0::1;24637:351:1::0;52546:65:0::1;52641:31;52651:10;52663:8;52641:9;:31::i;:::-;52741:8;52724:13;;:25;;;;;;;:::i;:::-;::::0;;;-1:-1:-1;;52790:30:0::1;::::0;;25167:25:1;;;-1:-1:-1;;;;;25228:32:1;;25223:2;25208:18;;25201:60;52790:30:0::1;::::0;25140:18:1;52790:30:0::1;;;;;;;-1:-1:-1::0;;4157:1:0;5111:7;:22;52390:440::o;10136:201::-;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;-1:-1:-1;;;;;10225:22:0;::::1;10217:73;;;::::0;-1:-1:-1;;;10217:73:0;;25474:2:1;10217:73:0::1;::::0;::::1;25456:21:1::0;25513:2;25493:18;;;25486:30;25552:34;25532:18;;;25525:62;-1:-1:-1;;;25603:18:1;;;25596:36;25649:19;;10217:73:0::1;25272:402:1::0;10217:73:0::1;10301:28;10320:8;10301:18;:28::i;48051:108::-:0;9300:6;;-1:-1:-1;;;;;9300:6:0;8031:10;9447:23;9439:68;;;;-1:-1:-1;;;9439:68:0;;;;;;;:::i;:::-;48125:9:::1;:26:::0;48051:108::o;41448:172::-;41545:24;;;;:15;:24;;;;;;:29;;-1:-1:-1;;;;;;41545:29:0;-1:-1:-1;;;;;41545:29:0;;;;;;;;;41586:28;;41545:24;;41586:28;;;;;;;41448:172;;;:::o;39813:1529::-;39910:35;39948:20;39960:7;39948:11;:20::i;:::-;40019:18;;39910:58;;-1:-1:-1;39977:22:0;;-1:-1:-1;;;;;40003:34:0;8031:10;-1:-1:-1;;;;;40003:34:0;;:81;;;-1:-1:-1;8031:10:0;40048:20;40060:7;40048:11;:20::i;:::-;-1:-1:-1;;;;;40048:36:0;;40003:81;:142;;;-1:-1:-1;40112:18:0;;40095:50;;8031:10;36541:186;:::i;40095:50::-;39977:169;;40171:17;40155:101;;;;-1:-1:-1;;;40155:101:0;;25881:2:1;40155:101:0;;;25863:21:1;25920:2;25900:18;;;25893:30;25959:34;25939:18;;;25932:62;-1:-1:-1;;;26010:18:1;;;26003:48;26068:19;;40155:101:0;25679:414:1;40155:101:0;40303:4;-1:-1:-1;;;;;40281:26:0;:13;:18;;;-1:-1:-1;;;;;40281:26:0;;40265:98;;;;-1:-1:-1;;;40265:98:0;;26300:2:1;40265:98:0;;;26282:21:1;26339:2;26319:18;;;26312:30;26378:34;26358:18;;;26351:62;-1:-1:-1;;;26429:18:1;;;26422:36;26475:19;;40265:98:0;26098:402:1;40265:98:0;-1:-1:-1;;;;;40378:16:0;;40370:66;;;;-1:-1:-1;;;40370:66:0;;26707:2:1;40370:66:0;;;26689:21:1;26746:2;26726:18;;;26719:30;26785:34;26765:18;;;26758:62;-1:-1:-1;;;26836:18:1;;;26829:35;26881:19;;40370:66:0;26505:401:1;40370:66:0;40545:49;40562:1;40566:7;40575:13;:18;;;40545:8;:49::i;:::-;-1:-1:-1;;;;;40603:18:0;;;;;;:12;:18;;;;;:31;;40633:1;;40603:18;:31;;40633:1;;-1:-1:-1;;;;;40603:31:0;;:::i;:::-;;;;;;;;-1:-1:-1;;;;;40603:31:0;;;;;;;;;;;;;;;-1:-1:-1;;;;;40641:16:0;;-1:-1:-1;40641:16:0;;;:12;:16;;;;;:29;;-1:-1:-1;;;40641:16:0;;:29;;-1:-1:-1;;40641:29:0;;:::i;:::-;;;-1:-1:-1;;;;;40641:29:0;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;40700:43:0;;;;;;;;-1:-1:-1;;;;;40700:43:0;;;;;-1:-1:-1;;;;;40726:15:0;40700:43;;;;;;;;;-1:-1:-1;40677:20:0;;;:11;:20;;;;;;:66;;;;;;;;;-1:-1:-1;;;40677:66:0;-1:-1:-1;;;;;;40677:66:0;;;;;;;;;;;40993:11;40689:7;-1:-1:-1;40993:11:0;:::i;:::-;41056:1;41015:24;;;:11;:24;;;;;:29;40971:33;;-1:-1:-1;;;;;;41015:29:0;41011:236;;41073:20;41081:11;37818:4;37848:12;-1:-1:-1;37838:22:0;37761:105;41073:20;41069:171;;;41133:97;;;;;;;;41160:18;;-1:-1:-1;;;;;41133:97:0;;;;;;41191:28;;;;-1:-1:-1;;;;;41133:97:0;;;;;;;;;-1:-1:-1;41106:24:0;;;:11;:24;;;;;;;:124;;;;;;;;;-1:-1:-1;;;41106:124:0;-1:-1:-1;;;;;;41106:124:0;;;;;;;;;;;;41069:171;41279:7;41275:2;-1:-1:-1;;;;;41260:27:0;41269:4;-1:-1:-1;;;;;41260:27:0;;;;;;;;;;;41294:42;39903:1439;;;39813:1529;;;:::o;41774:846::-;41864:24;;41903:12;41895:49;;;;-1:-1:-1;;;41895:49:0;;27622:2:1;41895:49:0;;;27604:21:1;27661:2;27641:18;;;27634:30;27700:26;27680:18;;;27673:54;27744:18;;41895:49:0;27420:348:1;41895:49:0;41951:16;42001:1;41970:28;41990:8;41970:17;:28;:::i;:::-;:32;;;;:::i;:::-;41951:51;-1:-1:-1;42024:18:0;42041:1;42024:14;:18;:::i;:::-;42013:8;:29;42009:81;;;42064:18;42081:1;42064:14;:18;:::i;:::-;42053:29;;42009:81;42205:17;42213:8;37818:4;37848:12;-1:-1:-1;37838:22:0;37761:105;42205:17;42197:68;;;;-1:-1:-1;;;42197:68:0;;27975:2:1;42197:68:0;;;27957:21:1;28014:2;27994:18;;;27987:30;28053:34;28033:18;;;28026:62;-1:-1:-1;;;28104:18:1;;;28097:36;28150:19;;42197:68:0;27773:402:1;42197:68:0;42289:17;42272:297;42313:8;42308:1;:13;42272:297;;42372:1;42341:14;;;:11;:14;;;;;:19;-1:-1:-1;;;;;42341:19:0;42337:225;;42387:31;42421:14;42433:1;42421:11;:14::i;:::-;42463:89;;;;;;;;42490:14;;-1:-1:-1;;;;;42463:89:0;;;;;;42517:24;;;;-1:-1:-1;;;;;42463:89:0;;;;;;;;;-1:-1:-1;42446:14:0;;;:11;:14;;;;;;;:106;;;;;;;;;-1:-1:-1;;;42446:106:0;-1:-1:-1;;;;;;42446:106:0;;;;;;;;;;;;-1:-1:-1;42337:225:0;42323:3;;;;:::i;:::-;;;;42272:297;;;-1:-1:-1;42602:12:0;:8;42613:1;42602:12;:::i;:::-;42575:24;:39;-1:-1:-1;;;41774:846:0:o;923:190::-;1048:4;1101;1072:25;1085:5;1092:4;1072:12;:25::i;:::-;:33;;923:190;-1:-1:-1;;;;923:190:0:o;48933:182::-;49000:8;;49022:86;49042:12;49038:1;:16;49022:86;;;49088:5;49094:1;49088:8;;;;;;;:::i;:::-;;;;;49082:14;;:3;:14;:::i;:::-;49076:20;-1:-1:-1;49056:3:0;;;;:::i;:::-;;;;49022:86;;;;48933:182;;;:::o;49379:743::-;49496:15;;49447:4;;;49561:29;49558:474;;49635:9;;49620:24;;:12;:24;:::i;:::-;49607:37;;49558:474;;;49694:12;49666:24;:40;49662:370;;49752:19;;49737:34;;:12;:34;:::i;:::-;49724:47;-1:-1:-1;49786:40:0;49814:12;49786:40;;:::i;:::-;;;49662:370;;;49967:9;;49926:37;49939:24;49926:12;:37;:::i;:::-;49925:51;;;;:::i;:::-;49901:19;;49874:46;;:24;:46;:::i;:::-;49873:104;;;;:::i;:::-;49860:117;;50019:1;49992:28;;49662:370;50044:15;:42;;;;50104:10;49379:743;-1:-1:-1;;49379:743:0:o;37872:98::-;37937:27;37947:2;37951:8;37937:27;;;;;;;;;;;;:9;:27::i;33574:606::-;-1:-1:-1;;;;;;;;;;;;;;;;;33691:16:0;33699:7;37818:4;37848:12;-1:-1:-1;37838:22:0;37761:105;33691:16;33683:71;;;;-1:-1:-1;;;33683:71:0;;28616:2:1;33683:71:0;;;28598:21:1;28655:2;28635:18;;;28628:30;28694:34;28674:18;;;28667:62;-1:-1:-1;;;28745:18:1;;;28738:40;28795:19;;33683:71:0;28414:406:1;33683:71:0;33763:26;33811:12;33800:7;:23;33796:93;;33855:22;33865:12;33855:7;:22;:::i;:::-;:26;;33880:1;33855:26;:::i;:::-;33834:47;;33796:93;33917:7;33897:212;33934:18;33926:4;:26;33897:212;;33971:31;34005:17;;;:11;:17;;;;;;;;;33971:51;;;;;;;;;-1:-1:-1;;;;;33971:51:0;;;;;-1:-1:-1;;;33971:51:0;;;-1:-1:-1;;;;;33971:51:0;;;;;;;;34035:28;34031:71;;34083:9;33574:606;-1:-1:-1;;;;33574:606:0:o;34031:71::-;-1:-1:-1;33954:6:0;;;;:::i;:::-;;;;33897:212;;;-1:-1:-1;34117:57:0;;-1:-1:-1;;;34117:57:0;;29168:2:1;34117:57:0;;;29150:21:1;29207:2;29187:18;;;29180:30;29246:34;29226:18;;;29219:62;-1:-1:-1;;;29297:18:1;;;29290:45;29352:19;;34117:57:0;28966:411:1;10497:191:0;10590:6;;;-1:-1:-1;;;;;10607:17:0;;;-1:-1:-1;;;;;;10607:17:0;;;;;;;10640:40;;10590:6;;;10607:17;10590:6;;10640:40;;10571:16;;10640:40;10560:128;10497:191;:::o;43163:690::-;43300:4;-1:-1:-1;;;;;43317:13:0;;12223:19;:23;43313:535;;43356:72;;-1:-1:-1;;;43356:72:0;;-1:-1:-1;;;;;43356:36:0;;;;;:72;;8031:10;;43407:4;;43413:7;;43422:5;;43356:72;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43356:72:0;;;;;;;;-1:-1:-1;;43356:72:0;;;;;;;;;;;;:::i;:::-;;;43343:464;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;43587:13:0;;43583:215;;43620:61;;-1:-1:-1;;;43620:61:0;;;;;;;:::i;43583:215::-;43766:6;43760:13;43751:6;43747:2;43743:15;43736:38;43343:464;-1:-1:-1;;;;;;43478:55:0;-1:-1:-1;;;43478:55:0;;-1:-1:-1;43471:62:0;;43313:535;-1:-1:-1;43836:4:0;43313:535;43163:690;;;;;;:::o;46230:114::-;46290:13;46323;46316:20;;;;;:::i;5513:723::-;5569:13;5790:10;5786:53;;-1:-1:-1;;5817:10:0;;;;;;;;;;;;-1:-1:-1;;;5817:10:0;;;;;5513:723::o;5786:53::-;5864:5;5849:12;5905:78;5912:9;;5905:78;;5938:8;;;;:::i;:::-;;-1:-1:-1;5961:10:0;;-1:-1:-1;5969:2:0;5961:10;;:::i;:::-;;;5905:78;;;5993:19;6025:6;-1:-1:-1;;;;;6015:17:0;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;-1:-1:-1;6015:17:0;;5993:39;;6043:154;6050:10;;6043:154;;6077:11;6087:1;6077:11;;:::i;:::-;;-1:-1:-1;6146:10:0;6154:2;6146:5;:10;:::i;:::-;6133:24;;:2;:24;:::i;:::-;6120:39;;6103:6;6110;6103:14;;;;;;;;:::i;:::-;;;;:56;-1:-1:-1;;;;;6103:56:0;;;;;;;;-1:-1:-1;6174:11:0;6183:2;6174:11;;:::i;:::-;;;6043:154;;33328:240;33389:7;-1:-1:-1;;;;;33421:19:0;;33405:102;;;;-1:-1:-1;;;33405:102:0;;30332:2:1;33405:102:0;;;30314:21:1;30371:2;30351:18;;;30344:30;30410:34;30390:18;;;30383:62;-1:-1:-1;;;30461:18:1;;;30454:47;30518:19;;33405:102:0;30130:413:1;33405:102:0;-1:-1:-1;;;;;;33529:19:0;;;;;:12;:19;;;;;:32;-1:-1:-1;;;33529:32:0;;-1:-1:-1;;;;;33529:32:0;;33328:240::o;1475:675::-;1558:7;1601:4;1558:7;1616:497;1640:5;:12;1636:1;:16;1616:497;;;1674:20;1697:5;1703:1;1697:8;;;;;;;;:::i;:::-;;;;;;;1674:31;;1740:12;1724;:28;1720:382;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;1852:57;;1720:382;;;2226:13;2276:15;;;2312:4;2305:15;;;2359:4;2343:21;;2029:57;;1720:382;-1:-1:-1;1654:3:0;;;;:::i;:::-;;;;1616:497;;;-1:-1:-1;2130:12:0;1475:675;-1:-1:-1;;;1475:675:0:o;38309:1272::-;38414:20;38437:12;-1:-1:-1;;;;;38464:16:0;;38456:62;;;;-1:-1:-1;;;38456:62:0;;30750:2:1;38456:62:0;;;30732:21:1;30789:2;30769:18;;;30762:30;30828:34;30808:18;;;30801:62;-1:-1:-1;;;30879:18:1;;;30872:31;30920:19;;38456:62:0;30548:397:1;38456:62:0;38655:21;38663:12;37818:4;37848:12;-1:-1:-1;37838:22:0;37761:105;38655:21;38654:22;38646:64;;;;-1:-1:-1;;;38646:64:0;;31152:2:1;38646:64:0;;;31134:21:1;31191:2;31171:18;;;31164:30;31230:31;31210:18;;;31203:59;31279:18;;38646:64:0;30950:353:1;38646:64:0;38737:12;38725:8;:24;;38717:71;;;;-1:-1:-1;;;38717:71:0;;31510:2:1;38717:71:0;;;31492:21:1;31549:2;31529:18;;;31522:30;31588:34;31568:18;;;31561:62;-1:-1:-1;;;31639:18:1;;;31632:32;31681:19;;38717:71:0;31308:398:1;38717:71:0;-1:-1:-1;;;;;38900:16:0;;38867:30;38900:16;;;:12;:16;;;;;;;;;38867:49;;;;;;;;;-1:-1:-1;;;;;38867:49:0;;;;;-1:-1:-1;;;38867:49:0;;;;;;;;;;;38942:119;;;;;;;;38962:19;;38867:49;;38942:119;;;38962:39;;38992:8;;38962:39;:::i;:::-;-1:-1:-1;;;;;38942:119:0;;;;;39045:8;39010:11;:24;;;:44;;;;:::i;:::-;-1:-1:-1;;;;;38942:119:0;;;;;;-1:-1:-1;;;;;38923:16:0;;;;;;;:12;:16;;;;;;;;:138;;;;;;;;-1:-1:-1;;;38923:138:0;;;;;;;;;;;;39096:43;;;;;;;;;;-1:-1:-1;;;;;39122:15:0;39096:43;;;;;;;;39068:25;;;:11;:25;;;;;;:71;;;;;;;;;-1:-1:-1;;;39068:71:0;-1:-1:-1;;;;;;39068:71:0;;;;;;;;;;;;;;;;;;39080:12;;39192:281;39216:8;39212:1;:12;39192:281;;;39245:38;;39270:12;;-1:-1:-1;;;;;39245:38:0;;;39262:1;;39245:38;;39262:1;;39245:38;39310:59;39341:1;39345:2;39349:12;39363:5;39310:22;:59::i;:::-;39292:150;;;;-1:-1:-1;;;39292:150:0;;;;;;;:::i;:::-;39451:14;;;;:::i;:::-;;;;39226:3;;;;;:::i;:::-;;;;39192:281;;;-1:-1:-1;39481:12:0;:27;;;39515:60;37211:311;-1:-1:-1;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14:131:1;-1:-1:-1;;;;;;88:32:1;;78:43;;68:71;;135:1;132;125:12;150:245;208:6;261:2;249:9;240:7;236:23;232:32;229:52;;;277:1;274;267:12;229:52;316:9;303:23;335:30;359:5;335:30;:::i;592:258::-;664:1;674:113;688:6;685:1;682:13;674:113;;;764:11;;;758:18;745:11;;;738:39;710:2;703:10;674:113;;;805:6;802:1;799:13;796:48;;;-1:-1:-1;;840:1:1;822:16;;815:27;592:258::o;855:::-;897:3;935:5;929:12;962:6;957:3;950:19;978:63;1034:6;1027:4;1022:3;1018:14;1011:4;1004:5;1000:16;978:63;:::i;:::-;1095:2;1074:15;-1:-1:-1;;1070:29:1;1061:39;;;;1102:4;1057:50;;855:258;-1:-1:-1;;855:258:1:o;1118:220::-;1267:2;1256:9;1249:21;1230:4;1287:45;1328:2;1317:9;1313:18;1305:6;1287:45;:::i;1343:180::-;1402:6;1455:2;1443:9;1434:7;1430:23;1426:32;1423:52;;;1471:1;1468;1461:12;1423:52;-1:-1:-1;1494:23:1;;1343:180;-1:-1:-1;1343:180:1:o;1736:131::-;-1:-1:-1;;;;;1811:31:1;;1801:42;;1791:70;;1857:1;1854;1847:12;1872:315;1940:6;1948;2001:2;1989:9;1980:7;1976:23;1972:32;1969:52;;;2017:1;2014;2007:12;1969:52;2056:9;2043:23;2075:31;2100:5;2075:31;:::i;:::-;2125:5;2177:2;2162:18;;;;2149:32;;-1:-1:-1;;;1872:315:1:o;2374:456::-;2451:6;2459;2467;2520:2;2508:9;2499:7;2495:23;2491:32;2488:52;;;2536:1;2533;2526:12;2488:52;2575:9;2562:23;2594:31;2619:5;2594:31;:::i;:::-;2644:5;-1:-1:-1;2701:2:1;2686:18;;2673:32;2714:33;2673:32;2714:33;:::i;:::-;2374:456;;2766:7;;-1:-1:-1;;;2820:2:1;2805:18;;;;2792:32;;2374:456::o;3017:160::-;3111:6;3144:3;3132:16;;3129:25;-1:-1:-1;3126:45:1;;;3167:1;3164;3157:12;3182:367;3245:8;3255:6;3309:3;3302:4;3294:6;3290:17;3286:27;3276:55;;3327:1;3324;3317:12;3276:55;-1:-1:-1;3350:20:1;;-1:-1:-1;;;;;3382:30:1;;3379:50;;;3425:1;3422;3415:12;3379:50;3462:4;3454:6;3450:17;3438:29;;3522:3;3515:4;3505:6;3502:1;3498:14;3490:6;3486:27;3482:38;3479:47;3476:67;;;3539:1;3536;3529:12;3476:67;3182:367;;;;;:::o;3554:563::-;3675:6;3683;3691;3744:3;3732:9;3723:7;3719:23;3715:33;3712:53;;;3761:1;3758;3751:12;3712:53;3784;3829:7;3818:9;3784:53;:::i;:::-;3774:63;;3888:3;3877:9;3873:19;3860:33;-1:-1:-1;;;;;3908:6:1;3905:30;3902:50;;;3948:1;3945;3938:12;3902:50;3987:70;4049:7;4040:6;4029:9;4025:22;3987:70;:::i;:::-;3554:563;;4076:8;;-1:-1:-1;3961:96:1;;-1:-1:-1;;;;3554:563:1:o;4122:592::-;4193:6;4201;4254:2;4242:9;4233:7;4229:23;4225:32;4222:52;;;4270:1;4267;4260:12;4222:52;4310:9;4297:23;-1:-1:-1;;;;;4380:2:1;4372:6;4369:14;4366:34;;;4396:1;4393;4386:12;4366:34;4434:6;4423:9;4419:22;4409:32;;4479:7;4472:4;4468:2;4464:13;4460:27;4450:55;;4501:1;4498;4491:12;4450:55;4541:2;4528:16;4567:2;4559:6;4556:14;4553:34;;;4583:1;4580;4573:12;4553:34;4628:7;4623:2;4614:6;4610:2;4606:15;4602:24;4599:37;4596:57;;;4649:1;4646;4639:12;4596:57;4680:2;4672:11;;;;;4702:6;;-1:-1:-1;4122:592:1;;-1:-1:-1;;;;4122:592:1:o;4719:160::-;4784:20;;4840:13;;4833:21;4823:32;;4813:60;;4869:1;4866;4859:12;4813:60;4719:160;;;:::o;4884:180::-;4940:6;4993:2;4981:9;4972:7;4968:23;4964:32;4961:52;;;5009:1;5006;4999:12;4961:52;5032:26;5048:9;5032:26;:::i;5069:247::-;5128:6;5181:2;5169:9;5160:7;5156:23;5152:32;5149:52;;;5197:1;5194;5187:12;5149:52;5236:9;5223:23;5255:31;5280:5;5255:31;:::i;5871:237::-;5956:6;6009:3;5997:9;5988:7;5984:23;5980:33;5977:53;;;6026:1;6023;6016:12;5977:53;6049;6094:7;6083:9;6049:53;:::i;6113:127::-;6174:10;6169:3;6165:20;6162:1;6155:31;6205:4;6202:1;6195:15;6229:4;6226:1;6219:15;6245:275;6316:2;6310:9;6381:2;6362:13;;-1:-1:-1;;6358:27:1;6346:40;;-1:-1:-1;;;;;6401:34:1;;6437:22;;;6398:62;6395:88;;;6463:18;;:::i;:::-;6499:2;6492:22;6245:275;;-1:-1:-1;6245:275:1:o;6525:407::-;6590:5;-1:-1:-1;;;;;6616:6:1;6613:30;6610:56;;;6646:18;;:::i;:::-;6684:57;6729:2;6708:15;;-1:-1:-1;;6704:29:1;6735:4;6700:40;6684:57;:::i;:::-;6675:66;;6764:6;6757:5;6750:21;6804:3;6795:6;6790:3;6786:16;6783:25;6780:45;;;6821:1;6818;6811:12;6780:45;6870:6;6865:3;6858:4;6851:5;6847:16;6834:43;6924:1;6917:4;6908:6;6901:5;6897:18;6893:29;6886:40;6525:407;;;;;:::o;6937:451::-;7006:6;7059:2;7047:9;7038:7;7034:23;7030:32;7027:52;;;7075:1;7072;7065:12;7027:52;7115:9;7102:23;-1:-1:-1;;;;;7140:6:1;7137:30;7134:50;;;7180:1;7177;7170:12;7134:50;7203:22;;7256:4;7248:13;;7244:27;-1:-1:-1;7234:55:1;;7285:1;7282;7275:12;7234:55;7308:74;7374:7;7369:2;7356:16;7351:2;7347;7343:11;7308:74;:::i;7393:315::-;7458:6;7466;7519:2;7507:9;7498:7;7494:23;7490:32;7487:52;;;7535:1;7532;7525:12;7487:52;7574:9;7561:23;7593:31;7618:5;7593:31;:::i;:::-;7643:5;-1:-1:-1;7667:35:1;7698:2;7683:18;;7667:35;:::i;:::-;7657:45;;7393:315;;;;;:::o;7713:437::-;7799:6;7807;7860:2;7848:9;7839:7;7835:23;7831:32;7828:52;;;7876:1;7873;7866:12;7828:52;7916:9;7903:23;-1:-1:-1;;;;;7941:6:1;7938:30;7935:50;;;7981:1;7978;7971:12;7935:50;8020:70;8082:7;8073:6;8062:9;8058:22;8020:70;:::i;:::-;8109:8;;7994:96;;-1:-1:-1;7713:437:1;-1:-1:-1;;;;7713:437:1:o;8155:404::-;8239:6;8247;8300:2;8288:9;8279:7;8275:23;8271:32;8268:52;;;8316:1;8313;8306:12;8268:52;8355:9;8342:23;8374:31;8399:5;8374:31;:::i;:::-;8424:5;-1:-1:-1;8481:2:1;8466:18;;8453:32;8494:33;8453:32;8494:33;:::i;:::-;8546:7;8536:17;;;8155:404;;;;;:::o;8757:795::-;8852:6;8860;8868;8876;8929:3;8917:9;8908:7;8904:23;8900:33;8897:53;;;8946:1;8943;8936:12;8897:53;8985:9;8972:23;9004:31;9029:5;9004:31;:::i;:::-;9054:5;-1:-1:-1;9111:2:1;9096:18;;9083:32;9124:33;9083:32;9124:33;:::i;:::-;9176:7;-1:-1:-1;9230:2:1;9215:18;;9202:32;;-1:-1:-1;9285:2:1;9270:18;;9257:32;-1:-1:-1;;;;;9301:30:1;;9298:50;;;9344:1;9341;9334:12;9298:50;9367:22;;9420:4;9412:13;;9408:27;-1:-1:-1;9398:55:1;;9449:1;9446;9439:12;9398:55;9472:74;9538:7;9533:2;9520:16;9515:2;9511;9507:11;9472:74;:::i;:::-;9462:84;;;8757:795;;;;;;;:::o;9557:508::-;9737:3;9722:19;;9726:9;9818:6;9695:4;9852:207;9866:4;9863:1;9860:11;9852:207;;;9929:13;;9944:6;9925:26;9913:39;;9975:4;9999:12;;;;10034:15;;;;9886:1;9879:9;9852:207;;;9856:3;;;9557:508;;;;:::o;10070:1021::-;10154:6;10185:2;10228;10216:9;10207:7;10203:23;10199:32;10196:52;;;10244:1;10241;10234:12;10196:52;10284:9;10271:23;-1:-1:-1;;;;;10354:2:1;10346:6;10343:14;10340:34;;;10370:1;10367;10360:12;10340:34;10408:6;10397:9;10393:22;10383:32;;10453:7;10446:4;10442:2;10438:13;10434:27;10424:55;;10475:1;10472;10465:12;10424:55;10511:2;10498:16;10533:2;10529;10526:10;10523:36;;;10539:18;;:::i;:::-;10585:2;10582:1;10578:10;10568:20;;10608:28;10632:2;10628;10624:11;10608:28;:::i;:::-;10670:15;;;10740:11;;;10736:20;;;10701:12;;;;10768:19;;;10765:39;;;10800:1;10797;10790:12;10765:39;10824:11;;;;10844:217;10860:6;10855:3;10852:15;10844:217;;;10940:3;10927:17;10914:30;;10957:31;10982:5;10957:31;:::i;:::-;11001:18;;;10877:12;;;;11039;;;;10844:217;;;11080:5;10070:1021;-1:-1:-1;;;;;;;;10070:1021:1:o;11489:380::-;11568:1;11564:12;;;;11611;;;11632:61;;11686:4;11678:6;11674:17;11664:27;;11632:61;11739:2;11731:6;11728:14;11708:18;11705:38;11702:161;;;11785:10;11780:3;11776:20;11773:1;11766:31;11820:4;11817:1;11810:15;11848:4;11845:1;11838:15;13117:356;13319:2;13301:21;;;13338:18;;;13331:30;13397:34;13392:2;13377:18;;13370:62;13464:2;13449:18;;13117:356::o;13478:355::-;13680:2;13662:21;;;13719:2;13699:18;;;13692:30;13758:33;13753:2;13738:18;;13731:61;13824:2;13809:18;;13478:355::o;14871:127::-;14932:10;14927:3;14923:20;14920:1;14913:31;14963:4;14960:1;14953:15;14987:4;14984:1;14977:15;15003:128;15043:3;15074:1;15070:6;15067:1;15064:13;15061:39;;;15080:18;;:::i;:::-;-1:-1:-1;15116:9:1;;15003:128::o;15491:168::-;15531:7;15597:1;15593;15589:6;15585:14;15582:1;15579:21;15574:1;15567:9;15560:17;15556:45;15553:71;;;15604:18;;:::i;:::-;-1:-1:-1;15644:9:1;;15491:168::o;16349:127::-;16410:10;16405:3;16401:20;16398:1;16391:31;16441:4;16438:1;16431:15;16465:4;16462:1;16455:15;16481:217;16520:4;16549:6;16605:10;;;;16575;;16627:12;;;16624:38;;;16642:18;;:::i;:::-;16679:13;;16481:217;-1:-1:-1;;;16481:217:1:o;16703:135::-;16742:3;-1:-1:-1;;16763:17:1;;16760:43;;;16783:18;;:::i;:::-;-1:-1:-1;16830:1:1;16819:13;;16703:135::o;17193:127::-;17254:10;17249:3;17245:20;17242:1;17235:31;17285:4;17282:1;17275:15;17309:4;17306:1;17299:15;17325:120;17365:1;17391;17381:35;;17396:18;;:::i;:::-;-1:-1:-1;17430:9:1;;17325:120::o;17450:125::-;17490:4;17518:1;17515;17512:8;17509:34;;;17523:18;;:::i;:::-;-1:-1:-1;17560:9:1;;17450:125::o;18841:595::-;19051:3;19036:19;;19040:9;19132:6;19009:4;19166:194;19180:4;19177:1;19174:11;19166:194;;;19239:13;;19227:26;;19276:4;19300:12;;;;19335:15;;;;19200:1;19193:9;19166:194;;;-1:-1:-1;;;;;;;;19397:32:1;;;;19391:3;19376:19;;;;19369:61;18841:595;;-1:-1:-1;18841:595:1:o;21075:343::-;21277:2;21259:21;;;21316:2;21296:18;;;21289:30;-1:-1:-1;;;21350:2:1;21335:18;;21328:49;21409:2;21394:18;;21075:343::o;22158:112::-;22190:1;22216;22206:35;;22221:18;;:::i;:::-;-1:-1:-1;22255:9:1;;22158:112::o;23326:415::-;23528:2;23510:21;;;23567:2;23547:18;;;23540:30;23606:34;23601:2;23586:18;;23579:62;-1:-1:-1;;;23672:2:1;23657:18;;23650:49;23731:3;23716:19;;23326:415::o;24162:470::-;24341:3;24379:6;24373:13;24395:53;24441:6;24436:3;24429:4;24421:6;24417:17;24395:53;:::i;:::-;24511:13;;24470:16;;;;24533:57;24511:13;24470:16;24567:4;24555:17;;24533:57;:::i;:::-;24606:20;;24162:470;-1:-1:-1;;;;24162:470:1:o;26911:246::-;26951:4;-1:-1:-1;;;;;27064:10:1;;;;27034;;27086:12;;;27083:38;;;27101:18;;:::i;27162:253::-;27202:3;-1:-1:-1;;;;;27291:2:1;27288:1;27284:10;27321:2;27318:1;27314:10;27352:3;27348:2;27344:12;27339:3;27336:21;27333:47;;;27360:18;;:::i;28825:136::-;28864:3;28892:5;28882:39;;28901:18;;:::i;:::-;-1:-1:-1;;;28937:18:1;;28825:136::o;29382:489::-;-1:-1:-1;;;;;29651:15:1;;;29633:34;;29703:15;;29698:2;29683:18;;29676:43;29750:2;29735:18;;29728:34;;;29798:3;29793:2;29778:18;;29771:31;;;29576:4;;29819:46;;29845:19;;29837:6;29819:46;:::i;:::-;29811:54;29382:489;-1:-1:-1;;;;;;29382:489:1:o;29876:249::-;29945:6;29998:2;29986:9;29977:7;29973:23;29969:32;29966:52;;;30014:1;30011;30004:12;29966:52;30046:9;30040:16;30065:30;30089:5;30065:30;:::i

Swarm Source

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