ETH Price: $3,536.53 (+7.26%)

Token

AmariArtistPass (AMAP)
 

Overview

Max Total Supply

2,000 AMAP

Holders

777

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
6 AMAP
0xbcD2E843FE41Da351cDe58bceB40D69242b229Db
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:
AmariArtistPass

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2022-09-20
*/

// SPDX-License-Identifier: MIT
pragma solidity ^0.8.0;

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

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

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

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

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


// OpenZeppelin Contracts v4.4.1 (utils/cryptography/ECDSA.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

        return (signer, RecoverError.NoError);
    }

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

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

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

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

    function _setOwner(address newOwner) private {
        address oldOwner = _owner;
        _owner = newOwner;
        emit OwnershipTransferred(oldOwner, newOwner);
    }
}
// File: Address.sol



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}
// File: 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: 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: 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: 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: 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 tokenId);

    /**
     * @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: 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: ERC721A.sol


pragma solidity ^0.8.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 internal currentIndex;

    // 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) internal _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;

    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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(totalSupply). 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;
        address currOwnershipAddr;

        // Counter overflow is impossible as the loop breaks when uint256 i is equal to another uint256 numMintedSoFar.
        unchecked {
            for (uint256 i; 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);
    }

    /**
     * Gas spent here starts off proportional to the maximum mint batch size.
     * It gradually moves to O(1) as tokens get transferred around in the collection over time.
     */
    function ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {
        require(_exists(tokenId), 'ERC721A: owner query for nonexistent token');

        unchecked {
            for (uint256 curr = tokenId; curr >= 0; 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 Safely mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(
        address to,
        uint256 quantity,
        bytes memory _data
    ) internal {
        _mint(to, quantity, _data, true);
    }

    /**
     * @dev Mints `quantity` tokens and transfers them to `to`.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `quantity` must be greater than 0.
     *
     * Emits a {Transfer} event.
     */
    function _mint(
        address to,
        uint256 quantity,
        bytes memory _data,
        bool safe
    ) internal {
        uint256 startTokenId = currentIndex;
        require(to != address(0), 'ERC721A: mint to the zero address');
        require(quantity != 0, 'ERC721A: quantity must be greater than 0');

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

        // Overflows are incredibly unrealistic.
        // balance or numberMinted overflow if current value of either + quantity > 3.4e38 (2**128) - 1
        // updatedIndex overflows if currentIndex + quantity > 1.56e77 (2**256) - 1
        unchecked {
            _addressData[to].balance += uint128(quantity);
            _addressData[to].numberMinted += uint128(quantity);

            _ownerships[startTokenId].addr = to;
            _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);

            uint256 updatedIndex = startTokenId;

            for (uint256 i; i < quantity; i++) {
                emit Transfer(address(0), to, updatedIndex);
                if (safe) {
                    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);

        // Underflow of the sender's balance is impossible because we check for
        // ownership above and the recipient's balance can't realistically overflow.
        // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.
        unchecked {
            _addressData[from].balance -= 1;
            _addressData[to].balance += 1;

            _ownerships[tokenId].addr = to;
            _ownerships[tokenId].startTimestamp = 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].addr = prevOwnership.addr;
                    _ownerships[nextTokenId].startTimestamp = 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);
    }

    /**
     * @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 {}
}

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

pragma solidity ^0.8.0;

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

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

    uint256 private _status;

    constructor() {
        _status = _NOT_ENTERED;
    }

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

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

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

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


pragma solidity ^0.8.2;

abstract contract ALLOWLISTCONTRACT {
  function balanceOf(address owner) public view virtual returns (uint256);
}
 
contract AmariArtistPass is ERC721A, Ownable, ReentrancyGuard {
    using Strings
    for uint256;
    string public _metadata;

    ALLOWLISTCONTRACT private allowlistcontract;

   //@notice admin wallet
    address private adminWallet = 0x2901BF554C4c90d2356204fa0E772328Ea8d9e20;

    //@notice contract for allowlist
    address public allowlistContract = 0x892848074ddeA461A15f337250Da3ce55580CA85;

    //@notice phases for sale
    bool public isAllowlistActive = false;
    bool public isPublicActive = false;

    //@notice settings for sale
    uint256 public MAX_SUPPLY = 2000;
    uint256 public MAX_SUPPLY_ALLOWLIST = 400; // 250 for allowlists with 150 reserved
    uint256 public PRICE_PER_TOKEN = 0.02 ether;
    uint256 private maxMintPerWalletAllowlist = 1;
    uint256 private maxMintPerWalletPublic = 5;

    //@notice mappings for sale
    mapping(address => uint256) public numMintedPerPersonAllowlist;
    mapping(address => uint256) public numMintedPerPersonPublic;

    constructor() ERC721A("AmariArtistPass ", "AMAP") {
        allowlistcontract = ALLOWLISTCONTRACT(allowlistContract);
    }

    //@notice mint allowlist, requires balance from allowlist contract
    function mintAllowlist() external nonReentrant {
        uint256 ts = totalSupply();
        uint256 checkBal = allowlistcontract.balanceOf(msg.sender);
        require(isAllowlistActive, "Allowlist is not Active");
        require(checkBal > 0, "Minter does not own allowlisted contract");

        require(ts + 1 <= MAX_SUPPLY_ALLOWLIST, "Purchase would exceed max tokens");
        require(numMintedPerPersonAllowlist[msg.sender] + 1 <= maxMintPerWalletAllowlist, "Purchase would exceed max tokens per Wallet");
        require(msg.sender == tx.origin);
        _safeMint(msg.sender, 1);
        numMintedPerPersonAllowlist[msg.sender] += 1;
    }

    //@notice public mint
   function mintPublic(uint256 _tokenAmount) external payable nonReentrant {
        uint256 ts = totalSupply();
        require(isPublicActive, "Public is not Active");
        require(_tokenAmount <= maxMintPerWalletPublic, "Purchase would exceed max tokens per tx in this phase");
        require(ts + _tokenAmount <= MAX_SUPPLY, "Purchase would exceed max tokens");
        require(msg.value >= PRICE_PER_TOKEN * _tokenAmount, "Ether value sent is not correct");
        require(msg.sender == tx.origin);
        require(numMintedPerPersonPublic[msg.sender] + _tokenAmount <= maxMintPerWalletPublic, "Purchase would exceed max tokens per Wallet");

        _safeMint(msg.sender, _tokenAmount);
        numMintedPerPersonPublic[msg.sender] += _tokenAmount;
       }

    //@notice reserve tokens, only owner
    function reserve(address addr, uint256 _tokenAmount) public onlyOwner {
        uint256 ts = totalSupply();
        require(ts + _tokenAmount <= MAX_SUPPLY);
        _safeMint(addr, _tokenAmount);
    }

    //@notice set new allowlist contract
    function setAllowlistContract(address _contract) external onlyOwner {
        allowlistContract = _contract;
    }

    //@notice set new price for a token
    function setPrice(uint256 _newPrice) external onlyOwner {
        PRICE_PER_TOKEN = _newPrice;
    }

    //@notice set new max allowlist/presale spots
    function setMaxAllowlist(uint256 _newMaxAllowlist) external onlyOwner {
        require(_newMaxAllowlist <= MAX_SUPPLY,"Can not set greater than maxsupply");
        MAX_SUPPLY_ALLOWLIST = _newMaxAllowlist;
    }

    //@notice set allowlist active
    function setAllowlistLive(bool _status) external onlyOwner {
        isAllowlistActive = _status;
    }

    //@notice set public active
    function sePublicLive(bool _status) external onlyOwner {
        isPublicActive = _status;
    }

    //@notice set max mint per wallet allowlist
    function setMaxMintPerWalletAllowlis(uint256 _amount) external onlyOwner {
        maxMintPerWalletAllowlist = _amount;
    }

    //@notice set max mint per wallet public
    function setMaxMintPerWalletPublic(uint256 _amount) external onlyOwner {
        maxMintPerWalletPublic = _amount;
    }

    //@notice set metadata
    function setMetadata(string memory metadata_) external onlyOwner {
        _metadata = metadata_;
    }

    //@notice Set the admin wallet.
    function setAdminWallet(address _wallet) external onlyOwner {
        adminWallet = _wallet;
    }

    //@notice call metadata
    function _baseURI() internal view virtual override returns(string memory) {
        return _metadata;
    }

    //@notice withdraw to admin
    function withdraw() public payable onlyOwner {
        (bool success, ) = payable(adminWallet).call {
            value: address(this).balance
        }("");
        require(success);
    }
}

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":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_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY_ALLOWLIST","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PRICE_PER_TOKEN","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_metadata","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"allowlistContract","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isAllowlistActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isPublicActive","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"mintAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"mintPublic","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numMintedPerPersonAllowlist","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"numMintedPerPersonPublic","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":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint256","name":"_tokenAmount","type":"uint256"}],"name":"reserve","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":"bool","name":"_status","type":"bool"}],"name":"sePublicLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_wallet","type":"address"}],"name":"setAdminWallet","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_contract","type":"address"}],"name":"setAllowlistContract","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_status","type":"bool"}],"name":"setAllowlistLive","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newMaxAllowlist","type":"uint256"}],"name":"setMaxAllowlist","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxMintPerWalletAllowlis","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"setMaxMintPerWalletPublic","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"metadata_","type":"string"}],"name":"setMetadata","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newPrice","type":"uint256"}],"name":"setPrice","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":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]

6080604052732901bf554c4c90d2356204fa0e772328ea8d9e20600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073892848074ddea461a15f337250da3ce55580ca85600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506000600c60146101000a81548160ff0219169083151502179055506000600c60156101000a81548160ff0219169083151502179055506107d0600d55610190600e5566470de4df820000600f55600160105560056011553480156200011257600080fd5b506040518060400160405280601081526020017f416d6172694172746973745061737320000000000000000000000000000000008152506040518060400160405280600481526020017f414d41500000000000000000000000000000000000000000000000000000000081525081600190805190602001906200019792919062000312565b508060029080519060200190620001b092919062000312565b505050620001d3620001c76200024460201b60201c565b6200024c60201b60201c565b6001600881905550600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555062000427565b600033905090565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b8280546200032090620003c2565b90600052602060002090601f01602090048101928262000344576000855562000390565b82601f106200035f57805160ff191683800117855562000390565b8280016001018555821562000390579182015b828111156200038f57825182559160200191906001019062000372565b5b5090506200039f9190620003a3565b5090565b5b80821115620003be576000816000905550600101620003a4565b5090565b60006002820490506001821680620003db57607f821691505b60208210811415620003f257620003f1620003f8565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b614f3b80620004376000396000f3fe6080604052600436106102465760003560e01c8063715018a611610139578063a3330d25116100b6578063cc47a40b1161007a578063cc47a40b1461087d578063d2d515cc146108a6578063e985e9c5146108d1578063efd0cbf91461090e578063f2fde38b1461092a578063f7a225a41461095357610246565b8063a3330d251461079a578063a49a1e7d146107c5578063aa7fa199146107ee578063b88d4fde14610817578063c87b56dd1461084057610246565b806391b7f5ed116100fd57806391b7f5ed146106cb57806395d89b41146106f457806399c92bed1461071f5780639af5886214610748578063a22cb4651461077157610246565b8063715018a61461060857806377a3c6651461061f578063833b94991461064a5780638da5cb5b146106755780638de928d8146106a057610246565b806339371b25116101c75780634f6ccce71161018b5780634f6ccce7146104ff57806351ad69761461053c5780636352211e1461056557806363b4e0b2146105a257806370a08231146105cb57610246565b806339371b25146104275780633ab23d9a146104525780633ccfd60b1461048f57806342842e0e146104995780634c24fa7b146104c257610246565b806318160ddd1161020e57806318160ddd1461034257806323b872dd1461036d5780632f745c591461039657806332cb6b0c146103d357806335082933146103fe57610246565b8063016161b81461024b57806301ffc9a71461027457806306fdde03146102b1578063081812fc146102dc578063095ea7b314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613816565b61096a565b005b34801561028057600080fd5b5061029b60048036038101906102969190613843565b610a03565b6040516102a89190613ea7565b60405180910390f35b3480156102bd57600080fd5b506102c6610b4d565b6040516102d39190613ec2565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe91906138e6565b610bdf565b6040516103109190613e40565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b91906137d6565b610c64565b005b34801561034e57600080fd5b50610357610d7d565b6040516103649190614264565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f91906136c0565b610d86565b005b3480156103a257600080fd5b506103bd60048036038101906103b891906137d6565b610d96565b6040516103ca9190614264565b60405180910390f35b3480156103df57600080fd5b506103e8610f88565b6040516103f59190614264565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613653565b610f8e565b005b34801561043357600080fd5b5061043c61104e565b6040516104499190613ec2565b60405180910390f35b34801561045e57600080fd5b5061047960048036038101906104749190613653565b6110dc565b6040516104869190614264565b60405180910390f35b6104976110f4565b005b3480156104a557600080fd5b506104c060048036038101906104bb91906136c0565b61120b565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190613653565b61122b565b6040516104f69190614264565b60405180910390f35b34801561050b57600080fd5b50610526600480360381019061052191906138e6565b611243565b6040516105339190614264565b60405180910390f35b34801561054857600080fd5b50610563600480360381019061055e9190613653565b611296565b005b34801561057157600080fd5b5061058c600480360381019061058791906138e6565b611356565b6040516105999190613e40565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c491906138e6565b61136c565b005b3480156105d757600080fd5b506105f260048036038101906105ed9190613653565b611437565b6040516105ff9190614264565b60405180910390f35b34801561061457600080fd5b5061061d611520565b005b34801561062b57600080fd5b506106346115a8565b6040516106419190614264565b60405180910390f35b34801561065657600080fd5b5061065f6115ae565b60405161066c9190614264565b60405180910390f35b34801561068157600080fd5b5061068a6115b4565b6040516106979190613e40565b60405180910390f35b3480156106ac57600080fd5b506106b56115de565b6040516106c29190613e40565b60405180910390f35b3480156106d757600080fd5b506106f260048036038101906106ed91906138e6565b611604565b005b34801561070057600080fd5b5061070961168a565b6040516107169190613ec2565b60405180910390f35b34801561072b57600080fd5b50610746600480360381019061074191906138e6565b61171c565b005b34801561075457600080fd5b5061076f600480360381019061076a91906138e6565b6117a2565b005b34801561077d57600080fd5b5061079860048036038101906107939190613796565b611828565b005b3480156107a657600080fd5b506107af6119a9565b6040516107bc9190613ea7565b60405180910390f35b3480156107d157600080fd5b506107ec60048036038101906107e7919061389d565b6119bc565b005b3480156107fa57600080fd5b5061081560048036038101906108109190613816565b611a52565b005b34801561082357600080fd5b5061083e60048036038101906108399190613713565b611aeb565b005b34801561084c57600080fd5b50610867600480360381019061086291906138e6565b611b47565b6040516108749190613ec2565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f91906137d6565b611bef565b005b3480156108b257600080fd5b506108bb611ca0565b6040516108c89190613ea7565b60405180910390f35b3480156108dd57600080fd5b506108f860048036038101906108f39190613680565b611cb3565b6040516109059190613ea7565b60405180910390f35b610928600480360381019061092391906138e6565b611d47565b005b34801561093657600080fd5b50610951600480360381019061094c9190613653565b611fc2565b005b34801561095f57600080fd5b506109686120ba565b005b610972612396565b73ffffffffffffffffffffffffffffffffffffffff166109906115b4565b73ffffffffffffffffffffffffffffffffffffffff16146109e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109dd906140a4565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ace57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b3657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b465750610b458261239e565b5b9050919050565b606060018054610b5c9061451f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b889061451f565b8015610bd55780601f10610baa57610100808354040283529160200191610bd5565b820191906000526020600020905b815481529060010190602001808311610bb857829003601f168201915b5050505050905090565b6000610bea82612408565b610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2090614244565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c6f82611356565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd790614144565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cff612396565b73ffffffffffffffffffffffffffffffffffffffff161480610d2e5750610d2d81610d28612396565b611cb3565b5b610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6490614004565b60405180910390fd5b610d78838383612415565b505050565b60008054905090565b610d918383836124c7565b505050565b6000610da183611437565b8210610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990613ee4565b60405180910390fd5b6000610dec610d7d565b905060008060005b83811015610f46576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ee657806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f385786841415610f2f578195505050505050610f82565b83806001019450505b508080600101915050610df4565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f79906141e4565b60405180910390fd5b92915050565b600d5481565b610f96612396565b73ffffffffffffffffffffffffffffffffffffffff16610fb46115b4565b73ffffffffffffffffffffffffffffffffffffffff161461100a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611001906140a4565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6009805461105b9061451f565b80601f01602080910402602001604051908101604052809291908181526020018280546110879061451f565b80156110d45780601f106110a9576101008083540402835291602001916110d4565b820191906000526020600020905b8154815290600101906020018083116110b757829003601f168201915b505050505081565b60126020528060005260406000206000915090505481565b6110fc612396565b73ffffffffffffffffffffffffffffffffffffffff1661111a6115b4565b73ffffffffffffffffffffffffffffffffffffffff1614611170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611167906140a4565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516111b890613e2b565b60006040518083038185875af1925050503d80600081146111f5576040519150601f19603f3d011682016040523d82523d6000602084013e6111fa565b606091505b505090508061120857600080fd5b50565b61122683838360405180602001604052806000815250611aeb565b505050565b60136020528060005260406000206000915090505481565b600061124d610d7d565b821061128e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128590613f64565b60405180910390fd5b819050919050565b61129e612396565b73ffffffffffffffffffffffffffffffffffffffff166112bc6115b4565b73ffffffffffffffffffffffffffffffffffffffff1614611312576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611309906140a4565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061136182612a07565b600001519050919050565b611374612396565b73ffffffffffffffffffffffffffffffffffffffff166113926115b4565b73ffffffffffffffffffffffffffffffffffffffff16146113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df906140a4565b60405180910390fd5b600d5481111561142d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142490613fc4565b60405180910390fd5b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f90614024565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611528612396565b73ffffffffffffffffffffffffffffffffffffffff166115466115b4565b73ffffffffffffffffffffffffffffffffffffffff161461159c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611593906140a4565b60405180910390fd5b6115a66000612ba1565b565b600e5481565b600f5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61160c612396565b73ffffffffffffffffffffffffffffffffffffffff1661162a6115b4565b73ffffffffffffffffffffffffffffffffffffffff1614611680576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611677906140a4565b60405180910390fd5b80600f8190555050565b6060600280546116999061451f565b80601f01602080910402602001604051908101604052809291908181526020018280546116c59061451f565b80156117125780601f106116e757610100808354040283529160200191611712565b820191906000526020600020905b8154815290600101906020018083116116f557829003601f168201915b5050505050905090565b611724612396565b73ffffffffffffffffffffffffffffffffffffffff166117426115b4565b73ffffffffffffffffffffffffffffffffffffffff1614611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f906140a4565b60405180910390fd5b8060118190555050565b6117aa612396565b73ffffffffffffffffffffffffffffffffffffffff166117c86115b4565b73ffffffffffffffffffffffffffffffffffffffff161461181e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611815906140a4565b60405180910390fd5b8060108190555050565b611830612396565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561189e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611895906140e4565b60405180910390fd5b80600660006118ab612396565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611958612396565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161199d9190613ea7565b60405180910390a35050565b600c60159054906101000a900460ff1681565b6119c4612396565b73ffffffffffffffffffffffffffffffffffffffff166119e26115b4565b73ffffffffffffffffffffffffffffffffffffffff1614611a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2f906140a4565b60405180910390fd5b8060099080519060200190611a4e929190613418565b5050565b611a5a612396565b73ffffffffffffffffffffffffffffffffffffffff16611a786115b4565b73ffffffffffffffffffffffffffffffffffffffff1614611ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac5906140a4565b60405180910390fd5b80600c60156101000a81548160ff02191690831515021790555050565b611af68484846124c7565b611b0284848484612c67565b611b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3890614164565b60405180910390fd5b50505050565b6060611b5282612408565b611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b88906140c4565b60405180910390fd5b6000611b9b612dfe565b9050600081511415611bbc5760405180602001604052806000815250611be7565b80611bc684612e90565b604051602001611bd7929190613e07565b6040516020818303038152906040525b915050919050565b611bf7612396565b73ffffffffffffffffffffffffffffffffffffffff16611c156115b4565b73ffffffffffffffffffffffffffffffffffffffff1614611c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c62906140a4565b60405180910390fd5b6000611c75610d7d565b9050600d548282611c869190614354565b1115611c9157600080fd5b611c9b8383612ff1565b505050565b600c60149054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d4f61300f565b6000611d59610d7d565b9050600c60159054906101000a900460ff16611daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da190614064565b60405180910390fd5b601154821115611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de690613fe4565b60405180910390fd5b600d548282611dfe9190614354565b1115611e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3690613f24565b60405180910390fd5b81600f54611e4d91906143db565b341015611e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8690613fa4565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ec757600080fd5b60115482601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f159190614354565b1115611f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4d906141c4565b60405180910390fd5b611f603383612ff1565b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611faf9190614354565b9250508190555050611fbf61305f565b50565b611fca612396565b73ffffffffffffffffffffffffffffffffffffffff16611fe86115b4565b73ffffffffffffffffffffffffffffffffffffffff161461203e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612035906140a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a590613f04565b60405180910390fd5b6120b781612ba1565b50565b6120c261300f565b60006120cc610d7d565b90506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161212b9190613e40565b60206040518083038186803b15801561214357600080fd5b505afa158015612157573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217b9190613913565b9050600c60149054906101000a900460ff166121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c390614124565b60405180910390fd5b6000811161220f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220690614044565b60405180910390fd5b600e5460018361221f9190614354565b1115612260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225790613f24565b60405180910390fd5b6010546001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122af9190614354565b11156122f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e7906141c4565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461232857600080fd5b612333336001612ff1565b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123839190614354565b92505081905550505061239461305f565b565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006124d282612a07565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166124f9612396565b73ffffffffffffffffffffffffffffffffffffffff161480612555575061251e612396565b73ffffffffffffffffffffffffffffffffffffffff1661253d84610bdf565b73ffffffffffffffffffffffffffffffffffffffff16145b806125715750612570826000015161256b612396565b611cb3565b5b9050806125b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125aa90614104565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261c90614084565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268c90613f84565b60405180910390fd5b6126a28585856001613069565b6126b26000848460000151612415565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612997576128f681612408565b156129965782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a00858585600161306f565b5050505050565b612a0f61349e565b612a1882612408565b612a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4e90613f44565b60405180910390fd5b60008290505b60008110612b60576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612b51578092505050612b9c565b50808060019003915050612a5d565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9390614224565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612c888473ffffffffffffffffffffffffffffffffffffffff16613075565b15612df1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cb1612396565b8786866040518563ffffffff1660e01b8152600401612cd39493929190613e5b565b602060405180830381600087803b158015612ced57600080fd5b505af1925050508015612d1e57506040513d601f19601f82011682018060405250810190612d1b9190613870565b60015b612da1573d8060008114612d4e576040519150601f19603f3d011682016040523d82523d6000602084013e612d53565b606091505b50600081511415612d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9090614164565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612df6565b600190505b949350505050565b606060098054612e0d9061451f565b80601f0160208091040260200160405190810160405280929190818152602001828054612e399061451f565b8015612e865780601f10612e5b57610100808354040283529160200191612e86565b820191906000526020600020905b815481529060010190602001808311612e6957829003601f168201915b5050505050905090565b60606000821415612ed8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fec565b600082905060005b60008214612f0a578080612ef390614582565b915050600a82612f0391906143aa565b9150612ee0565b60008167ffffffffffffffff811115612f2657612f256146b8565b5b6040519080825280601f01601f191660200182016040528015612f585781602001600182028036833780820191505090505b5090505b60008514612fe557600182612f719190614435565b9150600a85612f8091906145cb565b6030612f8c9190614354565b60f81b818381518110612fa257612fa1614689565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fde91906143aa565b9450612f5c565b8093505050505b919050565b61300b828260405180602001604052806000815250613088565b5050565b60026008541415613055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304c90614204565b60405180910390fd5b6002600881905550565b6001600881905550565b50505050565b50505050565b600080823b905060008111915050919050565b613095838383600161309a565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310790614184565b60405180910390fd5b6000841415613154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314b906141a4565b60405180910390fd5b6131616000868387613069565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156133fb57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156133e6576133a66000888488612c67565b6133e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dc90614164565b60405180910390fd5b5b8180600101925050808060010191505061332f565b508060008190555050613411600086838761306f565b5050505050565b8280546134249061451f565b90600052602060002090601f016020900481019282613446576000855561348d565b82601f1061345f57805160ff191683800117855561348d565b8280016001018555821561348d579182015b8281111561348c578251825591602001919060010190613471565b5b50905061349a91906134d8565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156134f15760008160009055506001016134d9565b5090565b6000613508613503846142a4565b61427f565b905082815260208101848484011115613524576135236146ec565b5b61352f8482856144dd565b509392505050565b600061354a613545846142d5565b61427f565b905082815260208101848484011115613566576135656146ec565b5b6135718482856144dd565b509392505050565b60008135905061358881614ea9565b92915050565b60008135905061359d81614ec0565b92915050565b6000813590506135b281614ed7565b92915050565b6000815190506135c781614ed7565b92915050565b600082601f8301126135e2576135e16146e7565b5b81356135f28482602086016134f5565b91505092915050565b600082601f8301126136105761360f6146e7565b5b8135613620848260208601613537565b91505092915050565b60008135905061363881614eee565b92915050565b60008151905061364d81614eee565b92915050565b600060208284031215613669576136686146f6565b5b600061367784828501613579565b91505092915050565b60008060408385031215613697576136966146f6565b5b60006136a585828601613579565b92505060206136b685828601613579565b9150509250929050565b6000806000606084860312156136d9576136d86146f6565b5b60006136e786828701613579565b93505060206136f886828701613579565b925050604061370986828701613629565b9150509250925092565b6000806000806080858703121561372d5761372c6146f6565b5b600061373b87828801613579565b945050602061374c87828801613579565b935050604061375d87828801613629565b925050606085013567ffffffffffffffff81111561377e5761377d6146f1565b5b61378a878288016135cd565b91505092959194509250565b600080604083850312156137ad576137ac6146f6565b5b60006137bb85828601613579565b92505060206137cc8582860161358e565b9150509250929050565b600080604083850312156137ed576137ec6146f6565b5b60006137fb85828601613579565b925050602061380c85828601613629565b9150509250929050565b60006020828403121561382c5761382b6146f6565b5b600061383a8482850161358e565b91505092915050565b600060208284031215613859576138586146f6565b5b6000613867848285016135a3565b91505092915050565b600060208284031215613886576138856146f6565b5b6000613894848285016135b8565b91505092915050565b6000602082840312156138b3576138b26146f6565b5b600082013567ffffffffffffffff8111156138d1576138d06146f1565b5b6138dd848285016135fb565b91505092915050565b6000602082840312156138fc576138fb6146f6565b5b600061390a84828501613629565b91505092915050565b600060208284031215613929576139286146f6565b5b60006139378482850161363e565b91505092915050565b61394981614469565b82525050565b6139588161447b565b82525050565b600061396982614306565b613973818561431c565b93506139838185602086016144ec565b61398c816146fb565b840191505092915050565b60006139a282614311565b6139ac8185614338565b93506139bc8185602086016144ec565b6139c5816146fb565b840191505092915050565b60006139db82614311565b6139e58185614349565b93506139f58185602086016144ec565b80840191505092915050565b6000613a0e602283614338565b9150613a198261470c565b604082019050919050565b6000613a31602683614338565b9150613a3c8261475b565b604082019050919050565b6000613a54602083614338565b9150613a5f826147aa565b602082019050919050565b6000613a77602a83614338565b9150613a82826147d3565b604082019050919050565b6000613a9a602383614338565b9150613aa582614822565b604082019050919050565b6000613abd602583614338565b9150613ac882614871565b604082019050919050565b6000613ae0601f83614338565b9150613aeb826148c0565b602082019050919050565b6000613b03602283614338565b9150613b0e826148e9565b604082019050919050565b6000613b26603583614338565b9150613b3182614938565b604082019050919050565b6000613b49603983614338565b9150613b5482614987565b604082019050919050565b6000613b6c602b83614338565b9150613b77826149d6565b604082019050919050565b6000613b8f602883614338565b9150613b9a82614a25565b604082019050919050565b6000613bb2601483614338565b9150613bbd82614a74565b602082019050919050565b6000613bd5602683614338565b9150613be082614a9d565b604082019050919050565b6000613bf8602083614338565b9150613c0382614aec565b602082019050919050565b6000613c1b602f83614338565b9150613c2682614b15565b604082019050919050565b6000613c3e601a83614338565b9150613c4982614b64565b602082019050919050565b6000613c61603283614338565b9150613c6c82614b8d565b604082019050919050565b6000613c84601783614338565b9150613c8f82614bdc565b602082019050919050565b6000613ca7602283614338565b9150613cb282614c05565b604082019050919050565b6000613cca60008361432d565b9150613cd582614c54565b600082019050919050565b6000613ced603383614338565b9150613cf882614c57565b604082019050919050565b6000613d10602183614338565b9150613d1b82614ca6565b604082019050919050565b6000613d33602883614338565b9150613d3e82614cf5565b604082019050919050565b6000613d56602b83614338565b9150613d6182614d44565b604082019050919050565b6000613d79602e83614338565b9150613d8482614d93565b604082019050919050565b6000613d9c601f83614338565b9150613da782614de2565b602082019050919050565b6000613dbf602f83614338565b9150613dca82614e0b565b604082019050919050565b6000613de2602d83614338565b9150613ded82614e5a565b604082019050919050565b613e01816144d3565b82525050565b6000613e1382856139d0565b9150613e1f82846139d0565b91508190509392505050565b6000613e3682613cbd565b9150819050919050565b6000602082019050613e556000830184613940565b92915050565b6000608082019050613e706000830187613940565b613e7d6020830186613940565b613e8a6040830185613df8565b8181036060830152613e9c818461395e565b905095945050505050565b6000602082019050613ebc600083018461394f565b92915050565b60006020820190508181036000830152613edc8184613997565b905092915050565b60006020820190508181036000830152613efd81613a01565b9050919050565b60006020820190508181036000830152613f1d81613a24565b9050919050565b60006020820190508181036000830152613f3d81613a47565b9050919050565b60006020820190508181036000830152613f5d81613a6a565b9050919050565b60006020820190508181036000830152613f7d81613a8d565b9050919050565b60006020820190508181036000830152613f9d81613ab0565b9050919050565b60006020820190508181036000830152613fbd81613ad3565b9050919050565b60006020820190508181036000830152613fdd81613af6565b9050919050565b60006020820190508181036000830152613ffd81613b19565b9050919050565b6000602082019050818103600083015261401d81613b3c565b9050919050565b6000602082019050818103600083015261403d81613b5f565b9050919050565b6000602082019050818103600083015261405d81613b82565b9050919050565b6000602082019050818103600083015261407d81613ba5565b9050919050565b6000602082019050818103600083015261409d81613bc8565b9050919050565b600060208201905081810360008301526140bd81613beb565b9050919050565b600060208201905081810360008301526140dd81613c0e565b9050919050565b600060208201905081810360008301526140fd81613c31565b9050919050565b6000602082019050818103600083015261411d81613c54565b9050919050565b6000602082019050818103600083015261413d81613c77565b9050919050565b6000602082019050818103600083015261415d81613c9a565b9050919050565b6000602082019050818103600083015261417d81613ce0565b9050919050565b6000602082019050818103600083015261419d81613d03565b9050919050565b600060208201905081810360008301526141bd81613d26565b9050919050565b600060208201905081810360008301526141dd81613d49565b9050919050565b600060208201905081810360008301526141fd81613d6c565b9050919050565b6000602082019050818103600083015261421d81613d8f565b9050919050565b6000602082019050818103600083015261423d81613db2565b9050919050565b6000602082019050818103600083015261425d81613dd5565b9050919050565b60006020820190506142796000830184613df8565b92915050565b600061428961429a565b90506142958282614551565b919050565b6000604051905090565b600067ffffffffffffffff8211156142bf576142be6146b8565b5b6142c8826146fb565b9050602081019050919050565b600067ffffffffffffffff8211156142f0576142ef6146b8565b5b6142f9826146fb565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061435f826144d3565b915061436a836144d3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561439f5761439e6145fc565b5b828201905092915050565b60006143b5826144d3565b91506143c0836144d3565b9250826143d0576143cf61462b565b5b828204905092915050565b60006143e6826144d3565b91506143f1836144d3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561442a576144296145fc565b5b828202905092915050565b6000614440826144d3565b915061444b836144d3565b92508282101561445e5761445d6145fc565b5b828203905092915050565b6000614474826144b3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561450a5780820151818401526020810190506144ef565b83811115614519576000848401525b50505050565b6000600282049050600182168061453757607f821691505b6020821081141561454b5761454a61465a565b5b50919050565b61455a826146fb565b810181811067ffffffffffffffff82111715614579576145786146b8565b5b80604052505050565b600061458d826144d3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145c0576145bf6145fc565b5b600182019050919050565b60006145d6826144d3565b91506145e1836144d3565b9250826145f1576145f061462b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f43616e206e6f74207365742067726561746572207468616e206d61787375707060008201527f6c79000000000000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008201527f2070657220747820696e20746869732070686173650000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4d696e74657220646f6573206e6f74206f776e20616c6c6f776c69737465642060008201527f636f6e7472616374000000000000000000000000000000000000000000000000602082015250565b7f5075626c6963206973206e6f7420416374697665000000000000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f416c6c6f776c697374206973206e6f7420416374697665000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008201527f207065722057616c6c6574000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b614eb281614469565b8114614ebd57600080fd5b50565b614ec98161447b565b8114614ed457600080fd5b50565b614ee081614487565b8114614eeb57600080fd5b50565b614ef7816144d3565b8114614f0257600080fd5b5056fea26469706673582212203e766cad3e9c39412a81bbffc1005bf94ced14849049d6c1547e8b64b967556b64736f6c63430008070033

Deployed Bytecode

0x6080604052600436106102465760003560e01c8063715018a611610139578063a3330d25116100b6578063cc47a40b1161007a578063cc47a40b1461087d578063d2d515cc146108a6578063e985e9c5146108d1578063efd0cbf91461090e578063f2fde38b1461092a578063f7a225a41461095357610246565b8063a3330d251461079a578063a49a1e7d146107c5578063aa7fa199146107ee578063b88d4fde14610817578063c87b56dd1461084057610246565b806391b7f5ed116100fd57806391b7f5ed146106cb57806395d89b41146106f457806399c92bed1461071f5780639af5886214610748578063a22cb4651461077157610246565b8063715018a61461060857806377a3c6651461061f578063833b94991461064a5780638da5cb5b146106755780638de928d8146106a057610246565b806339371b25116101c75780634f6ccce71161018b5780634f6ccce7146104ff57806351ad69761461053c5780636352211e1461056557806363b4e0b2146105a257806370a08231146105cb57610246565b806339371b25146104275780633ab23d9a146104525780633ccfd60b1461048f57806342842e0e146104995780634c24fa7b146104c257610246565b806318160ddd1161020e57806318160ddd1461034257806323b872dd1461036d5780632f745c591461039657806332cb6b0c146103d357806335082933146103fe57610246565b8063016161b81461024b57806301ffc9a71461027457806306fdde03146102b1578063081812fc146102dc578063095ea7b314610319575b600080fd5b34801561025757600080fd5b50610272600480360381019061026d9190613816565b61096a565b005b34801561028057600080fd5b5061029b60048036038101906102969190613843565b610a03565b6040516102a89190613ea7565b60405180910390f35b3480156102bd57600080fd5b506102c6610b4d565b6040516102d39190613ec2565b60405180910390f35b3480156102e857600080fd5b5061030360048036038101906102fe91906138e6565b610bdf565b6040516103109190613e40565b60405180910390f35b34801561032557600080fd5b50610340600480360381019061033b91906137d6565b610c64565b005b34801561034e57600080fd5b50610357610d7d565b6040516103649190614264565b60405180910390f35b34801561037957600080fd5b50610394600480360381019061038f91906136c0565b610d86565b005b3480156103a257600080fd5b506103bd60048036038101906103b891906137d6565b610d96565b6040516103ca9190614264565b60405180910390f35b3480156103df57600080fd5b506103e8610f88565b6040516103f59190614264565b60405180910390f35b34801561040a57600080fd5b5061042560048036038101906104209190613653565b610f8e565b005b34801561043357600080fd5b5061043c61104e565b6040516104499190613ec2565b60405180910390f35b34801561045e57600080fd5b5061047960048036038101906104749190613653565b6110dc565b6040516104869190614264565b60405180910390f35b6104976110f4565b005b3480156104a557600080fd5b506104c060048036038101906104bb91906136c0565b61120b565b005b3480156104ce57600080fd5b506104e960048036038101906104e49190613653565b61122b565b6040516104f69190614264565b60405180910390f35b34801561050b57600080fd5b50610526600480360381019061052191906138e6565b611243565b6040516105339190614264565b60405180910390f35b34801561054857600080fd5b50610563600480360381019061055e9190613653565b611296565b005b34801561057157600080fd5b5061058c600480360381019061058791906138e6565b611356565b6040516105999190613e40565b60405180910390f35b3480156105ae57600080fd5b506105c960048036038101906105c491906138e6565b61136c565b005b3480156105d757600080fd5b506105f260048036038101906105ed9190613653565b611437565b6040516105ff9190614264565b60405180910390f35b34801561061457600080fd5b5061061d611520565b005b34801561062b57600080fd5b506106346115a8565b6040516106419190614264565b60405180910390f35b34801561065657600080fd5b5061065f6115ae565b60405161066c9190614264565b60405180910390f35b34801561068157600080fd5b5061068a6115b4565b6040516106979190613e40565b60405180910390f35b3480156106ac57600080fd5b506106b56115de565b6040516106c29190613e40565b60405180910390f35b3480156106d757600080fd5b506106f260048036038101906106ed91906138e6565b611604565b005b34801561070057600080fd5b5061070961168a565b6040516107169190613ec2565b60405180910390f35b34801561072b57600080fd5b50610746600480360381019061074191906138e6565b61171c565b005b34801561075457600080fd5b5061076f600480360381019061076a91906138e6565b6117a2565b005b34801561077d57600080fd5b5061079860048036038101906107939190613796565b611828565b005b3480156107a657600080fd5b506107af6119a9565b6040516107bc9190613ea7565b60405180910390f35b3480156107d157600080fd5b506107ec60048036038101906107e7919061389d565b6119bc565b005b3480156107fa57600080fd5b5061081560048036038101906108109190613816565b611a52565b005b34801561082357600080fd5b5061083e60048036038101906108399190613713565b611aeb565b005b34801561084c57600080fd5b50610867600480360381019061086291906138e6565b611b47565b6040516108749190613ec2565b60405180910390f35b34801561088957600080fd5b506108a4600480360381019061089f91906137d6565b611bef565b005b3480156108b257600080fd5b506108bb611ca0565b6040516108c89190613ea7565b60405180910390f35b3480156108dd57600080fd5b506108f860048036038101906108f39190613680565b611cb3565b6040516109059190613ea7565b60405180910390f35b610928600480360381019061092391906138e6565b611d47565b005b34801561093657600080fd5b50610951600480360381019061094c9190613653565b611fc2565b005b34801561095f57600080fd5b506109686120ba565b005b610972612396565b73ffffffffffffffffffffffffffffffffffffffff166109906115b4565b73ffffffffffffffffffffffffffffffffffffffff16146109e6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109dd906140a4565b60405180910390fd5b80600c60146101000a81548160ff02191690831515021790555050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480610ace57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b3657507f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610b465750610b458261239e565b5b9050919050565b606060018054610b5c9061451f565b80601f0160208091040260200160405190810160405280929190818152602001828054610b889061451f565b8015610bd55780601f10610baa57610100808354040283529160200191610bd5565b820191906000526020600020905b815481529060010190602001808311610bb857829003601f168201915b5050505050905090565b6000610bea82612408565b610c29576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c2090614244565b60405180910390fd5b6005600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610c6f82611356565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610ce0576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cd790614144565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610cff612396565b73ffffffffffffffffffffffffffffffffffffffff161480610d2e5750610d2d81610d28612396565b611cb3565b5b610d6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d6490614004565b60405180910390fd5b610d78838383612415565b505050565b60008054905090565b610d918383836124c7565b505050565b6000610da183611437565b8210610de2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dd990613ee4565b60405180910390fd5b6000610dec610d7d565b905060008060005b83811015610f46576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614610ee657806000015192505b8773ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f385786841415610f2f578195505050505050610f82565b83806001019450505b508080600101915050610df4565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f79906141e4565b60405180910390fd5b92915050565b600d5481565b610f96612396565b73ffffffffffffffffffffffffffffffffffffffff16610fb46115b4565b73ffffffffffffffffffffffffffffffffffffffff161461100a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611001906140a4565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b6009805461105b9061451f565b80601f01602080910402602001604051908101604052809291908181526020018280546110879061451f565b80156110d45780601f106110a9576101008083540402835291602001916110d4565b820191906000526020600020905b8154815290600101906020018083116110b757829003601f168201915b505050505081565b60126020528060005260406000206000915090505481565b6110fc612396565b73ffffffffffffffffffffffffffffffffffffffff1661111a6115b4565b73ffffffffffffffffffffffffffffffffffffffff1614611170576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611167906140a4565b60405180910390fd5b6000600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16476040516111b890613e2b565b60006040518083038185875af1925050503d80600081146111f5576040519150601f19603f3d011682016040523d82523d6000602084013e6111fa565b606091505b505090508061120857600080fd5b50565b61122683838360405180602001604052806000815250611aeb565b505050565b60136020528060005260406000206000915090505481565b600061124d610d7d565b821061128e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161128590613f64565b60405180910390fd5b819050919050565b61129e612396565b73ffffffffffffffffffffffffffffffffffffffff166112bc6115b4565b73ffffffffffffffffffffffffffffffffffffffff1614611312576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611309906140a4565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b600061136182612a07565b600001519050919050565b611374612396565b73ffffffffffffffffffffffffffffffffffffffff166113926115b4565b73ffffffffffffffffffffffffffffffffffffffff16146113e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016113df906140a4565b60405180910390fd5b600d5481111561142d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161142490613fc4565b60405180910390fd5b80600e8190555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156114a8576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161149f90614024565b60405180910390fd5b600460008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160009054906101000a90046fffffffffffffffffffffffffffffffff166fffffffffffffffffffffffffffffffff169050919050565b611528612396565b73ffffffffffffffffffffffffffffffffffffffff166115466115b4565b73ffffffffffffffffffffffffffffffffffffffff161461159c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611593906140a4565b60405180910390fd5b6115a66000612ba1565b565b600e5481565b600f5481565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b61160c612396565b73ffffffffffffffffffffffffffffffffffffffff1661162a6115b4565b73ffffffffffffffffffffffffffffffffffffffff1614611680576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611677906140a4565b60405180910390fd5b80600f8190555050565b6060600280546116999061451f565b80601f01602080910402602001604051908101604052809291908181526020018280546116c59061451f565b80156117125780601f106116e757610100808354040283529160200191611712565b820191906000526020600020905b8154815290600101906020018083116116f557829003601f168201915b5050505050905090565b611724612396565b73ffffffffffffffffffffffffffffffffffffffff166117426115b4565b73ffffffffffffffffffffffffffffffffffffffff1614611798576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178f906140a4565b60405180910390fd5b8060118190555050565b6117aa612396565b73ffffffffffffffffffffffffffffffffffffffff166117c86115b4565b73ffffffffffffffffffffffffffffffffffffffff161461181e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611815906140a4565b60405180910390fd5b8060108190555050565b611830612396565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561189e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611895906140e4565b60405180910390fd5b80600660006118ab612396565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611958612396565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161199d9190613ea7565b60405180910390a35050565b600c60159054906101000a900460ff1681565b6119c4612396565b73ffffffffffffffffffffffffffffffffffffffff166119e26115b4565b73ffffffffffffffffffffffffffffffffffffffff1614611a38576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2f906140a4565b60405180910390fd5b8060099080519060200190611a4e929190613418565b5050565b611a5a612396565b73ffffffffffffffffffffffffffffffffffffffff16611a786115b4565b73ffffffffffffffffffffffffffffffffffffffff1614611ace576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ac5906140a4565b60405180910390fd5b80600c60156101000a81548160ff02191690831515021790555050565b611af68484846124c7565b611b0284848484612c67565b611b41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b3890614164565b60405180910390fd5b50505050565b6060611b5282612408565b611b91576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b88906140c4565b60405180910390fd5b6000611b9b612dfe565b9050600081511415611bbc5760405180602001604052806000815250611be7565b80611bc684612e90565b604051602001611bd7929190613e07565b6040516020818303038152906040525b915050919050565b611bf7612396565b73ffffffffffffffffffffffffffffffffffffffff16611c156115b4565b73ffffffffffffffffffffffffffffffffffffffff1614611c6b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c62906140a4565b60405180910390fd5b6000611c75610d7d565b9050600d548282611c869190614354565b1115611c9157600080fd5b611c9b8383612ff1565b505050565b600c60149054906101000a900460ff1681565b6000600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b611d4f61300f565b6000611d59610d7d565b9050600c60159054906101000a900460ff16611daa576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611da190614064565b60405180910390fd5b601154821115611def576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611de690613fe4565b60405180910390fd5b600d548282611dfe9190614354565b1115611e3f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3690613f24565b60405180910390fd5b81600f54611e4d91906143db565b341015611e8f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e8690613fa4565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611ec757600080fd5b60115482601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054611f159190614354565b1115611f56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4d906141c4565b60405180910390fd5b611f603383612ff1565b81601360003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611faf9190614354565b9250508190555050611fbf61305f565b50565b611fca612396565b73ffffffffffffffffffffffffffffffffffffffff16611fe86115b4565b73ffffffffffffffffffffffffffffffffffffffff161461203e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612035906140a4565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614156120ae576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120a590613f04565b60405180910390fd5b6120b781612ba1565b50565b6120c261300f565b60006120cc610d7d565b90506000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166370a08231336040518263ffffffff1660e01b815260040161212b9190613e40565b60206040518083038186803b15801561214357600080fd5b505afa158015612157573d6000803e3d6000fd5b505050506040513d601f19601f8201168201806040525081019061217b9190613913565b9050600c60149054906101000a900460ff166121cc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121c390614124565b60405180910390fd5b6000811161220f576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161220690614044565b60405180910390fd5b600e5460018361221f9190614354565b1115612260576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225790613f24565b60405180910390fd5b6010546001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020546122af9190614354565b11156122f0576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122e7906141c4565b60405180910390fd5b3273ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff161461232857600080fd5b612333336001612ff1565b6001601260003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123839190614354565b92505081905550505061239461305f565b565b600033905090565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000805482109050919050565b826005600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b60006124d282612a07565b90506000816000015173ffffffffffffffffffffffffffffffffffffffff166124f9612396565b73ffffffffffffffffffffffffffffffffffffffff161480612555575061251e612396565b73ffffffffffffffffffffffffffffffffffffffff1661253d84610bdf565b73ffffffffffffffffffffffffffffffffffffffff16145b806125715750612570826000015161256b612396565b611cb3565b5b9050806125b3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125aa90614104565b60405180910390fd5b8473ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff1614612625576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161261c90614084565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161415612695576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161268c90613f84565b60405180910390fd5b6126a28585856001613069565b6126b26000848460000151612415565b6001600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160392506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff1602179055506001600460008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550836003600085815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600085815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055506000600184019050600073ffffffffffffffffffffffffffffffffffffffff166003600083815260200190815260200160002060000160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff161415612997576128f681612408565b156129965782600001516003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555082602001516003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff1602179055505b5b50828473ffffffffffffffffffffffffffffffffffffffff168673ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612a00858585600161306f565b5050505050565b612a0f61349e565b612a1882612408565b612a57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a4e90613f44565b60405180910390fd5b60008290505b60008110612b60576000600360008381526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a900467ffffffffffffffff1667ffffffffffffffff1667ffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1614612b51578092505050612b9c565b50808060019003915050612a5d565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b9390614224565b60405180910390fd5b919050565b6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6000612c888473ffffffffffffffffffffffffffffffffffffffff16613075565b15612df1578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cb1612396565b8786866040518563ffffffff1660e01b8152600401612cd39493929190613e5b565b602060405180830381600087803b158015612ced57600080fd5b505af1925050508015612d1e57506040513d601f19601f82011682018060405250810190612d1b9190613870565b60015b612da1573d8060008114612d4e576040519150601f19603f3d011682016040523d82523d6000602084013e612d53565b606091505b50600081511415612d99576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9090614164565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612df6565b600190505b949350505050565b606060098054612e0d9061451f565b80601f0160208091040260200160405190810160405280929190818152602001828054612e399061451f565b8015612e865780601f10612e5b57610100808354040283529160200191612e86565b820191906000526020600020905b815481529060010190602001808311612e6957829003601f168201915b5050505050905090565b60606000821415612ed8576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612fec565b600082905060005b60008214612f0a578080612ef390614582565b915050600a82612f0391906143aa565b9150612ee0565b60008167ffffffffffffffff811115612f2657612f256146b8565b5b6040519080825280601f01601f191660200182016040528015612f585781602001600182028036833780820191505090505b5090505b60008514612fe557600182612f719190614435565b9150600a85612f8091906145cb565b6030612f8c9190614354565b60f81b818381518110612fa257612fa1614689565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612fde91906143aa565b9450612f5c565b8093505050505b919050565b61300b828260405180602001604052806000815250613088565b5050565b60026008541415613055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161304c90614204565b60405180910390fd5b6002600881905550565b6001600881905550565b50505050565b50505050565b600080823b905060008111915050919050565b613095838383600161309a565b505050565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff161415613110576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161310790614184565b60405180910390fd5b6000841415613154576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161314b906141a4565b60405180910390fd5b6131616000868387613069565b83600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160008282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff16021790555083600460008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000160108282829054906101000a90046fffffffffffffffffffffffffffffffff160192506101000a8154816fffffffffffffffffffffffffffffffff02191690836fffffffffffffffffffffffffffffffff160217905550846003600083815260200190815260200160002060000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550426003600083815260200190815260200160002060000160146101000a81548167ffffffffffffffff021916908367ffffffffffffffff160217905550600081905060005b858110156133fb57818773ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a483156133e6576133a66000888488612c67565b6133e5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016133dc90614164565b60405180910390fd5b5b8180600101925050808060010191505061332f565b508060008190555050613411600086838761306f565b5050505050565b8280546134249061451f565b90600052602060002090601f016020900481019282613446576000855561348d565b82601f1061345f57805160ff191683800117855561348d565b8280016001018555821561348d579182015b8281111561348c578251825591602001919060010190613471565b5b50905061349a91906134d8565b5090565b6040518060400160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff1681525090565b5b808211156134f15760008160009055506001016134d9565b5090565b6000613508613503846142a4565b61427f565b905082815260208101848484011115613524576135236146ec565b5b61352f8482856144dd565b509392505050565b600061354a613545846142d5565b61427f565b905082815260208101848484011115613566576135656146ec565b5b6135718482856144dd565b509392505050565b60008135905061358881614ea9565b92915050565b60008135905061359d81614ec0565b92915050565b6000813590506135b281614ed7565b92915050565b6000815190506135c781614ed7565b92915050565b600082601f8301126135e2576135e16146e7565b5b81356135f28482602086016134f5565b91505092915050565b600082601f8301126136105761360f6146e7565b5b8135613620848260208601613537565b91505092915050565b60008135905061363881614eee565b92915050565b60008151905061364d81614eee565b92915050565b600060208284031215613669576136686146f6565b5b600061367784828501613579565b91505092915050565b60008060408385031215613697576136966146f6565b5b60006136a585828601613579565b92505060206136b685828601613579565b9150509250929050565b6000806000606084860312156136d9576136d86146f6565b5b60006136e786828701613579565b93505060206136f886828701613579565b925050604061370986828701613629565b9150509250925092565b6000806000806080858703121561372d5761372c6146f6565b5b600061373b87828801613579565b945050602061374c87828801613579565b935050604061375d87828801613629565b925050606085013567ffffffffffffffff81111561377e5761377d6146f1565b5b61378a878288016135cd565b91505092959194509250565b600080604083850312156137ad576137ac6146f6565b5b60006137bb85828601613579565b92505060206137cc8582860161358e565b9150509250929050565b600080604083850312156137ed576137ec6146f6565b5b60006137fb85828601613579565b925050602061380c85828601613629565b9150509250929050565b60006020828403121561382c5761382b6146f6565b5b600061383a8482850161358e565b91505092915050565b600060208284031215613859576138586146f6565b5b6000613867848285016135a3565b91505092915050565b600060208284031215613886576138856146f6565b5b6000613894848285016135b8565b91505092915050565b6000602082840312156138b3576138b26146f6565b5b600082013567ffffffffffffffff8111156138d1576138d06146f1565b5b6138dd848285016135fb565b91505092915050565b6000602082840312156138fc576138fb6146f6565b5b600061390a84828501613629565b91505092915050565b600060208284031215613929576139286146f6565b5b60006139378482850161363e565b91505092915050565b61394981614469565b82525050565b6139588161447b565b82525050565b600061396982614306565b613973818561431c565b93506139838185602086016144ec565b61398c816146fb565b840191505092915050565b60006139a282614311565b6139ac8185614338565b93506139bc8185602086016144ec565b6139c5816146fb565b840191505092915050565b60006139db82614311565b6139e58185614349565b93506139f58185602086016144ec565b80840191505092915050565b6000613a0e602283614338565b9150613a198261470c565b604082019050919050565b6000613a31602683614338565b9150613a3c8261475b565b604082019050919050565b6000613a54602083614338565b9150613a5f826147aa565b602082019050919050565b6000613a77602a83614338565b9150613a82826147d3565b604082019050919050565b6000613a9a602383614338565b9150613aa582614822565b604082019050919050565b6000613abd602583614338565b9150613ac882614871565b604082019050919050565b6000613ae0601f83614338565b9150613aeb826148c0565b602082019050919050565b6000613b03602283614338565b9150613b0e826148e9565b604082019050919050565b6000613b26603583614338565b9150613b3182614938565b604082019050919050565b6000613b49603983614338565b9150613b5482614987565b604082019050919050565b6000613b6c602b83614338565b9150613b77826149d6565b604082019050919050565b6000613b8f602883614338565b9150613b9a82614a25565b604082019050919050565b6000613bb2601483614338565b9150613bbd82614a74565b602082019050919050565b6000613bd5602683614338565b9150613be082614a9d565b604082019050919050565b6000613bf8602083614338565b9150613c0382614aec565b602082019050919050565b6000613c1b602f83614338565b9150613c2682614b15565b604082019050919050565b6000613c3e601a83614338565b9150613c4982614b64565b602082019050919050565b6000613c61603283614338565b9150613c6c82614b8d565b604082019050919050565b6000613c84601783614338565b9150613c8f82614bdc565b602082019050919050565b6000613ca7602283614338565b9150613cb282614c05565b604082019050919050565b6000613cca60008361432d565b9150613cd582614c54565b600082019050919050565b6000613ced603383614338565b9150613cf882614c57565b604082019050919050565b6000613d10602183614338565b9150613d1b82614ca6565b604082019050919050565b6000613d33602883614338565b9150613d3e82614cf5565b604082019050919050565b6000613d56602b83614338565b9150613d6182614d44565b604082019050919050565b6000613d79602e83614338565b9150613d8482614d93565b604082019050919050565b6000613d9c601f83614338565b9150613da782614de2565b602082019050919050565b6000613dbf602f83614338565b9150613dca82614e0b565b604082019050919050565b6000613de2602d83614338565b9150613ded82614e5a565b604082019050919050565b613e01816144d3565b82525050565b6000613e1382856139d0565b9150613e1f82846139d0565b91508190509392505050565b6000613e3682613cbd565b9150819050919050565b6000602082019050613e556000830184613940565b92915050565b6000608082019050613e706000830187613940565b613e7d6020830186613940565b613e8a6040830185613df8565b8181036060830152613e9c818461395e565b905095945050505050565b6000602082019050613ebc600083018461394f565b92915050565b60006020820190508181036000830152613edc8184613997565b905092915050565b60006020820190508181036000830152613efd81613a01565b9050919050565b60006020820190508181036000830152613f1d81613a24565b9050919050565b60006020820190508181036000830152613f3d81613a47565b9050919050565b60006020820190508181036000830152613f5d81613a6a565b9050919050565b60006020820190508181036000830152613f7d81613a8d565b9050919050565b60006020820190508181036000830152613f9d81613ab0565b9050919050565b60006020820190508181036000830152613fbd81613ad3565b9050919050565b60006020820190508181036000830152613fdd81613af6565b9050919050565b60006020820190508181036000830152613ffd81613b19565b9050919050565b6000602082019050818103600083015261401d81613b3c565b9050919050565b6000602082019050818103600083015261403d81613b5f565b9050919050565b6000602082019050818103600083015261405d81613b82565b9050919050565b6000602082019050818103600083015261407d81613ba5565b9050919050565b6000602082019050818103600083015261409d81613bc8565b9050919050565b600060208201905081810360008301526140bd81613beb565b9050919050565b600060208201905081810360008301526140dd81613c0e565b9050919050565b600060208201905081810360008301526140fd81613c31565b9050919050565b6000602082019050818103600083015261411d81613c54565b9050919050565b6000602082019050818103600083015261413d81613c77565b9050919050565b6000602082019050818103600083015261415d81613c9a565b9050919050565b6000602082019050818103600083015261417d81613ce0565b9050919050565b6000602082019050818103600083015261419d81613d03565b9050919050565b600060208201905081810360008301526141bd81613d26565b9050919050565b600060208201905081810360008301526141dd81613d49565b9050919050565b600060208201905081810360008301526141fd81613d6c565b9050919050565b6000602082019050818103600083015261421d81613d8f565b9050919050565b6000602082019050818103600083015261423d81613db2565b9050919050565b6000602082019050818103600083015261425d81613dd5565b9050919050565b60006020820190506142796000830184613df8565b92915050565b600061428961429a565b90506142958282614551565b919050565b6000604051905090565b600067ffffffffffffffff8211156142bf576142be6146b8565b5b6142c8826146fb565b9050602081019050919050565b600067ffffffffffffffff8211156142f0576142ef6146b8565b5b6142f9826146fb565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600081905092915050565b600082825260208201905092915050565b600081905092915050565b600061435f826144d3565b915061436a836144d3565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561439f5761439e6145fc565b5b828201905092915050565b60006143b5826144d3565b91506143c0836144d3565b9250826143d0576143cf61462b565b5b828204905092915050565b60006143e6826144d3565b91506143f1836144d3565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff048311821515161561442a576144296145fc565b5b828202905092915050565b6000614440826144d3565b915061444b836144d3565b92508282101561445e5761445d6145fc565b5b828203905092915050565b6000614474826144b3565b9050919050565b60008115159050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b8381101561450a5780820151818401526020810190506144ef565b83811115614519576000848401525b50505050565b6000600282049050600182168061453757607f821691505b6020821081141561454b5761454a61465a565b5b50919050565b61455a826146fb565b810181811067ffffffffffffffff82111715614579576145786146b8565b5b80604052505050565b600061458d826144d3565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156145c0576145bf6145fc565b5b600182019050919050565b60006145d6826144d3565b91506145e1836144d3565b9250826145f1576145f061462b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f455243373231413a206f776e657220696e646578206f7574206f6620626f756e60008201527f6473000000000000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e73600082015250565b7f455243373231413a206f776e657220717565727920666f72206e6f6e6578697360008201527f74656e7420746f6b656e00000000000000000000000000000000000000000000602082015250565b7f455243373231413a20676c6f62616c20696e646578206f7574206f6620626f7560008201527f6e64730000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207472616e7366657220746f20746865207a65726f20616460008201527f6472657373000000000000000000000000000000000000000000000000000000602082015250565b7f45746865722076616c75652073656e74206973206e6f7420636f727265637400600082015250565b7f43616e206e6f74207365742067726561746572207468616e206d61787375707060008201527f6c79000000000000000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008201527f2070657220747820696e20746869732070686173650000000000000000000000602082015250565b7f455243373231413a20617070726f76652063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f76656420666f7220616c6c00000000000000602082015250565b7f455243373231413a2062616c616e636520717565727920666f7220746865207a60008201527f65726f2061646472657373000000000000000000000000000000000000000000602082015250565b7f4d696e74657220646f6573206e6f74206f776e20616c6c6f776c69737465642060008201527f636f6e7472616374000000000000000000000000000000000000000000000000602082015250565b7f5075626c6963206973206e6f7420416374697665000000000000000000000000600082015250565b7f455243373231413a207472616e736665722066726f6d20696e636f727265637460008201527f206f776e65720000000000000000000000000000000000000000000000000000602082015250565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f766520746f2063616c6c6572000000000000600082015250565b7f455243373231413a207472616e736665722063616c6c6572206973206e6f742060008201527f6f776e6572206e6f7220617070726f7665640000000000000000000000000000602082015250565b7f416c6c6f776c697374206973206e6f7420416374697665000000000000000000600082015250565b7f455243373231413a20617070726f76616c20746f2063757272656e74206f776e60008201527f6572000000000000000000000000000000000000000000000000000000000000602082015250565b50565b7f455243373231413a207472616e7366657220746f206e6f6e204552433732315260008201527f6563656976657220696d706c656d656e74657200000000000000000000000000602082015250565b7f455243373231413a206d696e7420746f20746865207a65726f2061646472657360008201527f7300000000000000000000000000000000000000000000000000000000000000602082015250565b7f455243373231413a207175616e74697479206d7573742062652067726561746560008201527f72207468616e2030000000000000000000000000000000000000000000000000602082015250565b7f507572636861736520776f756c6420657863656564206d617820746f6b656e7360008201527f207065722057616c6c6574000000000000000000000000000000000000000000602082015250565b7f455243373231413a20756e61626c6520746f2067657420746f6b656e206f662060008201527f6f776e657220627920696e646578000000000000000000000000000000000000602082015250565b7f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00600082015250565b7f455243373231413a20756e61626c6520746f2064657465726d696e652074686560008201527f206f776e6572206f6620746f6b656e0000000000000000000000000000000000602082015250565b7f455243373231413a20617070726f76656420717565727920666f72206e6f6e6560008201527f78697374656e7420746f6b656e00000000000000000000000000000000000000602082015250565b614eb281614469565b8114614ebd57600080fd5b50565b614ec98161447b565b8114614ed457600080fd5b50565b614ee081614487565b8114614eeb57600080fd5b50565b614ef7816144d3565b8114614f0257600080fd5b5056fea26469706673582212203e766cad3e9c39412a81bbffc1005bf94ced14849049d6c1547e8b64b967556b64736f6c63430008070033

Deployed Bytecode Sourcemap

50646:4864:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54236:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34512:372;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36398:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37960:214;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37481:413;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;32769:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38836:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;33433:1007;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51219:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55026:100;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;50752:23;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51532:62;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55313:194;;;:::i;:::-;;39069:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51601:59;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32946:187;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53651:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36207:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53977:215;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34948:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13945:94;;;;;;;;;;;;;:::i;:::-;;51258:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51346:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13291:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50982:77;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53816:102;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36567:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54718:122;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54537:127;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38246:288;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51143:34;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54876:105;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54382:98;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39317:355;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36742:335;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53395:206;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51099:37;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38605:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52569:776;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;14194:192;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;51874:661;;;;;;;;;;;;;:::i;:::-;;54236:105;13525:12;:10;:12::i;:::-;13514:23;;:7;:5;:7::i;:::-;:23;;;13506:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54326:7:::1;54306:17;;:27;;;;;;;;;;;;;;;;;;54236:105:::0;:::o;34512:372::-;34614:4;34666:25;34651:40;;;:11;:40;;;;:105;;;;34723:33;34708:48;;;:11;:48;;;;34651:105;:172;;;;34788:35;34773:50;;;:11;:50;;;;34651:172;:225;;;;34840:36;34864:11;34840:23;:36::i;:::-;34651:225;34631:245;;34512:372;;;:::o;36398:100::-;36452:13;36485:5;36478:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36398:100;:::o;37960:214::-;38028:7;38056:16;38064:7;38056;:16::i;:::-;38048:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;38142:15;:24;38158:7;38142:24;;;;;;;;;;;;;;;;;;;;;38135:31;;37960:214;;;:::o;37481:413::-;37554:13;37570:24;37586:7;37570:15;:24::i;:::-;37554:40;;37619:5;37613:11;;:2;:11;;;;37605:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;37714:5;37698:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;37723:37;37740:5;37747:12;:10;:12::i;:::-;37723:16;:37::i;:::-;37698:62;37676:169;;;;;;;;;;;;:::i;:::-;;;;;;;;;37858:28;37867:2;37871:7;37880:5;37858:8;:28::i;:::-;37543:351;37481:413;;:::o;32769:100::-;32822:7;32849:12;;32842:19;;32769:100;:::o;38836:162::-;38962:28;38972:4;38978:2;38982:7;38962:9;:28::i;:::-;38836:162;;;:::o;33433:1007::-;33522:7;33558:16;33568:5;33558:9;:16::i;:::-;33550:5;:24;33542:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;33624:22;33649:13;:11;:13::i;:::-;33624:38;;33673:19;33703:25;33892:9;33887:466;33907:14;33903:1;:18;33887:466;;;33947:31;33981:11;:14;33993:1;33981:14;;;;;;;;;;;33947:48;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34044:1;34018:28;;:9;:14;;;:28;;;34014:111;;34091:9;:14;;;34071:34;;34014:111;34168:5;34147:26;;:17;:26;;;34143:195;;;34217:5;34202:11;:20;34198:85;;;34258:1;34251:8;;;;;;;;;34198:85;34305:13;;;;;;;34143:195;33928:425;33923:3;;;;;;;33887:466;;;;34376:56;;;;;;;;;;:::i;:::-;;;;;;;;33433:1007;;;;;:::o;51219:32::-;;;;:::o;55026:100::-;13525:12;:10;:12::i;:::-;13514:23;;:7;:5;:7::i;:::-;:23;;;13506:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55111:7:::1;55097:11;;:21;;;;;;;;;;;;;;;;;;55026:100:::0;:::o;50752:23::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;51532:62::-;;;;;;;;;;;;;;;;;:::o;55313:194::-;13525:12;:10;:12::i;:::-;13514:23;;:7;:5;:7::i;:::-;:23;;;13506:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;55370:12:::1;55396:11;;;;;;;;;;;55388:25;;55436:21;55388:84;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55369:103;;;55491:7;55483:16;;;::::0;::::1;;55358:149;55313:194::o:0;39069:177::-;39199:39;39216:4;39222:2;39226:7;39199:39;;;;;;;;;;;;:16;:39::i;:::-;39069:177;;;:::o;51601:59::-;;;;;;;;;;;;;;;;;:::o;32946:187::-;33013:7;33049:13;:11;:13::i;:::-;33041:5;:21;33033:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;33120:5;33113:12;;32946:187;;;:::o;53651:116::-;13525:12;:10;:12::i;:::-;13514:23;;:7;:5;:7::i;:::-;:23;;;13506:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53750:9:::1;53730:17;;:29;;;;;;;;;;;;;;;;;;53651:116:::0;:::o;36207:124::-;36271:7;36298:20;36310:7;36298:11;:20::i;:::-;:25;;;36291:32;;36207:124;;;:::o;53977:215::-;13525:12;:10;:12::i;:::-;13514:23;;:7;:5;:7::i;:::-;:23;;;13506:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54086:10:::1;;54066:16;:30;;54058:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;54168:16;54145:20;:39;;;;53977:215:::0;:::o;34948:221::-;35012:7;35057:1;35040:19;;:5;:19;;;;35032:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;35133:12;:19;35146:5;35133:19;;;;;;;;;;;;;;;:27;;;;;;;;;;;;35125:36;;35118:43;;34948:221;;;:::o;13945:94::-;13525:12;:10;:12::i;:::-;13514:23;;:7;:5;:7::i;:::-;:23;;;13506:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14010:21:::1;14028:1;14010:9;:21::i;:::-;13945:94::o:0;51258:41::-;;;;:::o;51346:43::-;;;;:::o;13291:87::-;13337:7;13364:6;;;;;;;;;;;13357:13;;13291:87;:::o;50982:77::-;;;;;;;;;;;;;:::o;53816:102::-;13525:12;:10;:12::i;:::-;13514:23;;:7;:5;:7::i;:::-;:23;;;13506:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53901:9:::1;53883:15;:27;;;;53816:102:::0;:::o;36567:104::-;36623:13;36656:7;36649:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36567:104;:::o;54718:122::-;13525:12;:10;:12::i;:::-;13514:23;;:7;:5;:7::i;:::-;:23;;;13506:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54825:7:::1;54800:22;:32;;;;54718:122:::0;:::o;54537:127::-;13525:12;:10;:12::i;:::-;13514:23;;:7;:5;:7::i;:::-;:23;;;13506:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54649:7:::1;54621:25;:35;;;;54537:127:::0;:::o;38246:288::-;38353:12;:10;:12::i;:::-;38341:24;;:8;:24;;;;38333:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;38454:8;38409:18;:32;38428:12;:10;:12::i;:::-;38409:32;;;;;;;;;;;;;;;:42;38442:8;38409:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;38507:8;38478:48;;38493:12;:10;:12::i;:::-;38478:48;;;38517:8;38478:48;;;;;;:::i;:::-;;;;;;;;38246:288;;:::o;51143:34::-;;;;;;;;;;;;;:::o;54876:105::-;13525:12;:10;:12::i;:::-;13514:23;;:7;:5;:7::i;:::-;:23;;;13506:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54964:9:::1;54952;:21;;;;;;;;;;;;:::i;:::-;;54876:105:::0;:::o;54382:98::-;13525:12;:10;:12::i;:::-;13514:23;;:7;:5;:7::i;:::-;:23;;;13506:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;54465:7:::1;54448:14;;:24;;;;;;;;;;;;;;;;;;54382:98:::0;:::o;39317:355::-;39476:28;39486:4;39492:2;39496:7;39476:9;:28::i;:::-;39537:48;39560:4;39566:2;39570:7;39579:5;39537:22;:48::i;:::-;39515:149;;;;;;;;;;;;:::i;:::-;;;;;;;;;39317:355;;;;:::o;36742:335::-;36815:13;36849:16;36857:7;36849;:16::i;:::-;36841:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;36930:21;36954:10;:8;:10::i;:::-;36930:34;;37007:1;36988:7;36982:21;:26;;:87;;;;;;;;;;;;;;;;;37035:7;37044:18;:7;:16;:18::i;:::-;37018:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;36982:87;36975:94;;;36742:335;;;:::o;53395:206::-;13525:12;:10;:12::i;:::-;13514:23;;:7;:5;:7::i;:::-;:23;;;13506:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;53476:10:::1;53489:13;:11;:13::i;:::-;53476:26;;53542:10;;53526:12;53521:2;:17;;;;:::i;:::-;:31;;53513:40;;;::::0;::::1;;53564:29;53574:4;53580:12;53564:9;:29::i;:::-;53465:136;53395:206:::0;;:::o;51099:37::-;;;;;;;;;;;;;:::o;38605:164::-;38702:4;38726:18;:25;38745:5;38726:25;;;;;;;;;;;;;;;:35;38752:8;38726:35;;;;;;;;;;;;;;;;;;;;;;;;;38719:42;;38605:164;;;;:::o;52569:776::-;49899:21;:19;:21::i;:::-;52652:10:::1;52665:13;:11;:13::i;:::-;52652:26;;52697:14;;;;;;;;;;;52689:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;52771:22;;52755:12;:38;;52747:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;52891:10;;52875:12;52870:2;:17;;;;:::i;:::-;:31;;52862:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;52988:12;52970:15;;:30;;;;:::i;:::-;52957:9;:43;;52949:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;53069:9;53055:23;;:10;:23;;;53047:32;;;::::0;::::1;;53153:22;;53137:12;53098:24;:36;53123:10;53098:36;;;;;;;;;;;;;;;;:51;;;;:::i;:::-;:77;;53090:133;;;;;;;;;;;;:::i;:::-;;;;;;;;;53236:35;53246:10;53258:12;53236:9;:35::i;:::-;53322:12;53282:24;:36;53307:10;53282:36;;;;;;;;;;;;;;;;:52;;;;;;;:::i;:::-;;;;;;;;52641:704;49943:20:::0;:18;:20::i;:::-;52569:776;:::o;14194:192::-;13525:12;:10;:12::i;:::-;13514:23;;:7;:5;:7::i;:::-;:23;;;13506:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;14303:1:::1;14283:22;;:8;:22;;;;14275:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;14359:19;14369:8;14359:9;:19::i;:::-;14194:192:::0;:::o;51874:661::-;49899:21;:19;:21::i;:::-;51932:10:::1;51945:13;:11;:13::i;:::-;51932:26;;51969:16;51988:17;;;;;;;;;;;:27;;;52016:10;51988:39;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;51969:58;;52046:17;;;;;;;;;;;52038:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;52121:1;52110:8;:12;52102:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;52198:20;;52193:1;52188:2;:6;;;;:::i;:::-;:30;;52180:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;52321:25;;52316:1;52274:27;:39;52302:10;52274:39;;;;;;;;;;;;;;;;:43;;;;:::i;:::-;:72;;52266:128;;;;;;;;;;;;:::i;:::-;;;;;;;;;52427:9;52413:23;;:10;:23;;;52405:32;;;::::0;::::1;;52448:24;52458:10;52470:1;52448:9;:24::i;:::-;52526:1;52483:27;:39;52511:10;52483:39;;;;;;;;;;;;;;;;:44;;;;;;;:::i;:::-;;;;;;;;51921:614;;49943:20:::0;:18;:20::i;:::-;51874:661::o;12112:98::-;12165:7;12192:10;12185:17;;12112:98;:::o;24900:157::-;24985:4;25024:25;25009:40;;;:11;:40;;;;25002:47;;24900:157;;;:::o;39927:111::-;39984:4;40018:12;;40008:7;:22;40001:29;;39927:111;;;:::o;44847:196::-;44989:2;44962:15;:24;44978:7;44962:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;45027:7;45023:2;45007:28;;45016:5;45007:28;;;;;;;;;;;;44847:196;;;:::o;42727:2002::-;42842:35;42880:20;42892:7;42880:11;:20::i;:::-;42842:58;;42913:22;42955:13;:18;;;42939:34;;:12;:10;:12::i;:::-;:34;;;:87;;;;43014:12;:10;:12::i;:::-;42990:36;;:20;43002:7;42990:11;:20::i;:::-;:36;;;42939:87;:154;;;;43043:50;43060:13;:18;;;43080:12;:10;:12::i;:::-;43043:16;:50::i;:::-;42939:154;42913:181;;43115:17;43107:80;;;;;;;;;;;;:::i;:::-;;;;;;;;;43230:4;43208:26;;:13;:18;;;:26;;;43200:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;43310:1;43296:16;;:2;:16;;;;43288:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;43367:43;43389:4;43395:2;43399:7;43408:1;43367:21;:43::i;:::-;43475:49;43492:1;43496:7;43505:13;:18;;;43475:8;:49::i;:::-;43850:1;43820:12;:18;43833:4;43820:18;;;;;;;;;;;;;;;:26;;;:31;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43894:1;43866:12;:16;43879:2;43866:16;;;;;;;;;;;;;;;:24;;;:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43940:2;43912:11;:20;43924:7;43912:20;;;;;;;;;;;:25;;;:30;;;;;;;;;;;;;;;;;;44002:15;43957:11;:20;43969:7;43957:20;;;;;;;;;;;:35;;;:61;;;;;;;;;;;;;;;;;;44270:19;44302:1;44292:7;:11;44270:33;;44363:1;44322:43;;:11;:24;44334:11;44322:24;;;;;;;;;;;:29;;;;;;;;;;;;:43;;;44318:295;;;44390:20;44398:11;44390:7;:20::i;:::-;44386:212;;;44467:13;:18;;;44435:11;:24;44447:11;44435:24;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;44550:13;:28;;;44508:11;:24;44520:11;44508:24;;;;;;;;;;;:39;;;:70;;;;;;;;;;;;;;;;;;44386:212;44318:295;43795:829;44660:7;44656:2;44641:27;;44650:4;44641:27;;;;;;;;;;;;44679:42;44700:4;44706:2;44710:7;44719:1;44679:20;:42::i;:::-;42831:1898;;42727:2002;;;:::o;35608:537::-;35669:21;;:::i;:::-;35711:16;35719:7;35711;:16::i;:::-;35703:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;35817:12;35832:7;35817:22;;35812:245;35849:1;35841:4;:9;35812:245;;35879:31;35913:11;:17;35925:4;35913:17;;;;;;;;;;;35879:51;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35979:1;35953:28;;:9;:14;;;:28;;;35949:93;;36013:9;36006:16;;;;;;35949:93;35860:197;35852:6;;;;;;;;35812:245;;;;36080:57;;;;;;;;;;:::i;:::-;;;;;;;;35608:537;;;;:::o;14394:173::-;14450:16;14469:6;;;;;;;;;;;14450:25;;14495:8;14486:6;;:17;;;;;;;;;;;;;;;;;;14550:8;14519:40;;14540:8;14519:40;;;;;;;;;;;;14439:128;14394:173;:::o;45608:804::-;45763:4;45784:15;:2;:13;;;:15::i;:::-;45780:625;;;45836:2;45820:36;;;45857:12;:10;:12::i;:::-;45871:4;45877:7;45886:5;45820:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;45816:534;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46083:1;46066:6;:13;:18;46062:273;;;46109:61;;;;;;;;;;:::i;:::-;;;;;;;;46062:273;46285:6;46279:13;46270:6;46266:2;46262:15;46255:38;45816:534;45953:45;;;45943:55;;;:6;:55;;;;45936:62;;;;;45780:625;46389:4;46382:11;;45608:804;;;;;;;:::o;55163:109::-;55222:13;55255:9;55248:16;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55163:109;:::o;286:723::-;342:13;572:1;563:5;:10;559:53;;;590:10;;;;;;;;;;;;;;;;;;;;;559:53;622:12;637:5;622:20;;653:14;678:78;693:1;685:4;:9;678:78;;711:8;;;;;:::i;:::-;;;;742:2;734:10;;;;;:::i;:::-;;;678:78;;;766:19;798:6;788:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;766:39;;816:154;832:1;823:5;:10;816:154;;860:1;850:11;;;;;:::i;:::-;;;927:2;919:5;:10;;;;:::i;:::-;906:2;:24;;;;:::i;:::-;893:39;;876:6;883;876:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;956:2;947:11;;;;;:::i;:::-;;;816:154;;;994:6;980:21;;;;;286:723;;;;:::o;40046:104::-;40115:27;40125:2;40129:8;40115:27;;;;;;;;;;;;:9;:27::i;:::-;40046:104;;:::o;49979:289::-;49381:1;50109:7;;:19;;50101:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;49381:1;50242:7;:18;;;;49979:289::o;50276:213::-;49337:1;50459:7;:22;;;;50276:213::o;46900:159::-;;;;;:::o;47471:158::-;;;;;:::o;15308:387::-;15368:4;15576:12;15643:7;15631:20;15623:28;;15686:1;15679:4;:8;15672:15;;;15308:387;;;:::o;40513:163::-;40636:32;40642:2;40646:8;40656:5;40663:4;40636:5;:32::i;:::-;40513:163;;;:::o;40935:1538::-;41074:20;41097:12;;41074:35;;41142:1;41128:16;;:2;:16;;;;41120:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;41213:1;41201:8;:13;;41193:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;41272:61;41302:1;41306:2;41310:12;41324:8;41272:21;:61::i;:::-;41647:8;41611:12;:16;41624:2;41611:16;;;;;;;;;;;;;;;:24;;;:45;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41712:8;41671:12;:16;41684:2;41671:16;;;;;;;;;;;;;;;:29;;;:50;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;41771:2;41738:11;:25;41750:12;41738:25;;;;;;;;;;;:30;;;:35;;;;;;;;;;;;;;;;;;41838:15;41788:11;:25;41800:12;41788:25;;;;;;;;;;;:40;;;:66;;;;;;;;;;;;;;;;;;41871:20;41894:12;41871:35;;41928:9;41923:415;41943:8;41939:1;:12;41923:415;;;42007:12;42003:2;41982:38;;41999:1;41982:38;;;;;;;;;;;;42043:4;42039:249;;;42106:59;42137:1;42141:2;42145:12;42159:5;42106:22;:59::i;:::-;42072:196;;;;;;;;;;;;:::i;:::-;;;;;;;;;42039:249;42308:14;;;;;;;41953:3;;;;;;;41923:415;;;;42369:12;42354;:27;;;;41586:807;42405:60;42434:1;42438:2;42442:12;42456:8;42405:20;:60::i;:::-;41063:1410;40935:1538;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:137::-;1170:5;1208:6;1195:20;1186:29;;1224:32;1250:5;1224:32;:::i;:::-;1125:137;;;;:::o;1268:141::-;1324:5;1355:6;1349:13;1340:22;;1371:32;1397:5;1371:32;:::i;:::-;1268:141;;;;:::o;1428:338::-;1483:5;1532:3;1525:4;1517:6;1513:17;1509:27;1499:122;;1540:79;;:::i;:::-;1499:122;1657:6;1644:20;1682:78;1756:3;1748:6;1741:4;1733:6;1729:17;1682:78;:::i;:::-;1673:87;;1489:277;1428:338;;;;:::o;1786:340::-;1842:5;1891:3;1884:4;1876:6;1872:17;1868:27;1858:122;;1899:79;;:::i;:::-;1858:122;2016:6;2003:20;2041:79;2116:3;2108:6;2101:4;2093:6;2089:17;2041:79;:::i;:::-;2032:88;;1848:278;1786:340;;;;:::o;2132:139::-;2178:5;2216:6;2203:20;2194:29;;2232:33;2259:5;2232:33;:::i;:::-;2132:139;;;;:::o;2277:143::-;2334:5;2365:6;2359:13;2350:22;;2381:33;2408:5;2381:33;:::i;:::-;2277:143;;;;:::o;2426:329::-;2485:6;2534:2;2522:9;2513:7;2509:23;2505:32;2502:119;;;2540:79;;:::i;:::-;2502:119;2660:1;2685:53;2730:7;2721:6;2710:9;2706:22;2685:53;:::i;:::-;2675:63;;2631:117;2426:329;;;;:::o;2761:474::-;2829:6;2837;2886:2;2874:9;2865:7;2861:23;2857:32;2854:119;;;2892:79;;:::i;:::-;2854:119;3012:1;3037:53;3082:7;3073:6;3062:9;3058:22;3037:53;:::i;:::-;3027:63;;2983:117;3139:2;3165:53;3210:7;3201:6;3190:9;3186:22;3165:53;:::i;:::-;3155:63;;3110:118;2761:474;;;;;:::o;3241:619::-;3318:6;3326;3334;3383:2;3371:9;3362:7;3358:23;3354:32;3351:119;;;3389:79;;:::i;:::-;3351:119;3509:1;3534:53;3579:7;3570:6;3559:9;3555:22;3534:53;:::i;:::-;3524:63;;3480:117;3636:2;3662:53;3707:7;3698:6;3687:9;3683:22;3662:53;:::i;:::-;3652:63;;3607:118;3764:2;3790:53;3835:7;3826:6;3815:9;3811:22;3790:53;:::i;:::-;3780:63;;3735:118;3241:619;;;;;:::o;3866:943::-;3961:6;3969;3977;3985;4034:3;4022:9;4013:7;4009:23;4005:33;4002:120;;;4041:79;;:::i;:::-;4002:120;4161:1;4186:53;4231:7;4222:6;4211:9;4207:22;4186:53;:::i;:::-;4176:63;;4132:117;4288:2;4314:53;4359:7;4350:6;4339:9;4335:22;4314:53;:::i;:::-;4304:63;;4259:118;4416:2;4442:53;4487:7;4478:6;4467:9;4463:22;4442:53;:::i;:::-;4432:63;;4387:118;4572:2;4561:9;4557:18;4544:32;4603:18;4595:6;4592:30;4589:117;;;4625:79;;:::i;:::-;4589:117;4730:62;4784:7;4775:6;4764:9;4760:22;4730:62;:::i;:::-;4720:72;;4515:287;3866:943;;;;;;;:::o;4815:468::-;4880:6;4888;4937:2;4925:9;4916:7;4912:23;4908:32;4905:119;;;4943:79;;:::i;:::-;4905:119;5063:1;5088:53;5133:7;5124:6;5113:9;5109:22;5088:53;:::i;:::-;5078:63;;5034:117;5190:2;5216:50;5258:7;5249:6;5238:9;5234:22;5216:50;:::i;:::-;5206:60;;5161:115;4815:468;;;;;:::o;5289:474::-;5357:6;5365;5414:2;5402:9;5393:7;5389:23;5385:32;5382:119;;;5420:79;;:::i;:::-;5382:119;5540:1;5565:53;5610:7;5601:6;5590:9;5586:22;5565:53;:::i;:::-;5555:63;;5511:117;5667:2;5693:53;5738:7;5729:6;5718:9;5714:22;5693:53;:::i;:::-;5683:63;;5638:118;5289:474;;;;;:::o;5769:323::-;5825:6;5874:2;5862:9;5853:7;5849:23;5845:32;5842:119;;;5880:79;;:::i;:::-;5842:119;6000:1;6025:50;6067:7;6058:6;6047:9;6043:22;6025:50;:::i;:::-;6015:60;;5971:114;5769:323;;;;:::o;6098:327::-;6156:6;6205:2;6193:9;6184:7;6180:23;6176:32;6173:119;;;6211:79;;:::i;:::-;6173:119;6331:1;6356:52;6400:7;6391:6;6380:9;6376:22;6356:52;:::i;:::-;6346:62;;6302:116;6098:327;;;;:::o;6431:349::-;6500:6;6549:2;6537:9;6528:7;6524:23;6520:32;6517:119;;;6555:79;;:::i;:::-;6517:119;6675:1;6700:63;6755:7;6746:6;6735:9;6731:22;6700:63;:::i;:::-;6690:73;;6646:127;6431:349;;;;:::o;6786:509::-;6855:6;6904:2;6892:9;6883:7;6879:23;6875:32;6872:119;;;6910:79;;:::i;:::-;6872:119;7058:1;7047:9;7043:17;7030:31;7088:18;7080:6;7077:30;7074:117;;;7110:79;;:::i;:::-;7074:117;7215:63;7270:7;7261:6;7250:9;7246:22;7215:63;:::i;:::-;7205:73;;7001:287;6786:509;;;;:::o;7301:329::-;7360:6;7409:2;7397:9;7388:7;7384:23;7380:32;7377:119;;;7415:79;;:::i;:::-;7377:119;7535:1;7560:53;7605:7;7596:6;7585:9;7581:22;7560:53;:::i;:::-;7550:63;;7506:117;7301:329;;;;:::o;7636:351::-;7706:6;7755:2;7743:9;7734:7;7730:23;7726:32;7723:119;;;7761:79;;:::i;:::-;7723:119;7881:1;7906:64;7962:7;7953:6;7942:9;7938:22;7906:64;:::i;:::-;7896:74;;7852:128;7636:351;;;;:::o;7993:118::-;8080:24;8098:5;8080:24;:::i;:::-;8075:3;8068:37;7993:118;;:::o;8117:109::-;8198:21;8213:5;8198:21;:::i;:::-;8193:3;8186:34;8117:109;;:::o;8232:360::-;8318:3;8346:38;8378:5;8346:38;:::i;:::-;8400:70;8463:6;8458:3;8400:70;:::i;:::-;8393:77;;8479:52;8524:6;8519:3;8512:4;8505:5;8501:16;8479:52;:::i;:::-;8556:29;8578:6;8556:29;:::i;:::-;8551:3;8547:39;8540:46;;8322:270;8232:360;;;;:::o;8598:364::-;8686:3;8714:39;8747:5;8714:39;:::i;:::-;8769:71;8833:6;8828:3;8769:71;:::i;:::-;8762:78;;8849:52;8894:6;8889:3;8882:4;8875:5;8871:16;8849:52;:::i;:::-;8926:29;8948:6;8926:29;:::i;:::-;8921:3;8917:39;8910:46;;8690:272;8598:364;;;;:::o;8968:377::-;9074:3;9102:39;9135:5;9102:39;:::i;:::-;9157:89;9239:6;9234:3;9157:89;:::i;:::-;9150:96;;9255:52;9300:6;9295:3;9288:4;9281:5;9277:16;9255:52;:::i;:::-;9332:6;9327:3;9323:16;9316:23;;9078:267;8968:377;;;;:::o;9351:366::-;9493:3;9514:67;9578:2;9573:3;9514:67;:::i;:::-;9507:74;;9590:93;9679:3;9590:93;:::i;:::-;9708:2;9703:3;9699:12;9692:19;;9351:366;;;:::o;9723:::-;9865:3;9886:67;9950:2;9945:3;9886:67;:::i;:::-;9879:74;;9962:93;10051:3;9962:93;:::i;:::-;10080:2;10075:3;10071:12;10064:19;;9723:366;;;:::o;10095:::-;10237:3;10258:67;10322:2;10317:3;10258:67;:::i;:::-;10251:74;;10334:93;10423:3;10334:93;:::i;:::-;10452:2;10447:3;10443:12;10436:19;;10095:366;;;:::o;10467:::-;10609:3;10630:67;10694:2;10689:3;10630:67;:::i;:::-;10623:74;;10706:93;10795:3;10706:93;:::i;:::-;10824:2;10819:3;10815:12;10808:19;;10467:366;;;:::o;10839:::-;10981:3;11002:67;11066:2;11061:3;11002:67;:::i;:::-;10995:74;;11078:93;11167:3;11078:93;:::i;:::-;11196:2;11191:3;11187:12;11180:19;;10839:366;;;:::o;11211:::-;11353:3;11374:67;11438:2;11433:3;11374:67;:::i;:::-;11367:74;;11450:93;11539:3;11450:93;:::i;:::-;11568:2;11563:3;11559:12;11552:19;;11211:366;;;:::o;11583:::-;11725:3;11746:67;11810:2;11805:3;11746:67;:::i;:::-;11739:74;;11822:93;11911:3;11822:93;:::i;:::-;11940:2;11935:3;11931:12;11924:19;;11583:366;;;:::o;11955:::-;12097:3;12118:67;12182:2;12177:3;12118:67;:::i;:::-;12111:74;;12194:93;12283:3;12194:93;:::i;:::-;12312:2;12307:3;12303:12;12296:19;;11955:366;;;:::o;12327:::-;12469:3;12490:67;12554:2;12549:3;12490:67;:::i;:::-;12483:74;;12566:93;12655:3;12566:93;:::i;:::-;12684:2;12679:3;12675:12;12668:19;;12327:366;;;:::o;12699:::-;12841:3;12862:67;12926:2;12921:3;12862:67;:::i;:::-;12855:74;;12938:93;13027:3;12938:93;:::i;:::-;13056:2;13051:3;13047:12;13040:19;;12699:366;;;:::o;13071:::-;13213:3;13234:67;13298:2;13293:3;13234:67;:::i;:::-;13227:74;;13310:93;13399:3;13310:93;:::i;:::-;13428:2;13423:3;13419:12;13412:19;;13071:366;;;:::o;13443:::-;13585:3;13606:67;13670:2;13665:3;13606:67;:::i;:::-;13599:74;;13682:93;13771:3;13682:93;:::i;:::-;13800:2;13795:3;13791:12;13784:19;;13443:366;;;:::o;13815:::-;13957:3;13978:67;14042:2;14037:3;13978:67;:::i;:::-;13971:74;;14054:93;14143:3;14054:93;:::i;:::-;14172:2;14167:3;14163:12;14156:19;;13815:366;;;:::o;14187:::-;14329:3;14350:67;14414:2;14409:3;14350:67;:::i;:::-;14343:74;;14426:93;14515:3;14426:93;:::i;:::-;14544:2;14539:3;14535:12;14528:19;;14187:366;;;:::o;14559:::-;14701:3;14722:67;14786:2;14781:3;14722:67;:::i;:::-;14715:74;;14798:93;14887:3;14798:93;:::i;:::-;14916:2;14911:3;14907:12;14900:19;;14559:366;;;:::o;14931:::-;15073:3;15094:67;15158:2;15153:3;15094:67;:::i;:::-;15087:74;;15170:93;15259:3;15170:93;:::i;:::-;15288:2;15283:3;15279:12;15272:19;;14931:366;;;:::o;15303:::-;15445:3;15466:67;15530:2;15525:3;15466:67;:::i;:::-;15459:74;;15542:93;15631:3;15542:93;:::i;:::-;15660:2;15655:3;15651:12;15644:19;;15303:366;;;:::o;15675:::-;15817:3;15838:67;15902:2;15897:3;15838:67;:::i;:::-;15831:74;;15914:93;16003:3;15914:93;:::i;:::-;16032:2;16027:3;16023:12;16016:19;;15675:366;;;:::o;16047:::-;16189:3;16210:67;16274:2;16269:3;16210:67;:::i;:::-;16203:74;;16286:93;16375:3;16286:93;:::i;:::-;16404:2;16399:3;16395:12;16388:19;;16047:366;;;:::o;16419:::-;16561:3;16582:67;16646:2;16641:3;16582:67;:::i;:::-;16575:74;;16658:93;16747:3;16658:93;:::i;:::-;16776:2;16771:3;16767:12;16760:19;;16419:366;;;:::o;16791:398::-;16950:3;16971:83;17052:1;17047:3;16971:83;:::i;:::-;16964:90;;17063:93;17152:3;17063:93;:::i;:::-;17181:1;17176:3;17172:11;17165:18;;16791:398;;;:::o;17195:366::-;17337:3;17358:67;17422:2;17417:3;17358:67;:::i;:::-;17351:74;;17434:93;17523:3;17434:93;:::i;:::-;17552:2;17547:3;17543:12;17536:19;;17195:366;;;:::o;17567:::-;17709:3;17730:67;17794:2;17789:3;17730:67;:::i;:::-;17723:74;;17806:93;17895:3;17806:93;:::i;:::-;17924:2;17919:3;17915:12;17908:19;;17567:366;;;:::o;17939:::-;18081:3;18102:67;18166:2;18161:3;18102:67;:::i;:::-;18095:74;;18178:93;18267:3;18178:93;:::i;:::-;18296:2;18291:3;18287:12;18280:19;;17939:366;;;:::o;18311:::-;18453:3;18474:67;18538:2;18533:3;18474:67;:::i;:::-;18467:74;;18550:93;18639:3;18550:93;:::i;:::-;18668:2;18663:3;18659:12;18652:19;;18311:366;;;:::o;18683:::-;18825:3;18846:67;18910:2;18905:3;18846:67;:::i;:::-;18839:74;;18922:93;19011:3;18922:93;:::i;:::-;19040:2;19035:3;19031:12;19024:19;;18683:366;;;:::o;19055:::-;19197:3;19218:67;19282:2;19277:3;19218:67;:::i;:::-;19211:74;;19294:93;19383:3;19294:93;:::i;:::-;19412:2;19407:3;19403:12;19396:19;;19055:366;;;:::o;19427:::-;19569:3;19590:67;19654:2;19649:3;19590:67;:::i;:::-;19583:74;;19666:93;19755:3;19666:93;:::i;:::-;19784:2;19779:3;19775:12;19768:19;;19427:366;;;:::o;19799:::-;19941:3;19962:67;20026:2;20021:3;19962:67;:::i;:::-;19955:74;;20038:93;20127:3;20038:93;:::i;:::-;20156:2;20151:3;20147:12;20140:19;;19799:366;;;:::o;20171:118::-;20258:24;20276:5;20258:24;:::i;:::-;20253:3;20246:37;20171:118;;:::o;20295:435::-;20475:3;20497:95;20588:3;20579:6;20497:95;:::i;:::-;20490:102;;20609:95;20700:3;20691:6;20609:95;:::i;:::-;20602:102;;20721:3;20714:10;;20295:435;;;;;:::o;20736:379::-;20920:3;20942:147;21085:3;20942:147;:::i;:::-;20935:154;;21106:3;21099:10;;20736:379;;;:::o;21121:222::-;21214:4;21252:2;21241:9;21237:18;21229:26;;21265:71;21333:1;21322:9;21318:17;21309:6;21265:71;:::i;:::-;21121:222;;;;:::o;21349:640::-;21544:4;21582:3;21571:9;21567:19;21559:27;;21596:71;21664:1;21653:9;21649:17;21640:6;21596:71;:::i;:::-;21677:72;21745:2;21734:9;21730:18;21721:6;21677:72;:::i;:::-;21759;21827:2;21816:9;21812:18;21803:6;21759:72;:::i;:::-;21878:9;21872:4;21868:20;21863:2;21852:9;21848:18;21841:48;21906:76;21977:4;21968:6;21906:76;:::i;:::-;21898:84;;21349:640;;;;;;;:::o;21995:210::-;22082:4;22120:2;22109:9;22105:18;22097:26;;22133:65;22195:1;22184:9;22180:17;22171:6;22133:65;:::i;:::-;21995:210;;;;:::o;22211:313::-;22324:4;22362:2;22351:9;22347:18;22339:26;;22411:9;22405:4;22401:20;22397:1;22386:9;22382:17;22375:47;22439:78;22512:4;22503:6;22439:78;:::i;:::-;22431:86;;22211:313;;;;:::o;22530:419::-;22696:4;22734:2;22723:9;22719:18;22711:26;;22783:9;22777:4;22773:20;22769:1;22758:9;22754:17;22747:47;22811:131;22937:4;22811:131;:::i;:::-;22803:139;;22530:419;;;:::o;22955:::-;23121:4;23159:2;23148:9;23144:18;23136:26;;23208:9;23202:4;23198:20;23194:1;23183:9;23179:17;23172:47;23236:131;23362:4;23236:131;:::i;:::-;23228:139;;22955:419;;;:::o;23380:::-;23546:4;23584:2;23573:9;23569:18;23561:26;;23633:9;23627:4;23623:20;23619:1;23608:9;23604:17;23597:47;23661:131;23787:4;23661:131;:::i;:::-;23653:139;;23380:419;;;:::o;23805:::-;23971:4;24009:2;23998:9;23994:18;23986:26;;24058:9;24052:4;24048:20;24044:1;24033:9;24029:17;24022:47;24086:131;24212:4;24086:131;:::i;:::-;24078:139;;23805:419;;;:::o;24230:::-;24396:4;24434:2;24423:9;24419:18;24411:26;;24483:9;24477:4;24473:20;24469:1;24458:9;24454:17;24447:47;24511:131;24637:4;24511:131;:::i;:::-;24503:139;;24230:419;;;:::o;24655:::-;24821:4;24859:2;24848:9;24844:18;24836:26;;24908:9;24902:4;24898:20;24894:1;24883:9;24879:17;24872:47;24936:131;25062:4;24936:131;:::i;:::-;24928:139;;24655:419;;;:::o;25080:::-;25246:4;25284:2;25273:9;25269:18;25261:26;;25333:9;25327:4;25323:20;25319:1;25308:9;25304:17;25297:47;25361:131;25487:4;25361:131;:::i;:::-;25353:139;;25080:419;;;:::o;25505:::-;25671:4;25709:2;25698:9;25694:18;25686:26;;25758:9;25752:4;25748:20;25744:1;25733:9;25729:17;25722:47;25786:131;25912:4;25786:131;:::i;:::-;25778:139;;25505:419;;;:::o;25930:::-;26096:4;26134:2;26123:9;26119:18;26111:26;;26183:9;26177:4;26173:20;26169:1;26158:9;26154:17;26147:47;26211:131;26337:4;26211:131;:::i;:::-;26203:139;;25930:419;;;:::o;26355:::-;26521:4;26559:2;26548:9;26544:18;26536:26;;26608:9;26602:4;26598:20;26594:1;26583:9;26579:17;26572:47;26636:131;26762:4;26636:131;:::i;:::-;26628:139;;26355:419;;;:::o;26780:::-;26946:4;26984:2;26973:9;26969:18;26961:26;;27033:9;27027:4;27023:20;27019:1;27008:9;27004:17;26997:47;27061:131;27187:4;27061:131;:::i;:::-;27053:139;;26780:419;;;:::o;27205:::-;27371:4;27409:2;27398:9;27394:18;27386:26;;27458:9;27452:4;27448:20;27444:1;27433:9;27429:17;27422:47;27486:131;27612:4;27486:131;:::i;:::-;27478:139;;27205:419;;;:::o;27630:::-;27796:4;27834:2;27823:9;27819:18;27811:26;;27883:9;27877:4;27873:20;27869:1;27858:9;27854:17;27847:47;27911:131;28037:4;27911:131;:::i;:::-;27903:139;;27630:419;;;:::o;28055:::-;28221:4;28259:2;28248:9;28244:18;28236:26;;28308:9;28302:4;28298:20;28294:1;28283:9;28279:17;28272:47;28336:131;28462:4;28336:131;:::i;:::-;28328:139;;28055:419;;;:::o;28480:::-;28646:4;28684:2;28673:9;28669:18;28661:26;;28733:9;28727:4;28723:20;28719:1;28708:9;28704:17;28697:47;28761:131;28887:4;28761:131;:::i;:::-;28753:139;;28480:419;;;:::o;28905:::-;29071:4;29109:2;29098:9;29094:18;29086:26;;29158:9;29152:4;29148:20;29144:1;29133:9;29129:17;29122:47;29186:131;29312:4;29186:131;:::i;:::-;29178:139;;28905:419;;;:::o;29330:::-;29496:4;29534:2;29523:9;29519:18;29511:26;;29583:9;29577:4;29573:20;29569:1;29558:9;29554:17;29547:47;29611:131;29737:4;29611:131;:::i;:::-;29603:139;;29330:419;;;:::o;29755:::-;29921:4;29959:2;29948:9;29944:18;29936:26;;30008:9;30002:4;29998:20;29994:1;29983:9;29979:17;29972:47;30036:131;30162:4;30036:131;:::i;:::-;30028:139;;29755:419;;;:::o;30180:::-;30346:4;30384:2;30373:9;30369:18;30361:26;;30433:9;30427:4;30423:20;30419:1;30408:9;30404:17;30397:47;30461:131;30587:4;30461:131;:::i;:::-;30453:139;;30180:419;;;:::o;30605:::-;30771:4;30809:2;30798:9;30794:18;30786:26;;30858:9;30852:4;30848:20;30844:1;30833:9;30829:17;30822:47;30886:131;31012:4;30886:131;:::i;:::-;30878:139;;30605:419;;;:::o;31030:::-;31196:4;31234:2;31223:9;31219:18;31211:26;;31283:9;31277:4;31273:20;31269:1;31258:9;31254:17;31247:47;31311:131;31437:4;31311:131;:::i;:::-;31303:139;;31030:419;;;:::o;31455:::-;31621:4;31659:2;31648:9;31644:18;31636:26;;31708:9;31702:4;31698:20;31694:1;31683:9;31679:17;31672:47;31736:131;31862:4;31736:131;:::i;:::-;31728:139;;31455:419;;;:::o;31880:::-;32046:4;32084:2;32073:9;32069:18;32061:26;;32133:9;32127:4;32123:20;32119:1;32108:9;32104:17;32097:47;32161:131;32287:4;32161:131;:::i;:::-;32153:139;;31880:419;;;:::o;32305:::-;32471:4;32509:2;32498:9;32494:18;32486:26;;32558:9;32552:4;32548:20;32544:1;32533:9;32529:17;32522:47;32586:131;32712:4;32586:131;:::i;:::-;32578:139;;32305:419;;;:::o;32730:::-;32896:4;32934:2;32923:9;32919:18;32911:26;;32983:9;32977:4;32973:20;32969:1;32958:9;32954:17;32947:47;33011:131;33137:4;33011:131;:::i;:::-;33003:139;;32730:419;;;:::o;33155:::-;33321:4;33359:2;33348:9;33344:18;33336:26;;33408:9;33402:4;33398:20;33394:1;33383:9;33379:17;33372:47;33436:131;33562:4;33436:131;:::i;:::-;33428:139;;33155:419;;;:::o;33580:::-;33746:4;33784:2;33773:9;33769:18;33761:26;;33833:9;33827:4;33823:20;33819:1;33808:9;33804:17;33797:47;33861:131;33987:4;33861:131;:::i;:::-;33853:139;;33580:419;;;:::o;34005:::-;34171:4;34209:2;34198:9;34194:18;34186:26;;34258:9;34252:4;34248:20;34244:1;34233:9;34229:17;34222:47;34286:131;34412:4;34286:131;:::i;:::-;34278:139;;34005:419;;;:::o;34430:222::-;34523:4;34561:2;34550:9;34546:18;34538:26;;34574:71;34642:1;34631:9;34627:17;34618:6;34574:71;:::i;:::-;34430:222;;;;:::o;34658:129::-;34692:6;34719:20;;:::i;:::-;34709:30;;34748:33;34776:4;34768:6;34748:33;:::i;:::-;34658:129;;;:::o;34793:75::-;34826:6;34859:2;34853:9;34843:19;;34793:75;:::o;34874:307::-;34935:4;35025:18;35017:6;35014:30;35011:56;;;35047:18;;:::i;:::-;35011:56;35085:29;35107:6;35085:29;:::i;:::-;35077:37;;35169:4;35163;35159:15;35151:23;;34874:307;;;:::o;35187:308::-;35249:4;35339:18;35331:6;35328:30;35325:56;;;35361:18;;:::i;:::-;35325:56;35399:29;35421:6;35399:29;:::i;:::-;35391:37;;35483:4;35477;35473:15;35465:23;;35187:308;;;:::o;35501:98::-;35552:6;35586:5;35580:12;35570:22;;35501:98;;;:::o;35605:99::-;35657:6;35691:5;35685:12;35675:22;;35605:99;;;:::o;35710:168::-;35793:11;35827:6;35822:3;35815:19;35867:4;35862:3;35858:14;35843:29;;35710:168;;;;:::o;35884:147::-;35985:11;36022:3;36007:18;;35884:147;;;;:::o;36037:169::-;36121:11;36155:6;36150:3;36143:19;36195:4;36190:3;36186:14;36171:29;;36037:169;;;;:::o;36212:148::-;36314:11;36351:3;36336:18;;36212:148;;;;:::o;36366:305::-;36406:3;36425:20;36443:1;36425:20;:::i;:::-;36420:25;;36459:20;36477:1;36459:20;:::i;:::-;36454:25;;36613:1;36545:66;36541:74;36538:1;36535:81;36532:107;;;36619:18;;:::i;:::-;36532:107;36663:1;36660;36656:9;36649:16;;36366:305;;;;:::o;36677:185::-;36717:1;36734:20;36752:1;36734:20;:::i;:::-;36729:25;;36768:20;36786:1;36768:20;:::i;:::-;36763:25;;36807:1;36797:35;;36812:18;;:::i;:::-;36797:35;36854:1;36851;36847:9;36842:14;;36677:185;;;;:::o;36868:348::-;36908:7;36931:20;36949:1;36931:20;:::i;:::-;36926:25;;36965:20;36983:1;36965:20;:::i;:::-;36960:25;;37153:1;37085:66;37081:74;37078:1;37075:81;37070:1;37063:9;37056:17;37052:105;37049:131;;;37160:18;;:::i;:::-;37049:131;37208:1;37205;37201:9;37190:20;;36868:348;;;;:::o;37222:191::-;37262:4;37282:20;37300:1;37282:20;:::i;:::-;37277:25;;37316:20;37334:1;37316:20;:::i;:::-;37311:25;;37355:1;37352;37349:8;37346:34;;;37360:18;;:::i;:::-;37346:34;37405:1;37402;37398:9;37390:17;;37222:191;;;;:::o;37419:96::-;37456:7;37485:24;37503:5;37485:24;:::i;:::-;37474:35;;37419:96;;;:::o;37521:90::-;37555:7;37598:5;37591:13;37584:21;37573:32;;37521:90;;;:::o;37617:149::-;37653:7;37693:66;37686:5;37682:78;37671:89;;37617:149;;;:::o;37772:126::-;37809:7;37849:42;37842:5;37838:54;37827:65;;37772:126;;;:::o;37904:77::-;37941:7;37970:5;37959:16;;37904:77;;;:::o;37987:154::-;38071:6;38066:3;38061;38048:30;38133:1;38124:6;38119:3;38115:16;38108:27;37987:154;;;:::o;38147:307::-;38215:1;38225:113;38239:6;38236:1;38233:13;38225:113;;;38324:1;38319:3;38315:11;38309:18;38305:1;38300:3;38296:11;38289:39;38261:2;38258:1;38254:10;38249:15;;38225:113;;;38356:6;38353:1;38350:13;38347:101;;;38436:1;38427:6;38422:3;38418:16;38411:27;38347:101;38196:258;38147:307;;;:::o;38460:320::-;38504:6;38541:1;38535:4;38531:12;38521:22;;38588:1;38582:4;38578:12;38609:18;38599:81;;38665:4;38657:6;38653:17;38643:27;;38599:81;38727:2;38719:6;38716:14;38696:18;38693:38;38690:84;;;38746:18;;:::i;:::-;38690:84;38511:269;38460:320;;;:::o;38786:281::-;38869:27;38891:4;38869:27;:::i;:::-;38861:6;38857:40;38999:6;38987:10;38984:22;38963:18;38951:10;38948:34;38945:62;38942:88;;;39010:18;;:::i;:::-;38942:88;39050:10;39046:2;39039:22;38829:238;38786:281;;:::o;39073:233::-;39112:3;39135:24;39153:5;39135:24;:::i;:::-;39126:33;;39181:66;39174:5;39171:77;39168:103;;;39251:18;;:::i;:::-;39168:103;39298:1;39291:5;39287:13;39280:20;;39073:233;;;:::o;39312:176::-;39344:1;39361:20;39379:1;39361:20;:::i;:::-;39356:25;;39395:20;39413:1;39395:20;:::i;:::-;39390:25;;39434:1;39424:35;;39439:18;;:::i;:::-;39424:35;39480:1;39477;39473:9;39468:14;;39312:176;;;;:::o;39494:180::-;39542:77;39539:1;39532:88;39639:4;39636:1;39629:15;39663:4;39660:1;39653:15;39680:180;39728:77;39725:1;39718:88;39825:4;39822:1;39815:15;39849:4;39846:1;39839:15;39866:180;39914:77;39911:1;39904:88;40011:4;40008:1;40001:15;40035:4;40032:1;40025:15;40052:180;40100:77;40097:1;40090:88;40197:4;40194:1;40187:15;40221:4;40218:1;40211:15;40238:180;40286:77;40283:1;40276:88;40383:4;40380:1;40373:15;40407:4;40404:1;40397:15;40424:117;40533:1;40530;40523:12;40547:117;40656:1;40653;40646:12;40670:117;40779:1;40776;40769:12;40793:117;40902:1;40899;40892:12;40916:102;40957:6;41008:2;41004:7;40999:2;40992:5;40988:14;40984:28;40974:38;;40916:102;;;:::o;41024:221::-;41164:34;41160:1;41152:6;41148:14;41141:58;41233:4;41228:2;41220:6;41216:15;41209:29;41024:221;:::o;41251:225::-;41391:34;41387:1;41379:6;41375:14;41368:58;41460:8;41455:2;41447:6;41443:15;41436:33;41251:225;:::o;41482:182::-;41622:34;41618:1;41610:6;41606:14;41599:58;41482:182;:::o;41670:229::-;41810:34;41806:1;41798:6;41794:14;41787:58;41879:12;41874:2;41866:6;41862:15;41855:37;41670:229;:::o;41905:222::-;42045:34;42041:1;42033:6;42029:14;42022:58;42114:5;42109:2;42101:6;42097:15;42090:30;41905:222;:::o;42133:224::-;42273:34;42269:1;42261:6;42257:14;42250:58;42342:7;42337:2;42329:6;42325:15;42318:32;42133:224;:::o;42363:181::-;42503:33;42499:1;42491:6;42487:14;42480:57;42363:181;:::o;42550:221::-;42690:34;42686:1;42678:6;42674:14;42667:58;42759:4;42754:2;42746:6;42742:15;42735:29;42550:221;:::o;42777:240::-;42917:34;42913:1;42905:6;42901:14;42894:58;42986:23;42981:2;42973:6;42969:15;42962:48;42777:240;:::o;43023:244::-;43163:34;43159:1;43151:6;43147:14;43140:58;43232:27;43227:2;43219:6;43215:15;43208:52;43023:244;:::o;43273:230::-;43413:34;43409:1;43401:6;43397:14;43390:58;43482:13;43477:2;43469:6;43465:15;43458:38;43273:230;:::o;43509:227::-;43649:34;43645:1;43637:6;43633:14;43626:58;43718:10;43713:2;43705:6;43701:15;43694:35;43509:227;:::o;43742:170::-;43882:22;43878:1;43870:6;43866:14;43859:46;43742:170;:::o;43918:225::-;44058:34;44054:1;44046:6;44042:14;44035:58;44127:8;44122:2;44114:6;44110:15;44103:33;43918:225;:::o;44149:182::-;44289:34;44285:1;44277:6;44273:14;44266:58;44149:182;:::o;44337:234::-;44477:34;44473:1;44465:6;44461:14;44454:58;44546:17;44541:2;44533:6;44529:15;44522:42;44337:234;:::o;44577:176::-;44717:28;44713:1;44705:6;44701:14;44694:52;44577:176;:::o;44759:237::-;44899:34;44895:1;44887:6;44883:14;44876:58;44968:20;44963:2;44955:6;44951:15;44944:45;44759:237;:::o;45002:173::-;45142:25;45138:1;45130:6;45126:14;45119:49;45002:173;:::o;45181:221::-;45321:34;45317:1;45309:6;45305:14;45298:58;45390:4;45385:2;45377:6;45373:15;45366:29;45181:221;:::o;45408:114::-;;:::o;45528:238::-;45668:34;45664:1;45656:6;45652:14;45645:58;45737:21;45732:2;45724:6;45720:15;45713:46;45528:238;:::o;45772:220::-;45912:34;45908:1;45900:6;45896:14;45889:58;45981:3;45976:2;45968:6;45964:15;45957:28;45772:220;:::o;45998:227::-;46138:34;46134:1;46126:6;46122:14;46115:58;46207:10;46202:2;46194:6;46190:15;46183:35;45998:227;:::o;46231:230::-;46371:34;46367:1;46359:6;46355:14;46348:58;46440:13;46435:2;46427:6;46423:15;46416:38;46231:230;:::o;46467:233::-;46607:34;46603:1;46595:6;46591:14;46584:58;46676:16;46671:2;46663:6;46659:15;46652:41;46467:233;:::o;46706:181::-;46846:33;46842:1;46834:6;46830:14;46823:57;46706:181;:::o;46893:234::-;47033:34;47029:1;47021:6;47017:14;47010:58;47102:17;47097:2;47089:6;47085:15;47078:42;46893:234;:::o;47133:232::-;47273:34;47269:1;47261:6;47257:14;47250:58;47342:15;47337:2;47329:6;47325:15;47318:40;47133:232;:::o;47371:122::-;47444:24;47462:5;47444:24;:::i;:::-;47437:5;47434:35;47424:63;;47483:1;47480;47473:12;47424:63;47371:122;:::o;47499:116::-;47569:21;47584:5;47569:21;:::i;:::-;47562:5;47559:32;47549:60;;47605:1;47602;47595:12;47549:60;47499:116;:::o;47621:120::-;47693:23;47710:5;47693:23;:::i;:::-;47686:5;47683:34;47673:62;;47731:1;47728;47721:12;47673:62;47621:120;:::o;47747:122::-;47820:24;47838:5;47820:24;:::i;:::-;47813:5;47810:35;47800:63;;47859:1;47856;47849:12;47800:63;47747:122;:::o

Swarm Source

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