Mumbai Testnet

Token

PolyNFT (Poly)
ERC-721

Overview

Max Total Supply

0 Poly

Holders

21

Market

Onchain Market Cap

$0.00

Circulating Supply Market Cap

-
Balance
0 Poly
0x14723a09acff6d2a60dcdf7aa4aff308fddc160c
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information

Contract Source Code Verified (Exact Match)

Contract Name:
IloWhitelistNFT

Compiler Version
v0.8.17+commit.8df45f5f

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at mumbai.polygonscan.com on 2023-03-04
*/

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/math/Math.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/math/Math.sol)

pragma solidity ^0.8.17;

/**
 * @dev Standard math utilities missing in the Solidity language.
 */
library Math {
    enum Rounding {
        Down, // Toward negative infinity
        Up, // Toward infinity
        Zero // Toward zero
    }

    /**
     * @dev Returns the largest of two numbers.
     */
    function max(uint256 a, uint256 b) internal pure returns (uint256) {
        return a > b ? a : b;
    }

    /**
     * @dev Returns the smallest of two numbers.
     */
    function min(uint256 a, uint256 b) internal pure returns (uint256) {
        return a < b ? a : b;
    }

    /**
     * @dev Returns the average of two numbers. The result is rounded towards
     * zero.
     */
    function average(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b) / 2 can overflow.
        return (a & b) + (a ^ b) / 2;
    }

    /**
     * @dev Returns the ceiling of the division of two numbers.
     *
     * This differs from standard division with `/` in that it rounds up instead
     * of rounding down.
     */
    function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) {
        // (a + b - 1) / b can overflow on addition, so we distribute.
        return a == 0 ? 0 : (a - 1) / b + 1;
    }

    /**
     * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0
     * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv)
     * with further edits by Uniswap Labs also under MIT license.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator
    ) internal pure returns (uint256 result) {
        unchecked {
            // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use
            // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256
            // variables such that product = prod1 * 2^256 + prod0.
            uint256 prod0; // Least significant 256 bits of the product
            uint256 prod1; // Most significant 256 bits of the product
            assembly {
                let mm := mulmod(x, y, not(0))
                prod0 := mul(x, y)
                prod1 := sub(sub(mm, prod0), lt(mm, prod0))
            }

            // Handle non-overflow cases, 256 by 256 division.
            if (prod1 == 0) {
                return prod0 / denominator;
            }

            // Make sure the result is less than 2^256. Also prevents denominator == 0.
            require(denominator > prod1);

            ///////////////////////////////////////////////
            // 512 by 256 division.
            ///////////////////////////////////////////////

            // Make division exact by subtracting the remainder from [prod1 prod0].
            uint256 remainder;
            assembly {
                // Compute remainder using mulmod.
                remainder := mulmod(x, y, denominator)

                // Subtract 256 bit number from 512 bit number.
                prod1 := sub(prod1, gt(remainder, prod0))
                prod0 := sub(prod0, remainder)
            }

            // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1.
            // See https://cs.stackexchange.com/q/138556/92363.

            // Does not overflow because the denominator cannot be zero at this stage in the function.
            uint256 twos = denominator & (~denominator + 1);
            assembly {
                // Divide denominator by twos.
                denominator := div(denominator, twos)

                // Divide [prod1 prod0] by twos.
                prod0 := div(prod0, twos)

                // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one.
                twos := add(div(sub(0, twos), twos), 1)
            }

            // Shift in bits from prod1 into prod0.
            prod0 |= prod1 * twos;

            // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such
            // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for
            // four bits. That is, denominator * inv = 1 mod 2^4.
            uint256 inverse = (3 * denominator) ^ 2;

            // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works
            // in modular arithmetic, doubling the correct bits in each step.
            inverse *= 2 - denominator * inverse; // inverse mod 2^8
            inverse *= 2 - denominator * inverse; // inverse mod 2^16
            inverse *= 2 - denominator * inverse; // inverse mod 2^32
            inverse *= 2 - denominator * inverse; // inverse mod 2^64
            inverse *= 2 - denominator * inverse; // inverse mod 2^128
            inverse *= 2 - denominator * inverse; // inverse mod 2^256

            // Because the division is now exact we can divide by multiplying with the modular inverse of denominator.
            // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is
            // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1
            // is no longer required.
            result = prod0 * inverse;
            return result;
        }
    }

    /**
     * @notice Calculates x * y / denominator with full precision, following the selected rounding direction.
     */
    function mulDiv(
        uint256 x,
        uint256 y,
        uint256 denominator,
        Rounding rounding
    ) internal pure returns (uint256) {
        uint256 result = mulDiv(x, y, denominator);
        if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) {
            result += 1;
        }
        return result;
    }

    /**
     * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down.
     *
     * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11).
     */
    function sqrt(uint256 a) internal pure returns (uint256) {
        if (a == 0) {
            return 0;
        }

        // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target.
        //
        // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have
        // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`.
        //
        // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)`
        // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))`
        // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)`
        //
        // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit.
        uint256 result = 1 << (log2(a) >> 1);

        // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128,
        // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at
        // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision
        // into the expected uint128 result.
        unchecked {
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            result = (result + a / result) >> 1;
            return min(result, a / result);
        }
    }

    /**
     * @notice Calculates sqrt(a), following the selected rounding direction.
     */
    function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = sqrt(a);
            return result + (rounding == Rounding.Up && result * result < a ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 2, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 128;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 64;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 32;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 16;
            }
            if (value >> 8 > 0) {
                value >>= 8;
                result += 8;
            }
            if (value >> 4 > 0) {
                value >>= 4;
                result += 4;
            }
            if (value >> 2 > 0) {
                value >>= 2;
                result += 2;
            }
            if (value >> 1 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 2, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log2(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log2(value);
            return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 10, rounded down, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >= 10**64) {
                value /= 10**64;
                result += 64;
            }
            if (value >= 10**32) {
                value /= 10**32;
                result += 32;
            }
            if (value >= 10**16) {
                value /= 10**16;
                result += 16;
            }
            if (value >= 10**8) {
                value /= 10**8;
                result += 8;
            }
            if (value >= 10**4) {
                value /= 10**4;
                result += 4;
            }
            if (value >= 10**2) {
                value /= 10**2;
                result += 2;
            }
            if (value >= 10**1) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log10(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log10(value);
            return result + (rounding == Rounding.Up && 10**result < value ? 1 : 0);
        }
    }

    /**
     * @dev Return the log in base 256, rounded down, of a positive value.
     * Returns 0 if given 0.
     *
     * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string.
     */
    function log256(uint256 value) internal pure returns (uint256) {
        uint256 result = 0;
        unchecked {
            if (value >> 128 > 0) {
                value >>= 128;
                result += 16;
            }
            if (value >> 64 > 0) {
                value >>= 64;
                result += 8;
            }
            if (value >> 32 > 0) {
                value >>= 32;
                result += 4;
            }
            if (value >> 16 > 0) {
                value >>= 16;
                result += 2;
            }
            if (value >> 8 > 0) {
                result += 1;
            }
        }
        return result;
    }

    /**
     * @dev Return the log in base 10, following the selected rounding direction, of a positive value.
     * Returns 0 if given 0.
     */
    function log256(uint256 value, Rounding rounding) internal pure returns (uint256) {
        unchecked {
            uint256 result = log256(value);
            return result + (rounding == Rounding.Up && 1 << (result * 8) < value ? 1 : 0);
        }
    }
}

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


// OpenZeppelin Contracts (last updated v4.8.0) (utils/Strings.sol)

pragma solidity ^0.8.0;


/**
 * @dev String operations.
 */
library Strings {
    bytes16 private constant _SYMBOLS = "0123456789abcdef";
    uint8 private constant _ADDRESS_LENGTH = 20;

    /**
     * @dev Converts a `uint256` to its ASCII `string` decimal representation.
     */
    function toString(uint256 value) internal pure returns (string memory) {
        unchecked {
            uint256 length = Math.log10(value) + 1;
            string memory buffer = new string(length);
            uint256 ptr;
            /// @solidity memory-safe-assembly
            assembly {
                ptr := add(buffer, add(32, length))
            }
            while (true) {
                ptr--;
                /// @solidity memory-safe-assembly
                assembly {
                    mstore8(ptr, byte(mod(value, 10), _SYMBOLS))
                }
                value /= 10;
                if (value == 0) break;
            }
            return buffer;
        }
    }

    /**
     * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.
     */
    function toHexString(uint256 value) internal pure returns (string memory) {
        unchecked {
            return toHexString(value, Math.log256(value) + 1);
        }
    }

    /**
     * @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] = _SYMBOLS[value & 0xf];
            value >>= 4;
        }
        require(value == 0, "Strings: hex length insufficient");
        return string(buffer);
    }

    /**
     * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.
     */
    function toHexString(address addr) internal pure returns (string memory) {
        return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);
    }
}

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


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

pragma solidity ^0.8.17;

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

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

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


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

pragma solidity ^0.8.17;

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

        return account.code.length > 0;
    }

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

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

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

    /**
     * @dev Tool to verify that a low level call to smart-contract was successful, and revert (either by bubbling
     * the revert reason or using the provided one) in case of unsuccessful call or if target was not a contract.
     *
     * _Available since v4.8._
     */
    function verifyCallResultFromTarget(
        address target,
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal view returns (bytes memory) {
        if (success) {
            if (returndata.length == 0) {
                // only check isContract if the call was successful and the return data is empty
                // otherwise we already know that it was a contract
                require(isContract(target), "Address: call to non-contract");
            }
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    /**
     * @dev Tool to verify that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason or using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            _revert(returndata, errorMessage);
        }
    }

    function _revert(bytes memory returndata, string memory errorMessage) private pure {
        // Look for revert reason and bubble it up if present
        if (returndata.length > 0) {
            // The easiest way to bubble the revert reason is using memory via assembly
            /// @solidity memory-safe-assembly
            assembly {
                let returndata_size := mload(returndata)
                revert(add(32, returndata), returndata_size)
            }
        } else {
            revert(errorMessage);
        }
    }
}

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


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/IERC165.sol


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

pragma solidity ^0.8.0;

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

// File: @openzeppelin/contracts/utils/introspection/ERC165.sol


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

pragma solidity ^0.8.0;


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

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


// OpenZeppelin Contracts (last updated v4.8.0) (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;


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

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

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

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`.
     *
     * 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;

    /**
     * @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 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: Note that the caller is responsible to confirm that the recipient is capable of receiving ERC721
     * or else they may be permanently lost. Usage of {safeTransferFrom} prevents loss, though the caller must
     * understand this adds an external call which potentially creates a reentrancy vulnerability.
     *
     * 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 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 the account approved for `tokenId` token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function getApproved(uint256 tokenId) external view returns (address operator);

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

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


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

pragma solidity ^0.8.0;


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

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

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

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


// OpenZeppelin Contracts (last updated v4.8.2) (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;








/**
 * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including
 * the Metadata extension, but not including the Enumerable extension, which is available separately as
 * {ERC721Enumerable}.
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata {
    using Address for address;
    using Strings for uint256;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Mapping from token ID to owner address
    mapping(uint256 => address) private _owners;

    // Mapping owner address to token count
    mapping(address => uint256) private _balances;

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

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

    /**
     * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.
     */
    constructor(string memory name_, string memory symbol_) {
        _name = name_;
        _symbol = symbol_;
    }

    /**
     * @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 ||
            super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {IERC721-balanceOf}.
     */
    function balanceOf(address owner) public view virtual override returns (uint256) {
        require(owner != address(0), "ERC721: address zero is not a valid owner");
        return _balances[owner];
    }

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _ownerOf(tokenId);
        require(owner != address(0), "ERC721: invalid token ID");
        return owner;
    }

    /**
     * @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) {
        _requireMinted(tokenId);

        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 overridden in child contracts.
     */
    function _baseURI() internal view virtual returns (string memory) {
        return "";
    }

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

        require(
            _msgSender() == owner || isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not token owner or approved for all"
        );

        _approve(to, tokenId);
    }

    /**
     * @dev See {IERC721-getApproved}.
     */
    function getApproved(uint256 tokenId) public view virtual override returns (address) {
        _requireMinted(tokenId);

        return _tokenApprovals[tokenId];
    }

    /**
     * @dev See {IERC721-setApprovalForAll}.
     */
    function setApprovalForAll(address operator, bool approved) public virtual override {
        _setApprovalForAll(_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 virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");

        _transfer(from, to, tokenId);
    }

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

    /**
     * @dev See {IERC721-safeTransferFrom}.
     */
    function safeTransferFrom(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) public virtual override {
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _safeTransfer(from, to, tokenId, data);
    }

    /**
     * @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.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

    /**
     * @dev Returns the owner of the `tokenId`. Does NOT revert if token doesn't exist
     */
    function _ownerOf(uint256 tokenId) internal view virtual returns (address) {
        return _owners[tokenId];
    }

    /**
     * @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`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _ownerOf(tokenId) != address(0);
    }

    /**
     * @dev Returns whether `spender` is allowed to manage `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {
        address owner = ERC721.ownerOf(tokenId);
        return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);
    }

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeMint(address to, uint256 tokenId) internal virtual {
        _safeMint(to, tokenId, "");
    }

    /**
     * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is
     * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.
     */
    function _safeMint(
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _mint(to, tokenId);
        require(
            _checkOnERC721Received(address(0), to, tokenId, data),
            "ERC721: transfer to non ERC721Receiver implementer"
        );
    }

    /**
     * @dev Mints `tokenId` and transfers it to `to`.
     *
     * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible
     *
     * Requirements:
     *
     * - `tokenId` must not exist.
     * - `to` cannot be the zero address.
     *
     * Emits a {Transfer} event.
     */
    function _mint(address to, uint256 tokenId) internal virtual {
        require(to != address(0), "ERC721: mint to the zero address");
        require(!_exists(tokenId), "ERC721: token already minted");

        _beforeTokenTransfer(address(0), to, tokenId, 1);

        // Check that tokenId was not minted by `_beforeTokenTransfer` hook
        require(!_exists(tokenId), "ERC721: token already minted");

        unchecked {
            // Will not overflow unless all 2**256 token ids are minted to the same owner.
            // Given that tokens are minted one by one, it is impossible in practice that
            // this ever happens. Might change if we allow batch minting.
            // The ERC fails to describe this case.
            _balances[to] += 1;
        }

        _owners[tokenId] = to;

        emit Transfer(address(0), to, tokenId);

        _afterTokenTransfer(address(0), to, tokenId, 1);
    }

    /**
     * @dev Destroys `tokenId`.
     * The approval is cleared when the token is burned.
     * This is an internal function that does not check if the sender is authorized to operate on the token.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     *
     * Emits a {Transfer} event.
     */
    function _burn(uint256 tokenId) internal virtual {
        address owner = ERC721.ownerOf(tokenId);

        _beforeTokenTransfer(owner, address(0), tokenId, 1);

        // Update ownership in case tokenId was transferred by `_beforeTokenTransfer` hook
        owner = ERC721.ownerOf(tokenId);

        // Clear approvals
        delete _tokenApprovals[tokenId];

        unchecked {
            // Cannot overflow, as that would require more tokens to be burned/transferred
            // out than the owner initially received through minting and transferring in.
            _balances[owner] -= 1;
        }
        delete _owners[tokenId];

        emit Transfer(owner, address(0), tokenId);

        _afterTokenTransfer(owner, address(0), tokenId, 1);
    }

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * 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
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

        // Check that tokenId was not transferred by `_beforeTokenTransfer` hook
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");

        // Clear approvals from the previous owner
        delete _tokenApprovals[tokenId];

        unchecked {
            // `_balances[from]` cannot overflow for the same reason as described in `_burn`:
            // `from`'s balance is the number of token held, which is at least one before the current
            // transfer.
            // `_balances[to]` could overflow in the conditions described in `_mint`. That would require
            // all 2**256 token ids to be minted, which in practice is impossible.
            _balances[from] -= 1;
            _balances[to] += 1;
        }
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);

        _afterTokenTransfer(from, to, tokenId, 1);
    }

    /**
     * @dev Approve `to` to operate on `tokenId`
     *
     * Emits an {Approval} event.
     */
    function _approve(address to, uint256 tokenId) internal virtual {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId);
    }

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

    /**
     * @dev Reverts if the `tokenId` has not been minted yet.
     */
    function _requireMinted(uint256 tokenId) internal view virtual {
        require(_exists(tokenId), "ERC721: invalid token ID");
    }

    /**
     * @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.onERC721Received.selector;
            } catch (bytes memory reason) {
                if (reason.length == 0) {
                    revert("ERC721: transfer to non ERC721Receiver implementer");
                } else {
                    /// @solidity memory-safe-assembly
                    assembly {
                        revert(add(32, reason), mload(reason))
                    }
                }
            }
        } else {
            return true;
        }
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens will be transferred to `to`.
     * - When `from` is zero, the tokens will be minted for `to`.
     * - When `to` is zero, ``from``'s tokens will be burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}

    /**
     * @dev Hook that is called after any token transfer. This includes minting and burning. If {ERC721Consecutive} is
     * used, the hook may be called as part of a consecutive (batch) mint, as indicated by `batchSize` greater than 1.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s tokens were transferred to `to`.
     * - When `from` is zero, the tokens were minted for `to`.
     * - When `to` is zero, ``from``'s tokens were burned.
     * - `from` and `to` are never both zero.
     * - `batchSize` is non-zero.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _afterTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual {}

    /**
     * @dev Unsafe write access to the balances, used by extensions that "mint" tokens using an {ownerOf} override.
     *
     * WARNING: Anyone calling this MUST ensure that the balances remain consistent with the ownership. The invariant
     * being that for any address `a` the value returned by `balanceOf(a)` must be equal to the number of tokens such
     * that `ownerOf(tokenId)` is `a`.
     */
    // solhint-disable-next-line func-name-mixedcase
    function __unsafe_increaseBalance(address account, uint256 amount) internal {
        _balances[account] += amount;
    }
}

// File: contracts/IloWhitelistNFT.sol



pragma solidity 0.8.17;



