ETH Price: $3,621.12 (+5.83%)

Token

OrdinalSkulls (OS)
 

Overview

Max Total Supply

100 OS

Holders

23

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A

Other Info

Balance
18 OS
0xdB5d7E2dc031488DD4985f6293FD5885e0dd9836
Loading...
Loading
Loading...
Loading
Loading...
Loading

Click here to update the token information / general information
# Exchange Pair Price  24H Volume % Volume

Contract Source Code Verified (Exact Match)

Contract Name:
OrdinalSkulls

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 Etherscan.io on 2023-02-09
*/

// SPDX-License-Identifier: MIT

// File: @openzeppelin/contracts/utils/math/Math.sol

// 100 Skulls minted on the ordinal Blockchain from Inscription 5000-7700. This token represents an opportunity to purchase your Skull for .025 BTC. 

// genesis transaction deaf2c41f8a685b9159edee25460b61774b4ab577ff4a65151b0d42a18b1d19e

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

pragma solidity ^0.8.0;

/**
 * @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.0;

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

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

// File: @openzeppelin/contracts/access/Ownable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (access/Ownable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which provides a basic access control mechanism, where
 * there is an account (an owner) that can be granted exclusive access to
 * specific functions.
 *
 * By default, the owner account will be the one that deploys the contract. This
 * can later be changed with {transferOwnership}.
 *
 * This module is used through inheritance. It will make available the modifier
 * `onlyOwner`, which can be applied to your functions to restrict their use to
 * the owner.
 */
abstract contract Ownable is Context {
    address private _owner;

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

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        _checkOwner();
        _;
    }

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

    /**
     * @dev Throws if the sender is not the owner.
     */
    function _checkOwner() internal view virtual {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
    }

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

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

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

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


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

pragma solidity ^0.8.1;

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

        return account.code.length > 0;
    }

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

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

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


// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)

pragma solidity ^0.8.0;


/**
 * @dev Interface for the NFT Royalty Standard.
 *
 * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal
 * support for royalty payments across all NFT marketplaces and ecosystem participants.
 *
 * _Available since v4.5._
 */
interface IERC2981 is IERC165 {
    /**
     * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of
     * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.
     */
    function royaltyInfo(uint256 tokenId, uint256 salePrice)
        external
        view
        returns (address receiver, uint256 royaltyAmount);
}

// 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/common/ERC2981.sol


// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)

pragma solidity ^0.8.0;



/**
 * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.
 *
 * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for
 * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the
 * fee is specified in basis points by default.
 *
 * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See
 * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to
 * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.
 *
 * _Available since v4.5._
 */
abstract contract ERC2981 is IERC2981, ERC165 {
    struct RoyaltyInfo {
        address receiver;
        uint96 royaltyFraction;
    }

    RoyaltyInfo private _defaultRoyaltyInfo;
    mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;

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

    /**
     * @inheritdoc IERC2981
     */
    function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {
        RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];

        if (royalty.receiver == address(0)) {
            royalty = _defaultRoyaltyInfo;
        }

        uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();

        return (royalty.receiver, royaltyAmount);
    }

    /**
     * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a
     * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an
     * override.
     */
    function _feeDenominator() internal pure virtual returns (uint96) {
        return 10000;
    }

    /**
     * @dev Sets the royalty information that all ids in this contract will default to.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: invalid receiver");

        _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Removes default royalty information.
     */
    function _deleteDefaultRoyalty() internal virtual {
        delete _defaultRoyaltyInfo;
    }

    /**
     * @dev Sets the royalty information for a specific token id, overriding the global default.
     *
     * Requirements:
     *
     * - `receiver` cannot be the zero address.
     * - `feeNumerator` cannot be greater than the fee denominator.
     */
    function _setTokenRoyalty(
        uint256 tokenId,
        address receiver,
        uint96 feeNumerator
    ) internal virtual {
        require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice");
        require(receiver != address(0), "ERC2981: Invalid parameters");

        _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);
    }

    /**
     * @dev Resets royalty information for the token id back to the global default.
     */
    function _resetTokenRoyalty(uint256 tokenId) internal virtual {
        delete _tokenRoyaltyInfo[tokenId];
    }
}