interface PolyKick {
    function addToWhiteListBulk(address[] memory _allowed) external;
    function addToWhiteList(address _allowed) external;
}

contract IloWhitelistNFT is ERC721 {

    PolyKick public iloContract;
    address public owner;
    
    uint256 public constant NUM_SPECIAL_NFTS = 300;
    uint256 public constant rareNFT = 9;

    uint256 public rareNftsMinted = 0;
    uint256 public specialNftsMinted = 0;
    uint256 public normalNftsMinted = 0;
    uint256 public totalNftsMinted = 0; //total supply
    uint256 public batchSize = 1000;

    struct polyNFT{
        uint256 tokenId;
        uint256 userWhitelistedIlos;
        string typeNFT;
    }

    mapping(address => polyNFT) public details;
    mapping(address => bool) public isAdmin;

    event polyMinted(address To, uint256 TokenID, string typeNFT);
    event whiteListed(address[] Addresses);

/* @dev: Check if Admin */
    modifier onlyAdmin (){
        require(isAdmin[msg.sender] == true, "Not Admin!");
        _;
    }

/* @dev: Check if contract owner */
    modifier onlyOwner (){
        require(msg.sender == owner, "Not Owner!");
        _;
    } 

    constructor(string memory _name, string memory _symbol) ERC721(_name, _symbol) {
        owner = msg.sender;
        isAdmin[owner] = true;
    }
     
    function dummyFunction()external onlyAdmin{
        //dummy data to be removed
        //iloContract = PolyKick(0x1c5acd84D59D42dE4C4D601971C45A2f5BB47BF7);
        mint(0x2b90F2D3cd4580083fA4E3716860A9f1344a2E92);
        mint(0xc2cB8D5d835a1b049F350D6D33613Ef5c73E2144);
        mint(0x558BcF87ccE6A3CE166013F6474D70AdbC3241a1);
        mint(0x19400eB6AD0a521262e95F8D486BfC530CF7A19b);

        //mint(0x2c0a4276AeFf2d20bfE533afb317085f1ED5ec24);
        mint(0x6C1607DbFC68190051157f7D76ECD3fEd9f1CF31);
        mint(0x86a81D15937761D14c18AF300FD964a7C610b368);
        mint(0x5B38Da6a701c568545dCfcB03FcB875f56beddC4);

        mint(0xAb8483F64d9C6d1EcF9b849Ae677dD3315835cb2);
        mint(0x4B20993Bc481177ec7E8f571ceCaE8A9e22C02db);
        mint(0x78731D3Ca6b7E34aC0F824c42a7cC18A495cabaB);
        mint(0x617F2E2fD72FD9D5503197092aC168c91465E7f2);
        mint(0x17F6AD8Ef982297579C203069C1DbfFE4348c372);
        mint(0x5c6B0f7Bf3E7ce046039Bd8FABdfD3f9F5021678);
        mint(0x03C6FcED478cBbC9a4FAB34eF9f40767739D1Ff7);
        mint(0x1aE0EA34a72D944a8C7603FfB3eC30a6669E454C);
        mint(0x0A098Eda01Ce92ff4A4CCb7A4fFFb5A43EBC70DC);
        mint(0xCA35b7d915458EF540aDe6068dFe2F44E8fa733c);
        mint(0x14723A09ACff6D2A60DcdF7aA4AFf308FDDC160C);
        mint(0x4B0897b0513fdC7C541B6d9D7E929C4e5364D2dB);
        mint(0x583031D1113aD414F02576BD6afaBfb302140225);
        mint(0xdD870fA1b7C4700F2BD7f44238821C26f7392148);
        // end of dummy data
    } 
    function setPolyKick(address _polyKick) external onlyAdmin{
        require(_polyKick != address(0x0),"address zero");
        iloContract = PolyKick(_polyKick);
    }
    function addAdmin(address _newAdmin) external onlyOwner{
        isAdmin[_newAdmin] = true;
    }
    function setBatchSize(uint256 _batchSize) external onlyAdmin {
        batchSize = _batchSize;
    }
    function uint2str(uint256 _i) internal pure returns (string memory) {
    if (_i == 0) {
        return "0";
    }
    uint256 j = _i;
    uint256 length;
    while (j != 0) {
        length++;
        j /= 10;
    }
    bytes memory bstr = new bytes(length);
    uint256 k = length;
    while (_i != 0) {
        k = k-1;
        uint8 temp = (48 + uint8(_i - _i / 10 * 10));
        bytes1 b1 = bytes1(temp);
        bstr[k] = b1;
        _i /= 10;
    }
    return string(bstr);
}

    function mintBatch(address[] memory _to) external onlyOwner {
    for (uint256 i = 0; i < _to.length; i++) {
        mint(_to[i]);
        }
    }
    function mint(address _to) public onlyAdmin {
    require(details[_to].userWhitelistedIlos == 0, "already minted for user");

    uint256 tokenId;
    string memory typeNFT;
    tokenId = totalNftsMinted;

    if (specialNftsMinted < NUM_SPECIAL_NFTS &&
        uint256(keccak256(abi.encodePacked(_to, totalNftsMinted))) % (NUM_SPECIAL_NFTS + totalNftsMinted) < NUM_SPECIAL_NFTS - specialNftsMinted) {
        details[_to].tokenId = tokenId;
        details[_to].userWhitelistedIlos = 10;
        specialNftsMinted++;
        typeNFT = string(abi.encodePacked("Special Polykick NFT ", uint2str(specialNftsMinted)));
    } else {
        tokenId = totalNftsMinted;
        details[_to].userWhitelistedIlos = 3;
        normalNftsMinted++;
        typeNFT = string(abi.encodePacked("Normal Polykick NFT", uint2str(normalNftsMinted)));
    }

    totalNftsMinted++;
    details[_to].typeNFT = typeNFT;

    emit polyMinted(_to, tokenId, typeNFT);
    _safeMint(_to, tokenId);
}

    function mintRare(address _to, uint256 _numWhitelistedIlos) external onlyOwner {
        require(rareNftsMinted < rareNFT, "Maximum number of rare NFTs has been reached");
        string memory typeNFT;
        uint256 tokenId = totalNftsMinted;
        typeNFT = string(abi.encodePacked("Rare Polykick NFT", uint2str(tokenId)));
        details[_to].userWhitelistedIlos = _numWhitelistedIlos;
        details[_to].typeNFT = typeNFT;
        rareNftsMinted++;
        totalNftsMinted++;
        emit polyMinted(_to, tokenId, typeNFT);
        _safeMint(_to, tokenId);
    }
    function transfer(address _to, uint256 _tokenId) external {
        require(_isApprovedOrOwner(_msgSender(), _tokenId), "ERC721: transfer caller is not owner nor approved");
        _transfer(_msgSender(), _to, _tokenId);
        details[_to].userWhitelistedIlos = details[msg.sender].userWhitelistedIlos;
        details[_to].typeNFT = details[msg.sender].typeNFT;
        details[_to].tokenId = _tokenId;

        delete details[msg.sender];
    }

    function canParticipate(address _user, uint256 _numWhitelistedIlos) external view returns (bool) {
        return details[_user].userWhitelistedIlos >= _numWhitelistedIlos;
    }
    
    function addToWhiteListNFT(address _allowed) external onlyAdmin{
        require(totalNftsMinted > 0, "No NFTs have been minted");
        require(details[_allowed].userWhitelistedIlos > 0, "not allowed");
        iloContract.addToWhiteList(_allowed);
    }

    function addToWhiteListBulkFromNFT() external {
    require(totalNftsMinted > 0, "No NFTs have been minted");

    uint256 numBatches = (totalNftsMinted + batchSize - 1) / batchSize;

    for (uint256 batchIndex = 0; batchIndex < numBatches; batchIndex++) {
        uint256 startIndex = batchIndex * batchSize;
        uint256 endIndex = startIndex + batchSize;

        if (endIndex > totalNftsMinted) {
            endIndex = totalNftsMinted;
        }

        address[] memory usersToAddToWhiteList = new address[](endIndex - startIndex);
        uint256 numUsersToAddToWhiteList = 0;

        for (uint256 i = startIndex; i < endIndex; i++) {
            address user = ownerOf(i);
            if (details[user].userWhitelistedIlos > 0) {
                usersToAddToWhiteList[numUsersToAddToWhiteList++] = user;
                details[user].userWhitelistedIlos--;
            }
        }
        emit whiteListed(usersToAddToWhiteList);
        iloContract.addToWhiteListBulk(usersToAddToWhiteList);
    }
}



    


}

               /*********************************************************
                  Proudly Developed by MetaIdentity ltd. Copyright 2023
               **********************************************************/

Contract ABI

[{"inputs":[{"internalType":"string","name":"_name","type":"string"},{"internalType":"string","name":"_symbol","type":"string"}],"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":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"To","type":"address"},{"indexed":false,"internalType":"uint256","name":"TokenID","type":"uint256"},{"indexed":false,"internalType":"string","name":"typeNFT","type":"string"}],"name":"polyMinted","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address[]","name":"Addresses","type":"address[]"}],"name":"whiteListed","type":"event"},{"inputs":[],"name":"NUM_SPECIAL_NFTS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_newAdmin","type":"address"}],"name":"addAdmin","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"addToWhiteListBulkFromNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_allowed","type":"address"}],"name":"addToWhiteListNFT","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"batchSize","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_user","type":"address"},{"internalType":"uint256","name":"_numWhitelistedIlos","type":"uint256"}],"name":"canParticipate","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"details","outputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"userWhitelistedIlos","type":"uint256"},{"internalType":"string","name":"typeNFT","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"dummyFunction","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"iloContract","outputs":[{"internalType":"contract PolyKick","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"isAdmin","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":[{"internalType":"address","name":"_to","type":"address"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address[]","name":"_to","type":"address[]"}],"name":"mintBatch","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_numWhitelistedIlos","type":"uint256"}],"name":"mintRare","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"normalNftsMinted","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":"rareNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"rareNftsMinted","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":"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":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_batchSize","type":"uint256"}],"name":"setBatchSize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_polyKick","type":"address"}],"name":"setPolyKick","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"specialNftsMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalNftsMinted","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_tokenId","type":"uint256"}],"name":"transfer","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":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