// 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/extensions/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: 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 and Enumerable extensions
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
  using Address for address;
  using Strings for uint256;

  string private _name;
  string private _symbol;

  // nft ownership + burns data
  address[] public owners;
  uint public burnedTokens;

  function totalSupply() public override view returns (uint256) {
    return owners.length - burnedTokens;
  }

  function tokenByIndex(uint256 id) public override pure returns (uint256) {
    return id;
  }
  function tokenOfOwnerByIndex(address user, uint256 id) public override view returns (uint256) {
    uint256 ownedCount = 0;
    for(uint i = 0; i < owners.length; i++) {
      if(owners[i] == user) {
        if(ownedCount == id) {
          return i;
        } else {
          ownedCount++;
        }
      }
    }

    revert("ID_TOO_HIGH");
  }

  // 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: balance query for the zero address");
    uint count;
    for(uint i = 0; i < owners.length; i++) {
      if(owner == owners[i]) {
        count++;
      }
    }
    return count;
  }

  /**
  * @dev See {IERC721-ownerOf}.
  */
  function ownerOf(uint256 tokenId) public view virtual override returns (address) {
    require(tokenId < owners.length, "ERC721: owner query for nonexistent token");
    address owner = owners[tokenId];
    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) {
    require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

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

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

  /**
  * @dev See {IERC721-approve}.
  */
  function approve(address to, uint256 tokenId) public 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 owner nor approved for all"
    );

    _approve(to, tokenId);
  }

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

    return _tokenApprovals[tokenId];
  }

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

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

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

  /**
  * @dev See {IERC721-transferFrom}.
  */
  function transferFrom(
    address from,
    address to,
    uint256 tokenId
  ) public virtual override {
    //solhint-disable-next-line max-line-length
    require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor 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: transfer caller is not owner nor 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 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 owners.length > tokenId && owners[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) {
    require(_exists(tokenId), "ERC721: operator query for nonexistent token");
    address owner = ERC721.ownerOf(tokenId);
    return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, 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), "ALREADY_MINTED");

    owners.push(to);
    emit Transfer(address(0), to, tokenId);
  }

  /**
  * @dev Destroys `tokenId`.
  * The approval is cleared when the token is burned.
    *
    * Requirements:
    *
    * - `tokenId` must exist.
    *
    * Emits a {Transfer} event.
    */
  function _burn(uint256 tokenId) internal virtual {
    address owner = ERC721.ownerOf(tokenId);

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

    // Clear approvals
    _approve(address(0), tokenId);

    // delete owners[tokenId];
    owners[tokenId] = address(0);
    burnedTokens++;

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

  /**
  * @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 of token that is not own");
    require(to != address(0), "ERC721: transfer to the zero address");

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

    owners[tokenId] = to;

    emit Transfer(from, to, tokenId);
  }

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

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


// File: OrdinalSkulls.sol


pragma solidity ^0.8.0;






contract OrdinalSkulls is ERC721, ERC2981, Ownable {

  //---------------------------------------------------------------
  //  CONSTANTS
  //---------------------------------------------------------------
  uint public constant MAX_SUPPLY     = 100;
  uint public constant MAX_PER_WALLET = 20;
  uint public constant MINT_PRICE     = .0025 ether;
  bool public isRevealed;
  bool public paused;

  //---------------------------------------------------------------
  //  METADATA
  //---------------------------------------------------------------
  string public baseURI;
  string public coverURI;

  function tokenURI(uint id) public view virtual override returns (string memory) {
    require(_exists(id), "ERC721Metadata: URI query for nonexistent token");
    if(!isRevealed) {
      return coverURI;
    }

    return string(abi.encodePacked(baseURI, Strings.toString(id), ".json"));
  }

  //---------------------------------------------------------------
  //  CONSTRUCTOR
  //---------------------------------------------------------------

  constructor(string memory _coverURI, address collectionReceiever) ERC721("OrdinalSkulls", "OS") {
    paused = true;
    coverURI = _coverURI;
    _setDefaultRoyalty(_msgSender(), 1000);

    for(uint i = 0; i < 7; ++i) {
      _safeMint(collectionReceiever, owners.length);
    }
  }

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

  function mint(uint amount) public payable {
    require(!paused, "MINT_PAUSED");
    require(owners.length + amount <= MAX_SUPPLY, "MAX_SUPPLY");
    require(msg.value == (amount * MINT_PRICE), "WRONG_CANTO_VALUE");

    minters[_msgSender()] += amount;
    require(minters[_msgSender()] <= MAX_PER_WALLET, "ADDRESS_MAX_REACHED");
    for(uint i = 0; i < amount; i++) {
      _safeMint(_msgSender(), owners.length);
    }
  }

  mapping (address => uint) public minters;

  function burn(uint id) public {
    _burn(id);
  }

  //----------------------------------------------------------------
  //  ADMIN FUNCTIONS
  //----------------------------------------------------------------

  function setCoverURI(string memory uri) public onlyOwner {
    coverURI = uri;
  }
  function setBaseURI(string memory uri) public onlyOwner {
    baseURI = uri;
  }
  function setIsRevealed(bool _isRevealed) public onlyOwner {
    isRevealed = _isRevealed;
  }
  function setPaused(bool _paused) public onlyOwner {
    paused = _paused;
  }

  //---------------------------------------------------------------
  // WITHDRAWAL
  //---------------------------------------------------------------

  function withdraw(address to, uint amount) public onlyOwner {
    (bool success,) = payable(to).call{ value: amount }("");
    require(success, "WITHDRAWAL_FAILED");
  }

  //---------------------------------------------------------------
  // ROYALTIES
  //---------------------------------------------------------------

  /**
   * @dev Sets the royalty information that all ids in this contract will default to.
   *
   * Requirements:
   *
   * - `receiver` cannot be the zero address.
   * - `feeNumerator` cannot be greater than the fee denominator.
   */
  function setDefaultRoyalty(address receiver, uint96 feeNumerator) public onlyOwner {
    _setDefaultRoyalty(receiver, feeNumerator);
  }
  /**
   * @dev Sets the royalty information for a specific token id, overriding the global default.
   *
   * Requirements:
   *
   * - `receiver` cannot be the zero address.
   * - `feeNumerator` cannot be greater than the fee denominator.
   */
  function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) public onlyOwner {
    _setTokenRoyalty(tokenId, receiver, feeNumerator);
  }

  /**
   * @dev Resets royalty information for the token id back to the global default.
   */
  function resetTokenRoyalty(uint256 tokenId) public onlyOwner {
    _resetTokenRoyalty(tokenId);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"_coverURI","type":"string"},{"internalType":"address","name":"collectionReceiever","type":"address"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"MAX_PER_WALLET","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_SUPPLY","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINT_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"burnedTokens","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"coverURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"isRevealed","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"","type":"address"}],"name":"minters","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"owners","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"resetTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_tokenId","type":"uint256"},{"internalType":"uint256","name":"_salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"string","name":"uri","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"setCoverURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_isRevealed","type":"bool"}],"name":"setIsRevealed","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bool","name":"_paused","type":"bool"}],"name":"setPaused","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setTokenRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"pure","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"id","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"withdraw","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162005bb738038062005bb7833981810160405281019062000037919062000a62565b6040518060400160405280600d81526020017f4f7264696e616c536b756c6c73000000000000000000000000000000000000008152506040518060400160405280600281526020017f4f530000000000000000000000000000000000000000000000000000000000008152508160009081620000b4919062000d13565b508060019081620000c6919062000d13565b505050620000e9620000dd6200017a60201b60201c565b6200018260201b60201c565b6001600860156101000a81548160ff02191690831515021790555081600a908162000115919062000d13565b50620001396200012a6200017a60201b60201c565b6103e86200024860201b60201c565b60005b600781101562000171576200015d82600280549050620003eb60201b60201c565b80620001699062000e29565b90506200013c565b5050506200129e565b600033905090565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b620002586200041160201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620002b9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002b09062000efd565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036200032b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620003229062000f6f565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600660008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6200040d8282604051806020016040528060008152506200041b60201b60201c565b5050565b6000612710905090565b6200042d83836200048960201b60201c565b6200044260008484846200061260201b60201c565b62000484576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200047b9062001007565b60405180910390fd5b505050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603620004fb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620004f29062001079565b60405180910390fd5b6200050c81620007bb60201b60201c565b156200054f576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200054690620010eb565b60405180910390fd5b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620006408473ffffffffffffffffffffffffffffffffffffffff166200084760201b62001b3e1760201c565b15620007ae578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02620006726200017a60201b60201c565b8786866040518563ffffffff1660e01b81526004016200069694939291906200118c565b6020604051808303816000875af1925050508015620006d557506040513d601f19601f82011682018060405250810190620006d291906200123d565b60015b6200075d573d806000811462000708576040519150601f19603f3d011682016040523d82523d6000602084013e6200070d565b606091505b50600081510362000755576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200074c9062001007565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050620007b3565b600190505b949350505050565b600081600280549050118015620008405750600073ffffffffffffffffffffffffffffffffffffffff1660028381548110620007fc57620007fb6200126f565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620008d38262000888565b810181811067ffffffffffffffff82111715620008f557620008f462000899565b5b80604052505050565b60006200090a6200086a565b9050620009188282620008c8565b919050565b600067ffffffffffffffff8211156200093b576200093a62000899565b5b620009468262000888565b9050602081019050919050565b60005b838110156200097357808201518184015260208101905062000956565b60008484015250505050565b60006200099662000990846200091d565b620008fe565b905082815260208101848484011115620009b557620009b462000883565b5b620009c284828562000953565b509392505050565b600082601f830112620009e257620009e16200087e565b5b8151620009f48482602086016200097f565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b600062000a2a82620009fd565b9050919050565b62000a3c8162000a1d565b811462000a4857600080fd5b50565b60008151905062000a5c8162000a31565b92915050565b6000806040838503121562000a7c5762000a7b62000874565b5b600083015167ffffffffffffffff81111562000a9d5762000a9c62000879565b5b62000aab85828601620009ca565b925050602062000abe8582860162000a4b565b9150509250929050565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000600282049050600182168062000b1b57607f821691505b60208210810362000b315762000b3062000ad3565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830262000b9b7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8262000b5c565b62000ba7868362000b5c565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000bf462000bee62000be88462000bbf565b62000bc9565b62000bbf565b9050919050565b6000819050919050565b62000c108362000bd3565b62000c2862000c1f8262000bfb565b84845462000b69565b825550505050565b600090565b62000c3f62000c30565b62000c4c81848462000c05565b505050565b5b8181101562000c745762000c6860008262000c35565b60018101905062000c52565b5050565b601f82111562000cc35762000c8d8162000b37565b62000c988462000b4c565b8101602085101562000ca8578190505b62000cc062000cb78562000b4c565b83018262000c51565b50505b505050565b600082821c905092915050565b600062000ce86000198460080262000cc8565b1980831691505092915050565b600062000d03838362000cd5565b9150826002028217905092915050565b62000d1e8262000ac8565b67ffffffffffffffff81111562000d3a5762000d3962000899565b5b62000d46825462000b02565b62000d5382828562000c78565b600060209050601f83116001811462000d8b576000841562000d76578287015190505b62000d82858262000cf5565b86555062000df2565b601f19841662000d9b8662000b37565b60005b8281101562000dc55784890151825560018201915060208501945060208101905062000d9e565b8683101562000de5578489015162000de1601f89168262000cd5565b8355505b6001600288020188555050505b505050505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b600062000e368262000bbf565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff820362000e6b5762000e6a62000dfa565b5b600182019050919050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000ee5602a8362000e76565b915062000ef28262000e87565b604082019050919050565b6000602082019050818103600083015262000f188162000ed6565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000f5760198362000e76565b915062000f648262000f1f565b602082019050919050565b6000602082019050818103600083015262000f8a8162000f48565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b600062000fef60328362000e76565b915062000ffc8262000f91565b604082019050919050565b60006020820190508181036000830152620010228162000fe0565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b60006200106160208362000e76565b91506200106e8262001029565b602082019050919050565b60006020820190508181036000830152620010948162001052565b9050919050565b7f414c52454144595f4d494e544544000000000000000000000000000000000000600082015250565b6000620010d3600e8362000e76565b9150620010e0826200109b565b602082019050919050565b600060208201905081810360008301526200110681620010c4565b9050919050565b620011188162000a1d565b82525050565b620011298162000bbf565b82525050565b600081519050919050565b600082825260208201905092915050565b600062001158826200112f565b6200116481856200113a565b93506200117681856020860162000953565b620011818162000888565b840191505092915050565b6000608082019050620011a360008301876200110d565b620011b260208301866200110d565b620011c160408301856200111e565b8181036060830152620011d581846200114b565b905095945050505050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6200121781620011e0565b81146200122357600080fd5b50565b60008151905062001237816200120c565b92915050565b60006020828403121562001256576200125562000874565b5b6000620012668482850162001226565b91505092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b61490980620012ae6000396000f3fe60806040526004361061023b5760003560e01c8063580397061161012e578063a0712d68116100ab578063e985e9c51161006f578063e985e9c514610889578063ecd783c4146108c6578063f2fde38b146108ef578063f3fef3a314610918578063f46eccc4146109415761023b565b8063a0712d68146107b3578063a22cb465146107cf578063b88d4fde146107f8578063c002d23d14610821578063c87b56dd1461084c5761023b565b806370a08231116100f257806370a08231146106e0578063715018a61461071d5780638a616bc0146107345780638da5cb5b1461075d57806395d89b41146107885761023b565b806358039706146105f95780635944c753146106245780635c975abb1461064d5780636352211e146106785780636c0360eb146106b55761023b565b80632a55205a116101bc57806347b5dd541161018057806347b5dd541461051457806349a5980a1461053f5780634f6ccce71461056857806354214f69146105a557806355f804b3146105d05761023b565b80632a55205a1461041c5780632f745c591461045a57806332cb6b0c1461049757806342842e0e146104c257806342966c68146104eb5761023b565b8063095ea7b311610203578063095ea7b31461034b5780630f2cdd6c1461037457806316c38b3c1461039f57806318160ddd146103c857806323b872dd146103f35761023b565b806301ffc9a714610240578063025e7c271461027d57806304634d8d146102ba57806306fdde03146102e3578063081812fc1461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190612dc3565b61097e565b6040516102749190612e0b565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f9190612e5c565b610990565b6040516102b19190612eca565b60405180910390f35b3480156102c657600080fd5b506102e160048036038101906102dc9190612f55565b6109cf565b005b3480156102ef57600080fd5b506102f86109e5565b6040516103059190613025565b60405180910390f35b34801561031a57600080fd5b5061033560048036038101906103309190612e5c565b610a77565b6040516103429190612eca565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d9190613047565b610afc565b005b34801561038057600080fd5b50610389610c13565b6040516103969190613096565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c191906130dd565b610c18565b005b3480156103d457600080fd5b506103dd610c3d565b6040516103ea9190613096565b60405180910390f35b3480156103ff57600080fd5b5061041a6004803603810190610415919061310a565b610c57565b005b34801561042857600080fd5b50610443600480360381019061043e919061315d565b610cb7565b60405161045192919061319d565b60405180910390f35b34801561046657600080fd5b50610481600480360381019061047c9190613047565b610ea1565b60405161048e9190613096565b60405180910390f35b3480156104a357600080fd5b506104ac610f9e565b6040516104b99190613096565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e4919061310a565b610fa3565b005b3480156104f757600080fd5b50610512600480360381019061050d9190612e5c565b610fc3565b005b34801561052057600080fd5b50610529610fcf565b6040516105369190613096565b60405180910390f35b34801561054b57600080fd5b50610566600480360381019061056191906130dd565b610fd5565b005b34801561057457600080fd5b5061058f600480360381019061058a9190612e5c565b610ffa565b60405161059c9190613096565b60405180910390f35b3480156105b157600080fd5b506105ba611004565b6040516105c79190612e0b565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f291906132fb565b611017565b005b34801561060557600080fd5b5061060e611032565b60405161061b9190613025565b60405180910390f35b34801561063057600080fd5b5061064b60048036038101906106469190613344565b6110c0565b005b34801561065957600080fd5b506106626110d8565b60405161066f9190612e0b565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a9190612e5c565b6110eb565b6040516106ac9190612eca565b60405180910390f35b3480156106c157600080fd5b506106ca611180565b6040516106d79190613025565b60405180910390f35b3480156106ec57600080fd5b5061070760048036038101906107029190613397565b61120e565b6040516107149190613096565b60405180910390f35b34801561072957600080fd5b50610732611330565b005b34801561074057600080fd5b5061075b60048036038101906107569190612e5c565b611344565b005b34801561076957600080fd5b50610772611358565b60405161077f9190612eca565b60405180910390f35b34801561079457600080fd5b5061079d611382565b6040516107aa9190613025565b60405180910390f35b6107cd60048036038101906107c89190612e5c565b611414565b005b3480156107db57600080fd5b506107f660048036038101906107f191906133c4565b61162b565b005b34801561080457600080fd5b5061081f600480360381019061081a91906134a5565b6117ab565b005b34801561082d57600080fd5b5061083661180d565b6040516108439190613096565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190612e5c565b611818565b6040516108809190613025565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab9190613528565b61193b565b6040516108bd9190612e0b565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e891906132fb565b6119cf565b005b3480156108fb57600080fd5b5061091660048036038101906109119190613397565b6119ea565b005b34801561092457600080fd5b5061093f600480360381019061093a9190613047565b611a6d565b005b34801561094d57600080fd5b5061096860048036038101906109639190613397565b611b26565b6040516109759190613096565b60405180910390f35b600061098982611b61565b9050919050565b600281815481106109a057600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109d7611bdb565b6109e18282611c59565b5050565b6060600080546109f490613597565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2090613597565b8015610a6d5780601f10610a4257610100808354040283529160200191610a6d565b820191906000526020600020905b815481529060010190602001808311610a5057829003601f168201915b5050505050905090565b6000610a8282611dee565b610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab89061363a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b07826110eb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6e906136cc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b96611e76565b73ffffffffffffffffffffffffffffffffffffffff161480610bc55750610bc481610bbf611e76565b61193b565b5b610c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfb9061375e565b60405180910390fd5b610c0e8383611e7e565b505050565b601481565b610c20611bdb565b80600860156101000a81548160ff02191690831515021790555050565b6000600354600280549050610c5291906137ad565b905090565b610c68610c62611e76565b82611f37565b610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90613853565b60405180910390fd5b610cb2838383612015565b505050565b6000806000600760008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610e4c5760066040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610e566121c2565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610e829190613873565b610e8c91906138e4565b90508160000151819350935050509250929050565b6000806000905060005b600280549050811015610f5c578473ffffffffffffffffffffffffffffffffffffffff1660028281548110610ee357610ee2613915565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610f4957838203610f3a578092505050610f98565b8180610f4590613944565b9250505b8080610f5490613944565b915050610eab565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8f906139d8565b60405180910390fd5b92915050565b606481565b610fbe838383604051806020016040528060008152506117ab565b505050565b610fcc816121cc565b50565b60035481565b610fdd611bdb565b80600860146101000a81548160ff02191690831515021790555050565b6000819050919050565b600860149054906101000a900460ff1681565b61101f611bdb565b806009908161102e9190613ba4565b5050565b600a805461103f90613597565b80601f016020809104026020016040519081016040528092919081815260200182805461106b90613597565b80156110b85780601f1061108d576101008083540402835291602001916110b8565b820191906000526020600020905b81548152906001019060200180831161109b57829003601f168201915b505050505081565b6110c8611bdb565b6110d3838383612347565b505050565b600860159054906101000a900460ff1681565b60006002805490508210611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b90613ce8565b60405180910390fd5b60006002838154811061114a57611149613915565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080915050919050565b6009805461118d90613597565b80601f01602080910402602001604051908101604052809291908181526020018280546111b990613597565b80156112065780601f106111db57610100808354040283529160200191611206565b820191906000526020600020905b8154815290600101906020018083116111e957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361127e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127590613d7a565b60405180910390fd5b600080600090505b60028054905081101561132657600281815481106112a7576112a6613915565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361131357818061130f90613944565b9250505b808061131e90613944565b915050611286565b5080915050919050565b611338611bdb565b61134260006124ee565b565b61134c611bdb565b611355816125b4565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461139190613597565b80601f01602080910402602001604051908101604052809291908181526020018280546113bd90613597565b801561140a5780601f106113df5761010080835404028352916020019161140a565b820191906000526020600020905b8154815290600101906020018083116113ed57829003601f168201915b5050505050905090565b600860159054906101000a900460ff1615611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90613de6565b60405180910390fd5b6064816002805490506114779190613e06565b11156114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90613e86565b60405180910390fd5b6608e1bc9bf04000816114cb9190613873565b341461150c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150390613ef2565b60405180910390fd5b80600b6000611519611e76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115629190613e06565b925050819055506014600b6000611577611e76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea90613f5e565b60405180910390fd5b60005b8181101561162757611614611609611e76565b600280549050612613565b808061161f90613944565b9150506115f6565b5050565b611633611e76565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169790613fca565b60405180910390fd5b80600560006116ad611e76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661175a611e76565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161179f9190612e0b565b60405180910390a35050565b6117bc6117b6611e76565b83611f37565b6117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f290613853565b60405180910390fd5b61180784848484612631565b50505050565b6608e1bc9bf0400081565b606061182382611dee565b611862576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118599061405c565b60405180910390fd5b600860149054906101000a900460ff1661190857600a805461188390613597565b80601f01602080910402602001604051908101604052809291908181526020018280546118af90613597565b80156118fc5780601f106118d1576101008083540402835291602001916118fc565b820191906000526020600020905b8154815290600101906020018083116118df57829003601f168201915b50505050509050611936565b60096119138361268d565b604051602001611924929190614187565b60405160208183030381529060405290505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119d7611bdb565b80600a90816119e69190613ba4565b5050565b6119f2611bdb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5890614228565b60405180910390fd5b611a6a816124ee565b50565b611a75611bdb565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611a9b90614279565b60006040518083038185875af1925050503d8060008114611ad8576040519150601f19603f3d011682016040523d82523d6000602084013e611add565b606091505b5050905080611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b18906142da565b60405180910390fd5b505050565b600b6020528060005260406000206000915090505481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611bd45750611bd38261275b565b5b9050919050565b611be3611e76565b73ffffffffffffffffffffffffffffffffffffffff16611c01611358565b73ffffffffffffffffffffffffffffffffffffffff1614611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e90614346565b60405180910390fd5b565b611c616121c2565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb6906143d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2590614444565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600660008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600081600280549050118015611e6f5750600073ffffffffffffffffffffffffffffffffffffffff1660028381548110611e2b57611e2a613915565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ef1836110eb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f4282611dee565b611f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f78906144d6565b60405180910390fd5b6000611f8c836110eb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ffb57508373ffffffffffffffffffffffffffffffffffffffff16611fe384610a77565b73ffffffffffffffffffffffffffffffffffffffff16145b8061200c575061200b818561193b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612035826110eb565b73ffffffffffffffffffffffffffffffffffffffff161461208b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208290614568565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f1906145fa565b60405180910390fd5b612105600082611e7e565b816002828154811061211a57612119613915565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612710905090565b60006121d7826110eb565b90508073ffffffffffffffffffffffffffffffffffffffff166121f8611e76565b73ffffffffffffffffffffffffffffffffffffffff161480612227575061222681612221611e76565b61193b565b5b612266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225d9061375e565b60405180910390fd5b612271600083611e7e565b60006002838154811061228757612286613915565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906122e290613944565b919050555081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61234f6121c2565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156123ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a4906143d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361241c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241390614666565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506007600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60076000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b61262d82826040518060200160405280600081525061283d565b5050565b61263c848484612015565b61264884848484612898565b612687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267e906146f8565b60405180910390fd5b50505050565b60606000600161269c84612a1f565b01905060008167ffffffffffffffff8111156126bb576126ba6131d0565b5b6040519080825280601f01601f1916602001820160405280156126ed5781602001600182028036833780820191505090505b509050600082602001820190505b600115612750578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612744576127436138b5565b5b049450600085036126fb575b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061282657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612836575061283582612b72565b5b9050919050565b6128478383612bdc565b6128546000848484612898565b612893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288a906146f8565b60405180910390fd5b505050565b60006128b98473ffffffffffffffffffffffffffffffffffffffff16611b3e565b15612a12578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128e2611e76565b8786866040518563ffffffff1660e01b8152600401612904949392919061476d565b6020604051808303816000875af192505050801561294057506040513d601f19601f8201168201806040525081019061293d91906147ce565b60015b6129c2573d8060008114612970576040519150601f19603f3d011682016040523d82523d6000602084013e612975565b606091505b5060008151036129ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b1906146f8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a17565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612a7d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612a7357612a726138b5565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612aba576d04ee2d6d415b85acef81000000008381612ab057612aaf6138b5565b5b0492506020810190505b662386f26fc100008310612ae957662386f26fc100008381612adf57612ade6138b5565b5b0492506010810190505b6305f5e1008310612b12576305f5e1008381612b0857612b076138b5565b5b0492506008810190505b6127108310612b37576127108381612b2d57612b2c6138b5565b5b0492506004810190505b60648310612b5a5760648381612b5057612b4f6138b5565b5b0492506002810190505b600a8310612b69576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4290614847565b60405180910390fd5b612c5481611dee565b15612c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8b906148b3565b60405180910390fd5b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612da081612d6b565b8114612dab57600080fd5b50565b600081359050612dbd81612d97565b92915050565b600060208284031215612dd957612dd8612d61565b5b6000612de784828501612dae565b91505092915050565b60008115159050919050565b612e0581612df0565b82525050565b6000602082019050612e206000830184612dfc565b92915050565b6000819050919050565b612e3981612e26565b8114612e4457600080fd5b50565b600081359050612e5681612e30565b92915050565b600060208284031215612e7257612e71612d61565b5b6000612e8084828501612e47565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612eb482612e89565b9050919050565b612ec481612ea9565b82525050565b6000602082019050612edf6000830184612ebb565b92915050565b612eee81612ea9565b8114612ef957600080fd5b50565b600081359050612f0b81612ee5565b92915050565b60006bffffffffffffffffffffffff82169050919050565b612f3281612f11565b8114612f3d57600080fd5b50565b600081359050612f4f81612f29565b92915050565b60008060408385031215612f6c57612f6b612d61565b5b6000612f7a85828601612efc565b9250506020612f8b85828601612f40565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fcf578082015181840152602081019050612fb4565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ff782612f95565b6130018185612fa0565b9350613011818560208601612fb1565b61301a81612fdb565b840191505092915050565b6000602082019050818103600083015261303f8184612fec565b905092915050565b6000806040838503121561305e5761305d612d61565b5b600061306c85828601612efc565b925050602061307d85828601612e47565b9150509250929050565b61309081612e26565b82525050565b60006020820190506130ab6000830184613087565b92915050565b6130ba81612df0565b81146130c557600080fd5b50565b6000813590506130d7816130b1565b92915050565b6000602082840312156130f3576130f2612d61565b5b6000613101848285016130c8565b91505092915050565b60008060006060848603121561312357613122612d61565b5b600061313186828701612efc565b935050602061314286828701612efc565b925050604061315386828701612e47565b9150509250925092565b6000806040838503121561317457613173612d61565b5b600061318285828601612e47565b925050602061319385828601612e47565b9150509250929050565b60006040820190506131b26000830185612ebb565b6131bf6020830184613087565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61320882612fdb565b810181811067ffffffffffffffff82111715613227576132266131d0565b5b80604052505050565b600061323a612d57565b905061324682826131ff565b919050565b600067ffffffffffffffff821115613266576132656131d0565b5b61326f82612fdb565b9050602081019050919050565b82818337600083830152505050565b600061329e6132998461324b565b613230565b9050828152602081018484840111156132ba576132b96131cb565b5b6132c584828561327c565b509392505050565b600082601f8301126132e2576132e16131c6565b5b81356132f284826020860161328b565b91505092915050565b60006020828403121561331157613310612d61565b5b600082013567ffffffffffffffff81111561332f5761332e612d66565b5b61333b848285016132cd565b91505092915050565b60008060006060848603121561335d5761335c612d61565b5b600061336b86828701612e47565b935050602061337c86828701612efc565b925050604061338d86828701612f40565b9150509250925092565b6000602082840312156133ad576133ac612d61565b5b60006133bb84828501612efc565b91505092915050565b600080604083850312156133db576133da612d61565b5b60006133e985828601612efc565b92505060206133fa858286016130c8565b9150509250929050565b600067ffffffffffffffff82111561341f5761341e6131d0565b5b61342882612fdb565b9050602081019050919050565b600061344861344384613404565b613230565b905082815260208101848484011115613464576134636131cb565b5b61346f84828561327c565b509392505050565b600082601f83011261348c5761348b6131c6565b5b813561349c848260208601613435565b91505092915050565b600080600080608085870312156134bf576134be612d61565b5b60006134cd87828801612efc565b94505060206134de87828801612efc565b93505060406134ef87828801612e47565b925050606085013567ffffffffffffffff8111156135105761350f612d66565b5b61351c87828801613477565b91505092959194509250565b6000806040838503121561353f5761353e612d61565b5b600061354d85828601612efc565b925050602061355e85828601612efc565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135af57607f821691505b6020821081036135c2576135c1613568565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613624602c83612fa0565b915061362f826135c8565b604082019050919050565b6000602082019050818103600083015261365381613617565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006136b6602183612fa0565b91506136c18261365a565b604082019050919050565b600060208201905081810360008301526136e5816136a9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613748603883612fa0565b9150613753826136ec565b604082019050919050565b600060208201905081810360008301526137778161373b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137b882612e26565b91506137c383612e26565b92508282039050818111156137db576137da61377e565b5b92915050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061383d603183612fa0565b9150613848826137e1565b604082019050919050565b6000602082019050818103600083015261386c81613830565b9050919050565b600061387e82612e26565b915061388983612e26565b925082820261389781612e26565b915082820484148315176138ae576138ad61377e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006138ef82612e26565b91506138fa83612e26565b92508261390a576139096138b5565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061394f82612e26565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139815761398061377e565b5b600182019050919050565b7f49445f544f4f5f48494748000000000000000000000000000000000000000000600082015250565b60006139c2600b83612fa0565b91506139cd8261398c565b602082019050919050565b600060208201905081810360008301526139f1816139b5565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613a5a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a1d565b613a648683613a1d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613aa1613a9c613a9784612e26565b613a7c565b612e26565b9050919050565b6000819050919050565b613abb83613a86565b613acf613ac782613aa8565b848454613a2a565b825550505050565b600090565b613ae4613ad7565b613aef818484613ab2565b505050565b5b81811015613b1357613b08600082613adc565b600181019050613af5565b5050565b601f821115613b5857613b29816139f8565b613b3284613a0d565b81016020851015613b41578190505b613b55613b4d85613a0d565b830182613af4565b50505b505050565b600082821c905092915050565b6000613b7b60001984600802613b5d565b1980831691505092915050565b6000613b948383613b6a565b9150826002028217905092915050565b613bad82612f95565b67ffffffffffffffff811115613bc657613bc56131d0565b5b613bd08254613597565b613bdb828285613b17565b600060209050601f831160018114613c0e5760008415613bfc578287015190505b613c068582613b88565b865550613c6e565b601f198416613c1c866139f8565b60005b82811015613c4457848901518255600182019150602085019450602081019050613c1f565b86831015613c615784890151613c5d601f891682613b6a565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613cd2602983612fa0565b9150613cdd82613c76565b604082019050919050565b60006020820190508181036000830152613d0181613cc5565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613d64602a83612fa0565b9150613d6f82613d08565b604082019050919050565b60006020820190508181036000830152613d9381613d57565b9050919050565b7f4d494e545f504155534544000000000000000000000000000000000000000000600082015250565b6000613dd0600b83612fa0565b9150613ddb82613d9a565b602082019050919050565b60006020820190508181036000830152613dff81613dc3565b9050919050565b6000613e1182612e26565b9150613e1c83612e26565b9250828201905080821115613e3457613e3361377e565b5b92915050565b7f4d41585f535550504c5900000000000000000000000000000000000000000000600082015250565b6000613e70600a83612fa0565b9150613e7b82613e3a565b602082019050919050565b60006020820190508181036000830152613e9f81613e63565b9050919050565b7f57524f4e475f43414e544f5f56414c5545000000000000000000000000000000600082015250565b6000613edc601183612fa0565b9150613ee782613ea6565b602082019050919050565b60006020820190508181036000830152613f0b81613ecf565b9050919050565b7f414444524553535f4d41585f5245414348454400000000000000000000000000600082015250565b6000613f48601383612fa0565b9150613f5382613f12565b602082019050919050565b60006020820190508181036000830152613f7781613f3b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613fb4601983612fa0565b9150613fbf82613f7e565b602082019050919050565b60006020820190508181036000830152613fe381613fa7565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614046602f83612fa0565b915061405182613fea565b604082019050919050565b6000602082019050818103600083015261407581614039565b9050919050565b600081905092915050565b6000815461409481613597565b61409e818661407c565b945060018216600081146140b957600181146140ce57614101565b60ff1983168652811515820286019350614101565b6140d7856139f8565b60005b838110156140f9578154818901526001820191506020810190506140da565b838801955050505b50505092915050565b600061411582612f95565b61411f818561407c565b935061412f818560208601612fb1565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061417160058361407c565b915061417c8261413b565b600582019050919050565b60006141938285614087565b915061419f828461410a565b91506141aa82614164565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614212602683612fa0565b915061421d826141b6565b604082019050919050565b6000602082019050818103600083015261424181614205565b9050919050565b600081905092915050565b50565b6000614263600083614248565b915061426e82614253565b600082019050919050565b600061428482614256565b9150819050919050565b7f5749544844524157414c5f4641494c4544000000000000000000000000000000600082015250565b60006142c4601183612fa0565b91506142cf8261428e565b602082019050919050565b600060208201905081810360008301526142f3816142b7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614330602083612fa0565b915061433b826142fa565b602082019050919050565b6000602082019050818103600083015261435f81614323565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006143c2602a83612fa0565b91506143cd82614366565b604082019050919050565b600060208201905081810360008301526143f1816143b5565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061442e601983612fa0565b9150614439826143f8565b602082019050919050565b6000602082019050818103600083015261445d81614421565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006144c0602c83612fa0565b91506144cb82614464565b604082019050919050565b600060208201905081810360008301526144ef816144b3565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614552602983612fa0565b915061455d826144f6565b604082019050919050565b6000602082019050818103600083015261458181614545565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006145e4602483612fa0565b91506145ef82614588565b604082019050919050565b60006020820190508181036000830152614613816145d7565b9050919050565b7f455243323938313a20496e76616c696420706172616d65746572730000000000600082015250565b6000614650601b83612fa0565b915061465b8261461a565b602082019050919050565b6000602082019050818103600083015261467f81614643565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006146e2603283612fa0565b91506146ed82614686565b604082019050919050565b60006020820190508181036000830152614711816146d5565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061473f82614718565b6147498185614723565b9350614759818560208601612fb1565b61476281612fdb565b840191505092915050565b60006080820190506147826000830187612ebb565b61478f6020830186612ebb565b61479c6040830185613087565b81810360608301526147ae8184614734565b905095945050505050565b6000815190506147c881612d97565b92915050565b6000602082840312156147e4576147e3612d61565b5b60006147f2848285016147b9565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614831602083612fa0565b915061483c826147fb565b602082019050919050565b6000602082019050818103600083015261486081614824565b9050919050565b7f414c52454144595f4d494e544544000000000000000000000000000000000000600082015250565b600061489d600e83612fa0565b91506148a882614867565b602082019050919050565b600060208201905081810360008301526148cc81614890565b905091905056fea264697066735822122035e96cf6611b48f138efaabcb37bb5b4e662f0e3d23d2f12fa2694345a25b3eb64736f6c634300081100330000000000000000000000000000000000000000000000000000000000000040000000000000000000000000554384b10988cde2e3d84676d9cc70e9e24a7f5d000000000000000000000000000000000000000000000000000000000000006568747470733a2f2f6a6164652d6f63636173696f6e616c2d766963756e612d31372e6d7970696e6174612e636c6f75642f697066732f516d54745477627a535538724a4572537346596a77556642335951584261425a4c46654e44344b6e6359335070422f000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x60806040526004361061023b5760003560e01c8063580397061161012e578063a0712d68116100ab578063e985e9c51161006f578063e985e9c514610889578063ecd783c4146108c6578063f2fde38b146108ef578063f3fef3a314610918578063f46eccc4146109415761023b565b8063a0712d68146107b3578063a22cb465146107cf578063b88d4fde146107f8578063c002d23d14610821578063c87b56dd1461084c5761023b565b806370a08231116100f257806370a08231146106e0578063715018a61461071d5780638a616bc0146107345780638da5cb5b1461075d57806395d89b41146107885761023b565b806358039706146105f95780635944c753146106245780635c975abb1461064d5780636352211e146106785780636c0360eb146106b55761023b565b80632a55205a116101bc57806347b5dd541161018057806347b5dd541461051457806349a5980a1461053f5780634f6ccce71461056857806354214f69146105a557806355f804b3146105d05761023b565b80632a55205a1461041c5780632f745c591461045a57806332cb6b0c1461049757806342842e0e146104c257806342966c68146104eb5761023b565b8063095ea7b311610203578063095ea7b31461034b5780630f2cdd6c1461037457806316c38b3c1461039f57806318160ddd146103c857806323b872dd146103f35761023b565b806301ffc9a714610240578063025e7c271461027d57806304634d8d146102ba57806306fdde03146102e3578063081812fc1461030e575b600080fd5b34801561024c57600080fd5b5061026760048036038101906102629190612dc3565b61097e565b6040516102749190612e0b565b60405180910390f35b34801561028957600080fd5b506102a4600480360381019061029f9190612e5c565b610990565b6040516102b19190612eca565b60405180910390f35b3480156102c657600080fd5b506102e160048036038101906102dc9190612f55565b6109cf565b005b3480156102ef57600080fd5b506102f86109e5565b6040516103059190613025565b60405180910390f35b34801561031a57600080fd5b5061033560048036038101906103309190612e5c565b610a77565b6040516103429190612eca565b60405180910390f35b34801561035757600080fd5b50610372600480360381019061036d9190613047565b610afc565b005b34801561038057600080fd5b50610389610c13565b6040516103969190613096565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c191906130dd565b610c18565b005b3480156103d457600080fd5b506103dd610c3d565b6040516103ea9190613096565b60405180910390f35b3480156103ff57600080fd5b5061041a6004803603810190610415919061310a565b610c57565b005b34801561042857600080fd5b50610443600480360381019061043e919061315d565b610cb7565b60405161045192919061319d565b60405180910390f35b34801561046657600080fd5b50610481600480360381019061047c9190613047565b610ea1565b60405161048e9190613096565b60405180910390f35b3480156104a357600080fd5b506104ac610f9e565b6040516104b99190613096565b60405180910390f35b3480156104ce57600080fd5b506104e960048036038101906104e4919061310a565b610fa3565b005b3480156104f757600080fd5b50610512600480360381019061050d9190612e5c565b610fc3565b005b34801561052057600080fd5b50610529610fcf565b6040516105369190613096565b60405180910390f35b34801561054b57600080fd5b50610566600480360381019061056191906130dd565b610fd5565b005b34801561057457600080fd5b5061058f600480360381019061058a9190612e5c565b610ffa565b60405161059c9190613096565b60405180910390f35b3480156105b157600080fd5b506105ba611004565b6040516105c79190612e0b565b60405180910390f35b3480156105dc57600080fd5b506105f760048036038101906105f291906132fb565b611017565b005b34801561060557600080fd5b5061060e611032565b60405161061b9190613025565b60405180910390f35b34801561063057600080fd5b5061064b60048036038101906106469190613344565b6110c0565b005b34801561065957600080fd5b506106626110d8565b60405161066f9190612e0b565b60405180910390f35b34801561068457600080fd5b5061069f600480360381019061069a9190612e5c565b6110eb565b6040516106ac9190612eca565b60405180910390f35b3480156106c157600080fd5b506106ca611180565b6040516106d79190613025565b60405180910390f35b3480156106ec57600080fd5b5061070760048036038101906107029190613397565b61120e565b6040516107149190613096565b60405180910390f35b34801561072957600080fd5b50610732611330565b005b34801561074057600080fd5b5061075b60048036038101906107569190612e5c565b611344565b005b34801561076957600080fd5b50610772611358565b60405161077f9190612eca565b60405180910390f35b34801561079457600080fd5b5061079d611382565b6040516107aa9190613025565b60405180910390f35b6107cd60048036038101906107c89190612e5c565b611414565b005b3480156107db57600080fd5b506107f660048036038101906107f191906133c4565b61162b565b005b34801561080457600080fd5b5061081f600480360381019061081a91906134a5565b6117ab565b005b34801561082d57600080fd5b5061083661180d565b6040516108439190613096565b60405180910390f35b34801561085857600080fd5b50610873600480360381019061086e9190612e5c565b611818565b6040516108809190613025565b60405180910390f35b34801561089557600080fd5b506108b060048036038101906108ab9190613528565b61193b565b6040516108bd9190612e0b565b60405180910390f35b3480156108d257600080fd5b506108ed60048036038101906108e891906132fb565b6119cf565b005b3480156108fb57600080fd5b5061091660048036038101906109119190613397565b6119ea565b005b34801561092457600080fd5b5061093f600480360381019061093a9190613047565b611a6d565b005b34801561094d57600080fd5b5061096860048036038101906109639190613397565b611b26565b6040516109759190613096565b60405180910390f35b600061098982611b61565b9050919050565b600281815481106109a057600080fd5b906000526020600020016000915054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b6109d7611bdb565b6109e18282611c59565b5050565b6060600080546109f490613597565b80601f0160208091040260200160405190810160405280929190818152602001828054610a2090613597565b8015610a6d5780601f10610a4257610100808354040283529160200191610a6d565b820191906000526020600020905b815481529060010190602001808311610a5057829003601f168201915b5050505050905090565b6000610a8282611dee565b610ac1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ab89061363a565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b07826110eb565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6e906136cc565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610b96611e76565b73ffffffffffffffffffffffffffffffffffffffff161480610bc55750610bc481610bbf611e76565b61193b565b5b610c04576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610bfb9061375e565b60405180910390fd5b610c0e8383611e7e565b505050565b601481565b610c20611bdb565b80600860156101000a81548160ff02191690831515021790555050565b6000600354600280549050610c5291906137ad565b905090565b610c68610c62611e76565b82611f37565b610ca7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c9e90613853565b60405180910390fd5b610cb2838383612015565b505050565b6000806000600760008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610e4c5760066040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610e566121c2565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610e829190613873565b610e8c91906138e4565b90508160000151819350935050509250929050565b6000806000905060005b600280549050811015610f5c578473ffffffffffffffffffffffffffffffffffffffff1660028281548110610ee357610ee2613915565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1603610f4957838203610f3a578092505050610f98565b8180610f4590613944565b9250505b8080610f5490613944565b915050610eab565b506040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f8f906139d8565b60405180910390fd5b92915050565b606481565b610fbe838383604051806020016040528060008152506117ab565b505050565b610fcc816121cc565b50565b60035481565b610fdd611bdb565b80600860146101000a81548160ff02191690831515021790555050565b6000819050919050565b600860149054906101000a900460ff1681565b61101f611bdb565b806009908161102e9190613ba4565b5050565b600a805461103f90613597565b80601f016020809104026020016040519081016040528092919081815260200182805461106b90613597565b80156110b85780601f1061108d576101008083540402835291602001916110b8565b820191906000526020600020905b81548152906001019060200180831161109b57829003601f168201915b505050505081565b6110c8611bdb565b6110d3838383612347565b505050565b600860159054906101000a900460ff1681565b60006002805490508210611134576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161112b90613ce8565b60405180910390fd5b60006002838154811061114a57611149613915565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905080915050919050565b6009805461118d90613597565b80601f01602080910402602001604051908101604052809291908181526020018280546111b990613597565b80156112065780601f106111db57610100808354040283529160200191611206565b820191906000526020600020905b8154815290600101906020018083116111e957829003601f168201915b505050505081565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361127e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161127590613d7a565b60405180910390fd5b600080600090505b60028054905081101561132657600281815481106112a7576112a6613915565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff160361131357818061130f90613944565b9250505b808061131e90613944565b915050611286565b5080915050919050565b611338611bdb565b61134260006124ee565b565b61134c611bdb565b611355816125b4565b50565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b60606001805461139190613597565b80601f01602080910402602001604051908101604052809291908181526020018280546113bd90613597565b801561140a5780601f106113df5761010080835404028352916020019161140a565b820191906000526020600020905b8154815290600101906020018083116113ed57829003601f168201915b5050505050905090565b600860159054906101000a900460ff1615611464576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161145b90613de6565b60405180910390fd5b6064816002805490506114779190613e06565b11156114b8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114af90613e86565b60405180910390fd5b6608e1bc9bf04000816114cb9190613873565b341461150c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161150390613ef2565b60405180910390fd5b80600b6000611519611e76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546115629190613e06565b925050819055506014600b6000611577611e76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000205411156115f3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115ea90613f5e565b60405180910390fd5b60005b8181101561162757611614611609611e76565b600280549050612613565b808061161f90613944565b9150506115f6565b5050565b611633611e76565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036116a0576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161169790613fca565b60405180910390fd5b80600560006116ad611e76565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661175a611e76565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161179f9190612e0b565b60405180910390a35050565b6117bc6117b6611e76565b83611f37565b6117fb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117f290613853565b60405180910390fd5b61180784848484612631565b50505050565b6608e1bc9bf0400081565b606061182382611dee565b611862576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118599061405c565b60405180910390fd5b600860149054906101000a900460ff1661190857600a805461188390613597565b80601f01602080910402602001604051908101604052809291908181526020018280546118af90613597565b80156118fc5780601f106118d1576101008083540402835291602001916118fc565b820191906000526020600020905b8154815290600101906020018083116118df57829003601f168201915b50505050509050611936565b60096119138361268d565b604051602001611924929190614187565b60405160208183030381529060405290505b919050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6119d7611bdb565b80600a90816119e69190613ba4565b5050565b6119f2611bdb565b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603611a61576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a5890614228565b60405180910390fd5b611a6a816124ee565b50565b611a75611bdb565b60008273ffffffffffffffffffffffffffffffffffffffff1682604051611a9b90614279565b60006040518083038185875af1925050503d8060008114611ad8576040519150601f19603f3d011682016040523d82523d6000602084013e611add565b606091505b5050905080611b21576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b18906142da565b60405180910390fd5b505050565b600b6020528060005260406000206000915090505481565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611bd45750611bd38261275b565b5b9050919050565b611be3611e76565b73ffffffffffffffffffffffffffffffffffffffff16611c01611358565b73ffffffffffffffffffffffffffffffffffffffff1614611c57576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c4e90614346565b60405180910390fd5b565b611c616121c2565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115611cbf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb6906143d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611d2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d2590614444565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600660008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b600081600280549050118015611e6f5750600073ffffffffffffffffffffffffffffffffffffffff1660028381548110611e2b57611e2a613915565b5b9060005260206000200160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614155b9050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611ef1836110eb565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611f4282611dee565b611f81576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f78906144d6565b60405180910390fd5b6000611f8c836110eb565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611ffb57508373ffffffffffffffffffffffffffffffffffffffff16611fe384610a77565b73ffffffffffffffffffffffffffffffffffffffff16145b8061200c575061200b818561193b565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16612035826110eb565b73ffffffffffffffffffffffffffffffffffffffff161461208b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161208290614568565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16036120fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120f1906145fa565b60405180910390fd5b612105600082611e7e565b816002828154811061211a57612119613915565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6000612710905090565b60006121d7826110eb565b90508073ffffffffffffffffffffffffffffffffffffffff166121f8611e76565b73ffffffffffffffffffffffffffffffffffffffff161480612227575061222681612221611e76565b61193b565b5b612266576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161225d9061375e565b60405180910390fd5b612271600083611e7e565b60006002838154811061228757612286613915565b5b9060005260206000200160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550600360008154809291906122e290613944565b919050555081600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61234f6121c2565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff1611156123ad576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123a4906143d8565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361241c576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161241390614666565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff168152506007600085815260200190815260200160002060008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff160217905550905050505050565b6000600860009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905081600860006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508173ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b60076000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b61262d82826040518060200160405280600081525061283d565b5050565b61263c848484612015565b61264884848484612898565b612687576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161267e906146f8565b60405180910390fd5b50505050565b60606000600161269c84612a1f565b01905060008167ffffffffffffffff8111156126bb576126ba6131d0565b5b6040519080825280601f01601f1916602001820160405280156126ed5781602001600182028036833780820191505090505b509050600082602001820190505b600115612750578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a8581612744576127436138b5565b5b049450600085036126fb575b819350505050919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061282657507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612836575061283582612b72565b5b9050919050565b6128478383612bdc565b6128546000848484612898565b612893576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161288a906146f8565b60405180910390fd5b505050565b60006128b98473ffffffffffffffffffffffffffffffffffffffff16611b3e565b15612a12578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128e2611e76565b8786866040518563ffffffff1660e01b8152600401612904949392919061476d565b6020604051808303816000875af192505050801561294057506040513d601f19601f8201168201806040525081019061293d91906147ce565b60015b6129c2573d8060008114612970576040519150601f19603f3d011682016040523d82523d6000602084013e612975565b606091505b5060008151036129ba576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129b1906146f8565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612a17565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612a7d577a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008381612a7357612a726138b5565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612aba576d04ee2d6d415b85acef81000000008381612ab057612aaf6138b5565b5b0492506020810190505b662386f26fc100008310612ae957662386f26fc100008381612adf57612ade6138b5565b5b0492506010810190505b6305f5e1008310612b12576305f5e1008381612b0857612b076138b5565b5b0492506008810190505b6127108310612b37576127108381612b2d57612b2c6138b5565b5b0492506004810190505b60648310612b5a5760648381612b5057612b4f6138b5565b5b0492506002810190505b600a8310612b69576001810190505b80915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603612c4b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c4290614847565b60405180910390fd5b612c5481611dee565b15612c94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c8b906148b3565b60405180910390fd5b6002829080600181540180825580915050600190039060005260206000200160009091909190916101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612da081612d6b565b8114612dab57600080fd5b50565b600081359050612dbd81612d97565b92915050565b600060208284031215612dd957612dd8612d61565b5b6000612de784828501612dae565b91505092915050565b60008115159050919050565b612e0581612df0565b82525050565b6000602082019050612e206000830184612dfc565b92915050565b6000819050919050565b612e3981612e26565b8114612e4457600080fd5b50565b600081359050612e5681612e30565b92915050565b600060208284031215612e7257612e71612d61565b5b6000612e8084828501612e47565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000612eb482612e89565b9050919050565b612ec481612ea9565b82525050565b6000602082019050612edf6000830184612ebb565b92915050565b612eee81612ea9565b8114612ef957600080fd5b50565b600081359050612f0b81612ee5565b92915050565b60006bffffffffffffffffffffffff82169050919050565b612f3281612f11565b8114612f3d57600080fd5b50565b600081359050612f4f81612f29565b92915050565b60008060408385031215612f6c57612f6b612d61565b5b6000612f7a85828601612efc565b9250506020612f8b85828601612f40565b9150509250929050565b600081519050919050565b600082825260208201905092915050565b60005b83811015612fcf578082015181840152602081019050612fb4565b60008484015250505050565b6000601f19601f8301169050919050565b6000612ff782612f95565b6130018185612fa0565b9350613011818560208601612fb1565b61301a81612fdb565b840191505092915050565b6000602082019050818103600083015261303f8184612fec565b905092915050565b6000806040838503121561305e5761305d612d61565b5b600061306c85828601612efc565b925050602061307d85828601612e47565b9150509250929050565b61309081612e26565b82525050565b60006020820190506130ab6000830184613087565b92915050565b6130ba81612df0565b81146130c557600080fd5b50565b6000813590506130d7816130b1565b92915050565b6000602082840312156130f3576130f2612d61565b5b6000613101848285016130c8565b91505092915050565b60008060006060848603121561312357613122612d61565b5b600061313186828701612efc565b935050602061314286828701612efc565b925050604061315386828701612e47565b9150509250925092565b6000806040838503121561317457613173612d61565b5b600061318285828601612e47565b925050602061319385828601612e47565b9150509250929050565b60006040820190506131b26000830185612ebb565b6131bf6020830184613087565b9392505050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61320882612fdb565b810181811067ffffffffffffffff82111715613227576132266131d0565b5b80604052505050565b600061323a612d57565b905061324682826131ff565b919050565b600067ffffffffffffffff821115613266576132656131d0565b5b61326f82612fdb565b9050602081019050919050565b82818337600083830152505050565b600061329e6132998461324b565b613230565b9050828152602081018484840111156132ba576132b96131cb565b5b6132c584828561327c565b509392505050565b600082601f8301126132e2576132e16131c6565b5b81356132f284826020860161328b565b91505092915050565b60006020828403121561331157613310612d61565b5b600082013567ffffffffffffffff81111561332f5761332e612d66565b5b61333b848285016132cd565b91505092915050565b60008060006060848603121561335d5761335c612d61565b5b600061336b86828701612e47565b935050602061337c86828701612efc565b925050604061338d86828701612f40565b9150509250925092565b6000602082840312156133ad576133ac612d61565b5b60006133bb84828501612efc565b91505092915050565b600080604083850312156133db576133da612d61565b5b60006133e985828601612efc565b92505060206133fa858286016130c8565b9150509250929050565b600067ffffffffffffffff82111561341f5761341e6131d0565b5b61342882612fdb565b9050602081019050919050565b600061344861344384613404565b613230565b905082815260208101848484011115613464576134636131cb565b5b61346f84828561327c565b509392505050565b600082601f83011261348c5761348b6131c6565b5b813561349c848260208601613435565b91505092915050565b600080600080608085870312156134bf576134be612d61565b5b60006134cd87828801612efc565b94505060206134de87828801612efc565b93505060406134ef87828801612e47565b925050606085013567ffffffffffffffff8111156135105761350f612d66565b5b61351c87828801613477565b91505092959194509250565b6000806040838503121561353f5761353e612d61565b5b600061354d85828601612efc565b925050602061355e85828601612efc565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806135af57607f821691505b6020821081036135c2576135c1613568565b5b50919050565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b6000613624602c83612fa0565b915061362f826135c8565b604082019050919050565b6000602082019050818103600083015261365381613617565b9050919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b60006136b6602183612fa0565b91506136c18261365a565b604082019050919050565b600060208201905081810360008301526136e5816136a9565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b6000613748603883612fa0565b9150613753826136ec565b604082019050919050565b600060208201905081810360008301526137778161373b565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b60006137b882612e26565b91506137c383612e26565b92508282039050818111156137db576137da61377e565b5b92915050565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b600061383d603183612fa0565b9150613848826137e1565b604082019050919050565b6000602082019050818103600083015261386c81613830565b9050919050565b600061387e82612e26565b915061388983612e26565b925082820261389781612e26565b915082820484148315176138ae576138ad61377e565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b60006138ef82612e26565b91506138fa83612e26565b92508261390a576139096138b5565b5b828204905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b600061394f82612e26565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036139815761398061377e565b5b600182019050919050565b7f49445f544f4f5f48494748000000000000000000000000000000000000000000600082015250565b60006139c2600b83612fa0565b91506139cd8261398c565b602082019050919050565b600060208201905081810360008301526139f1816139b5565b9050919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b600060088302613a5a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82613a1d565b613a648683613a1d565b95508019841693508086168417925050509392505050565b6000819050919050565b6000613aa1613a9c613a9784612e26565b613a7c565b612e26565b9050919050565b6000819050919050565b613abb83613a86565b613acf613ac782613aa8565b848454613a2a565b825550505050565b600090565b613ae4613ad7565b613aef818484613ab2565b505050565b5b81811015613b1357613b08600082613adc565b600181019050613af5565b5050565b601f821115613b5857613b29816139f8565b613b3284613a0d565b81016020851015613b41578190505b613b55613b4d85613a0d565b830182613af4565b50505b505050565b600082821c905092915050565b6000613b7b60001984600802613b5d565b1980831691505092915050565b6000613b948383613b6a565b9150826002028217905092915050565b613bad82612f95565b67ffffffffffffffff811115613bc657613bc56131d0565b5b613bd08254613597565b613bdb828285613b17565b600060209050601f831160018114613c0e5760008415613bfc578287015190505b613c068582613b88565b865550613c6e565b601f198416613c1c866139f8565b60005b82811015613c4457848901518255600182019150602085019450602081019050613c1f565b86831015613c615784890151613c5d601f891682613b6a565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b6000613cd2602983612fa0565b9150613cdd82613c76565b604082019050919050565b60006020820190508181036000830152613d0181613cc5565b9050919050565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b6000613d64602a83612fa0565b9150613d6f82613d08565b604082019050919050565b60006020820190508181036000830152613d9381613d57565b9050919050565b7f4d494e545f504155534544000000000000000000000000000000000000000000600082015250565b6000613dd0600b83612fa0565b9150613ddb82613d9a565b602082019050919050565b60006020820190508181036000830152613dff81613dc3565b9050919050565b6000613e1182612e26565b9150613e1c83612e26565b9250828201905080821115613e3457613e3361377e565b5b92915050565b7f4d41585f535550504c5900000000000000000000000000000000000000000000600082015250565b6000613e70600a83612fa0565b9150613e7b82613e3a565b602082019050919050565b60006020820190508181036000830152613e9f81613e63565b9050919050565b7f57524f4e475f43414e544f5f56414c5545000000000000000000000000000000600082015250565b6000613edc601183612fa0565b9150613ee782613ea6565b602082019050919050565b60006020820190508181036000830152613f0b81613ecf565b9050919050565b7f414444524553535f4d41585f5245414348454400000000000000000000000000600082015250565b6000613f48601383612fa0565b9150613f5382613f12565b602082019050919050565b60006020820190508181036000830152613f7781613f3b565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000613fb4601983612fa0565b9150613fbf82613f7e565b602082019050919050565b60006020820190508181036000830152613fe381613fa7565b9050919050565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b6000614046602f83612fa0565b915061405182613fea565b604082019050919050565b6000602082019050818103600083015261407581614039565b9050919050565b600081905092915050565b6000815461409481613597565b61409e818661407c565b945060018216600081146140b957600181146140ce57614101565b60ff1983168652811515820286019350614101565b6140d7856139f8565b60005b838110156140f9578154818901526001820191506020810190506140da565b838801955050505b50505092915050565b600061411582612f95565b61411f818561407c565b935061412f818560208601612fb1565b80840191505092915050565b7f2e6a736f6e000000000000000000000000000000000000000000000000000000600082015250565b600061417160058361407c565b915061417c8261413b565b600582019050919050565b60006141938285614087565b915061419f828461410a565b91506141aa82614164565b91508190509392505050565b7f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008201527f6464726573730000000000000000000000000000000000000000000000000000602082015250565b6000614212602683612fa0565b915061421d826141b6565b604082019050919050565b6000602082019050818103600083015261424181614205565b9050919050565b600081905092915050565b50565b6000614263600083614248565b915061426e82614253565b600082019050919050565b600061428482614256565b9150819050919050565b7f5749544844524157414c5f4641494c4544000000000000000000000000000000600082015250565b60006142c4601183612fa0565b91506142cf8261428e565b602082019050919050565b600060208201905081810360008301526142f3816142b7565b9050919050565b7f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e6572600082015250565b6000614330602083612fa0565b915061433b826142fa565b602082019050919050565b6000602082019050818103600083015261435f81614323565b9050919050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b60006143c2602a83612fa0565b91506143cd82614366565b604082019050919050565b600060208201905081810360008301526143f1816143b5565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600061442e601983612fa0565b9150614439826143f8565b602082019050919050565b6000602082019050818103600083015261445d81614421565b9050919050565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b60006144c0602c83612fa0565b91506144cb82614464565b604082019050919050565b600060208201905081810360008301526144ef816144b3565b9050919050565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b6000614552602983612fa0565b915061455d826144f6565b604082019050919050565b6000602082019050818103600083015261458181614545565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b60006145e4602483612fa0565b91506145ef82614588565b604082019050919050565b60006020820190508181036000830152614613816145d7565b9050919050565b7f455243323938313a20496e76616c696420706172616d65746572730000000000600082015250565b6000614650601b83612fa0565b915061465b8261461a565b602082019050919050565b6000602082019050818103600083015261467f81614643565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006146e2603283612fa0565b91506146ed82614686565b604082019050919050565b60006020820190508181036000830152614711816146d5565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061473f82614718565b6147498185614723565b9350614759818560208601612fb1565b61476281612fdb565b840191505092915050565b60006080820190506147826000830187612ebb565b61478f6020830186612ebb565b61479c6040830185613087565b81810360608301526147ae8184614734565b905095945050505050565b6000815190506147c881612d97565b92915050565b6000602082840312156147e4576147e3612d61565b5b60006147f2848285016147b9565b91505092915050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b6000614831602083612fa0565b915061483c826147fb565b602082019050919050565b6000602082019050818103600083015261486081614824565b9050919050565b7f414c52454144595f4d494e544544000000000000000000000000000000000000600082015250565b600061489d600e83612fa0565b91506148a882614867565b602082019050919050565b600060208201905081810360008301526148cc81614890565b905091905056fea264697066735822122035e96cf6611b48f138efaabcb37bb5b4e662f0e3d23d2f12fa2694345a25b3eb64736f6c63430008110033

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

0000000000000000000000000000000000000000000000000000000000000040000000000000000000000000554384b10988cde2e3d84676d9cc70e9e24a7f5d000000000000000000000000000000000000000000000000000000000000006568747470733a2f2f6a6164652d6f63636173696f6e616c2d766963756e612d31372e6d7970696e6174612e636c6f75642f697066732f516d54745477627a535538724a4572537346596a77556642335951584261425a4c46654e44344b6e6359335070422f000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : _coverURI (string): https://jade-occasional-vicuna-17.mypinata.cloud/ipfs/QmTtTwbzSU8rJErSsFYjwUfB3YQXBaBZLFeND4KncY3PpB/
Arg [1] : collectionReceiever (address): 0x554384b10988CDE2E3D84676D9Cc70e9E24A7f5d

-----Encoded View---------------
7 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000040
Arg [1] : 000000000000000000000000554384b10988cde2e3d84676d9cc70e9e24a7f5d
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000065
Arg [3] : 68747470733a2f2f6a6164652d6f63636173696f6e616c2d766963756e612d31
Arg [4] : 372e6d7970696e6174612e636c6f75642f697066732f516d54745477627a5355
Arg [5] : 38724a4572537346596a77556642335951584261425a4c46654e44344b6e6359
Arg [6] : 335070422f000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