6080604052600060085560006009556000600a556000600b556103e8600c553480156200002b57600080fd5b5060405162005417380380620054178339818101604052810190620000519190620002cf565b818181600090816200006491906200059f565b5080600190816200007691906200059f565b50505033600760006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506001600e6000600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550505062000686565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620001a5826200015a565b810181811067ffffffffffffffff82111715620001c757620001c66200016b565b5b80604052505050565b6000620001dc6200013c565b9050620001ea82826200019a565b919050565b600067ffffffffffffffff8211156200020d576200020c6200016b565b5b62000218826200015a565b9050602081019050919050565b60005b838110156200024557808201518184015260208101905062000228565b60008484015250505050565b6000620002686200026284620001ef565b620001d0565b90508281526020810184848401111562000287576200028662000155565b5b6200029484828562000225565b509392505050565b600082601f830112620002b457620002b362000150565b5b8151620002c684826020860162000251565b91505092915050565b60008060408385031215620002e957620002e862000146565b5b600083015167ffffffffffffffff8111156200030a57620003096200014b565b5b62000318858286016200029c565b925050602083015167ffffffffffffffff8111156200033c576200033b6200014b565b5b6200034a858286016200029c565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620003a757607f821691505b602082108103620003bd57620003bc6200035f565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302620004277fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620003e8565b620004338683620003e8565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b6000620004806200047a62000474846200044b565b62000455565b6200044b565b9050919050565b6000819050919050565b6200049c836200045f565b620004b4620004ab8262000487565b848454620003f5565b825550505050565b600090565b620004cb620004bc565b620004d881848462000491565b505050565b5b818110156200050057620004f4600082620004c1565b600181019050620004de565b5050565b601f8211156200054f576200051981620003c3565b6200052484620003d8565b8101602085101562000534578190505b6200054c6200054385620003d8565b830182620004dd565b50505b505050565b600082821c905092915050565b6000620005746000198460080262000554565b1980831691505092915050565b60006200058f838362000561565b9150826002028217905092915050565b620005aa8262000354565b67ffffffffffffffff811115620005c657620005c56200016b565b5b620005d282546200038e565b620005df82828562000504565b600060209050601f83116001811462000617576000841562000602578287015190505b6200060e858262000581565b8655506200067e565b601f1984166200062786620003c3565b60005b8281101562000651578489015182556001820191506020850194506020810190506200062a565b868310156200067157848901516200066d601f89168262000561565b8355505b6001600288020188555050505b505050505050565b614d8180620006966000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80636a62784211610125578063a22cb465116100ad578063c6545c111161007c578063c6545c11146105ee578063c87b56dd1461060a578063dfa9b6681461063a578063e985e9c514610644578063f4daaba11461067457610211565b8063a22cb4651461057e578063a9059cbb1461059a578063b06ef135146105b6578063b88d4fde146105d257610211565b806372fbaacb116100f457806372fbaacb146104fe5780637ec9d81f1461051c5780638da5cb5b14610526578063927f59ba1461054457806395d89b411461056057610211565b80636a627842146104785780636ad4da5c1461049457806370480275146104b257806370a08231146104ce57610211565b806324d7806c116101a857806342842e0e1161017757806342842e0e146103d457806351434363146103f0578063576f35e31461040e5780636352211e1461042a57806363f61f1a1461045a57610211565b806324d7806c1461034c5780632ab6861f1461037c5780632c6a495f1461039a578063327d664d146103b657610211565b806308232ae1116101e457806308232ae1146102c4578063095ea7b3146102e257806323b872dd146102fe57806324a92f9f1461031a57610211565b806301ffc9a71461021657806305a30fee1461024657806306fdde0314610276578063081812fc14610294575b600080fd5b610230600480360381019061022b9190613267565b610692565b60405161023d91906132af565b60405180910390f35b610260600480360381019061025b919061335e565b610774565b60405161026d91906132af565b60405180910390f35b61027e6107c4565b60405161028b919061342e565b60405180910390f35b6102ae60048036038101906102a99190613450565b610856565b6040516102bb919061348c565b60405180910390f35b6102cc61089c565b6040516102d991906134b6565b60405180910390f35b6102fc60048036038101906102f7919061335e565b6108a2565b005b610318600480360381019061031391906134d1565b6109b9565b005b610334600480360381019061032f9190613524565b610a19565b60405161034393929190613551565b60405180910390f35b61036660048036038101906103619190613524565b610acb565b60405161037391906132af565b60405180910390f35b610384610aeb565b60405161039191906134b6565b60405180910390f35b6103b460048036038101906103af9190613524565b610af0565b005b6103be610c36565b6040516103cb91906134b6565b60405180910390f35b6103ee60048036038101906103e991906134d1565b610c3c565b005b6103f8610c5c565b60405161040591906134b6565b60405180910390f35b61042860048036038101906104239190613450565b610c62565b005b610444600480360381019061043f9190613450565b610cff565b604051610451919061348c565b60405180910390f35b610462610d85565b60405161046f91906135ee565b60405180910390f35b610492600480360381019061048d9190613524565b610dab565b005b61049c611155565b6040516104a991906134b6565b60405180910390f35b6104cc60048036038101906104c79190613524565b61115b565b005b6104e860048036038101906104e39190613524565b611246565b6040516104f591906134b6565b60405180910390f35b6105066112fd565b60405161051391906134b6565b60405180910390f35b610524611303565b005b61052e6115f9565b60405161053b919061348c565b60405180910390f35b61055e60048036038101906105599190613751565b61161f565b005b6105686116f5565b604051610575919061342e565b60405180910390f35b610598600480360381019061059391906137c6565b611787565b005b6105b460048036038101906105af919061335e565b61179d565b005b6105d060048036038101906105cb919061335e565b6119c6565b005b6105ec60048036038101906105e791906138bb565b611be0565b005b61060860048036038101906106039190613524565b611c42565b005b610624600480360381019061061f9190613450565b611e2f565b604051610631919061342e565b60405180910390f35b610642611e97565b005b61065e6004803603810190610659919061393e565b6121ae565b60405161066b91906132af565b60405180910390f35b61067c612242565b60405161068991906134b6565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061075d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061076d575061076c82612248565b5b9050919050565b600081600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541015905092915050565b6060600080546107d3906139ad565b80601f01602080910402602001604051908101604052809291908181526020018280546107ff906139ad565b801561084c5780601f106108215761010080835404028352916020019161084c565b820191906000526020600020905b81548152906001019060200180831161082f57829003601f168201915b5050505050905090565b6000610861826122b2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600a5481565b60006108ad82610cff565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490613a50565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661093c6122fd565b73ffffffffffffffffffffffffffffffffffffffff16148061096b575061096a816109656122fd565b6121ae565b5b6109aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a190613ae2565b60405180910390fd5b6109b48383612305565b505050565b6109ca6109c46122fd565b826123be565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0090613b74565b60405180910390fd5b610a14838383612453565b505050565b600d602052806000526040600020600091509050806000015490806001015490806002018054610a48906139ad565b80601f0160208091040260200160405190810160405280929190818152602001828054610a74906139ad565b8015610ac15780601f10610a9657610100808354040283529160200191610ac1565b820191906000526020600020905b815481529060010190602001808311610aa457829003601f168201915b5050505050905083565b600e6020528060005260406000206000915054906101000a900460ff1681565b600981565b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90613be0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990613c4c565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61012c81565b610c5783838360405180602001604052806000815250611be0565b505050565b60085481565b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cec90613be0565b60405180910390fd5b80600c8190555050565b600080610d0b8361274c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7390613cb8565b60405180910390fd5b80915050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3590613be0565b60405180910390fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015414610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba90613d24565b60405180910390fd5b60006060600b54915061012c600954108015610f34575060095461012c610eea9190613d73565b600b5461012c610efa9190613da7565b84600b54604051602001610f0f929190613e44565b6040516020818303038152906040528051906020012060001c610f329190613e9f565b105b156110115781600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600a600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555060096000815480929190610fdb90613ed0565b9190505550610feb600954612789565b604051602001610ffb9190613fa0565b60405160208183030381529060405290506110a3565b600b5491506003600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550600a600081548092919061107190613ed0565b9190505550611081600a54612789565b604051602001611091919061400e565b60405160208183030381529060405290505b600b60008154809291906110b690613ed0565b919050555080600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201908161110a91906141d2565b507f7d4d8b1e4d4f2df8721ceef7a87626042658ed1e7066adb2861781425780db7183838360405161113e939291906142a4565b60405180910390a16111508383612911565b505050565b60095481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e29061432e565b60405180910390fd5b6001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad906143c0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b5481565b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138d90613be0565b60405180910390fd5b6113b3732b90f2d3cd4580083fa4e3716860a9f1344a2e92610dab565b6113d073c2cb8d5d835a1b049f350d6d33613ef5c73e2144610dab565b6113ed73558bcf87cce6a3ce166013f6474d70adbc3241a1610dab565b61140a7319400eb6ad0a521262e95f8d486bfc530cf7a19b610dab565b611427736c1607dbfc68190051157f7d76ecd3fed9f1cf31610dab565b6114447386a81d15937761d14c18af300fd964a7c610b368610dab565b611461735b38da6a701c568545dcfcb03fcb875f56beddc4610dab565b61147e73ab8483f64d9c6d1ecf9b849ae677dd3315835cb2610dab565b61149b734b20993bc481177ec7e8f571cecae8a9e22c02db610dab565b6114b87378731d3ca6b7e34ac0f824c42a7cc18a495cabab610dab565b6114d573617f2e2fd72fd9d5503197092ac168c91465e7f2610dab565b6114f27317f6ad8ef982297579c203069c1dbffe4348c372610dab565b61150f735c6b0f7bf3e7ce046039bd8fabdfd3f9f5021678610dab565b61152c7303c6fced478cbbc9a4fab34ef9f40767739d1ff7610dab565b611549731ae0ea34a72d944a8c7603ffb3ec30a6669e454c610dab565b611566730a098eda01ce92ff4a4ccb7a4fffb5a43ebc70dc610dab565b61158373ca35b7d915458ef540ade6068dfe2f44e8fa733c610dab565b6115a07314723a09acff6d2a60dcdf7aa4aff308fddc160c610dab565b6115bd734b0897b0513fdc7c541b6d9d7e929c4e5364d2db610dab565b6115da73583031d1113ad414f02576bd6afabfb302140225610dab565b6115f773dd870fa1b7c4700f2bd7f44238821c26f7392148610dab565b565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a69061432e565b60405180910390fd5b60005b81518110156116f1576116de8282815181106116d1576116d06143e0565b5b6020026020010151610dab565b80806116e990613ed0565b9150506116b2565b5050565b606060018054611704906139ad565b80601f0160208091040260200160405190810160405280929190818152602001828054611730906139ad565b801561177d5780601f106117525761010080835404028352916020019161177d565b820191906000526020600020905b81548152906001019060200180831161176057829003601f168201915b5050505050905090565b6117996117926122fd565b838361292f565b5050565b6117ae6117a86122fd565b826123be565b6117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e490614481565b60405180910390fd5b6117ff6117f86122fd565b8383612453565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201908161191891906144cc565b5080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160006119c0919061319e565b50505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d9061432e565b60405180910390fd5b600960085410611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9290614626565b60405180910390fd5b60606000600b549050611aad81612789565b604051602001611abd9190614692565b604051602081830303815290604052915082600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002019081611b6491906141d2565b5060086000815480929190611b7890613ed0565b9190505550600b6000815480929190611b9090613ed0565b91905055507f7d4d8b1e4d4f2df8721ceef7a87626042658ed1e7066adb2861781425780db71848284604051611bc8939291906142a4565b60405180910390a1611bda8482612911565b50505050565b611bf1611beb6122fd565b836123be565b611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2790613b74565b60405180910390fd5b611c3c84848484612a9b565b50505050565b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90613be0565b60405180910390fd5b6000600b5411611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1190614700565b60405180910390fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015411611d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d969061476c565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166347ee0394826040518263ffffffff1660e01b8152600401611dfa919061348c565b600060405180830381600087803b158015611e1457600080fd5b505af1158015611e28573d6000803e3d6000fd5b5050505050565b6060611e3a826122b2565b6000611e44612af7565b90506000815111611e645760405180602001604052806000815250611e8f565b80611e6e84612b0e565b604051602001611e7f92919061478c565b6040516020818303038152906040525b915050919050565b6000600b5411611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed390614700565b60405180910390fd5b6000600c546001600c54600b54611ef39190613da7565b611efd9190613d73565b611f0791906147b0565b905060005b818110156121aa576000600c5482611f2491906147e1565b90506000600c5482611f369190613da7565b9050600b54811115611f4857600b5490505b60008282611f569190613d73565b67ffffffffffffffff811115611f6f57611f6e61360e565b5b604051908082528060200260200182016040528015611f9d5781602001602082028036833780820191505090505b5090506000808490505b838110156120ce576000611fba82610cff565b90506000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015411156120ba578084848061201490613ed0565b955081518110612027576120266143e0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008154809291906120b490614823565b91905055505b5080806120c690613ed0565b915050611fa7565b507fbec2bc5e24d75dfbc742efe8195d17bb3387c3c84bd290dda8c4de02b5215af0826040516120fe919061490a565b60405180910390a1600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d994c257836040518263ffffffff1660e01b8152600401612161919061490a565b600060405180830381600087803b15801561217b57600080fd5b505af115801561218f573d6000803e3d6000fd5b505050505050505080806121a290613ed0565b915050611f0c565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122bb81612bdc565b6122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190613cb8565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661237883610cff565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806123ca83610cff565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061240c575061240b81856121ae565b5b8061244a57508373ffffffffffffffffffffffffffffffffffffffff1661243284610856565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661247382610cff565b73ffffffffffffffffffffffffffffffffffffffff16146124c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c09061499e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252f90614a30565b60405180910390fd5b6125458383836001612c1d565b8273ffffffffffffffffffffffffffffffffffffffff1661256582610cff565b73ffffffffffffffffffffffffffffffffffffffff16146125bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b29061499e565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127478383836001612c23565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6060600082036127d0576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061290c565b600082905060005b600082146128025780806127eb90613ed0565b915050600a826127fb91906147b0565b91506127d8565b60008167ffffffffffffffff81111561281e5761281d61360e565b5b6040519080825280601f01601f1916602001820160405280156128505781602001600182028036833780820191505090505b50905060008290505b600086146129045760018161286e9190613d73565b90506000600a808861288091906147b0565b61288a91906147e1565b876128959190613d73565b60306128a19190614a5d565b905060008160f81b9050808484815181106128bf576128be6143e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886128fb91906147b0565b97505050612859565b819450505050505b919050565b61292b828260405180602001604052806000815250612c29565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361299d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299490614ade565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a8e91906132af565b60405180910390a3505050565b612aa6848484612453565b612ab284848484612c84565b612af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae890614b70565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b606060006001612b1d84612e0b565b01905060008167ffffffffffffffff811115612b3c57612b3b61360e565b5b6040519080825280601f01601f191660200182016040528015612b6e5781602001600182028036833780820191505090505b509050600082602001820190505b600115612bd1578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612bc557612bc4613e70565b5b04945060008503612b7c575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612bfe8361274c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b612c338383612f5e565b612c406000848484612c84565b612c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7690614b70565b60405180910390fd5b505050565b6000612ca58473ffffffffffffffffffffffffffffffffffffffff1661317b565b15612dfe578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cce6122fd565b8786866040518563ffffffff1660e01b8152600401612cf09493929190614be5565b6020604051808303816000875af1925050508015612d2c57506040513d601f19601f82011682018060405250810190612d299190614c46565b60015b612dae573d8060008114612d5c576040519150601f19603f3d011682016040523d82523d6000602084013e612d61565b606091505b506000815103612da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9d90614b70565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e03565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612e69577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612e5f57612e5e613e70565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ea6576d04ee2d6d415b85acef81000000008381612e9c57612e9b613e70565b5b0492506020810190505b662386f26fc100008310612ed557662386f26fc100008381612ecb57612eca613e70565b5b0492506010810190505b6305f5e1008310612efe576305f5e1008381612ef457612ef3613e70565b5b0492506008810190505b6127108310612f23576127108381612f1957612f18613e70565b5b0492506004810190505b60648310612f465760648381612f3c57612f3b613e70565b5b0492506002810190505b600a8310612f55576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc490614cbf565b60405180910390fd5b612fd681612bdc565b15613016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300d90614d2b565b60405180910390fd5b613024600083836001612c1d565b61302d81612bdc565b1561306d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306490614d2b565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613177600083836001612c23565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5080546131aa906139ad565b6000825580601f106131bc57506131db565b601f0160209004906000526020600020908101906131da91906131de565b5b50565b5b808211156131f75760008160009055506001016131df565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132448161320f565b811461324f57600080fd5b50565b6000813590506132618161323b565b92915050565b60006020828403121561327d5761327c613205565b5b600061328b84828501613252565b91505092915050565b60008115159050919050565b6132a981613294565b82525050565b60006020820190506132c460008301846132a0565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132f5826132ca565b9050919050565b613305816132ea565b811461331057600080fd5b50565b600081359050613322816132fc565b92915050565b6000819050919050565b61333b81613328565b811461334657600080fd5b50565b60008135905061335881613332565b92915050565b6000806040838503121561337557613374613205565b5b600061338385828601613313565b925050602061339485828601613349565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133d85780820151818401526020810190506133bd565b60008484015250505050565b6000601f19601f8301169050919050565b60006134008261339e565b61340a81856133a9565b935061341a8185602086016133ba565b613423816133e4565b840191505092915050565b6000602082019050818103600083015261344881846133f5565b905092915050565b60006020828403121561346657613465613205565b5b600061347484828501613349565b91505092915050565b613486816132ea565b82525050565b60006020820190506134a1600083018461347d565b92915050565b6134b081613328565b82525050565b60006020820190506134cb60008301846134a7565b92915050565b6000806000606084860312156134ea576134e9613205565b5b60006134f886828701613313565b935050602061350986828701613313565b925050604061351a86828701613349565b9150509250925092565b60006020828403121561353a57613539613205565b5b600061354884828501613313565b91505092915050565b600060608201905061356660008301866134a7565b61357360208301856134a7565b818103604083015261358581846133f5565b9050949350505050565b6000819050919050565b60006135b46135af6135aa846132ca565b61358f565b6132ca565b9050919050565b60006135c682613599565b9050919050565b60006135d8826135bb565b9050919050565b6135e8816135cd565b82525050565b600060208201905061360360008301846135df565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613646826133e4565b810181811067ffffffffffffffff821117156136655761366461360e565b5b80604052505050565b60006136786131fb565b9050613684828261363d565b919050565b600067ffffffffffffffff8211156136a4576136a361360e565b5b602082029050602081019050919050565b600080fd5b60006136cd6136c884613689565b61366e565b905080838252602082019050602084028301858111156136f0576136ef6136b5565b5b835b8181101561371957806137058882613313565b8452602084019350506020810190506136f2565b5050509392505050565b600082601f83011261373857613737613609565b5b81356137488482602086016136ba565b91505092915050565b60006020828403121561376757613766613205565b5b600082013567ffffffffffffffff8111156137855761378461320a565b5b61379184828501613723565b91505092915050565b6137a381613294565b81146137ae57600080fd5b50565b6000813590506137c08161379a565b92915050565b600080604083850312156137dd576137dc613205565b5b60006137eb85828601613313565b92505060206137fc858286016137b1565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156138265761382561360e565b5b61382f826133e4565b9050602081019050919050565b82818337600083830152505050565b600061385e6138598461380b565b61366e565b90508281526020810184848401111561387a57613879613806565b5b61388584828561383c565b509392505050565b600082601f8301126138a2576138a1613609565b5b81356138b284826020860161384b565b91505092915050565b600080600080608085870312156138d5576138d4613205565b5b60006138e387828801613313565b94505060206138f487828801613313565b935050604061390587828801613349565b925050606085013567ffffffffffffffff8111156139265761392561320a565b5b6139328782880161388d565b91505092959194509250565b6000806040838503121561395557613954613205565b5b600061396385828601613313565b925050602061397485828601613313565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139c557607f821691505b6020821081036139d8576139d761397e565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a3a6021836133a9565b9150613a45826139de565b604082019050919050565b60006020820190508181036000830152613a6981613a2d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613acc603d836133a9565b9150613ad782613a70565b604082019050919050565b60006020820190508181036000830152613afb81613abf565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613b5e602d836133a9565b9150613b6982613b02565b604082019050919050565b60006020820190508181036000830152613b8d81613b51565b9050919050565b7f4e6f742041646d696e2100000000000000000000000000000000000000000000600082015250565b6000613bca600a836133a9565b9150613bd582613b94565b602082019050919050565b60006020820190508181036000830152613bf981613bbd565b9050919050565b7f61646472657373207a65726f0000000000000000000000000000000000000000600082015250565b6000613c36600c836133a9565b9150613c4182613c00565b602082019050919050565b60006020820190508181036000830152613c6581613c29565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ca26018836133a9565b9150613cad82613c6c565b602082019050919050565b60006020820190508181036000830152613cd181613c95565b9050919050565b7f616c7265616479206d696e74656420666f722075736572000000000000000000600082015250565b6000613d0e6017836133a9565b9150613d1982613cd8565b602082019050919050565b60006020820190508181036000830152613d3d81613d01565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d7e82613328565b9150613d8983613328565b9250828203905081811115613da157613da0613d44565b5b92915050565b6000613db282613328565b9150613dbd83613328565b9250828201905080821115613dd557613dd4613d44565b5b92915050565b60008160601b9050919050565b6000613df382613ddb565b9050919050565b6000613e0582613de8565b9050919050565b613e1d613e18826132ea565b613dfa565b82525050565b6000819050919050565b613e3e613e3982613328565b613e23565b82525050565b6000613e508285613e0c565b601482019150613e608284613e2d565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613eaa82613328565b9150613eb583613328565b925082613ec557613ec4613e70565b5b828206905092915050565b6000613edb82613328565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f0d57613f0c613d44565b5b600182019050919050565b600081905092915050565b7f5370656369616c20506f6c796b69636b204e4654200000000000000000000000600082015250565b6000613f59601583613f18565b9150613f6482613f23565b601582019050919050565b6000613f7a8261339e565b613f848185613f18565b9350613f948185602086016133ba565b80840191505092915050565b6000613fab82613f4c565b9150613fb78284613f6f565b915081905092915050565b7f4e6f726d616c20506f6c796b69636b204e465400000000000000000000000000600082015250565b6000613ff8601383613f18565b915061400382613fc2565b601382019050919050565b600061401982613feb565b91506140258284613f6f565b915081905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614055565b61409c8683614055565b95508019841693508086168417925050509392505050565b60006140cf6140ca6140c584613328565b61358f565b613328565b9050919050565b6000819050919050565b6140e9836140b4565b6140fd6140f5826140d6565b848454614062565b825550505050565b600090565b614112614105565b61411d8184846140e0565b505050565b5b818110156141415761413660008261410a565b600181019050614123565b5050565b601f8211156141865761415781614030565b61416084614045565b8101602085101561416f578190505b61418361417b85614045565b830182614122565b50505b505050565b600082821c905092915050565b60006141a96000198460080261418b565b1980831691505092915050565b60006141c28383614198565b9150826002028217905092915050565b6141db8261339e565b67ffffffffffffffff8111156141f4576141f361360e565b5b6141fe82546139ad565b614209828285614145565b600060209050601f83116001811461423c576000841561422a578287015190505b61423485826141b6565b86555061429c565b601f19841661424a86614030565b60005b828110156142725784890151825560018201915060208501945060208101905061424d565b8683101561428f578489015161428b601f891682614198565b8355505b6001600288020188555050505b505050505050565b60006060820190506142b9600083018661347d565b6142c660208301856134a7565b81810360408301526142d881846133f5565b9050949350505050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b6000614318600a836133a9565b9150614323826142e2565b602082019050919050565b600060208201905081810360008301526143478161430b565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006143aa6029836133a9565b91506143b58261434e565b604082019050919050565b600060208201905081810360008301526143d98161439d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061446b6031836133a9565b91506144768261440f565b604082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b6000815490506144b0816139ad565b9050919050565b60008190508160005260206000209050919050565b8181036144da5750506145b2565b6144e3826144a1565b67ffffffffffffffff8111156144fc576144fb61360e565b5b61450682546139ad565b614511828285614145565b6000601f831160018114614540576000841561452e578287015490505b61453885826141b6565b8655506145ab565b601f19841661454e876144b7565b965061455986614030565b60005b828110156145815784890154825560018201915060018501945060208101905061455c565b8683101561459e578489015461459a601f891682614198565b8355505b6001600288020188555050505b5050505050505b565b7f4d6178696d756d206e756d626572206f662072617265204e465473206861732060008201527f6265656e20726561636865640000000000000000000000000000000000000000602082015250565b6000614610602c836133a9565b915061461b826145b4565b604082019050919050565b6000602082019050818103600083015261463f81614603565b9050919050565b7f5261726520506f6c796b69636b204e4654000000000000000000000000000000600082015250565b600061467c601183613f18565b915061468782614646565b601182019050919050565b600061469d8261466f565b91506146a98284613f6f565b915081905092915050565b7f4e6f204e4654732068617665206265656e206d696e7465640000000000000000600082015250565b60006146ea6018836133a9565b91506146f5826146b4565b602082019050919050565b60006020820190508181036000830152614719816146dd565b9050919050565b7f6e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b6000614756600b836133a9565b915061476182614720565b602082019050919050565b6000602082019050818103600083015261478581614749565b9050919050565b60006147988285613f6f565b91506147a48284613f6f565b91508190509392505050565b60006147bb82613328565b91506147c683613328565b9250826147d6576147d5613e70565b5b828204905092915050565b60006147ec82613328565b91506147f783613328565b925082820261480581613328565b9150828204841483151761481c5761481b613d44565b5b5092915050565b600061482e82613328565b91506000820361484157614840613d44565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614881816132ea565b82525050565b60006148938383614878565b60208301905092915050565b6000602082019050919050565b60006148b78261484c565b6148c18185614857565b93506148cc83614868565b8060005b838110156148fd5781516148e48882614887565b97506148ef8361489f565b9250506001810190506148d0565b5085935050505092915050565b6000602082019050818103600083015261492481846148ac565b905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006149886025836133a9565b91506149938261492c565b604082019050919050565b600060208201905081810360008301526149b78161497b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a1a6024836133a9565b9150614a25826149be565b604082019050919050565b60006020820190508181036000830152614a4981614a0d565b9050919050565b600060ff82169050919050565b6000614a6882614a50565b9150614a7383614a50565b9250828201905060ff811115614a8c57614a8b613d44565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614ac86019836133a9565b9150614ad382614a92565b602082019050919050565b60006020820190508181036000830152614af781614abb565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614b5a6032836133a9565b9150614b6582614afe565b604082019050919050565b60006020820190508181036000830152614b8981614b4d565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614bb782614b90565b614bc18185614b9b565b9350614bd18185602086016133ba565b614bda816133e4565b840191505092915050565b6000608082019050614bfa600083018761347d565b614c07602083018661347d565b614c1460408301856134a7565b8181036060830152614c268184614bac565b905095945050505050565b600081519050614c408161323b565b92915050565b600060208284031215614c5c57614c5b613205565b5b6000614c6a84828501614c31565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ca96020836133a9565b9150614cb482614c73565b602082019050919050565b60006020820190508181036000830152614cd881614c9c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614d15601c836133a9565b9150614d2082614cdf565b602082019050919050565b60006020820190508181036000830152614d4481614d08565b905091905056fea2646970667358221220c7d4030899d0b94819aa82ba7e9021c3c5d6c00fefbb6e175057162042130cd764736f6c63430008110033000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000007506f6c794e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004506f6c7900000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106102115760003560e01c80636a62784211610125578063a22cb465116100ad578063c6545c111161007c578063c6545c11146105ee578063c87b56dd1461060a578063dfa9b6681461063a578063e985e9c514610644578063f4daaba11461067457610211565b8063a22cb4651461057e578063a9059cbb1461059a578063b06ef135146105b6578063b88d4fde146105d257610211565b806372fbaacb116100f457806372fbaacb146104fe5780637ec9d81f1461051c5780638da5cb5b14610526578063927f59ba1461054457806395d89b411461056057610211565b80636a627842146104785780636ad4da5c1461049457806370480275146104b257806370a08231146104ce57610211565b806324d7806c116101a857806342842e0e1161017757806342842e0e146103d457806351434363146103f0578063576f35e31461040e5780636352211e1461042a57806363f61f1a1461045a57610211565b806324d7806c1461034c5780632ab6861f1461037c5780632c6a495f1461039a578063327d664d146103b657610211565b806308232ae1116101e457806308232ae1146102c4578063095ea7b3146102e257806323b872dd146102fe57806324a92f9f1461031a57610211565b806301ffc9a71461021657806305a30fee1461024657806306fdde0314610276578063081812fc14610294575b600080fd5b610230600480360381019061022b9190613267565b610692565b60405161023d91906132af565b60405180910390f35b610260600480360381019061025b919061335e565b610774565b60405161026d91906132af565b60405180910390f35b61027e6107c4565b60405161028b919061342e565b60405180910390f35b6102ae60048036038101906102a99190613450565b610856565b6040516102bb919061348c565b60405180910390f35b6102cc61089c565b6040516102d991906134b6565b60405180910390f35b6102fc60048036038101906102f7919061335e565b6108a2565b005b610318600480360381019061031391906134d1565b6109b9565b005b610334600480360381019061032f9190613524565b610a19565b60405161034393929190613551565b60405180910390f35b61036660048036038101906103619190613524565b610acb565b60405161037391906132af565b60405180910390f35b610384610aeb565b60405161039191906134b6565b60405180910390f35b6103b460048036038101906103af9190613524565b610af0565b005b6103be610c36565b6040516103cb91906134b6565b60405180910390f35b6103ee60048036038101906103e991906134d1565b610c3c565b005b6103f8610c5c565b60405161040591906134b6565b60405180910390f35b61042860048036038101906104239190613450565b610c62565b005b610444600480360381019061043f9190613450565b610cff565b604051610451919061348c565b60405180910390f35b610462610d85565b60405161046f91906135ee565b60405180910390f35b610492600480360381019061048d9190613524565b610dab565b005b61049c611155565b6040516104a991906134b6565b60405180910390f35b6104cc60048036038101906104c79190613524565b61115b565b005b6104e860048036038101906104e39190613524565b611246565b6040516104f591906134b6565b60405180910390f35b6105066112fd565b60405161051391906134b6565b60405180910390f35b610524611303565b005b61052e6115f9565b60405161053b919061348c565b60405180910390f35b61055e60048036038101906105599190613751565b61161f565b005b6105686116f5565b604051610575919061342e565b60405180910390f35b610598600480360381019061059391906137c6565b611787565b005b6105b460048036038101906105af919061335e565b61179d565b005b6105d060048036038101906105cb919061335e565b6119c6565b005b6105ec60048036038101906105e791906138bb565b611be0565b005b61060860048036038101906106039190613524565b611c42565b005b610624600480360381019061061f9190613450565b611e2f565b604051610631919061342e565b60405180910390f35b610642611e97565b005b61065e6004803603810190610659919061393e565b6121ae565b60405161066b91906132af565b60405180910390f35b61067c612242565b60405161068991906134b6565b60405180910390f35b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061075d57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b8061076d575061076c82612248565b5b9050919050565b600081600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600101541015905092915050565b6060600080546107d3906139ad565b80601f01602080910402602001604051908101604052809291908181526020018280546107ff906139ad565b801561084c5780601f106108215761010080835404028352916020019161084c565b820191906000526020600020905b81548152906001019060200180831161082f57829003601f168201915b5050505050905090565b6000610861826122b2565b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b600a5481565b60006108ad82610cff565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361091d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161091490613a50565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661093c6122fd565b73ffffffffffffffffffffffffffffffffffffffff16148061096b575061096a816109656122fd565b6121ae565b5b6109aa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109a190613ae2565b60405180910390fd5b6109b48383612305565b505050565b6109ca6109c46122fd565b826123be565b610a09576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a0090613b74565b60405180910390fd5b610a14838383612453565b505050565b600d602052806000526040600020600091509050806000015490806001015490806002018054610a48906139ad565b80601f0160208091040260200160405190810160405280929190818152602001828054610a74906139ad565b8015610ac15780601f10610a9657610100808354040283529160200191610ac1565b820191906000526020600020905b815481529060010190602001808311610aa457829003601f168201915b5050505050905083565b600e6020528060005260406000206000915054906101000a900460ff1681565b600981565b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610b83576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b7a90613be0565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610bf2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be990613c4c565b60405180910390fd5b80600660006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61012c81565b610c5783838360405180602001604052806000815250611be0565b505050565b60085481565b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610cf5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cec90613be0565b60405180910390fd5b80600c8190555050565b600080610d0b8361274c565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610d7c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d7390613cb8565b60405180910390fd5b80915050919050565b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514610e3e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3590613be0565b60405180910390fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015414610ec3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610eba90613d24565b60405180910390fd5b60006060600b54915061012c600954108015610f34575060095461012c610eea9190613d73565b600b5461012c610efa9190613da7565b84600b54604051602001610f0f929190613e44565b6040516020818303038152906040528051906020012060001c610f329190613e9f565b105b156110115781600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600a600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555060096000815480929190610fdb90613ed0565b9190505550610feb600954612789565b604051602001610ffb9190613fa0565b60405160208183030381529060405290506110a3565b600b5491506003600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550600a600081548092919061107190613ed0565b9190505550611081600a54612789565b604051602001611091919061400e565b60405160208183030381529060405290505b600b60008154809291906110b690613ed0565b919050555080600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201908161110a91906141d2565b507f7d4d8b1e4d4f2df8721ceef7a87626042658ed1e7066adb2861781425780db7183838360405161113e939291906142a4565b60405180910390a16111508383612911565b505050565b60095481565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146111eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e29061432e565b60405180910390fd5b6001600e60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036112b6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112ad906143c0565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600b5481565b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611396576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161138d90613be0565b60405180910390fd5b6113b3732b90f2d3cd4580083fa4e3716860a9f1344a2e92610dab565b6113d073c2cb8d5d835a1b049f350d6d33613ef5c73e2144610dab565b6113ed73558bcf87cce6a3ce166013f6474d70adbc3241a1610dab565b61140a7319400eb6ad0a521262e95f8d486bfc530cf7a19b610dab565b611427736c1607dbfc68190051157f7d76ecd3fed9f1cf31610dab565b6114447386a81d15937761d14c18af300fd964a7c610b368610dab565b611461735b38da6a701c568545dcfcb03fcb875f56beddc4610dab565b61147e73ab8483f64d9c6d1ecf9b849ae677dd3315835cb2610dab565b61149b734b20993bc481177ec7e8f571cecae8a9e22c02db610dab565b6114b87378731d3ca6b7e34ac0f824c42a7cc18a495cabab610dab565b6114d573617f2e2fd72fd9d5503197092ac168c91465e7f2610dab565b6114f27317f6ad8ef982297579c203069c1dbffe4348c372610dab565b61150f735c6b0f7bf3e7ce046039bd8fabdfd3f9f5021678610dab565b61152c7303c6fced478cbbc9a4fab34ef9f40767739d1ff7610dab565b611549731ae0ea34a72d944a8c7603ffb3ec30a6669e454c610dab565b611566730a098eda01ce92ff4a4ccb7a4fffb5a43ebc70dc610dab565b61158373ca35b7d915458ef540ade6068dfe2f44e8fa733c610dab565b6115a07314723a09acff6d2a60dcdf7aa4aff308fddc160c610dab565b6115bd734b0897b0513fdc7c541b6d9d7e929c4e5364d2db610dab565b6115da73583031d1113ad414f02576bd6afabfb302140225610dab565b6115f773dd870fa1b7c4700f2bd7f44238821c26f7392148610dab565b565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff16146116af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116a69061432e565b60405180910390fd5b60005b81518110156116f1576116de8282815181106116d1576116d06143e0565b5b6020026020010151610dab565b80806116e990613ed0565b9150506116b2565b5050565b606060018054611704906139ad565b80601f0160208091040260200160405190810160405280929190818152602001828054611730906139ad565b801561177d5780601f106117525761010080835404028352916020019161177d565b820191906000526020600020905b81548152906001019060200180831161176057829003601f168201915b5050505050905090565b6117996117926122fd565b838361292f565b5050565b6117ae6117a86122fd565b826123be565b6117ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117e490614481565b60405180910390fd5b6117ff6117f86122fd565b8383612453565b600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010154600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010181905550600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600201908161191891906144cc565b5080600d60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060000181905550600d60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008082016000905560018201600090556002820160006119c0919061319e565b50505050565b600760009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff163373ffffffffffffffffffffffffffffffffffffffff1614611a56576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a4d9061432e565b60405180910390fd5b600960085410611a9b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a9290614626565b60405180910390fd5b60606000600b549050611aad81612789565b604051602001611abd9190614692565b604051602081830303815290604052915082600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001018190555081600d60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206002019081611b6491906141d2565b5060086000815480929190611b7890613ed0565b9190505550600b6000815480929190611b9090613ed0565b91905055507f7d4d8b1e4d4f2df8721ceef7a87626042658ed1e7066adb2861781425780db71848284604051611bc8939291906142a4565b60405180910390a1611bda8482612911565b50505050565b611bf1611beb6122fd565b836123be565b611c30576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c2790613b74565b60405180910390fd5b611c3c84848484612a9b565b50505050565b60011515600e60003373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16151514611cd5576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ccc90613be0565b60405180910390fd5b6000600b5411611d1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d1190614700565b60405180910390fd5b6000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015411611d9f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d969061476c565b60405180910390fd5b600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166347ee0394826040518263ffffffff1660e01b8152600401611dfa919061348c565b600060405180830381600087803b158015611e1457600080fd5b505af1158015611e28573d6000803e3d6000fd5b5050505050565b6060611e3a826122b2565b6000611e44612af7565b90506000815111611e645760405180602001604052806000815250611e8f565b80611e6e84612b0e565b604051602001611e7f92919061478c565b6040516020818303038152906040525b915050919050565b6000600b5411611edc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ed390614700565b60405180910390fd5b6000600c546001600c54600b54611ef39190613da7565b611efd9190613d73565b611f0791906147b0565b905060005b818110156121aa576000600c5482611f2491906147e1565b90506000600c5482611f369190613da7565b9050600b54811115611f4857600b5490505b60008282611f569190613d73565b67ffffffffffffffff811115611f6f57611f6e61360e565b5b604051908082528060200260200182016040528015611f9d5781602001602082028036833780820191505090505b5090506000808490505b838110156120ce576000611fba82610cff565b90506000600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206001015411156120ba578084848061201490613ed0565b955081518110612027576120266143e0565b5b602002602001019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff1681525050600d60008273ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060010160008154809291906120b490614823565b91905055505b5080806120c690613ed0565b915050611fa7565b507fbec2bc5e24d75dfbc742efe8195d17bb3387c3c84bd290dda8c4de02b5215af0826040516120fe919061490a565b60405180910390a1600660009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1663d994c257836040518263ffffffff1660e01b8152600401612161919061490a565b600060405180830381600087803b15801561217b57600080fd5b505af115801561218f573d6000803e3d6000fd5b505050505050505080806121a290613ed0565b915050611f0c565b5050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600c5481565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6122bb81612bdc565b6122fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122f190613cb8565b60405180910390fd5b50565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff1661237883610cff565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000806123ca83610cff565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061240c575061240b81856121ae565b5b8061244a57508373ffffffffffffffffffffffffffffffffffffffff1661243284610856565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661247382610cff565b73ffffffffffffffffffffffffffffffffffffffff16146124c9576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124c09061499e565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612538576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252f90614a30565b60405180910390fd5b6125458383836001612c1d565b8273ffffffffffffffffffffffffffffffffffffffff1661256582610cff565b73ffffffffffffffffffffffffffffffffffffffff16146125bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125b29061499e565b60405180910390fd5b6004600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46127478383836001612c23565b505050565b60006002600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6060600082036127d0576040518060400160405280600181526020017f3000000000000000000000000000000000000000000000000000000000000000815250905061290c565b600082905060005b600082146128025780806127eb90613ed0565b915050600a826127fb91906147b0565b91506127d8565b60008167ffffffffffffffff81111561281e5761281d61360e565b5b6040519080825280601f01601f1916602001820160405280156128505781602001600182028036833780820191505090505b50905060008290505b600086146129045760018161286e9190613d73565b90506000600a808861288091906147b0565b61288a91906147e1565b876128959190613d73565b60306128a19190614a5d565b905060008160f81b9050808484815181106128bf576128be6143e0565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a886128fb91906147b0565b97505050612859565b819450505050505b919050565b61292b828260405180602001604052806000815250612c29565b5050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff160361299d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161299490614ade565b60405180910390fd5b80600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051612a8e91906132af565b60405180910390a3505050565b612aa6848484612453565b612ab284848484612c84565b612af1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ae890614b70565b60405180910390fd5b50505050565b606060405180602001604052806000815250905090565b606060006001612b1d84612e0b565b01905060008167ffffffffffffffff811115612b3c57612b3b61360e565b5b6040519080825280601f01601f191660200182016040528015612b6e5781602001600182028036833780820191505090505b509050600082602001820190505b600115612bd1578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612bc557612bc4613e70565b5b04945060008503612b7c575b819350505050919050565b60008073ffffffffffffffffffffffffffffffffffffffff16612bfe8361274c565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b50505050565b50505050565b612c338383612f5e565b612c406000848484612c84565b612c7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c7690614b70565b60405180910390fd5b505050565b6000612ca58473ffffffffffffffffffffffffffffffffffffffff1661317b565b15612dfe578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612cce6122fd565b8786866040518563ffffffff1660e01b8152600401612cf09493929190614be5565b6020604051808303816000875af1925050508015612d2c57506040513d601f19601f82011682018060405250810190612d299190614c46565b60015b612dae573d8060008114612d5c576040519150601f19603f3d011682016040523d82523d6000602084013e612d61565b606091505b506000815103612da6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612d9d90614b70565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612e03565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612e69577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612e5f57612e5e613e70565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612ea6576d04ee2d6d415b85acef81000000008381612e9c57612e9b613e70565b5b0492506020810190505b662386f26fc100008310612ed557662386f26fc100008381612ecb57612eca613e70565b5b0492506010810190505b6305f5e1008310612efe576305f5e1008381612ef457612ef3613e70565b5b0492506008810190505b6127108310612f23576127108381612f1957612f18613e70565b5b0492506004810190505b60648310612f465760648381612f3c57612f3b613e70565b5b0492506002810190505b600a8310612f55576001810190505b80915050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612fcd576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612fc490614cbf565b60405180910390fd5b612fd681612bdc565b15613016576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161300d90614d2b565b60405180910390fd5b613024600083836001612c1d565b61302d81612bdc565b1561306d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161306490614d2b565b60405180910390fd5b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4613177600083836001612c23565b5050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b5080546131aa906139ad565b6000825580601f106131bc57506131db565b601f0160209004906000526020600020908101906131da91906131de565b5b50565b5b808211156131f75760008160009055506001016131df565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6132448161320f565b811461324f57600080fd5b50565b6000813590506132618161323b565b92915050565b60006020828403121561327d5761327c613205565b5b600061328b84828501613252565b91505092915050565b60008115159050919050565b6132a981613294565b82525050565b60006020820190506132c460008301846132a0565b92915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006132f5826132ca565b9050919050565b613305816132ea565b811461331057600080fd5b50565b600081359050613322816132fc565b92915050565b6000819050919050565b61333b81613328565b811461334657600080fd5b50565b60008135905061335881613332565b92915050565b6000806040838503121561337557613374613205565b5b600061338385828601613313565b925050602061339485828601613349565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b838110156133d85780820151818401526020810190506133bd565b60008484015250505050565b6000601f19601f8301169050919050565b60006134008261339e565b61340a81856133a9565b935061341a8185602086016133ba565b613423816133e4565b840191505092915050565b6000602082019050818103600083015261344881846133f5565b905092915050565b60006020828403121561346657613465613205565b5b600061347484828501613349565b91505092915050565b613486816132ea565b82525050565b60006020820190506134a1600083018461347d565b92915050565b6134b081613328565b82525050565b60006020820190506134cb60008301846134a7565b92915050565b6000806000606084860312156134ea576134e9613205565b5b60006134f886828701613313565b935050602061350986828701613313565b925050604061351a86828701613349565b9150509250925092565b60006020828403121561353a57613539613205565b5b600061354884828501613313565b91505092915050565b600060608201905061356660008301866134a7565b61357360208301856134a7565b818103604083015261358581846133f5565b9050949350505050565b6000819050919050565b60006135b46135af6135aa846132ca565b61358f565b6132ca565b9050919050565b60006135c682613599565b9050919050565b60006135d8826135bb565b9050919050565b6135e8816135cd565b82525050565b600060208201905061360360008301846135df565b92915050565b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613646826133e4565b810181811067ffffffffffffffff821117156136655761366461360e565b5b80604052505050565b60006136786131fb565b9050613684828261363d565b919050565b600067ffffffffffffffff8211156136a4576136a361360e565b5b602082029050602081019050919050565b600080fd5b60006136cd6136c884613689565b61366e565b905080838252602082019050602084028301858111156136f0576136ef6136b5565b5b835b8181101561371957806137058882613313565b8452602084019350506020810190506136f2565b5050509392505050565b600082601f83011261373857613737613609565b5b81356137488482602086016136ba565b91505092915050565b60006020828403121561376757613766613205565b5b600082013567ffffffffffffffff8111156137855761378461320a565b5b61379184828501613723565b91505092915050565b6137a381613294565b81146137ae57600080fd5b50565b6000813590506137c08161379a565b92915050565b600080604083850312156137dd576137dc613205565b5b60006137eb85828601613313565b92505060206137fc858286016137b1565b9150509250929050565b600080fd5b600067ffffffffffffffff8211156138265761382561360e565b5b61382f826133e4565b9050602081019050919050565b82818337600083830152505050565b600061385e6138598461380b565b61366e565b90508281526020810184848401111561387a57613879613806565b5b61388584828561383c565b509392505050565b600082601f8301126138a2576138a1613609565b5b81356138b284826020860161384b565b91505092915050565b600080600080608085870312156138d5576138d4613205565b5b60006138e387828801613313565b94505060206138f487828801613313565b935050604061390587828801613349565b925050606085013567ffffffffffffffff8111156139265761392561320a565b5b6139328782880161388d565b91505092959194509250565b6000806040838503121561395557613954613205565b5b600061396385828601613313565b925050602061397485828601613313565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806139c557607f821691505b6020821081036139d8576139d761397e565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613a3a6021836133a9565b9150613a45826139de565b604082019050919050565b60006020820190508181036000830152613a6981613a2d565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613acc603d836133a9565b9150613ad782613a70565b604082019050919050565b60006020820190508181036000830152613afb81613abf565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613b5e602d836133a9565b9150613b6982613b02565b604082019050919050565b60006020820190508181036000830152613b8d81613b51565b9050919050565b7f4e6f742041646d696e2100000000000000000000000000000000000000000000600082015250565b6000613bca600a836133a9565b9150613bd582613b94565b602082019050919050565b60006020820190508181036000830152613bf981613bbd565b9050919050565b7f61646472657373207a65726f0000000000000000000000000000000000000000600082015250565b6000613c36600c836133a9565b9150613c4182613c00565b602082019050919050565b60006020820190508181036000830152613c6581613c29565b9050919050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b6000613ca26018836133a9565b9150613cad82613c6c565b602082019050919050565b60006020820190508181036000830152613cd181613c95565b9050919050565b7f616c7265616479206d696e74656420666f722075736572000000000000000000600082015250565b6000613d0e6017836133a9565b9150613d1982613cd8565b602082019050919050565b60006020820190508181036000830152613d3d81613d01565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613d7e82613328565b9150613d8983613328565b9250828203905081811115613da157613da0613d44565b5b92915050565b6000613db282613328565b9150613dbd83613328565b9250828201905080821115613dd557613dd4613d44565b5b92915050565b60008160601b9050919050565b6000613df382613ddb565b9050919050565b6000613e0582613de8565b9050919050565b613e1d613e18826132ea565b613dfa565b82525050565b6000819050919050565b613e3e613e3982613328565b613e23565b82525050565b6000613e508285613e0c565b601482019150613e608284613e2d565b6020820191508190509392505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000613eaa82613328565b9150613eb583613328565b925082613ec557613ec4613e70565b5b828206905092915050565b6000613edb82613328565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613f0d57613f0c613d44565b5b600182019050919050565b600081905092915050565b7f5370656369616c20506f6c796b69636b204e4654200000000000000000000000600082015250565b6000613f59601583613f18565b9150613f6482613f23565b601582019050919050565b6000613f7a8261339e565b613f848185613f18565b9350613f948185602086016133ba565b80840191505092915050565b6000613fab82613f4c565b9150613fb78284613f6f565b915081905092915050565b7f4e6f726d616c20506f6c796b69636b204e465400000000000000000000000000600082015250565b6000613ff8601383613f18565b915061400382613fc2565b601382019050919050565b600061401982613feb565b91506140258284613f6f565b915081905092915050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026140927fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82614055565b61409c8683614055565b95508019841693508086168417925050509392505050565b60006140cf6140ca6140c584613328565b61358f565b613328565b9050919050565b6000819050919050565b6140e9836140b4565b6140fd6140f5826140d6565b848454614062565b825550505050565b600090565b614112614105565b61411d8184846140e0565b505050565b5b818110156141415761413660008261410a565b600181019050614123565b5050565b601f8211156141865761415781614030565b61416084614045565b8101602085101561416f578190505b61418361417b85614045565b830182614122565b50505b505050565b600082821c905092915050565b60006141a96000198460080261418b565b1980831691505092915050565b60006141c28383614198565b9150826002028217905092915050565b6141db8261339e565b67ffffffffffffffff8111156141f4576141f361360e565b5b6141fe82546139ad565b614209828285614145565b600060209050601f83116001811461423c576000841561422a578287015190505b61423485826141b6565b86555061429c565b601f19841661424a86614030565b60005b828110156142725784890151825560018201915060208501945060208101905061424d565b8683101561428f578489015161428b601f891682614198565b8355505b6001600288020188555050505b505050505050565b60006060820190506142b9600083018661347d565b6142c660208301856134a7565b81810360408301526142d881846133f5565b9050949350505050565b7f4e6f74204f776e65722100000000000000000000000000000000000000000000600082015250565b6000614318600a836133a9565b9150614323826142e2565b602082019050919050565b600060208201905081810360008301526143478161430b565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b60006143aa6029836133a9565b91506143b58261434e565b604082019050919050565b600060208201905081810360008301526143d98161439d565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061446b6031836133a9565b91506144768261440f565b604082019050919050565b6000602082019050818103600083015261449a8161445e565b9050919050565b6000815490506144b0816139ad565b9050919050565b60008190508160005260206000209050919050565b8181036144da5750506145b2565b6144e3826144a1565b67ffffffffffffffff8111156144fc576144fb61360e565b5b61450682546139ad565b614511828285614145565b6000601f831160018114614540576000841561452e578287015490505b61453885826141b6565b8655506145ab565b601f19841661454e876144b7565b965061455986614030565b60005b828110156145815784890154825560018201915060018501945060208101905061455c565b8683101561459e578489015461459a601f891682614198565b8355505b6001600288020188555050505b5050505050505b565b7f4d6178696d756d206e756d626572206f662072617265204e465473206861732060008201527f6265656e20726561636865640000000000000000000000000000000000000000602082015250565b6000614610602c836133a9565b915061461b826145b4565b604082019050919050565b6000602082019050818103600083015261463f81614603565b9050919050565b7f5261726520506f6c796b69636b204e4654000000000000000000000000000000600082015250565b600061467c601183613f18565b915061468782614646565b601182019050919050565b600061469d8261466f565b91506146a98284613f6f565b915081905092915050565b7f4e6f204e4654732068617665206265656e206d696e7465640000000000000000600082015250565b60006146ea6018836133a9565b91506146f5826146b4565b602082019050919050565b60006020820190508181036000830152614719816146dd565b9050919050565b7f6e6f7420616c6c6f776564000000000000000000000000000000000000000000600082015250565b6000614756600b836133a9565b915061476182614720565b602082019050919050565b6000602082019050818103600083015261478581614749565b9050919050565b60006147988285613f6f565b91506147a48284613f6f565b91508190509392505050565b60006147bb82613328565b91506147c683613328565b9250826147d6576147d5613e70565b5b828204905092915050565b60006147ec82613328565b91506147f783613328565b925082820261480581613328565b9150828204841483151761481c5761481b613d44565b5b5092915050565b600061482e82613328565b91506000820361484157614840613d44565b5b600182039050919050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b614881816132ea565b82525050565b60006148938383614878565b60208301905092915050565b6000602082019050919050565b60006148b78261484c565b6148c18185614857565b93506148cc83614868565b8060005b838110156148fd5781516148e48882614887565b97506148ef8361489f565b9250506001810190506148d0565b5085935050505092915050565b6000602082019050818103600083015261492481846148ac565b905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b60006149886025836133a9565b91506149938261492c565b604082019050919050565b600060208201905081810360008301526149b78161497b565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614a1a6024836133a9565b9150614a25826149be565b604082019050919050565b60006020820190508181036000830152614a4981614a0d565b9050919050565b600060ff82169050919050565b6000614a6882614a50565b9150614a7383614a50565b9250828201905060ff811115614a8c57614a8b613d44565b5b92915050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614ac86019836133a9565b9150614ad382614a92565b602082019050919050565b60006020820190508181036000830152614af781614abb565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b6000614b5a6032836133a9565b9150614b6582614afe565b604082019050919050565b60006020820190508181036000830152614b8981614b4d565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614bb782614b90565b614bc18185614b9b565b9350614bd18185602086016133ba565b614bda816133e4565b840191505092915050565b6000608082019050614bfa600083018761347d565b614c07602083018661347d565b614c1460408301856134a7565b8181036060830152614c268184614bac565b905095945050505050565b600081519050614c408161323b565b92915050565b600060208284031215614c5c57614c5b613205565b5b6000614c6a84828501614c31565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614ca96020836133a9565b9150614cb482614c73565b602082019050919050565b60006020820190508181036000830152614cd881614c9c565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b6000614d15601c836133a9565b9150614d2082614cdf565b602082019050919050565b60006020820190508181036000830152614d4481614d08565b905091905056fea2646970667358221220c7d4030899d0b94819aa82ba7e9021c3c5d6c00fefbb6e175057162042130cd764736f6c63430008110033

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