55857:4326:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;57295:310;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44015:23;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59418:138;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46149:94;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47588:211;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47155:377;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56116:40;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58595:79;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44074:110;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48418:311;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;34051:442;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;44289:360;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56070:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48790:165;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58099:52;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44043:24;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58496:95;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44190;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56215:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58410:82;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56447:22;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59816:160;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56242:18;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45864:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56421:21;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45495:317;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;18252:103;;;;;;;;;;;;;:::i;:::-;;60079:101;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;17604:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46302:98;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57611:435;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;47861:281;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;49016:300;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56161:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;56476:298;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;48203:158;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58322:84;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;18510:201;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58837:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58052:40;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57295:310;57397:4;57419:36;57443:11;57419:23;:36::i;:::-;57412:43;;57295:310;;;:::o;44015:23::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59418:138::-;17490:13;:11;:13::i;:::-;59508:42:::1;59527:8;59537:12;59508:18;:42::i;:::-;59418:138:::0;;:::o;46149:94::-;46203:13;46232:5;46225:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46149:94;:::o;47588:211::-;47664:7;47688:16;47696:7;47688;:16::i;:::-;47680:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;47769:15;:24;47785:7;47769:24;;;;;;;;;;;;;;;;;;;;;47762:31;;47588:211;;;:::o;47155:377::-;47232:13;47248:23;47263:7;47248:14;:23::i;:::-;47232:39;;47292:5;47286:11;;:2;:11;;;47278:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;47376:5;47360:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;47385:37;47402:5;47409:12;:10;:12::i;:::-;47385:16;:37::i;:::-;47360:62;47344:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;47505:21;47514:2;47518:7;47505:8;:21::i;:::-;47225:307;47155:377;;:::o;56116:40::-;56154:2;56116:40;:::o;58595:79::-;17490:13;:11;:13::i;:::-;58661:7:::1;58652:6;;:16;;;;;;;;;;;;;;;;;;58595:79:::0;:::o;44074:110::-;44127:7;44166:12;;44150:6;:13;;;;:28;;;;:::i;:::-;44143:35;;44074:110;:::o;48418:311::-;48591:41;48610:12;:10;:12::i;:::-;48624:7;48591:18;:41::i;:::-;48583:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;48695:28;48705:4;48711:2;48715:7;48695:9;:28::i;:::-;48418:311;;;:::o;34051:442::-;34148:7;34157;34177:26;34206:17;:27;34224:8;34206:27;;;;;;;;;;;34177:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34278:1;34250:30;;:7;:16;;;:30;;;34246:92;;34307:19;34297:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;34246:92;34350:21;34415:17;:15;:17::i;:::-;34374:58;;34388:7;:23;;;34375:36;;:10;:36;;;;:::i;:::-;34374:58;;;;:::i;:::-;34350:82;;34453:7;:16;;;34471:13;34445:40;;;;;;34051:442;;;;;:::o;44289:360::-;44374:7;44390:18;44411:1;44390:22;;44423:6;44419:195;44439:6;:13;;;;44435:1;:17;44419:195;;;44484:4;44471:17;;:6;44478:1;44471:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:17;;;44468:139;;44518:2;44504:10;:16;44501:97;;44542:1;44535:8;;;;;;44501:97;44574:12;;;;;:::i;:::-;;;;44468:139;44454:3;;;;;:::i;:::-;;;;44419:195;;;;44622:21;;;;;;;;;;:::i;:::-;;;;;;;;44289:360;;;;;:::o;56070:41::-;56108:3;56070:41;:::o;48790:165::-;48910:39;48927:4;48933:2;48937:7;48910:39;;;;;;;;;;;;:16;:39::i;:::-;48790:165;;;:::o;58099:52::-;58136:9;58142:2;58136:5;:9::i;:::-;58099:52;:::o;44043:24::-;;;;:::o;58496:95::-;17490:13;:11;:13::i;:::-;58574:11:::1;58561:10;;:24;;;;;;;;;;;;;;;;;;58496:95:::0;:::o;44190:::-;44254:7;44277:2;44270:9;;44190:95;;;:::o;56215:22::-;;;;;;;;;;;;;:::o;58410:82::-;17490:13;:11;:13::i;:::-;58483:3:::1;58473:7;:13;;;;;;:::i;:::-;;58410:82:::0;:::o;56447:22::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;59816:160::-;17490:13;:11;:13::i;:::-;59921:49:::1;59938:7;59947:8;59957:12;59921:16;:49::i;:::-;59816:160:::0;;;:::o;56242:18::-;;;;;;;;;;;;;:::o;45864:228::-;45936:7;45970:6;:13;;;;45960:7;:23;45952:77;;;;;;;;;;;;:::i;:::-;;;;;;;;;46036:13;46052:6;46059:7;46052:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;46036:31;;46081:5;46074:12;;;45864:228;;;:::o;56421:21::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;45495:317::-;45567:7;45608:1;45591:19;;:5;:19;;;45583:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;45664:10;45685:6;45694:1;45685:10;;45681:107;45701:6;:13;;;;45697:1;:17;45681:107;;;45742:6;45749:1;45742:9;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;45733:18;;:5;:18;;;45730:51;;45764:7;;;;;:::i;:::-;;;;45730:51;45716:3;;;;;:::i;:::-;;;;45681:107;;;;45801:5;45794:12;;;45495:317;;;:::o;18252:103::-;17490:13;:11;:13::i;:::-;18317:30:::1;18344:1;18317:18;:30::i;:::-;18252:103::o:0;60079:101::-;17490:13;:11;:13::i;:::-;60147:27:::1;60166:7;60147:18;:27::i;:::-;60079:101:::0;:::o;17604:87::-;17650:7;17677:6;;;;;;;;;;;17670:13;;17604:87;:::o;46302:98::-;46358:13;46387:7;46380:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;46302:98;:::o;57611:435::-;57669:6;;;;;;;;;;;57668:7;57660:31;;;;;;;;;;;;:::i;:::-;;;;;;;;;56108:3;57722:6;57706;:13;;;;:22;;;;:::i;:::-;:36;;57698:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;56199:11;57786:6;:19;;;;:::i;:::-;57772:9;:34;57764:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;57862:6;57837:7;:21;57845:12;:10;:12::i;:::-;57837:21;;;;;;;;;;;;;;;;:31;;;;;;;:::i;:::-;;;;;;;;56154:2;57883:7;:21;57891:12;:10;:12::i;:::-;57883:21;;;;;;;;;;;;;;;;:39;;57875:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;57957:6;57953:88;57973:6;57969:1;:10;57953:88;;;57995:38;58005:12;:10;:12::i;:::-;58019:6;:13;;;;57995:9;:38::i;:::-;57981:3;;;;;:::i;:::-;;;;57953:88;;;;57611:435;:::o;47861:281::-;47972:12;:10;:12::i;:::-;47960:24;;:8;:24;;;47952:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;48068:8;48023:18;:32;48042:12;:10;:12::i;:::-;48023:32;;;;;;;;;;;;;;;:42;48056:8;48023:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;48117:8;48088:48;;48103:12;:10;:12::i;:::-;48088:48;;;48127:8;48088:48;;;;;;:::i;:::-;;;;;;;;47861:281;;:::o;49016:300::-;49169:41;49188:12;:10;:12::i;:::-;49202:7;49169:18;:41::i;:::-;49161:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;49271:39;49285:4;49291:2;49295:7;49304:5;49271:13;:39::i;:::-;49016:300;;;;:::o;56161:49::-;56199:11;56161:49;:::o;56476:298::-;56541:13;56571:11;56579:2;56571:7;:11::i;:::-;56563:71;;;;;;;;;;;;:::i;:::-;;;;;;;;;56645:10;;;;;;;;;;;56641:48;;56673:8;56666:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56641:48;56728:7;56737:20;56754:2;56737:16;:20::i;:::-;56711:56;;;;;;;;;:::i;:::-;;;;;;;;;;;;;56697:71;;56476:298;;;;:::o;48203:158::-;48300:4;48320:18;:25;48339:5;48320:25;;;;;;;;;;;;;;;:35;48346:8;48320:35;;;;;;;;;;;;;;;;;;;;;;;;;48313:42;;48203:158;;;;:::o;58322:84::-;17490:13;:11;:13::i;:::-;58397:3:::1;58386:8;:14;;;;;;:::i;:::-;;58322:84:::0;:::o;18510:201::-;17490:13;:11;:13::i;:::-;18619:1:::1;18599:22;;:8;:22;;::::0;18591:73:::1;;;;;;;;;;;;:::i;:::-;;;;;;;;;18675:28;18694:8;18675:18;:28::i;:::-;18510:201:::0;:::o;58837:172::-;17490:13;:11;:13::i;:::-;58905:12:::1;58930:2;58922:16;;58947:6;58922:37;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58904:55;;;58974:7;58966:37;;;;;;;;;;;;:::i;:::-;;;;;;;;;58897:112;58837:172:::0;;:::o;58052:40::-;;;;;;;;;;;;;;;;;:::o;20302:326::-;20362:4;20619:1;20597:7;:19;;;:23;20590:30;;20302:326;;;:::o;33781:215::-;33883:4;33922:26;33907:41;;;:11;:41;;;;:81;;;;33952:36;33976:11;33952:23;:36::i;:::-;33907:81;33900:88;;33781:215;;;:::o;17769:132::-;17844:12;:10;:12::i;:::-;17833:23;;:7;:5;:7::i;:::-;:23;;;17825:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;17769:132::o;35143:332::-;35262:17;:15;:17::i;:::-;35246:33;;:12;:33;;;;35238:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;35365:1;35345:22;;:8;:22;;;35337:60;;;;;;;;;;;;:::i;:::-;;;;;;;;;35432:35;;;;;;;;35444:8;35432:35;;;;;;35454:12;35432:35;;;;;35410:19;:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35143:332;;:::o;50756:147::-;50821:4;50857:7;50841:6;:13;;;;:23;:56;;;;;50895:1;50868:29;;:6;50875:7;50868:15;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;:29;;;;50841:56;50834:63;;50756:147;;;:::o;16155:98::-;16208:7;16235:10;16228:17;;16155:98;:::o;54412:164::-;54510:2;54483:15;:24;54499:7;54483:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;54562:7;54558:2;54524:46;;54533:23;54548:7;54533:14;:23::i;:::-;54524:46;;;;;;;;;;;;54412:164;;:::o;51056:334::-;51149:4;51170:16;51178:7;51170;:16::i;:::-;51162:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;51242:13;51258:23;51273:7;51258:14;:23::i;:::-;51242:39;;51307:5;51296:16;;:7;:16;;;:51;;;;51340:7;51316:31;;:20;51328:7;51316:11;:20::i;:::-;:31;;;51296:51;:87;;;;51351:32;51368:5;51375:7;51351:16;:32::i;:::-;51296:87;51288:96;;;51056:334;;;;:::o;53881:425::-;54022:4;53995:31;;:23;54010:7;53995:14;:23::i;:::-;:31;;;53987:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;54101:1;54087:16;;:2;:16;;;54079:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;54201:29;54218:1;54222:7;54201:8;:29::i;:::-;54257:2;54239:6;54246:7;54239:15;;;;;;;;:::i;:::-;;;;;;;;;;:20;;;;;;;;;;;;;;;;;;54292:7;54288:2;54273:27;;54282:4;54273:27;;;;;;;;;;;;53881:425;;;:::o;34775:97::-;34833:6;34859:5;34852:12;;34775:97;:::o;53098:464::-;53154:13;53170:23;53185:7;53170:14;:23::i;:::-;53154:39;;53234:5;53218:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;53243:37;53260:5;53267:12;:10;:12::i;:::-;53243:16;:37::i;:::-;53218:62;53202:152;;;;;;;;;;;;:::i;:::-;;;;;;;;;53387:29;53404:1;53408:7;53387:8;:29::i;:::-;53483:1;53457:6;53464:7;53457:15;;;;;;;;:::i;:::-;;;;;;;;;;:28;;;;;;;;;;;;;;;;;;53492:12;;:14;;;;;;;;;:::i;:::-;;;;;;53548:7;53544:1;53520:36;;53529:5;53520:36;;;;;;;;;;;;53147:415;53098:464;:::o;35926:390::-;36094:17;:15;:17::i;:::-;36078:33;;:12;:33;;;;36070:88;;;;;;;;;;;;:::i;:::-;;;;;;;;;36197:1;36177:22;;:8;:22;;;36169:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;36273:35;;;;;;;;36285:8;36273:35;;;;;;36295:12;36273:35;;;;;36244:17;:26;36262:7;36244:26;;;;;;;;;;;:64;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;35926:390;;;:::o;18871:191::-;18945:16;18964:6;;;;;;;;;;;18945:25;;18990:8;18981:6;;:17;;;;;;;;;;;;;;;;;;19045:8;19014:40;;19035:8;19014:40;;;;;;;;;;;;18934:128;18871:191;:::o;36427:114::-;36507:17;:26;36525:7;36507:26;;;;;;;;;;;;36500:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;36427:114;:::o;51715:104::-;51787:26;51797:2;51801:7;51787:26;;;;;;;;;;;;:9;:26::i;:::-;51715:104;;:::o;50173:287::-;50308:28;50318:4;50324:2;50328:7;50308:9;:28::i;:::-;50351:48;50374:4;50380:2;50384:7;50393:5;50351:22;:48::i;:::-;50343:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;50173:287;;;;:::o;13582:716::-;13638:13;13689:14;13726:1;13706:17;13717:5;13706:10;:17::i;:::-;:21;13689:38;;13742:20;13776:6;13765:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;13742:41;;13798:11;13927:6;13923:2;13919:15;13911:6;13907:28;13900:35;;13964:288;13971:4;13964:288;;;13996:5;;;;;;;;14138:8;14133:2;14126:5;14122:14;14117:30;14112:3;14104:44;14194:2;14185:11;;;;;;:::i;:::-;;;;;14228:1;14219:5;:10;13964:288;14215:21;13964:288;14273:6;14266:13;;;;;13582:716;;;:::o;45162:279::-;45264:4;45304:25;45289:40;;;:11;:40;;;;:99;;;;45355:33;45340:48;;;:11;:48;;;;45289:99;:146;;;;45399:36;45423:11;45399:23;:36::i;:::-;45289:146;45277:158;;45162:279;;;:::o;52035:281::-;52147:18;52153:2;52157:7;52147:5;:18::i;:::-;52188:54;52219:1;52223:2;52227:7;52236:5;52188:22;:54::i;:::-;52172:138;;;;;;;;;;;;:::i;:::-;;;;;;;;;52035:281;;;:::o;55110:669::-;55247:4;55264:15;:2;:13;;;:15::i;:::-;55260:514;;;55310:2;55294:36;;;55331:12;:10;:12::i;:::-;55345:4;55351:7;55360:5;55294:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;55290:443;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55531:1;55514:6;:13;:18;55510:214;;55547:60;;;;;;;;;;:::i;:::-;;;;;;;;55510:214;55692:6;55686:13;55677:6;55673:2;55669:15;55662:38;55290:443;55419:41;;;55409:51;;;:6;:51;;;;55402:58;;;;;55260:514;55762:4;55755:11;;55110:669;;;;;;;:::o;10448:922::-;10501:7;10521:14;10538:1;10521:18;;10588:6;10579:5;:15;10575:102;;10624:6;10615:15;;;;;;:::i;:::-;;;;;10659:2;10649:12;;;;10575:102;10704:6;10695:5;:15;10691:102;;10740:6;10731:15;;;;;;:::i;:::-;;;;;10775:2;10765:12;;;;10691:102;10820:6;10811:5;:15;10807:102;;10856:6;10847:15;;;;;;:::i;:::-;;;;;10891:2;10881:12;;;;10807:102;10936:5;10927;:14;10923:99;;10971:5;10962:14;;;;;;:::i;:::-;;;;;11005:1;10995:11;;;;10923:99;11049:5;11040;:14;11036:99;;11084:5;11075:14;;;;;;:::i;:::-;;;;;11118:1;11108:11;;;;11036:99;11162:5;11153;:14;11149:99;;11197:5;11188:14;;;;;;:::i;:::-;;;;;11231:1;11221:11;;;;11149:99;11275:5;11266;:14;11262:66;;11311:1;11301:11;;;;11262:66;11356:6;11349:13;;;10448:922;;;:::o;32231:157::-;32316:4;32355:25;32340:40;;;:11;:40;;;;32333:47;;32231:157;;;:::o;52631:255::-;52721:1;52707:16;;:2;:16;;;52699:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;52776:16;52784:7;52776;:16::i;:::-;52775:17;52767:44;;;;;;;;;;;;:::i;:::-;;;;;;;;;52820:6;52832:2;52820:15;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;52872:7;52868:2;52847:33;;52864:1;52847:33;;;;;;;;;;;;52631:255;;:::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:77::-;1555:7;1584:5;1573:16;;1518:77;;;:::o;1601:122::-;1674:24;1692:5;1674:24;:::i;:::-;1667:5;1664:35;1654:63;;1713:1;1710;1703:12;1654:63;1601:122;:::o;1729:139::-;1775:5;1813:6;1800:20;1791:29;;1829:33;1856:5;1829:33;:::i;:::-;1729:139;;;;:::o;1874:329::-;1933:6;1982:2;1970:9;1961:7;1957:23;1953:32;1950:119;;;1988:79;;:::i;:::-;1950:119;2108:1;2133:53;2178:7;2169:6;2158:9;2154:22;2133:53;:::i;:::-;2123:63;;2079:117;1874:329;;;;:::o;2209:126::-;2246:7;2286:42;2279:5;2275:54;2264:65;;2209:126;;;:::o;2341:96::-;2378:7;2407:24;2425:5;2407:24;:::i;:::-;2396:35;;2341:96;;;:::o;2443:118::-;2530:24;2548:5;2530:24;:::i;:::-;2525:3;2518:37;2443:118;;:::o;2567:222::-;2660:4;2698:2;2687:9;2683:18;2675:26;;2711:71;2779:1;2768:9;2764:17;2755:6;2711:71;:::i;:::-;2567:222;;;;:::o;2795:122::-;2868:24;2886:5;2868:24;:::i;:::-;2861:5;2858:35;2848:63;;2907:1;2904;2897:12;2848:63;2795:122;:::o;2923:139::-;2969:5;3007:6;2994:20;2985:29;;3023:33;3050:5;3023:33;:::i;:::-;2923:139;;;;:::o;3068:109::-;3104:7;3144:26;3137:5;3133:38;3122:49;;3068:109;;;:::o;3183:120::-;3255:23;3272:5;3255:23;:::i;:::-;3248:5;3245:34;3235:62;;3293:1;3290;3283:12;3235:62;3183:120;:::o;3309:137::-;3354:5;3392:6;3379:20;3370:29;;3408:32;3434:5;3408:32;:::i;:::-;3309:137;;;;:::o;3452:472::-;3519:6;3527;3576:2;3564:9;3555:7;3551:23;3547:32;3544:119;;;3582:79;;:::i;:::-;3544:119;3702:1;3727:53;3772:7;3763:6;3752:9;3748:22;3727:53;:::i;:::-;3717:63;;3673:117;3829:2;3855:52;3899:7;3890:6;3879:9;3875:22;3855:52;:::i;:::-;3845:62;;3800:117;3452:472;;;;;:::o;3930:99::-;3982:6;4016:5;4010:12;4000:22;;3930:99;;;:::o;4035:169::-;4119:11;4153:6;4148:3;4141:19;4193:4;4188:3;4184:14;4169:29;;4035:169;;;;:::o;4210:246::-;4291:1;4301:113;4315:6;4312:1;4309:13;4301:113;;;4400:1;4395:3;4391:11;4385:18;4381:1;4376:3;4372:11;4365:39;4337:2;4334:1;4330:10;4325:15;;4301:113;;;4448:1;4439:6;4434:3;4430:16;4423:27;4272:184;4210:246;;;:::o;4462:102::-;4503:6;4554:2;4550:7;4545:2;4538:5;4534:14;4530:28;4520:38;;4462:102;;;:::o;4570:377::-;4658:3;4686:39;4719:5;4686:39;:::i;:::-;4741:71;4805:6;4800:3;4741:71;:::i;:::-;4734:78;;4821:65;4879:6;4874:3;4867:4;4860:5;4856:16;4821:65;:::i;:::-;4911:29;4933:6;4911:29;:::i;:::-;4906:3;4902:39;4895:46;;4662:285;4570:377;;;;:::o;4953:313::-;5066:4;5104:2;5093:9;5089:18;5081:26;;5153:9;5147:4;5143:20;5139:1;5128:9;5124:17;5117:47;5181:78;5254:4;5245:6;5181:78;:::i;:::-;5173:86;;4953:313;;;;:::o;5272:474::-;5340:6;5348;5397:2;5385:9;5376:7;5372:23;5368:32;5365:119;;;5403:79;;:::i;:::-;5365:119;5523:1;5548:53;5593:7;5584:6;5573:9;5569:22;5548:53;:::i;:::-;5538:63;;5494:117;5650:2;5676:53;5721:7;5712:6;5701:9;5697:22;5676:53;:::i;:::-;5666:63;;5621:118;5272:474;;;;;:::o;5752:118::-;5839:24;5857:5;5839:24;:::i;:::-;5834:3;5827:37;5752:118;;:::o;5876:222::-;5969:4;6007:2;5996:9;5992:18;5984:26;;6020:71;6088:1;6077:9;6073:17;6064:6;6020:71;:::i;:::-;5876:222;;;;:::o;6104:116::-;6174:21;6189:5;6174:21;:::i;:::-;6167:5;6164:32;6154:60;;6210:1;6207;6200:12;6154:60;6104:116;:::o;6226:133::-;6269:5;6307:6;6294:20;6285:29;;6323:30;6347:5;6323:30;:::i;:::-;6226:133;;;;:::o;6365:323::-;6421:6;6470:2;6458:9;6449:7;6445:23;6441:32;6438:119;;;6476:79;;:::i;:::-;6438:119;6596:1;6621:50;6663:7;6654:6;6643:9;6639:22;6621:50;:::i;:::-;6611:60;;6567:114;6365:323;;;;:::o;6694:619::-;6771:6;6779;6787;6836:2;6824:9;6815:7;6811:23;6807:32;6804:119;;;6842:79;;:::i;:::-;6804:119;6962:1;6987:53;7032:7;7023:6;7012:9;7008:22;6987:53;:::i;:::-;6977:63;;6933:117;7089:2;7115:53;7160:7;7151:6;7140:9;7136:22;7115:53;:::i;:::-;7105:63;;7060:118;7217:2;7243:53;7288:7;7279:6;7268:9;7264:22;7243:53;:::i;:::-;7233:63;;7188:118;6694:619;;;;;:::o;7319:474::-;7387:6;7395;7444:2;7432:9;7423:7;7419:23;7415:32;7412:119;;;7450:79;;:::i;:::-;7412:119;7570:1;7595:53;7640:7;7631:6;7620:9;7616:22;7595:53;:::i;:::-;7585:63;;7541:117;7697:2;7723:53;7768:7;7759:6;7748:9;7744:22;7723:53;:::i;:::-;7713:63;;7668:118;7319:474;;;;;:::o;7799:332::-;7920:4;7958:2;7947:9;7943:18;7935:26;;7971:71;8039:1;8028:9;8024:17;8015:6;7971:71;:::i;:::-;8052:72;8120:2;8109:9;8105:18;8096:6;8052:72;:::i;:::-;7799:332;;;;;:::o;8137:117::-;8246:1;8243;8236:12;8260:117;8369:1;8366;8359:12;8383:180;8431:77;8428:1;8421:88;8528:4;8525:1;8518:15;8552:4;8549:1;8542:15;8569:281;8652:27;8674:4;8652:27;:::i;:::-;8644:6;8640:40;8782:6;8770:10;8767:22;8746:18;8734:10;8731:34;8728:62;8725:88;;;8793:18;;:::i;:::-;8725:88;8833:10;8829:2;8822:22;8612:238;8569:281;;:::o;8856:129::-;8890:6;8917:20;;:::i;:::-;8907:30;;8946:33;8974:4;8966:6;8946:33;:::i;:::-;8856:129;;;:::o;8991:308::-;9053:4;9143:18;9135:6;9132:30;9129:56;;;9165:18;;:::i;:::-;9129:56;9203:29;9225:6;9203:29;:::i;:::-;9195:37;;9287:4;9281;9277:15;9269:23;;8991:308;;;:::o;9305:146::-;9402:6;9397:3;9392;9379:30;9443:1;9434:6;9429:3;9425:16;9418:27;9305:146;;;:::o;9457:425::-;9535:5;9560:66;9576:49;9618:6;9576:49;:::i;:::-;9560:66;:::i;:::-;9551:75;;9649:6;9642:5;9635:21;9687:4;9680:5;9676:16;9725:3;9716:6;9711:3;9707:16;9704:25;9701:112;;;9732:79;;:::i;:::-;9701:112;9822:54;9869:6;9864:3;9859;9822:54;:::i;:::-;9541:341;9457:425;;;;;:::o;9902:340::-;9958:5;10007:3;10000:4;9992:6;9988:17;9984:27;9974:122;;10015:79;;:::i;:::-;9974:122;10132:6;10119:20;10157:79;10232:3;10224:6;10217:4;10209:6;10205:17;10157:79;:::i;:::-;10148:88;;9964:278;9902:340;;;;:::o;10248:509::-;10317:6;10366:2;10354:9;10345:7;10341:23;10337:32;10334:119;;;10372:79;;:::i;:::-;10334:119;10520:1;10509:9;10505:17;10492:31;10550:18;10542:6;10539:30;10536:117;;;10572:79;;:::i;:::-;10536:117;10677:63;10732:7;10723:6;10712:9;10708:22;10677:63;:::i;:::-;10667:73;;10463:287;10248:509;;;;:::o;10763:617::-;10839:6;10847;10855;10904:2;10892:9;10883:7;10879:23;10875:32;10872:119;;;10910:79;;:::i;:::-;10872:119;11030:1;11055:53;11100:7;11091:6;11080:9;11076:22;11055:53;:::i;:::-;11045:63;;11001:117;11157:2;11183:53;11228:7;11219:6;11208:9;11204:22;11183:53;:::i;:::-;11173:63;;11128:118;11285:2;11311:52;11355:7;11346:6;11335:9;11331:22;11311:52;:::i;:::-;11301:62;;11256:117;10763:617;;;;;:::o;11386:329::-;11445:6;11494:2;11482:9;11473:7;11469:23;11465:32;11462:119;;;11500:79;;:::i;:::-;11462:119;11620:1;11645:53;11690:7;11681:6;11670:9;11666:22;11645:53;:::i;:::-;11635:63;;11591:117;11386:329;;;;:::o;11721:468::-;11786:6;11794;11843:2;11831:9;11822:7;11818:23;11814:32;11811:119;;;11849:79;;:::i;:::-;11811:119;11969:1;11994:53;12039:7;12030:6;12019:9;12015:22;11994:53;:::i;:::-;11984:63;;11940:117;12096:2;12122:50;12164:7;12155:6;12144:9;12140:22;12122:50;:::i;:::-;12112:60;;12067:115;11721:468;;;;;:::o;12195:307::-;12256:4;12346:18;12338:6;12335:30;12332:56;;;12368:18;;:::i;:::-;12332:56;12406:29;12428:6;12406:29;:::i;:::-;12398:37;;12490:4;12484;12480:15;12472:23;;12195:307;;;:::o;12508:423::-;12585:5;12610:65;12626:48;12667:6;12626:48;:::i;:::-;12610:65;:::i;:::-;12601:74;;12698:6;12691:5;12684:21;12736:4;12729:5;12725:16;12774:3;12765:6;12760:3;12756:16;12753:25;12750:112;;;12781:79;;:::i;:::-;12750:112;12871:54;12918:6;12913:3;12908;12871:54;:::i;:::-;12591:340;12508:423;;;;;:::o;12950:338::-;13005:5;13054:3;13047:4;13039:6;13035:17;13031:27;13021:122;;13062:79;;:::i;:::-;13021:122;13179:6;13166:20;13204:78;13278:3;13270:6;13263:4;13255:6;13251:17;13204:78;:::i;:::-;13195:87;;13011:277;12950:338;;;;:::o;13294:943::-;13389:6;13397;13405;13413;13462:3;13450:9;13441:7;13437:23;13433:33;13430:120;;;13469:79;;:::i;:::-;13430:120;13589:1;13614:53;13659:7;13650:6;13639:9;13635:22;13614:53;:::i;:::-;13604:63;;13560:117;13716:2;13742:53;13787:7;13778:6;13767:9;13763:22;13742:53;:::i;:::-;13732:63;;13687:118;13844:2;13870:53;13915:7;13906:6;13895:9;13891:22;13870:53;:::i;:::-;13860:63;;13815:118;14000:2;13989:9;13985:18;13972:32;14031:18;14023:6;14020:30;14017:117;;;14053:79;;:::i;:::-;14017:117;14158:62;14212:7;14203:6;14192:9;14188:22;14158:62;:::i;:::-;14148:72;;13943:287;13294:943;;;;;;;:::o;14243:474::-;14311:6;14319;14368:2;14356:9;14347:7;14343:23;14339:32;14336:119;;;14374:79;;:::i;:::-;14336:119;14494:1;14519:53;14564:7;14555:6;14544:9;14540:22;14519:53;:::i;:::-;14509:63;;14465:117;14621:2;14647:53;14692:7;14683:6;14672:9;14668:22;14647:53;:::i;:::-;14637:63;;14592:118;14243:474;;;;;:::o;14723:180::-;14771:77;14768:1;14761:88;14868:4;14865:1;14858:15;14892:4;14889:1;14882:15;14909:320;14953:6;14990:1;14984:4;14980:12;14970:22;;15037:1;15031:4;15027:12;15058:18;15048:81;;15114:4;15106:6;15102:17;15092:27;;15048:81;15176:2;15168:6;15165:14;15145:18;15142:38;15139:84;;15195:18;;:::i;:::-;15139:84;14960:269;14909:320;;;:::o;15235:231::-;15375:34;15371:1;15363:6;15359:14;15352:58;15444:14;15439:2;15431:6;15427:15;15420:39;15235:231;:::o;15472:366::-;15614:3;15635:67;15699:2;15694:3;15635:67;:::i;:::-;15628:74;;15711:93;15800:3;15711:93;:::i;:::-;15829:2;15824:3;15820:12;15813:19;;15472:366;;;:::o;15844:419::-;16010:4;16048:2;16037:9;16033:18;16025:26;;16097:9;16091:4;16087:20;16083:1;16072:9;16068:17;16061:47;16125:131;16251:4;16125:131;:::i;:::-;16117:139;;15844:419;;;:::o;16269:220::-;16409:34;16405:1;16397:6;16393:14;16386:58;16478:3;16473:2;16465:6;16461:15;16454:28;16269:220;:::o;16495:366::-;16637:3;16658:67;16722:2;16717:3;16658:67;:::i;:::-;16651:74;;16734:93;16823:3;16734:93;:::i;:::-;16852:2;16847:3;16843:12;16836:19;;16495:366;;;:::o;16867:419::-;17033:4;17071:2;17060:9;17056:18;17048:26;;17120:9;17114:4;17110:20;17106:1;17095:9;17091:17;17084:47;17148:131;17274:4;17148:131;:::i;:::-;17140:139;;16867:419;;;:::o;17292:243::-;17432:34;17428:1;17420:6;17416:14;17409:58;17501:26;17496:2;17488:6;17484:15;17477:51;17292:243;:::o;17541:366::-;17683:3;17704:67;17768:2;17763:3;17704:67;:::i;:::-;17697:74;;17780:93;17869:3;17780:93;:::i;:::-;17898:2;17893:3;17889:12;17882:19;;17541:366;;;:::o;17913:419::-;18079:4;18117:2;18106:9;18102:18;18094:26;;18166:9;18160:4;18156:20;18152:1;18141:9;18137:17;18130:47;18194:131;18320:4;18194:131;:::i;:::-;18186:139;;17913:419;;;:::o;18338:180::-;18386:77;18383:1;18376:88;18483:4;18480:1;18473:15;18507:4;18504:1;18497:15;18524:194;18564:4;18584:20;18602:1;18584:20;:::i;:::-;18579:25;;18618:20;18636:1;18618:20;:::i;:::-;18613:25;;18662:1;18659;18655:9;18647:17;;18686:1;18680:4;18677:11;18674:37;;;18691:18;;:::i;:::-;18674:37;18524:194;;;;:::o;18724:236::-;18864:34;18860:1;18852:6;18848:14;18841:58;18933:19;18928:2;18920:6;18916:15;18909:44;18724:236;:::o;18966:366::-;19108:3;19129:67;19193:2;19188:3;19129:67;:::i;:::-;19122:74;;19205:93;19294:3;19205:93;:::i;:::-;19323:2;19318:3;19314:12;19307:19;;18966:366;;;:::o;19338:419::-;19504:4;19542:2;19531:9;19527:18;19519:26;;19591:9;19585:4;19581:20;19577:1;19566:9;19562:17;19555:47;19619:131;19745:4;19619:131;:::i;:::-;19611:139;;19338:419;;;:::o;19763:410::-;19803:7;19826:20;19844:1;19826:20;:::i;:::-;19821:25;;19860:20;19878:1;19860:20;:::i;:::-;19855:25;;19915:1;19912;19908:9;19937:30;19955:11;19937:30;:::i;:::-;19926:41;;20116:1;20107:7;20103:15;20100:1;20097:22;20077:1;20070:9;20050:83;20027:139;;20146:18;;:::i;:::-;20027:139;19811:362;19763:410;;;;:::o;20179:180::-;20227:77;20224:1;20217:88;20324:4;20321:1;20314:15;20348:4;20345:1;20338:15;20365:185;20405:1;20422:20;20440:1;20422:20;:::i;:::-;20417:25;;20456:20;20474:1;20456:20;:::i;:::-;20451:25;;20495:1;20485:35;;20500:18;;:::i;:::-;20485:35;20542:1;20539;20535:9;20530:14;;20365:185;;;;:::o;20556:180::-;20604:77;20601:1;20594:88;20701:4;20698:1;20691:15;20725:4;20722:1;20715:15;20742:233;20781:3;20804:24;20822:5;20804:24;:::i;:::-;20795:33;;20850:66;20843:5;20840:77;20837:103;;20920:18;;:::i;:::-;20837:103;20967:1;20960:5;20956:13;20949:20;;20742:233;;;:::o;20981:161::-;21121:13;21117:1;21109:6;21105:14;21098:37;20981:161;:::o;21148:366::-;21290:3;21311:67;21375:2;21370:3;21311:67;:::i;:::-;21304:74;;21387:93;21476:3;21387:93;:::i;:::-;21505:2;21500:3;21496:12;21489:19;;21148:366;;;:::o;21520:419::-;21686:4;21724:2;21713:9;21709:18;21701:26;;21773:9;21767:4;21763:20;21759:1;21748:9;21744:17;21737:47;21801:131;21927:4;21801:131;:::i;:::-;21793:139;;21520:419;;;:::o;21945:141::-;21994:4;22017:3;22009:11;;22040:3;22037:1;22030:14;22074:4;22071:1;22061:18;22053:26;;21945:141;;;:::o;22092:93::-;22129:6;22176:2;22171;22164:5;22160:14;22156:23;22146:33;;22092:93;;;:::o;22191:107::-;22235:8;22285:5;22279:4;22275:16;22254:37;;22191:107;;;;:::o;22304:393::-;22373:6;22423:1;22411:10;22407:18;22446:97;22476:66;22465:9;22446:97;:::i;:::-;22564:39;22594:8;22583:9;22564:39;:::i;:::-;22552:51;;22636:4;22632:9;22625:5;22621:21;22612:30;;22685:4;22675:8;22671:19;22664:5;22661:30;22651:40;;22380:317;;22304:393;;;;;:::o;22703:60::-;22731:3;22752:5;22745:12;;22703:60;;;:::o;22769:142::-;22819:9;22852:53;22870:34;22879:24;22897:5;22879:24;:::i;:::-;22870:34;:::i;:::-;22852:53;:::i;:::-;22839:66;;22769:142;;;:::o;22917:75::-;22960:3;22981:5;22974:12;;22917:75;;;:::o;22998:269::-;23108:39;23139:7;23108:39;:::i;:::-;23169:91;23218:41;23242:16;23218:41;:::i;:::-;23210:6;23203:4;23197:11;23169:91;:::i;:::-;23163:4;23156:105;23074:193;22998:269;;;:::o;23273:73::-;23318:3;23273:73;:::o;23352:189::-;23429:32;;:::i;:::-;23470:65;23528:6;23520;23514:4;23470:65;:::i;:::-;23405:136;23352:189;;:::o;23547:186::-;23607:120;23624:3;23617:5;23614:14;23607:120;;;23678:39;23715:1;23708:5;23678:39;:::i;:::-;23651:1;23644:5;23640:13;23631:22;;23607:120;;;23547:186;;:::o;23739:543::-;23840:2;23835:3;23832:11;23829:446;;;23874:38;23906:5;23874:38;:::i;:::-;23958:29;23976:10;23958:29;:::i;:::-;23948:8;23944:44;24141:2;24129:10;24126:18;24123:49;;;24162:8;24147:23;;24123:49;24185:80;24241:22;24259:3;24241:22;:::i;:::-;24231:8;24227:37;24214:11;24185:80;:::i;:::-;23844:431;;23829:446;23739:543;;;:::o;24288:117::-;24342:8;24392:5;24386:4;24382:16;24361:37;;24288:117;;;;:::o;24411:169::-;24455:6;24488:51;24536:1;24532:6;24524:5;24521:1;24517:13;24488:51;:::i;:::-;24484:56;24569:4;24563;24559:15;24549:25;;24462:118;24411:169;;;;:::o;24585:295::-;24661:4;24807:29;24832:3;24826:4;24807:29;:::i;:::-;24799:37;;24869:3;24866:1;24862:11;24856:4;24853:21;24845:29;;24585:295;;;;:::o;24885:1395::-;25002:37;25035:3;25002:37;:::i;:::-;25104:18;25096:6;25093:30;25090:56;;;25126:18;;:::i;:::-;25090:56;25170:38;25202:4;25196:11;25170:38;:::i;:::-;25255:67;25315:6;25307;25301:4;25255:67;:::i;:::-;25349:1;25373:4;25360:17;;25405:2;25397:6;25394:14;25422:1;25417:618;;;;26079:1;26096:6;26093:77;;;26145:9;26140:3;26136:19;26130:26;26121:35;;26093:77;26196:67;26256:6;26249:5;26196:67;:::i;:::-;26190:4;26183:81;26052:222;25387:887;;25417:618;25469:4;25465:9;25457:6;25453:22;25503:37;25535:4;25503:37;:::i;:::-;25562:1;25576:208;25590:7;25587:1;25584:14;25576:208;;;25669:9;25664:3;25660:19;25654:26;25646:6;25639:42;25720:1;25712:6;25708:14;25698:24;;25767:2;25756:9;25752:18;25739:31;;25613:4;25610:1;25606:12;25601:17;;25576:208;;;25812:6;25803:7;25800:19;25797:179;;;25870:9;25865:3;25861:19;25855:26;25913:48;25955:4;25947:6;25943:17;25932:9;25913:48;:::i;:::-;25905:6;25898:64;25820:156;25797:179;26022:1;26018;26010:6;26006:14;26002:22;25996:4;25989:36;25424:611;;;25387:887;;24977:1303;;;24885:1395;;:::o;26286:228::-;26426:34;26422:1;26414:6;26410:14;26403:58;26495:11;26490:2;26482:6;26478:15;26471:36;26286:228;:::o;26520:366::-;26662:3;26683:67;26747:2;26742:3;26683:67;:::i;:::-;26676:74;;26759:93;26848:3;26759:93;:::i;:::-;26877:2;26872:3;26868:12;26861:19;;26520:366;;;:::o;26892:419::-;27058:4;27096:2;27085:9;27081:18;27073:26;;27145:9;27139:4;27135:20;27131:1;27120:9;27116:17;27109:47;27173:131;27299:4;27173:131;:::i;:::-;27165:139;;26892:419;;;:::o;27317:229::-;27457:34;27453:1;27445:6;27441:14;27434:58;27526:12;27521:2;27513:6;27509:15;27502:37;27317:229;:::o;27552:366::-;27694:3;27715:67;27779:2;27774:3;27715:67;:::i;:::-;27708:74;;27791:93;27880:3;27791:93;:::i;:::-;27909:2;27904:3;27900:12;27893:19;;27552:366;;;:::o;27924:419::-;28090:4;28128:2;28117:9;28113:18;28105:26;;28177:9;28171:4;28167:20;28163:1;28152:9;28148:17;28141:47;28205:131;28331:4;28205:131;:::i;:::-;28197:139;;27924:419;;;:::o;28349:161::-;28489:13;28485:1;28477:6;28473:14;28466:37;28349:161;:::o;28516:366::-;28658:3;28679:67;28743:2;28738:3;28679:67;:::i;:::-;28672:74;;28755:93;28844:3;28755:93;:::i;:::-;28873:2;28868:3;28864:12;28857:19;;28516:366;;;:::o;28888:419::-;29054:4;29092:2;29081:9;29077:18;29069:26;;29141:9;29135:4;29131:20;29127:1;29116:9;29112:17;29105:47;29169:131;29295:4;29169:131;:::i;:::-;29161:139;;28888:419;;;:::o;29313:191::-;29353:3;29372:20;29390:1;29372:20;:::i;:::-;29367:25;;29406:20;29424:1;29406:20;:::i;:::-;29401:25;;29449:1;29446;29442:9;29435:16;;29470:3;29467:1;29464:10;29461:36;;;29477:18;;:::i;:::-;29461:36;29313:191;;;;:::o;29510:160::-;29650:12;29646:1;29638:6;29634:14;29627:36;29510:160;:::o;29676:366::-;29818:3;29839:67;29903:2;29898:3;29839:67;:::i;:::-;29832:74;;29915:93;30004:3;29915:93;:::i;:::-;30033:2;30028:3;30024:12;30017:19;;29676:366;;;:::o;30048:419::-;30214:4;30252:2;30241:9;30237:18;30229:26;;30301:9;30295:4;30291:20;30287:1;30276:9;30272:17;30265:47;30329:131;30455:4;30329:131;:::i;:::-;30321:139;;30048:419;;;:::o;30473:167::-;30613:19;30609:1;30601:6;30597:14;30590:43;30473:167;:::o;30646:366::-;30788:3;30809:67;30873:2;30868:3;30809:67;:::i;:::-;30802:74;;30885:93;30974:3;30885:93;:::i;:::-;31003:2;30998:3;30994:12;30987:19;;30646:366;;;:::o;31018:419::-;31184:4;31222:2;31211:9;31207:18;31199:26;;31271:9;31265:4;31261:20;31257:1;31246:9;31242:17;31235:47;31299:131;31425:4;31299:131;:::i;:::-;31291:139;;31018:419;;;:::o;31443:169::-;31583:21;31579:1;31571:6;31567:14;31560:45;31443:169;:::o;31618:366::-;31760:3;31781:67;31845:2;31840:3;31781:67;:::i;:::-;31774:74;;31857:93;31946:3;31857:93;:::i;:::-;31975:2;31970:3;31966:12;31959:19;;31618:366;;;:::o;31990:419::-;32156:4;32194:2;32183:9;32179:18;32171:26;;32243:9;32237:4;32233:20;32229:1;32218:9;32214:17;32207:47;32271:131;32397:4;32271:131;:::i;:::-;32263:139;;31990:419;;;:::o;32415:175::-;32555:27;32551:1;32543:6;32539:14;32532:51;32415:175;:::o;32596:366::-;32738:3;32759:67;32823:2;32818:3;32759:67;:::i;:::-;32752:74;;32835:93;32924:3;32835:93;:::i;:::-;32953:2;32948:3;32944:12;32937:19;;32596:366;;;:::o;32968:419::-;33134:4;33172:2;33161:9;33157:18;33149:26;;33221:9;33215:4;33211:20;33207:1;33196:9;33192:17;33185:47;33249:131;33375:4;33249:131;:::i;:::-;33241:139;;32968:419;;;:::o;33393:234::-;33533:34;33529:1;33521:6;33517:14;33510:58;33602:17;33597:2;33589:6;33585:15;33578:42;33393:234;:::o;33633:366::-;33775:3;33796:67;33860:2;33855:3;33796:67;:::i;:::-;33789:74;;33872:93;33961:3;33872:93;:::i;:::-;33990:2;33985:3;33981:12;33974:19;;33633:366;;;:::o;34005:419::-;34171:4;34209:2;34198:9;34194:18;34186:26;;34258:9;34252:4;34248:20;34244:1;34233:9;34229:17;34222:47;34286:131;34412:4;34286:131;:::i;:::-;34278:139;;34005:419;;;:::o;34430:148::-;34532:11;34569:3;34554:18;;34430:148;;;;:::o;34608:874::-;34711:3;34748:5;34742:12;34777:36;34803:9;34777:36;:::i;:::-;34829:89;34911:6;34906:3;34829:89;:::i;:::-;34822:96;;34949:1;34938:9;34934:17;34965:1;34960:166;;;;35140:1;35135:341;;;;34927:549;;34960:166;35044:4;35040:9;35029;35025:25;35020:3;35013:38;35106:6;35099:14;35092:22;35084:6;35080:35;35075:3;35071:45;35064:52;;34960:166;;35135:341;35202:38;35234:5;35202:38;:::i;:::-;35262:1;35276:154;35290:6;35287:1;35284:13;35276:154;;;35364:7;35358:14;35354:1;35349:3;35345:11;35338:35;35414:1;35405:7;35401:15;35390:26;;35312:4;35309:1;35305:12;35300:17;;35276:154;;;35459:6;35454:3;35450:16;35443:23;;35142:334;;34927:549;;34715:767;;34608:874;;;;:::o;35488:390::-;35594:3;35622:39;35655:5;35622:39;:::i;:::-;35677:89;35759:6;35754:3;35677:89;:::i;:::-;35670:96;;35775:65;35833:6;35828:3;35821:4;35814:5;35810:16;35775:65;:::i;:::-;35865:6;35860:3;35856:16;35849:23;;35598:280;35488:390;;;;:::o;35884:155::-;36024:7;36020:1;36012:6;36008:14;36001:31;35884:155;:::o;36045:400::-;36205:3;36226:84;36308:1;36303:3;36226:84;:::i;:::-;36219:91;;36319:93;36408:3;36319:93;:::i;:::-;36437:1;36432:3;36428:11;36421:18;;36045:400;;;:::o;36451:695::-;36729:3;36751:92;36839:3;36830:6;36751:92;:::i;:::-;36744:99;;36860:95;36951:3;36942:6;36860:95;:::i;:::-;36853:102;;36972:148;37116:3;36972:148;:::i;:::-;36965:155;;37137:3;37130:10;;36451:695;;;;;:::o;37152:225::-;37292:34;37288:1;37280:6;37276:14;37269:58;37361:8;37356:2;37348:6;37344:15;37337:33;37152:225;:::o;37383:366::-;37525:3;37546:67;37610:2;37605:3;37546:67;:::i;:::-;37539:74;;37622:93;37711:3;37622:93;:::i;:::-;37740:2;37735:3;37731:12;37724:19;;37383:366;;;:::o;37755:419::-;37921:4;37959:2;37948:9;37944:18;37936:26;;38008:9;38002:4;37998:20;37994:1;37983:9;37979:17;37972:47;38036:131;38162:4;38036:131;:::i;:::-;38028:139;;37755:419;;;:::o;38180:147::-;38281:11;38318:3;38303:18;;38180:147;;;;:::o;38333:114::-;;:::o;38453:398::-;38612:3;38633:83;38714:1;38709:3;38633:83;:::i;:::-;38626:90;;38725:93;38814:3;38725:93;:::i;:::-;38843:1;38838:3;38834:11;38827:18;;38453:398;;;:::o;38857:379::-;39041:3;39063:147;39206:3;39063:147;:::i;:::-;39056:154;;39227:3;39220:10;;38857:379;;;:::o;39242:167::-;39382:19;39378:1;39370:6;39366:14;39359:43;39242:167;:::o;39415:366::-;39557:3;39578:67;39642:2;39637:3;39578:67;:::i;:::-;39571:74;;39654:93;39743:3;39654:93;:::i;:::-;39772:2;39767:3;39763:12;39756:19;;39415:366;;;:::o;39787:419::-;39953:4;39991:2;39980:9;39976:18;39968:26;;40040:9;40034:4;40030:20;40026:1;40015:9;40011:17;40004:47;40068:131;40194:4;40068:131;:::i;:::-;40060:139;;39787:419;;;:::o;40212:182::-;40352:34;40348:1;40340:6;40336:14;40329:58;40212:182;:::o;40400:366::-;40542:3;40563:67;40627:2;40622:3;40563:67;:::i;:::-;40556:74;;40639:93;40728:3;40639:93;:::i;:::-;40757:2;40752:3;40748:12;40741:19;;40400:366;;;:::o;40772:419::-;40938:4;40976:2;40965:9;40961:18;40953:26;;41025:9;41019:4;41015:20;41011:1;41000:9;40996:17;40989:47;41053:131;41179:4;41053:131;:::i;:::-;41045:139;;40772:419;;;:::o;41197:229::-;41337:34;41333:1;41325:6;41321:14;41314:58;41406:12;41401:2;41393:6;41389:15;41382:37;41197:229;:::o;41432:366::-;41574:3;41595:67;41659:2;41654:3;41595:67;:::i;:::-;41588:74;;41671:93;41760:3;41671:93;:::i;:::-;41789:2;41784:3;41780:12;41773:19;;41432:366;;;:::o;41804:419::-;41970:4;42008:2;41997:9;41993:18;41985:26;;42057:9;42051:4;42047:20;42043:1;42032:9;42028:17;42021:47;42085:131;42211:4;42085:131;:::i;:::-;42077:139;;41804:419;;;:::o;42229:175::-;42369:27;42365:1;42357:6;42353:14;42346:51;42229:175;:::o;42410:366::-;42552:3;42573:67;42637:2;42632:3;42573:67;:::i;:::-;42566:74;;42649:93;42738:3;42649:93;:::i;:::-;42767:2;42762:3;42758:12;42751:19;;42410:366;;;:::o;42782:419::-;42948:4;42986:2;42975:9;42971:18;42963:26;;43035:9;43029:4;43025:20;43021:1;43010:9;43006:17;42999:47;43063:131;43189:4;43063:131;:::i;:::-;43055:139;;42782:419;;;:::o;43207:231::-;43347:34;43343:1;43335:6;43331:14;43324:58;43416:14;43411:2;43403:6;43399:15;43392:39;43207:231;:::o;43444:366::-;43586:3;43607:67;43671:2;43666:3;43607:67;:::i;:::-;43600:74;;43683:93;43772:3;43683:93;:::i;:::-;43801:2;43796:3;43792:12;43785:19;;43444:366;;;:::o;43816:419::-;43982:4;44020:2;44009:9;44005:18;43997:26;;44069:9;44063:4;44059:20;44055:1;44044:9;44040:17;44033:47;44097:131;44223:4;44097:131;:::i;:::-;44089:139;;43816:419;;;:::o;44241:228::-;44381:34;44377:1;44369:6;44365:14;44358:58;44450:11;44445:2;44437:6;44433:15;44426:36;44241:228;:::o;44475:366::-;44617:3;44638:67;44702:2;44697:3;44638:67;:::i;:::-;44631:74;;44714:93;44803:3;44714:93;:::i;:::-;44832:2;44827:3;44823:12;44816:19;;44475:366;;;:::o;44847:419::-;45013:4;45051:2;45040:9;45036:18;45028:26;;45100:9;45094:4;45090:20;45086:1;45075:9;45071:17;45064:47;45128:131;45254:4;45128:131;:::i;:::-;45120:139;;44847:419;;;:::o;45272:223::-;45412:34;45408:1;45400:6;45396:14;45389:58;45481:6;45476:2;45468:6;45464:15;45457:31;45272:223;:::o;45501:366::-;45643:3;45664:67;45728:2;45723:3;45664:67;:::i;:::-;45657:74;;45740:93;45829:3;45740:93;:::i;:::-;45858:2;45853:3;45849:12;45842:19;;45501:366;;;:::o;45873:419::-;46039:4;46077:2;46066:9;46062:18;46054:26;;46126:9;46120:4;46116:20;46112:1;46101:9;46097:17;46090:47;46154:131;46280:4;46154:131;:::i;:::-;46146:139;;45873:419;;;:::o;46298:177::-;46438:29;46434:1;46426:6;46422:14;46415:53;46298:177;:::o;46481:366::-;46623:3;46644:67;46708:2;46703:3;46644:67;:::i;:::-;46637:74;;46720:93;46809:3;46720:93;:::i;:::-;46838:2;46833:3;46829:12;46822:19;;46481:366;;;:::o;46853:419::-;47019:4;47057:2;47046:9;47042:18;47034:26;;47106:9;47100:4;47096:20;47092:1;47081:9;47077:17;47070:47;47134:131;47260:4;47134:131;:::i;:::-;47126:139;;46853:419;;;:::o;47278:237::-;47418:34;47414:1;47406:6;47402:14;47395:58;47487:20;47482:2;47474:6;47470:15;47463:45;47278:237;:::o;47521:366::-;47663:3;47684:67;47748:2;47743:3;47684:67;:::i;:::-;47677:74;;47760:93;47849:3;47760:93;:::i;:::-;47878:2;47873:3;47869:12;47862:19;;47521:366;;;:::o;47893:419::-;48059:4;48097:2;48086:9;48082:18;48074:26;;48146:9;48140:4;48136:20;48132:1;48121:9;48117:17;48110:47;48174:131;48300:4;48174:131;:::i;:::-;48166:139;;47893:419;;;:::o;48318:98::-;48369:6;48403:5;48397:12;48387:22;;48318:98;;;:::o;48422:168::-;48505:11;48539:6;48534:3;48527:19;48579:4;48574:3;48570:14;48555:29;;48422:168;;;;:::o;48596:373::-;48682:3;48710:38;48742:5;48710:38;:::i;:::-;48764:70;48827:6;48822:3;48764:70;:::i;:::-;48757:77;;48843:65;48901:6;48896:3;48889:4;48882:5;48878:16;48843:65;:::i;:::-;48933:29;48955:6;48933:29;:::i;:::-;48928:3;48924:39;48917:46;;48686:283;48596:373;;;;:::o;48975:640::-;49170:4;49208:3;49197:9;49193:19;49185:27;;49222:71;49290:1;49279:9;49275:17;49266:6;49222:71;:::i;:::-;49303:72;49371:2;49360:9;49356:18;49347:6;49303:72;:::i;:::-;49385;49453:2;49442:9;49438:18;49429:6;49385:72;:::i;:::-;49504:9;49498:4;49494:20;49489:2;49478:9;49474:18;49467:48;49532:76;49603:4;49594:6;49532:76;:::i;:::-;49524:84;;48975:640;;;;;;;:::o;49621:141::-;49677:5;49708:6;49702:13;49693:22;;49724:32;49750:5;49724:32;:::i;:::-;49621:141;;;;:::o;49768:349::-;49837:6;49886:2;49874:9;49865:7;49861:23;49857:32;49854:119;;;49892:79;;:::i;:::-;49854:119;50012:1;50037:63;50092:7;50083:6;50072:9;50068:22;50037:63;:::i;:::-;50027:73;;49983:127;49768:349;;;;:::o;50123:182::-;50263:34;50259:1;50251:6;50247:14;50240:58;50123:182;:::o;50311:366::-;50453:3;50474:67;50538:2;50533:3;50474:67;:::i;:::-;50467:74;;50550:93;50639:3;50550:93;:::i;:::-;50668:2;50663:3;50659:12;50652:19;;50311:366;;;:::o;50683:419::-;50849:4;50887:2;50876:9;50872:18;50864:26;;50936:9;50930:4;50926:20;50922:1;50911:9;50907:17;50900:47;50964:131;51090:4;50964:131;:::i;:::-;50956:139;;50683:419;;;:::o;51108:164::-;51248:16;51244:1;51236:6;51232:14;51225:40;51108:164;:::o;51278:366::-;51420:3;51441:67;51505:2;51500:3;51441:67;:::i;:::-;51434:74;;51517:93;51606:3;51517:93;:::i;:::-;51635:2;51630:3;51626:12;51619:19;;51278:366;;;:::o;51650:419::-;51816:4;51854:2;51843:9;51839:18;51831:26;;51903:9;51897:4;51893:20;51889:1;51878:9;51874:17;51867:47;51931:131;52057:4;51931:131;:::i;:::-;51923:139;;51650:419;;;:::o

Swarm Source

ipfs://35e96cf6611b48f138efaabcb37bb5b4e662f0e3d23d2f12fa2694345a25b3eb
Loading...
Loading
Loading...
Loading
[ Download: CSV Export  ]
[ Download: CSV Export  ]

A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.