000000000000000000000000000000000000000000000000000000000000004000000000000000000000000000000000000000000000000000000000000000800000000000000000000000000000000000000000000000000000000000000007506f6c794e4654000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004506f6c7900000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _name (string): PolyNFT
Arg [1] : _symbol (string): Poly

-----Encoded View---------------
6 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000007
Arg [3] : 506f6c794e465400000000000000000000000000000000000000000000000000
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [5] : 506f6c7900000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

52306:7343:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35880:305;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58129:180;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;36808:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38320:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52597:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;37838:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39020:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52854:42;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;;:::i;:::-;;;;;;;;52903:39;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52470:35;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55011:170;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52417:46;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;39426:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52514:33;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55292:102;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36518:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52350:27;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56067:999;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52554:36;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55187:99;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36249:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52639:34;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53505:1499;;;:::i;:::-;;52384:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55911:150;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36977:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;38563:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57664:457;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57074:584;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;39682:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58321:261;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;37152:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58590:1040;;;:::i;:::-;;38789:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52695:31;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35880:305;35982:4;36034:25;36019:40;;;:11;:40;;;;:105;;;;36091:33;36076:48;;;:11;:48;;;;36019:105;:158;;;;36141:36;36165:11;36141:23;:36::i;:::-;36019:158;35999:178;;35880:305;;;:::o;58129:180::-;58220:4;58282:19;58244:7;:14;58252:5;58244:14;;;;;;;;;;;;;;;:34;;;:57;;58237:64;;58129:180;;;;:::o;36808:100::-;36862:13;36895:5;36888:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36808:100;:::o;38320:171::-;38396:7;38416:23;38431:7;38416:14;:23::i;:::-;38459:15;:24;38475:7;38459:24;;;;;;;;;;;;;;;;;;;;;38452:31;;38320:171;;;:::o;52597:35::-;;;;:::o;37838:416::-;37919:13;37935:23;37950:7;37935:14;:23::i;:::-;37919:39;;37983:5;37977:11;;:2;:11;;;37969:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;38077:5;38061:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;38086:37;38103:5;38110:12;:10;:12::i;:::-;38086:16;:37::i;:::-;38061:62;38039:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;38225:21;38234:2;38238:7;38225:8;:21::i;:::-;37908:346;37838:416;;:::o;39020:335::-;39215:41;39234:12;:10;:12::i;:::-;39248:7;39215:18;:41::i;:::-;39207:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;39319:28;39329:4;39335:2;39339:7;39319:9;:28::i;:::-;39020:335;;;:::o;52854:42::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;52903:39::-;;;;;;;;;;;;;;;;;;;;;;:::o;52470:35::-;52504:1;52470:35;:::o;55011:170::-;53157:4;53134:27;;:7;:19;53142:10;53134:19;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;53126:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;55109:3:::1;55088:25;;:9;:25;;::::0;55080:49:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;55163:9;55140:11;;:33;;;;;;;;;;;;;;;;;;55011:170:::0;:::o;52417:46::-;52460:3;52417:46;:::o;39426:185::-;39564:39;39581:4;39587:2;39591:7;39564:39;;;;;;;;;;;;:16;:39::i;:::-;39426:185;;;:::o;52514:33::-;;;;:::o;55292:102::-;53157:4;53134:27;;:7;:19;53142:10;53134:19;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;53126:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;55376:10:::1;55364:9;:22;;;;55292:102:::0;:::o;36518:223::-;36590:7;36610:13;36626:17;36635:7;36626:8;:17::i;:::-;36610:33;;36679:1;36662:19;;:5;:19;;;36654:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;36728:5;36721:12;;;36518:223;;;:::o;52350:27::-;;;;;;;;;;;;;:::o;56067:999::-;53157:4;53134:27;;:7;:19;53142:10;53134:19;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;53126:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;56162:1:::1;56126:7;:12;56134:3;56126:12;;;;;;;;;;;;;;;:32;;;:37;56118:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56200:15;56222:21;56260:15;;56250:25;;52460:3;56288:17;;:36;:185;;;;;56456:17;;52460:3;56437:36;;;;:::i;:::-;56418:15;;52460:3;56399:34;;;;:::i;:::-;56372:3;56377:15;;56355:38;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56345:49;;;;;;56337:58;;:97;;;;:::i;:::-;:136;56288:185;56284:639;;;56509:7;56486;:12;56494:3;56486:12;;;;;;;;;;;;;;;:20;;:30;;;;56562:2;56527:7;:12;56535:3;56527:12;;;;;;;;;;;;;;;:32;;:37;;;;56575:17;;:19;;;;;;;;;:::i;:::-;;;;;;56664:27;56673:17;;56664:8;:27::i;:::-;56622:70;;;;;;;;:::i;:::-;;;;;;;;;;;;;56605:88;;56284:639;;;56728:15;;56718:25;;56789:1;56754:7;:12;56762:3;56754:12;;;;;;;;;;;;;;;:32;;:36;;;;56801:16;;:18;;;;;;;;;:::i;:::-;;;;;;56887:26;56896:16;;56887:8;:26::i;:::-;56847:67;;;;;;;;:::i;:::-;;;;;;;;;;;;;56830:85;;56284:639;56931:15;;:17;;;;;;;;;:::i;:::-;;;;;;56978:7;56955;:12;56963:3;56955:12;;;;;;;;;;;;;;;:20;;:30;;;;;;:::i;:::-;;56999:33;57010:3;57015:7;57024;56999:33;;;;;;;;:::i;:::-;;;;;;;;57039:23;57049:3;57054:7;57039:9;:23::i;:::-;56111:955;;56067:999:::0;:::o;52554:36::-;;;;:::o;55187:99::-;53295:5;;;;;;;;;;;53281:19;;:10;:19;;;53273:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;55274:4:::1;55253:7;:18;55261:9;55253:18;;;;;;;;;;;;;;;;:25;;;;;;;;;;;;;;;;;;55187:99:::0;:::o;36249:207::-;36321:7;36366:1;36349:19;;:5;:19;;;36341:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;36432:9;:16;36442:5;36432:16;;;;;;;;;;;;;;;;36425:23;;36249:207;;;:::o;52639:34::-;;;;:::o;53505:1499::-;53157:4;53134:27;;:7;:19;53142:10;53134:19;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;53126:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;53673:48:::1;53678:42;53673:4;:48::i;:::-;53732;53737:42;53732:4;:48::i;:::-;53791;53796:42;53791:4;:48::i;:::-;53850;53855:42;53850:4;:48::i;:::-;53972;53977:42;53972:4;:48::i;:::-;54031;54036:42;54031:4;:48::i;:::-;54090;54095:42;54090:4;:48::i;:::-;54151;54156:42;54151:4;:48::i;:::-;54210;54215:42;54210:4;:48::i;:::-;54269;54274:42;54269:4;:48::i;:::-;54328;54333:42;54328:4;:48::i;:::-;54387;54392:42;54387:4;:48::i;:::-;54446;54451:42;54446:4;:48::i;:::-;54505;54510:42;54505:4;:48::i;:::-;54564;54569:42;54564:4;:48::i;:::-;54623;54628:42;54623:4;:48::i;:::-;54682;54687:42;54682:4;:48::i;:::-;54741;54746:42;54741:4;:48::i;:::-;54800;54805:42;54800:4;:48::i;:::-;54859;54864:42;54859:4;:48::i;:::-;54918;54923:42;54918:4;:48::i;:::-;53505:1499::o:0;52384:20::-;;;;;;;;;;;;;:::o;55911:150::-;53295:5;;;;;;;;;;;53281:19;;:10;:19;;;53273:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;55983:9:::1;55978:76;56002:3;:10;55998:1;:14;55978:76;;;56030:12;56035:3;56039:1;56035:6;;;;;;;;:::i;:::-;;;;;;;;56030:4;:12::i;:::-;56014:3;;;;;:::i;:::-;;;;55978:76;;;;55911:150:::0;:::o;36977:104::-;37033:13;37066:7;37059:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36977:104;:::o;38563:155::-;38658:52;38677:12;:10;:12::i;:::-;38691:8;38701;38658:18;:52::i;:::-;38563:155;;:::o;57664:457::-;57741:42;57760:12;:10;:12::i;:::-;57774:8;57741:18;:42::i;:::-;57733:104;;;;;;;;;;;;:::i;:::-;;;;;;;;;57848:38;57858:12;:10;:12::i;:::-;57872:3;57877:8;57848:9;:38::i;:::-;57932:7;:19;57940:10;57932:19;;;;;;;;;;;;;;;:39;;;57897:7;:12;57905:3;57897:12;;;;;;;;;;;;;;;:32;;:74;;;;58005:7;:19;58013:10;58005:19;;;;;;;;;;;;;;;:27;;57982:7;:12;57990:3;57982:12;;;;;;;;;;;;;;;:20;;:50;;;;;;:::i;:::-;;58066:8;58043:7;:12;58051:3;58043:12;;;;;;;;;;;;;;;:20;;:31;;;;58094:7;:19;58102:10;58094:19;;;;;;;;;;;;;;;;58087:26;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;57664:457;;:::o;57074:584::-;53295:5;;;;;;;;;;;53281:19;;:10;:19;;;53273:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;52504:1:::1;57172:14;;:24;57164:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;57256:21;57288:15;57306;;57288:33;;57387:17;57396:7;57387:8;:17::i;:::-;57349:56;;;;;;;;:::i;:::-;;;;;;;;;;;;;57332:74;;57452:19;57417:7;:12;57425:3;57417:12;;;;;;;;;;;;;;;:32;;:54;;;;57505:7;57482;:12;57490:3;57482:12;;;;;;;;;;;;;;;:20;;:30;;;;;;:::i;:::-;;57523:14;;:16;;;;;;;;;:::i;:::-;;;;;;57550:15;;:17;;;;;;;;;:::i;:::-;;;;;;57583:33;57594:3;57599:7;57608;57583:33;;;;;;;;:::i;:::-;;;;;;;;57627:23;57637:3;57642:7;57627:9;:23::i;:::-;57153:505;;57074:584:::0;;:::o;39682:322::-;39856:41;39875:12;:10;:12::i;:::-;39889:7;39856:18;:41::i;:::-;39848:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;39958:38;39972:4;39978:2;39982:7;39991:4;39958:13;:38::i;:::-;39682:322;;;;:::o;58321:261::-;53157:4;53134:27;;:7;:19;53142:10;53134:19;;;;;;;;;;;;;;;;;;;;;;;;;:27;;;53126:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;58421:1:::1;58403:15;;:19;58395:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;58510:1;58470:7;:17;58478:8;58470:17;;;;;;;;;;;;;;;:37;;;:41;58462:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;58538:11;;;;;;;;;;;:26;;;58565:8;58538:36;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;;;;;;;::::0;::::1;;;;;;;;;58321:261:::0;:::o;37152:281::-;37225:13;37251:23;37266:7;37251:14;:23::i;:::-;37287:21;37311:10;:8;:10::i;:::-;37287:34;;37363:1;37345:7;37339:21;:25;:86;;;;;;;;;;;;;;;;;37391:7;37400:18;:7;:16;:18::i;:::-;37374:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;37339:86;37332:93;;;37152:281;;;:::o;58590:1040::-;58669:1;58651:15;;:19;58643:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;58708:18;58765:9;;58760:1;58748:9;;58730:15;;:27;;;;:::i;:::-;:31;;;;:::i;:::-;58729:45;;;;:::i;:::-;58708:66;;58788:18;58783:844;58825:10;58812;:23;58783:844;;;58862:18;58896:9;;58883:10;:22;;;;:::i;:::-;58862:43;;58916:16;58948:9;;58935:10;:22;;;;:::i;:::-;58916:41;;58985:15;;58974:8;:26;58970:85;;;59028:15;;59017:26;;58970:85;59067:38;59133:10;59122:8;:21;;;;:::i;:::-;59108:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;59067:77;;59155:32;59209:9;59221:10;59209:22;;59204:302;59237:8;59233:1;:12;59204:302;;;59267:12;59282:10;59290:1;59282:7;:10::i;:::-;59267:25;;59347:1;59311:7;:13;59319:4;59311:13;;;;;;;;;;;;;;;:33;;;:37;59307:188;;;59421:4;59369:21;59391:26;;;;;:::i;:::-;;;59369:49;;;;;;;;:::i;:::-;;;;;;;:56;;;;;;;;;;;59444:7;:13;59452:4;59444:13;;;;;;;;;;;;;;;:33;;;:35;;;;;;;;;:::i;:::-;;;;;;59307:188;59252:254;59247:3;;;;;:::i;:::-;;;;59204:302;;;;59521:34;59533:21;59521:34;;;;;;:::i;:::-;;;;;;;;59566:11;;;;;;;;;;;:30;;;59597:21;59566:53;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58851:776;;;;58837:12;;;;;:::i;:::-;;;;58783:844;;;;58636:994;58590:1040::o;38789:164::-;38886:4;38910:18;:25;38929:5;38910:25;;;;;;;;;;;;;;;:35;38936:8;38910:35;;;;;;;;;;;;;;;;;;;;;;;;;38903:42;;38789:164;;;;:::o;52695:31::-;;;;:::o;28392:157::-;28477:4;28516:25;28501:40;;;:11;:40;;;;28494:47;;28392:157;;;:::o;48139:135::-;48221:16;48229:7;48221;:16::i;:::-;48213:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;48139:135;:::o;15913:98::-;15966:7;15993:10;15986:17;;15913:98;:::o;47418:174::-;47520:2;47493:15;:24;47509:7;47493:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;47576:7;47572:2;47538:46;;47547:23;47562:7;47547:14;:23::i;:::-;47538:46;;;;;;;;;;;;47418:174;;:::o;42037:264::-;42130:4;42147:13;42163:23;42178:7;42163:14;:23::i;:::-;42147:39;;42216:5;42205:16;;:7;:16;;;:52;;;;42225:32;42242:5;42249:7;42225:16;:32::i;:::-;42205:52;:87;;;;42285:7;42261:31;;:20;42273:7;42261:11;:20::i;:::-;:31;;;42205:87;42197:96;;;42037:264;;;;:::o;46036:1263::-;46195:4;46168:31;;:23;46183:7;46168:14;:23::i;:::-;:31;;;46160:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46274:1;46260:16;;:2;:16;;;46252:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;46330:42;46351:4;46357:2;46361:7;46370:1;46330:20;:42::i;:::-;46502:4;46475:31;;:23;46490:7;46475:14;:23::i;:::-;:31;;;46467:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;46620:15;:24;46636:7;46620:24;;;;;;;;;;;;46613:31;;;;;;;;;;;47115:1;47096:9;:15;47106:4;47096:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;47148:1;47131:9;:13;47141:2;47131:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;47190:2;47171:7;:16;47179:7;47171:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;47229:7;47225:2;47210:27;;47219:4;47210:27;;;;;;;;;;;;47250:41;47270:4;47276:2;47280:7;47289:1;47250:19;:41::i;:::-;46036:1263;;;:::o;41312:117::-;41378:7;41405;:16;41413:7;41405:16;;;;;;;;;;;;;;;;;;;;;41398:23;;41312:117;;;:::o;55400:503::-;55453:13;55485:1;55479:2;:7;55475:42;;55499:10;;;;;;;;;;;;;;;;;;;;;55475:42;55523:9;55535:2;55523:14;;55544;55565:60;55577:1;55572;:6;55565:60;;55591:8;;;;;:::i;:::-;;;;55615:2;55610:7;;;;;:::i;:::-;;;55565:60;;;55631:17;55661:6;55651:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55631:37;;55675:9;55687:6;55675:18;;55700:174;55713:1;55707:2;:7;55700:174;;55733:1;55731;:3;;;;:::i;:::-;55727:7;;55745:10;55785:2;55780;55775;:7;;;;:::i;:::-;:12;;;;:::i;:::-;55770:2;:17;;;;:::i;:::-;55759:2;:29;;;;:::i;:::-;55745:44;;55800:9;55819:4;55812:12;;55800:24;;55845:2;55835:4;55840:1;55835:7;;;;;;;;:::i;:::-;;;;;:12;;;;;;;;;;;55864:2;55858:8;;;;;:::i;:::-;;;55716:158;;55700:174;;;55894:4;55880:19;;;;;;55400:503;;;;:::o;42643:110::-;42719:26;42729:2;42733:7;42719:26;;;;;;;;;;;;:9;:26::i;:::-;42643:110;;:::o;47735:315::-;47890:8;47881:17;;:5;:17;;;47873:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;47977:8;47939:18;:25;47958:5;47939:25;;;;;;;;;;;;;;;:35;47965:8;47939:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;48023:8;48001:41;;48016:5;48001:41;;;48033:8;48001:41;;;;;;:::i;:::-;;;;;;;;47735:315;;;:::o;40885:313::-;41041:28;41051:4;41057:2;41061:7;41041:9;:28::i;:::-;41088:47;41111:4;41117:2;41121:7;41130:4;41088:22;:47::i;:::-;41080:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;40885:313;;;;:::o;37682:94::-;37733:13;37759:9;;;;;;;;;;;;;;37682:94;:::o;13339:716::-;13395:13;13446:14;13483:1;13463:17;13474:5;13463:10;:17::i;:::-;:21;13446:38;;13499:20;13533:6;13522:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13499:41;;13555:11;13684:6;13680:2;13676:15;13668:6;13664:28;13657:35;;13721:288;13728:4;13721:288;;;13753:5;;;;;;;;13895:8;13890:2;13883:5;13879:14;13874:30;13869:3;13861:44;13951:2;13942:11;;;;;;:::i;:::-;;;;;13985:1;13976:5;:10;13721:288;13972:21;13721:288;14030:6;14023:13;;;;;13339:716;;;:::o;41742:128::-;41807:4;41860:1;41831:31;;:17;41840:7;41831:8;:17::i;:::-;:31;;;;41824:38;;41742:128;;;:::o;50423:159::-;;;;;:::o;51304:158::-;;;;;:::o;42980:319::-;43109:18;43115:2;43119:7;43109:5;:18::i;:::-;43160:53;43191:1;43195:2;43199:7;43208:4;43160:22;:53::i;:::-;43138:153;;;;;;;;;;;;:::i;:::-;;;;;;;;;42980:319;;;:::o;48838:853::-;48992:4;49013:15;:2;:13;;;:15::i;:::-;49009:675;;;49065:2;49049:36;;;49086:12;:10;:12::i;:::-;49100:4;49106:7;49115:4;49049:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;49045:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49307:1;49290:6;:13;:18;49286:328;;49333:60;;;;;;;;;;:::i;:::-;;;;;;;;49286:328;49564:6;49558:13;49549:6;49545:2;49541:15;49534:38;49045:584;49181:41;;;49171:51;;;:6;:51;;;;49164:58;;;;;49009:675;49668:4;49661:11;;48838:853;;;;;;;:::o;10205:922::-;10258:7;10278:14;10295:1;10278:18;;10345:6;10336:5;:15;10332:102;;10381:6;10372:15;;;;;;:::i;:::-;;;;;10416:2;10406:12;;;;10332:102;10461:6;10452:5;:15;10448:102;;10497:6;10488:15;;;;;;:::i;:::-;;;;;10532:2;10522:12;;;;10448:102;10577:6;10568:5;:15;10564:102;;10613:6;10604:15;;;;;;:::i;:::-;;;;;10648:2;10638:12;;;;10564:102;10693:5;10684;:14;10680:99;;10728:5;10719:14;;;;;;:::i;:::-;;;;;10762:1;10752:11;;;;10680:99;10806:5;10797;:14;10793:99;;10841:5;10832:14;;;;;;:::i;:::-;;;;;10875:1;10865:11;;;;10793:99;10919:5;10910;:14;10906:99;;10954:5;10945:14;;;;;;:::i;:::-;;;;;10988:1;10978:11;;;;10906:99;11032:5;11023;:14;11019:66;;11068:1;11058:11;;;;11019:66;11113:6;11106:13;;;10205:922;;;:::o;43635:942::-;43729:1;43715:16;;:2;:16;;;43707:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;43788:16;43796:7;43788;:16::i;:::-;43787:17;43779:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;43850:48;43879:1;43883:2;43887:7;43896:1;43850:20;:48::i;:::-;43997:16;44005:7;43997;:16::i;:::-;43996:17;43988:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;44412:1;44395:9;:13;44405:2;44395:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;44456:2;44437:7;:16;44445:7;44437:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;44501:7;44497:2;44476:33;;44493:1;44476:33;;;;;;;;;;;;44522:47;44550:1;44554:2;44558:7;44567:1;44522:19;:47::i;:::-;43635:942;;:::o;17361:326::-;17421:4;17678:1;17656:7;:19;;;:23;17649:30;;17361:326;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:126::-;1555:7;1595:42;1588:5;1584:54;1573:65;;1518:126;;;:::o;1650:96::-;1687:7;1716:24;1734:5;1716:24;:::i;:::-;1705:35;;1650:96;;;:::o;1752:122::-;1825:24;1843:5;1825:24;:::i;:::-;1818:5;1815:35;1805:63;;1864:1;1861;1854:12;1805:63;1752:122;:::o;1880:139::-;1926:5;1964:6;1951:20;1942:29;;1980:33;2007:5;1980:33;:::i;:::-;1880:139;;;;:::o;2025:77::-;2062:7;2091:5;2080:16;;2025:77;;;:::o;2108:122::-;2181:24;2199:5;2181:24;:::i;:::-;2174:5;2171:35;2161:63;;2220:1;2217;2210:12;2161:63;2108:122;:::o;2236:139::-;2282:5;2320:6;2307:20;2298:29;;2336:33;2363:5;2336:33;:::i;:::-;2236:139;;;;:::o;2381:474::-;2449:6;2457;2506:2;2494:9;2485:7;2481:23;2477:32;2474:119;;;2512:79;;:::i;:::-;2474:119;2632:1;2657:53;2702:7;2693:6;2682:9;2678:22;2657:53;:::i;:::-;2647:63;;2603:117;2759:2;2785:53;2830:7;2821:6;2810:9;2806:22;2785:53;:::i;:::-;2775:63;;2730:118;2381:474;;;;;:::o;2861:99::-;2913:6;2947:5;2941:12;2931:22;;2861:99;;;:::o;2966:169::-;3050:11;3084:6;3079:3;3072:19;3124:4;3119:3;3115:14;3100:29;;2966:169;;;;:::o;3141:246::-;3222:1;3232:113;3246:6;3243:1;3240:13;3232:113;;;3331:1;3326:3;3322:11;3316:18;3312:1;3307:3;3303:11;3296:39;3268:2;3265:1;3261:10;3256:15;;3232:113;;;3379:1;3370:6;3365:3;3361:16;3354:27;3203:184;3141:246;;;:::o;3393:102::-;3434:6;3485:2;3481:7;3476:2;3469:5;3465:14;3461:28;3451:38;;3393:102;;;:::o;3501:377::-;3589:3;3617:39;3650:5;3617:39;:::i;:::-;3672:71;3736:6;3731:3;3672:71;:::i;:::-;3665:78;;3752:65;3810:6;3805:3;3798:4;3791:5;3787:16;3752:65;:::i;:::-;3842:29;3864:6;3842:29;:::i;:::-;3837:3;3833:39;3826:46;;3593:285;3501:377;;;;:::o;3884:313::-;3997:4;4035:2;4024:9;4020:18;4012:26;;4084:9;4078:4;4074:20;4070:1;4059:9;4055:17;4048:47;4112:78;4185:4;4176:6;4112:78;:::i;:::-;4104:86;;3884:313;;;;:::o;4203:329::-;4262:6;4311:2;4299:9;4290:7;4286:23;4282:32;4279:119;;;4317:79;;:::i;:::-;4279:119;4437:1;4462:53;4507:7;4498:6;4487:9;4483:22;4462:53;:::i;:::-;4452:63;;4408:117;4203:329;;;;:::o;4538:118::-;4625:24;4643:5;4625:24;:::i;:::-;4620:3;4613:37;4538:118;;:::o;4662:222::-;4755:4;4793:2;4782:9;4778:18;4770:26;;4806:71;4874:1;4863:9;4859:17;4850:6;4806:71;:::i;:::-;4662:222;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:329::-;5926:6;5975:2;5963:9;5954:7;5950:23;5946:32;5943:119;;;5981:79;;:::i;:::-;5943:119;6101:1;6126:53;6171:7;6162:6;6151:9;6147:22;6126:53;:::i;:::-;6116:63;;6072:117;5867:329;;;;:::o;6202:533::-;6371:4;6409:2;6398:9;6394:18;6386:26;;6422:71;6490:1;6479:9;6475:17;6466:6;6422:71;:::i;:::-;6503:72;6571:2;6560:9;6556:18;6547:6;6503:72;:::i;:::-;6622:9;6616:4;6612:20;6607:2;6596:9;6592:18;6585:48;6650:78;6723:4;6714:6;6650:78;:::i;:::-;6642:86;;6202:533;;;;;;:::o;6741:60::-;6769:3;6790:5;6783:12;;6741:60;;;:::o;6807:142::-;6857:9;6890:53;6908:34;6917:24;6935:5;6917:24;:::i;:::-;6908:34;:::i;:::-;6890:53;:::i;:::-;6877:66;;6807:142;;;:::o;6955:126::-;7005:9;7038:37;7069:5;7038:37;:::i;:::-;7025:50;;6955:126;;;:::o;7087:143::-;7154:9;7187:37;7218:5;7187:37;:::i;:::-;7174:50;;7087:143;;;:::o;7236:165::-;7340:54;7388:5;7340:54;:::i;:::-;7335:3;7328:67;7236:165;;:::o;7407:256::-;7517:4;7555:2;7544:9;7540:18;7532:26;;7568:88;7653:1;7642:9;7638:17;7629:6;7568:88;:::i;:::-;7407:256;;;;:::o;7669:117::-;7778:1;7775;7768:12;7792:180;7840:77;7837:1;7830:88;7937:4;7934:1;7927:15;7961:4;7958:1;7951:15;7978:281;8061:27;8083:4;8061:27;:::i;:::-;8053:6;8049:40;8191:6;8179:10;8176:22;8155:18;8143:10;8140:34;8137:62;8134:88;;;8202:18;;:::i;:::-;8134:88;8242:10;8238:2;8231:22;8021:238;7978:281;;:::o;8265:129::-;8299:6;8326:20;;:::i;:::-;8316:30;;8355:33;8383:4;8375:6;8355:33;:::i;:::-;8265:129;;;:::o;8400:311::-;8477:4;8567:18;8559:6;8556:30;8553:56;;;8589:18;;:::i;:::-;8553:56;8639:4;8631:6;8627:17;8619:25;;8699:4;8693;8689:15;8681:23;;8400:311;;;:::o;8717:117::-;8826:1;8823;8816:12;8857:710;8953:5;8978:81;8994:64;9051:6;8994:64;:::i;:::-;8978:81;:::i;:::-;8969:90;;9079:5;9108:6;9101:5;9094:21;9142:4;9135:5;9131:16;9124:23;;9195:4;9187:6;9183:17;9175:6;9171:30;9224:3;9216:6;9213:15;9210:122;;;9243:79;;:::i;:::-;9210:122;9358:6;9341:220;9375:6;9370:3;9367:15;9341:220;;;9450:3;9479:37;9512:3;9500:10;9479:37;:::i;:::-;9474:3;9467:50;9546:4;9541:3;9537:14;9530:21;;9417:144;9401:4;9396:3;9392:14;9385:21;;9341:220;;;9345:21;8959:608;;8857:710;;;;;:::o;9590:370::-;9661:5;9710:3;9703:4;9695:6;9691:17;9687:27;9677:122;;9718:79;;:::i;:::-;9677:122;9835:6;9822:20;9860:94;9950:3;9942:6;9935:4;9927:6;9923:17;9860:94;:::i;:::-;9851:103;;9667:293;9590:370;;;;:::o;9966:539::-;10050:6;10099:2;10087:9;10078:7;10074:23;10070:32;10067:119;;;10105:79;;:::i;:::-;10067:119;10253:1;10242:9;10238:17;10225:31;10283:18;10275:6;10272:30;10269:117;;;10305:79;;:::i;:::-;10269:117;10410:78;10480:7;10471:6;10460:9;10456:22;10410:78;:::i;:::-;10400:88;;10196:302;9966:539;;;;:::o;10511:116::-;10581:21;10596:5;10581:21;:::i;:::-;10574:5;10571:32;10561:60;;10617:1;10614;10607:12;10561:60;10511:116;:::o;10633:133::-;10676:5;10714:6;10701:20;10692:29;;10730:30;10754:5;10730:30;:::i;:::-;10633:133;;;;:::o;10772:468::-;10837:6;10845;10894:2;10882:9;10873:7;10869:23;10865:32;10862:119;;;10900:79;;:::i;:::-;10862:119;11020:1;11045:53;11090:7;11081:6;11070:9;11066:22;11045:53;:::i;:::-;11035:63;;10991:117;11147:2;11173:50;11215:7;11206:6;11195:9;11191:22;11173:50;:::i;:::-;11163:60;;11118:115;10772:468;;;;;:::o;11246:117::-;11355:1;11352;11345:12;11369:307;11430:4;11520:18;11512:6;11509:30;11506:56;;;11542:18;;:::i;:::-;11506:56;11580:29;11602:6;11580:29;:::i;:::-;11572:37;;11664:4;11658;11654:15;11646:23;;11369:307;;;:::o;11682:146::-;11779:6;11774:3;11769;11756:30;11820:1;11811:6;11806:3;11802:16;11795:27;11682:146;;;:::o;11834:423::-;11911:5;11936:65;11952:48;11993:6;11952:48;:::i;:::-;11936:65;:::i;:::-;11927:74;;12024:6;12017:5;12010:21;12062:4;12055:5;12051:16;12100:3;12091:6;12086:3;12082:16;12079:25;12076:112;;;12107:79;;:::i;:::-;12076:112;12197:54;12244:6;12239:3;12234;12197:54;:::i;:::-;11917:340;11834:423;;;;;:::o;12276:338::-;12331:5;12380:3;12373:4;12365:6;12361:17;12357:27;12347:122;;12388:79;;:::i;:::-;12347:122;12505:6;12492:20;12530:78;12604:3;12596:6;12589:4;12581:6;12577:17;12530:78;:::i;:::-;12521:87;;12337:277;12276:338;;;;:::o;12620:943::-;12715:6;12723;12731;12739;12788:3;12776:9;12767:7;12763:23;12759:33;12756:120;;;12795:79;;:::i;:::-;12756:120;12915:1;12940:53;12985:7;12976:6;12965:9;12961:22;12940:53;:::i;:::-;12930:63;;12886:117;13042:2;13068:53;13113:7;13104:6;13093:9;13089:22;13068:53;:::i;:::-;13058:63;;13013:118;13170:2;13196:53;13241:7;13232:6;13221:9;13217:22;13196:53;:::i;:::-;13186:63;;13141:118;13326:2;13315:9;13311:18;13298:32;13357:18;13349:6;13346:30;13343:117;;;13379:79;;:::i;:::-;13343:117;13484:62;13538:7;13529:6;13518:9;13514:22;13484:62;:::i;:::-;13474:72;;13269:287;12620:943;;;;;;;:::o;13569:474::-;13637:6;13645;13694:2;13682:9;13673:7;13669:23;13665:32;13662:119;;;13700:79;;:::i;:::-;13662:119;13820:1;13845:53;13890:7;13881:6;13870:9;13866:22;13845:53;:::i;:::-;13835:63;;13791:117;13947:2;13973:53;14018:7;14009:6;13998:9;13994:22;13973:53;:::i;:::-;13963:63;;13918:118;13569:474;;;;;:::o;14049:180::-;14097:77;14094:1;14087:88;14194:4;14191:1;14184:15;14218:4;14215:1;14208:15;14235:320;14279:6;14316:1;14310:4;14306:12;14296:22;;14363:1;14357:4;14353:12;14384:18;14374:81;;14440:4;14432:6;14428:17;14418:27;;14374:81;14502:2;14494:6;14491:14;14471:18;14468:38;14465:84;;14521:18;;:::i;:::-;14465:84;14286:269;14235:320;;;:::o;14561:220::-;14701:34;14697:1;14689:6;14685:14;14678:58;14770:3;14765:2;14757:6;14753:15;14746:28;14561:220;:::o;14787:366::-;14929:3;14950:67;15014:2;15009:3;14950:67;:::i;:::-;14943:74;;15026:93;15115:3;15026:93;:::i;:::-;15144:2;15139:3;15135:12;15128:19;;14787:366;;;:::o;15159:419::-;15325:4;15363:2;15352:9;15348:18;15340:26;;15412:9;15406:4;15402:20;15398:1;15387:9;15383:17;15376:47;15440:131;15566:4;15440:131;:::i;:::-;15432:139;;15159:419;;;:::o;15584:248::-;15724:34;15720:1;15712:6;15708:14;15701:58;15793:31;15788:2;15780:6;15776:15;15769:56;15584:248;:::o;15838:366::-;15980:3;16001:67;16065:2;16060:3;16001:67;:::i;:::-;15994:74;;16077:93;16166:3;16077:93;:::i;:::-;16195:2;16190:3;16186:12;16179:19;;15838:366;;;:::o;16210:419::-;16376:4;16414:2;16403:9;16399:18;16391:26;;16463:9;16457:4;16453:20;16449:1;16438:9;16434:17;16427:47;16491:131;16617:4;16491:131;:::i;:::-;16483:139;;16210:419;;;:::o;16635:232::-;16775:34;16771:1;16763:6;16759:14;16752:58;16844:15;16839:2;16831:6;16827:15;16820:40;16635:232;:::o;16873:366::-;17015:3;17036:67;17100:2;17095:3;17036:67;:::i;:::-;17029:74;;17112:93;17201:3;17112:93;:::i;:::-;17230:2;17225:3;17221:12;17214:19;;16873:366;;;:::o;17245:419::-;17411:4;17449:2;17438:9;17434:18;17426:26;;17498:9;17492:4;17488:20;17484:1;17473:9;17469:17;17462:47;17526:131;17652:4;17526:131;:::i;:::-;17518:139;;17245:419;;;:::o;17670:160::-;17810:12;17806:1;17798:6;17794:14;17787:36;17670:160;:::o;17836:366::-;17978:3;17999:67;18063:2;18058:3;17999:67;:::i;:::-;17992:74;;18075:93;18164:3;18075:93;:::i;:::-;18193:2;18188:3;18184:12;18177:19;;17836:366;;;:::o;18208:419::-;18374:4;18412:2;18401:9;18397:18;18389:26;;18461:9;18455:4;18451:20;18447:1;18436:9;18432:17;18425:47;18489:131;18615:4;18489:131;:::i;:::-;18481:139;;18208:419;;;:::o;18633:162::-;18773:14;18769:1;18761:6;18757:14;18750:38;18633:162;:::o;18801:366::-;18943:3;18964:67;19028:2;19023:3;18964:67;:::i;:::-;18957:74;;19040:93;19129:3;19040:93;:::i;:::-;19158:2;19153:3;19149:12;19142:19;;18801:366;;;:::o;19173:419::-;19339:4;19377:2;19366:9;19362:18;19354:26;;19426:9;19420:4;19416:20;19412:1;19401:9;19397:17;19390:47;19454:131;19580:4;19454:131;:::i;:::-;19446:139;;19173:419;;;:::o;19598:174::-;19738:26;19734:1;19726:6;19722:14;19715:50;19598:174;:::o;19778:366::-;19920:3;19941:67;20005:2;20000:3;19941:67;:::i;:::-;19934:74;;20017:93;20106:3;20017:93;:::i;:::-;20135:2;20130:3;20126:12;20119:19;;19778:366;;;:::o;20150:419::-;20316:4;20354:2;20343:9;20339:18;20331:26;;20403:9;20397:4;20393:20;20389:1;20378:9;20374:17;20367:47;20431:131;20557:4;20431:131;:::i;:::-;20423:139;;20150:419;;;:::o;20575:173::-;20715:25;20711:1;20703:6;20699:14;20692:49;20575:173;:::o;20754:366::-;20896:3;20917:67;20981:2;20976:3;20917:67;:::i;:::-;20910:74;;20993:93;21082:3;20993:93;:::i;:::-;21111:2;21106:3;21102:12;21095:19;;20754:366;;;:::o;21126:419::-;21292:4;21330:2;21319:9;21315:18;21307:26;;21379:9;21373:4;21369:20;21365:1;21354:9;21350:17;21343:47;21407:131;21533:4;21407:131;:::i;:::-;21399:139;;21126:419;;;:::o;21551:180::-;21599:77;21596:1;21589:88;21696:4;21693:1;21686:15;21720:4;21717:1;21710:15;21737:194;21777:4;21797:20;21815:1;21797:20;:::i;:::-;21792:25;;21831:20;21849:1;21831:20;:::i;:::-;21826:25;;21875:1;21872;21868:9;21860:17;;21899:1;21893:4;21890:11;21887:37;;;21904:18;;:::i;:::-;21887:37;21737:194;;;;:::o;21937:191::-;21977:3;21996:20;22014:1;21996:20;:::i;:::-;21991:25;;22030:20;22048:1;22030:20;:::i;:::-;22025:25;;22073:1;22070;22066:9;22059:16;;22094:3;22091:1;22088:10;22085:36;;;22101:18;;:::i;:::-;22085:36;21937:191;;;;:::o;22134:94::-;22167:8;22215:5;22211:2;22207:14;22186:35;;22134:94;;;:::o;22234:::-;22273:7;22302:20;22316:5;22302:20;:::i;:::-;22291:31;;22234:94;;;:::o;22334:100::-;22373:7;22402:26;22422:5;22402:26;:::i;:::-;22391:37;;22334:100;;;:::o;22440:157::-;22545:45;22565:24;22583:5;22565:24;:::i;:::-;22545:45;:::i;:::-;22540:3;22533:58;22440:157;;:::o;22603:79::-;22642:7;22671:5;22660:16;;22603:79;;;:::o;22688:157::-;22793:45;22813:24;22831:5;22813:24;:::i;:::-;22793:45;:::i;:::-;22788:3;22781:58;22688:157;;:::o;22851:397::-;22991:3;23006:75;23077:3;23068:6;23006:75;:::i;:::-;23106:2;23101:3;23097:12;23090:19;;23119:75;23190:3;23181:6;23119:75;:::i;:::-;23219:2;23214:3;23210:12;23203:19;;23239:3;23232:10;;22851:397;;;;;:::o;23254:180::-;23302:77;23299:1;23292:88;23399:4;23396:1;23389:15;23423:4;23420:1;23413:15;23440:176;23472:1;23489:20;23507:1;23489:20;:::i;:::-;23484:25;;23523:20;23541:1;23523:20;:::i;:::-;23518:25;;23562:1;23552:35;;23567:18;;:::i;:::-;23552:35;23608:1;23605;23601:9;23596:14;;23440:176;;;;:::o;23622:233::-;23661:3;23684:24;23702:5;23684:24;:::i;:::-;23675:33;;23730:66;23723:5;23720:77;23717:103;;23800:18;;:::i;:::-;23717:103;23847:1;23840:5;23836:13;23829:20;;23622:233;;;:::o;23861:148::-;23963:11;24000:3;23985:18;;23861:148;;;;:::o;24015:171::-;24155:23;24151:1;24143:6;24139:14;24132:47;24015:171;:::o;24192:402::-;24352:3;24373:85;24455:2;24450:3;24373:85;:::i;:::-;24366:92;;24467:93;24556:3;24467:93;:::i;:::-;24585:2;24580:3;24576:12;24569:19;;24192:402;;;:::o;24600:390::-;24706:3;24734:39;24767:5;24734:39;:::i;:::-;24789:89;24871:6;24866:3;24789:89;:::i;:::-;24782:96;;24887:65;24945:6;24940:3;24933:4;24926:5;24922:16;24887:65;:::i;:::-;24977:6;24972:3;24968:16;24961:23;;24710:280;24600:390;;;;:::o;24996:541::-;25229:3;25251:148;25395:3;25251:148;:::i;:::-;25244:155;;25416:95;25507:3;25498:6;25416:95;:::i;:::-;25409:102;;25528:3;25521:10;;24996:541;;;;:::o;25543:169::-;25683:21;25679:1;25671:6;25667:14;25660:45;25543:169;:::o;25718:402::-;25878:3;25899:85;25981:2;25976:3;25899:85;:::i;:::-;25892:92;;25993:93;26082:3;25993:93;:::i;:::-;26111:2;26106:3;26102:12;26095:19;;25718:402;;;:::o;26126:541::-;26359:3;26381:148;26525:3;26381:148;:::i;:::-;26374:155;;26546:95;26637:3;26628:6;26546:95;:::i;:::-;26539:102;;26658:3;26651:10;;26126:541;;;;:::o;26673:141::-;26722:4;26745:3;26737:11;;26768:3;26765:1;26758:14;26802:4;26799:1;26789:18;26781:26;;26673:141;;;:::o;26820:93::-;26857:6;26904:2;26899;26892:5;26888:14;26884:23;26874:33;;26820:93;;;:::o;26919:107::-;26963:8;27013:5;27007:4;27003:16;26982:37;;26919:107;;;;:::o;27032:393::-;27101:6;27151:1;27139:10;27135:18;27174:97;27204:66;27193:9;27174:97;:::i;:::-;27292:39;27322:8;27311:9;27292:39;:::i;:::-;27280:51;;27364:4;27360:9;27353:5;27349:21;27340:30;;27413:4;27403:8;27399:19;27392:5;27389:30;27379:40;;27108:317;;27032:393;;;;;:::o;27431:142::-;27481:9;27514:53;27532:34;27541:24;27559:5;27541:24;:::i;:::-;27532:34;:::i;:::-;27514:53;:::i;:::-;27501:66;;27431:142;;;:::o;27579:75::-;27622:3;27643:5;27636:12;;27579:75;;;:::o;27660:269::-;27770:39;27801:7;27770:39;:::i;:::-;27831:91;27880:41;27904:16;27880:41;:::i;:::-;27872:6;27865:4;27859:11;27831:91;:::i;:::-;27825:4;27818:105;27736:193;27660:269;;;:::o;27935:73::-;27980:3;27935:73;:::o;28014:189::-;28091:32;;:::i;:::-;28132:65;28190:6;28182;28176:4;28132:65;:::i;:::-;28067:136;28014:189;;:::o;28209:186::-;28269:120;28286:3;28279:5;28276:14;28269:120;;;28340:39;28377:1;28370:5;28340:39;:::i;:::-;28313:1;28306:5;28302:13;28293:22;;28269:120;;;28209:186;;:::o;28401:543::-;28502:2;28497:3;28494:11;28491:446;;;28536:38;28568:5;28536:38;:::i;:::-;28620:29;28638:10;28620:29;:::i;:::-;28610:8;28606:44;28803:2;28791:10;28788:18;28785:49;;;28824:8;28809:23;;28785:49;28847:80;28903:22;28921:3;28903:22;:::i;:::-;28893:8;28889:37;28876:11;28847:80;:::i;:::-;28506:431;;28491:446;28401:543;;;:::o;28950:117::-;29004:8;29054:5;29048:4;29044:16;29023:37;;28950:117;;;;:::o;29073:169::-;29117:6;29150:51;29198:1;29194:6;29186:5;29183:1;29179:13;29150:51;:::i;:::-;29146:56;29231:4;29225;29221:15;29211:25;;29124:118;29073:169;;;;:::o;29247:295::-;29323:4;29469:29;29494:3;29488:4;29469:29;:::i;:::-;29461:37;;29531:3;29528:1;29524:11;29518:4;29515:21;29507:29;;29247:295;;;;:::o;29547:1395::-;29664:37;29697:3;29664:37;:::i;:::-;29766:18;29758:6;29755:30;29752:56;;;29788:18;;:::i;:::-;29752:56;29832:38;29864:4;29858:11;29832:38;:::i;:::-;29917:67;29977:6;29969;29963:4;29917:67;:::i;:::-;30011:1;30035:4;30022:17;;30067:2;30059:6;30056:14;30084:1;30079:618;;;;30741:1;30758:6;30755:77;;;30807:9;30802:3;30798:19;30792:26;30783:35;;30755:77;30858:67;30918:6;30911:5;30858:67;:::i;:::-;30852:4;30845:81;30714:222;30049:887;;30079:618;30131:4;30127:9;30119:6;30115:22;30165:37;30197:4;30165:37;:::i;:::-;30224:1;30238:208;30252:7;30249:1;30246:14;30238:208;;;30331:9;30326:3;30322:19;30316:26;30308:6;30301:42;30382:1;30374:6;30370:14;30360:24;;30429:2;30418:9;30414:18;30401:31;;30275:4;30272:1;30268:12;30263:17;;30238:208;;;30474:6;30465:7;30462:19;30459:179;;;30532:9;30527:3;30523:19;30517:26;30575:48;30617:4;30609:6;30605:17;30594:9;30575:48;:::i;:::-;30567:6;30560:64;30482:156;30459:179;30684:1;30680;30672:6;30668:14;30664:22;30658:4;30651:36;30086:611;;;30049:887;;29639:1303;;;29547:1395;;:::o;30948:533::-;31117:4;31155:2;31144:9;31140:18;31132:26;;31168:71;31236:1;31225:9;31221:17;31212:6;31168:71;:::i;:::-;31249:72;31317:2;31306:9;31302:18;31293:6;31249:72;:::i;:::-;31368:9;31362:4;31358:20;31353:2;31342:9;31338:18;31331:48;31396:78;31469:4;31460:6;31396:78;:::i;:::-;31388:86;;30948:533;;;;;;:::o;31487:160::-;31627:12;31623:1;31615:6;31611:14;31604:36;31487:160;:::o;31653:366::-;31795:3;31816:67;31880:2;31875:3;31816:67;:::i;:::-;31809:74;;31892:93;31981:3;31892:93;:::i;:::-;32010:2;32005:3;32001:12;31994:19;;31653:366;;;:::o;32025:419::-;32191:4;32229:2;32218:9;32214:18;32206:26;;32278:9;32272:4;32268:20;32264:1;32253:9;32249:17;32242:47;32306:131;32432:4;32306:131;:::i;:::-;32298:139;;32025:419;;;:::o;32450:228::-;32590:34;32586:1;32578:6;32574:14;32567:58;32659:11;32654:2;32646:6;32642:15;32635:36;32450:228;:::o;32684:366::-;32826:3;32847:67;32911:2;32906:3;32847:67;:::i;:::-;32840:74;;32923:93;33012:3;32923:93;:::i;:::-;33041:2;33036:3;33032:12;33025:19;;32684:366;;;:::o;33056:419::-;33222:4;33260:2;33249:9;33245:18;33237:26;;33309:9;33303:4;33299:20;33295:1;33284:9;33280:17;33273:47;33337:131;33463:4;33337:131;:::i;:::-;33329:139;;33056:419;;;:::o;33481:180::-;33529:77;33526:1;33519:88;33626:4;33623:1;33616:15;33650:4;33647:1;33640:15;33667:236;33807:34;33803:1;33795:6;33791:14;33784:58;33876:19;33871:2;33863:6;33859:15;33852:44;33667:236;:::o;33909:366::-;34051:3;34072:67;34136:2;34131:3;34072:67;:::i;:::-;34065:74;;34148:93;34237:3;34148:93;:::i;:::-;34266:2;34261:3;34257:12;34250:19;;33909:366;;;:::o;34281:419::-;34447:4;34485:2;34474:9;34470:18;34462:26;;34534:9;34528:4;34524:20;34520:1;34509:9;34505:17;34498:47;34562:131;34688:4;34562:131;:::i;:::-;34554:139;;34281:419;;;:::o;34706:153::-;34759:6;34793:5;34787:12;34777:22;;34819:33;34845:6;34819:33;:::i;:::-;34809:43;;34706:153;;;:::o;34865:145::-;34918:4;34941:3;34933:11;;34964:3;34961:1;34954:14;34998:4;34995:1;34985:18;34977:26;;34865:145;;;:::o;35016:1463::-;35131:3;35125:4;35122:13;35119:26;;35138:5;;;;35119:26;35169:38;35203:3;35169:38;:::i;:::-;35272:18;35264:6;35261:30;35258:56;;;35294:18;;:::i;:::-;35258:56;35338:38;35370:4;35364:11;35338:38;:::i;:::-;35423:67;35483:6;35475;35469:4;35423:67;:::i;:::-;35517:1;35546:2;35538:6;35535:14;35563:1;35558:676;;;;36278:1;36295:6;36292:77;;;36344:9;36339:3;36335:19;36329:26;36320:35;;36292:77;36395:67;36455:6;36448:5;36395:67;:::i;:::-;36389:4;36382:81;36251:222;35528:945;;35558:676;35610:4;35606:9;35598:6;35594:22;35636:40;35672:3;35636:40;:::i;:::-;35629:47;;35703:37;35735:4;35703:37;:::i;:::-;35762:1;35776:207;35790:7;35787:1;35784:14;35776:207;;;35869:9;35864:3;35860:19;35854:26;35846:6;35839:42;35920:1;35912:6;35908:14;35898:24;;35967:1;35956:9;35952:17;35939:30;;35813:4;35810:1;35806:12;35801:17;;35776:207;;;36011:6;36002:7;35999:19;35996:179;;;36069:9;36064:3;36060:19;36054:26;36112:48;36154:4;36146:6;36142:17;36131:9;36112:48;:::i;:::-;36104:6;36097:64;36019:156;35996:179;36221:1;36217;36209:6;36205:14;36201:22;36195:4;36188:36;35565:669;;;35528:945;;35109:1370;;;35016:1463;;;:::o;36485:231::-;36625:34;36621:1;36613:6;36609:14;36602:58;36694:14;36689:2;36681:6;36677:15;36670:39;36485:231;:::o;36722:366::-;36864:3;36885:67;36949:2;36944:3;36885:67;:::i;:::-;36878:74;;36961:93;37050:3;36961:93;:::i;:::-;37079:2;37074:3;37070:12;37063:19;;36722:366;;;:::o;37094:419::-;37260:4;37298:2;37287:9;37283:18;37275:26;;37347:9;37341:4;37337:20;37333:1;37322:9;37318:17;37311:47;37375:131;37501:4;37375:131;:::i;:::-;37367:139;;37094:419;;;:::o;37519:167::-;37659:19;37655:1;37647:6;37643:14;37636:43;37519:167;:::o;37692:402::-;37852:3;37873:85;37955:2;37950:3;37873:85;:::i;:::-;37866:92;;37967:93;38056:3;37967:93;:::i;:::-;38085:2;38080:3;38076:12;38069:19;;37692:402;;;:::o;38100:541::-;38333:3;38355:148;38499:3;38355:148;:::i;:::-;38348:155;;38520:95;38611:3;38602:6;38520:95;:::i;:::-;38513:102;;38632:3;38625:10;;38100:541;;;;:::o;38647:174::-;38787:26;38783:1;38775:6;38771:14;38764:50;38647:174;:::o;38827:366::-;38969:3;38990:67;39054:2;39049:3;38990:67;:::i;:::-;38983:74;;39066:93;39155:3;39066:93;:::i;:::-;39184:2;39179:3;39175:12;39168:19;;38827:366;;;:::o;39199:419::-;39365:4;39403:2;39392:9;39388:18;39380:26;;39452:9;39446:4;39442:20;39438:1;39427:9;39423:17;39416:47;39480:131;39606:4;39480:131;:::i;:::-;39472:139;;39199:419;;;:::o;39624:161::-;39764:13;39760:1;39752:6;39748:14;39741:37;39624:161;:::o;39791:366::-;39933:3;39954:67;40018:2;40013:3;39954:67;:::i;:::-;39947:74;;40030:93;40119:3;40030:93;:::i;:::-;40148:2;40143:3;40139:12;40132:19;;39791:366;;;:::o;40163:419::-;40329:4;40367:2;40356:9;40352:18;40344:26;;40416:9;40410:4;40406:20;40402:1;40391:9;40387:17;40380:47;40444:131;40570:4;40444:131;:::i;:::-;40436:139;;40163:419;;;:::o;40588:435::-;40768:3;40790:95;40881:3;40872:6;40790:95;:::i;:::-;40783:102;;40902:95;40993:3;40984:6;40902:95;:::i;:::-;40895:102;;41014:3;41007:10;;40588:435;;;;;:::o;41029:185::-;41069:1;41086:20;41104:1;41086:20;:::i;:::-;41081:25;;41120:20;41138:1;41120:20;:::i;:::-;41115:25;;41159:1;41149:35;;41164:18;;:::i;:::-;41149:35;41206:1;41203;41199:9;41194:14;;41029:185;;;;:::o;41220:410::-;41260:7;41283:20;41301:1;41283:20;:::i;:::-;41278:25;;41317:20;41335:1;41317:20;:::i;:::-;41312:25;;41372:1;41369;41365:9;41394:30;41412:11;41394:30;:::i;:::-;41383:41;;41573:1;41564:7;41560:15;41557:1;41554:22;41534:1;41527:9;41507:83;41484:139;;41603:18;;:::i;:::-;41484:139;41268:362;41220:410;;;;:::o;41636:171::-;41675:3;41698:24;41716:5;41698:24;:::i;:::-;41689:33;;41744:4;41737:5;41734:15;41731:41;;41752:18;;:::i;:::-;41731:41;41799:1;41792:5;41788:13;41781:20;;41636:171;;;:::o;41813:114::-;41880:6;41914:5;41908:12;41898:22;;41813:114;;;:::o;41933:184::-;42032:11;42066:6;42061:3;42054:19;42106:4;42101:3;42097:14;42082:29;;41933:184;;;;:::o;42123:132::-;42190:4;42213:3;42205:11;;42243:4;42238:3;42234:14;42226:22;;42123:132;;;:::o;42261:108::-;42338:24;42356:5;42338:24;:::i;:::-;42333:3;42326:37;42261:108;;:::o;42375:179::-;42444:10;42465:46;42507:3;42499:6;42465:46;:::i;:::-;42543:4;42538:3;42534:14;42520:28;;42375:179;;;;:::o;42560:113::-;42630:4;42662;42657:3;42653:14;42645:22;;42560:113;;;:::o;42709:732::-;42828:3;42857:54;42905:5;42857:54;:::i;:::-;42927:86;43006:6;43001:3;42927:86;:::i;:::-;42920:93;;43037:56;43087:5;43037:56;:::i;:::-;43116:7;43147:1;43132:284;43157:6;43154:1;43151:13;43132:284;;;43233:6;43227:13;43260:63;43319:3;43304:13;43260:63;:::i;:::-;43253:70;;43346:60;43399:6;43346:60;:::i;:::-;43336:70;;43192:224;43179:1;43176;43172:9;43167:14;;43132:284;;;43136:14;43432:3;43425:10;;42833:608;;;42709:732;;;;:::o;43447:373::-;43590:4;43628:2;43617:9;43613:18;43605:26;;43677:9;43671:4;43667:20;43663:1;43652:9;43648:17;43641:47;43705:108;43808:4;43799:6;43705:108;:::i;:::-;43697:116;;43447:373;;;;:::o;43826:224::-;43966:34;43962:1;43954:6;43950:14;43943:58;44035:7;44030:2;44022:6;44018:15;44011:32;43826:224;:::o;44056:366::-;44198:3;44219:67;44283:2;44278:3;44219:67;:::i;:::-;44212:74;;44295:93;44384:3;44295:93;:::i;:::-;44413:2;44408:3;44404:12;44397:19;;44056:366;;;:::o;44428:419::-;44594:4;44632:2;44621:9;44617:18;44609:26;;44681:9;44675:4;44671:20;44667:1;44656:9;44652:17;44645:47;44709:131;44835:4;44709:131;:::i;:::-;44701:139;;44428:419;;;:::o;44853:223::-;44993:34;44989:1;44981:6;44977:14;44970:58;45062:6;45057:2;45049:6;45045:15;45038:31;44853:223;:::o;45082:366::-;45224:3;45245:67;45309:2;45304:3;45245:67;:::i;:::-;45238:74;;45321:93;45410:3;45321:93;:::i;:::-;45439:2;45434:3;45430:12;45423:19;;45082:366;;;:::o;45454:419::-;45620:4;45658:2;45647:9;45643:18;45635:26;;45707:9;45701:4;45697:20;45693:1;45682:9;45678:17;45671:47;45735:131;45861:4;45735:131;:::i;:::-;45727:139;;45454:419;;;:::o;45879:86::-;45914:7;45954:4;45947:5;45943:16;45932:27;;45879:86;;;:::o;45971:188::-;46009:3;46028:18;46044:1;46028:18;:::i;:::-;46023:23;;46060:18;46076:1;46060:18;:::i;:::-;46055:23;;46101:1;46098;46094:9;46087:16;;46124:4;46119:3;46116:13;46113:39;;;46132:18;;:::i;:::-;46113:39;45971:188;;;;:::o;46165:175::-;46305:27;46301:1;46293:6;46289:14;46282:51;46165:175;:::o;46346:366::-;46488:3;46509:67;46573:2;46568:3;46509:67;:::i;:::-;46502:74;;46585:93;46674:3;46585:93;:::i;:::-;46703:2;46698:3;46694:12;46687:19;;46346:366;;;:::o;46718:419::-;46884:4;46922:2;46911:9;46907:18;46899:26;;46971:9;46965:4;46961:20;46957:1;46946:9;46942:17;46935:47;46999:131;47125:4;46999:131;:::i;:::-;46991:139;;46718:419;;;:::o;47143:237::-;47283:34;47279:1;47271:6;47267:14;47260:58;47352:20;47347:2;47339:6;47335:15;47328:45;47143:237;:::o;47386:366::-;47528:3;47549:67;47613:2;47608:3;47549:67;:::i;:::-;47542:74;;47625:93;47714:3;47625:93;:::i;:::-;47743:2;47738:3;47734:12;47727:19;;47386:366;;;:::o;47758:419::-;47924:4;47962:2;47951:9;47947:18;47939:26;;48011:9;48005:4;48001:20;47997:1;47986:9;47982:17;47975:47;48039:131;48165:4;48039:131;:::i;:::-;48031:139;;47758:419;;;:::o;48183:98::-;48234:6;48268:5;48262:12;48252:22;;48183:98;;;:::o;48287:168::-;48370:11;48404:6;48399:3;48392:19;48444:4;48439:3;48435:14;48420:29;;48287:168;;;;:::o;48461:373::-;48547:3;48575:38;48607:5;48575:38;:::i;:::-;48629:70;48692:6;48687:3;48629:70;:::i;:::-;48622:77;;48708:65;48766:6;48761:3;48754:4;48747:5;48743:16;48708:65;:::i;:::-;48798:29;48820:6;48798:29;:::i;:::-;48793:3;48789:39;48782:46;;48551:283;48461:373;;;;:::o;48840:640::-;49035:4;49073:3;49062:9;49058:19;49050:27;;49087:71;49155:1;49144:9;49140:17;49131:6;49087:71;:::i;:::-;49168:72;49236:2;49225:9;49221:18;49212:6;49168:72;:::i;:::-;49250;49318:2;49307:9;49303:18;49294:6;49250:72;:::i;:::-;49369:9;49363:4;49359:20;49354:2;49343:9;49339:18;49332:48;49397:76;49468:4;49459:6;49397:76;:::i;:::-;49389:84;;48840:640;;;;;;;:::o;49486:141::-;49542:5;49573:6;49567:13;49558:22;;49589:32;49615:5;49589:32;:::i;:::-;49486:141;;;;:::o;49633:349::-;49702:6;49751:2;49739:9;49730:7;49726:23;49722:32;49719:119;;;49757:79;;:::i;:::-;49719:119;49877:1;49902:63;49957:7;49948:6;49937:9;49933:22;49902:63;:::i;:::-;49892:73;;49848:127;49633:349;;;;:::o;49988:182::-;50128:34;50124:1;50116:6;50112:14;50105:58;49988:182;:::o;50176:366::-;50318:3;50339:67;50403:2;50398:3;50339:67;:::i;:::-;50332:74;;50415:93;50504:3;50415:93;:::i;:::-;50533:2;50528:3;50524:12;50517:19;;50176:366;;;:::o;50548:419::-;50714:4;50752:2;50741:9;50737:18;50729:26;;50801:9;50795:4;50791:20;50787:1;50776:9;50772:17;50765:47;50829:131;50955:4;50829:131;:::i;:::-;50821:139;;50548:419;;;:::o;50973:178::-;51113:30;51109:1;51101:6;51097:14;51090:54;50973:178;:::o;51157:366::-;51299:3;51320:67;51384:2;51379:3;51320:67;:::i;:::-;51313:74;;51396:93;51485:3;51396:93;:::i;:::-;51514:2;51509:3;51505:12;51498:19;;51157:366;;;:::o;51529:419::-;51695:4;51733:2;51722:9;51718:18;51710:26;;51782:9;51776:4;51772:20;51768:1;51757:9;51753:17;51746:47;51810:131;51936:4;51810:131;:::i;:::-;51802:139;;51529:419;;;:::o

Swarm Source

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