ETH Price: $3,241.29 (+2.22%)
Gas: 2 Gwei

Token

ParisOperaAlgoBallet (OPERA1)
 

Overview

Max Total Supply

256 OPERA1

Holders

215

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 OPERA1
0xAda6Cbd477311409DF392F869c21f384A2d9D1ff
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:
Iko3OperaEmergenceNft

Compiler Version
v0.8.18+commit.87f61d96

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2023-03-11
*/

// File: @openzeppelin/[email protected]/utils/structs/EnumerableSet.sol


// OpenZeppelin Contracts (last updated v4.8.0) (utils/structs/EnumerableSet.sol)
// This file was procedurally generated from scripts/generate/templates/EnumerableSet.js.

pragma solidity ^0.8.0;

/**
 * @dev Library for managing
 * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive
 * types.
 *
 * Sets have the following properties:
 *
 * - Elements are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Elements are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableSet for EnumerableSet.AddressSet;
 *
 *     // Declare a set state variable
 *     EnumerableSet.AddressSet private mySet;
 * }
 * ```
 *
 * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`)
 * and `uint256` (`UintSet`) are supported.
 *
 * [WARNING]
 * ====
 * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure
 * unusable.
 * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info.
 *
 * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an
 * array of EnumerableSet.
 * ====
 */
library EnumerableSet {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Set type with
    // bytes32 values.
    // The Set implementation uses private functions, and user-facing
    // implementations (such as AddressSet) are just wrappers around the
    // underlying Set.
    // This means that we can only create new EnumerableSets for types that fit
    // in bytes32.

    struct Set {
        // Storage of set values
        bytes32[] _values;
        // Position of the value in the `values` array, plus 1 because index 0
        // means a value is not in the set.
        mapping(bytes32 => uint256) _indexes;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function _add(Set storage set, bytes32 value) private returns (bool) {
        if (!_contains(set, value)) {
            set._values.push(value);
            // The value is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            set._indexes[value] = set._values.length;
            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function _remove(Set storage set, bytes32 value) private returns (bool) {
        // We read and store the value's index to prevent multiple reads from the same storage slot
        uint256 valueIndex = set._indexes[value];

        if (valueIndex != 0) {
            // Equivalent to contains(set, value)
            // To delete an element from the _values array in O(1), we swap the element to delete with the last one in
            // the array, and then remove the last element (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = valueIndex - 1;
            uint256 lastIndex = set._values.length - 1;

            if (lastIndex != toDeleteIndex) {
                bytes32 lastValue = set._values[lastIndex];

                // Move the last value to the index where the value to delete is
                set._values[toDeleteIndex] = lastValue;
                // Update the index for the moved value
                set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex
            }

            // Delete the slot where the moved value was stored
            set._values.pop();

            // Delete the index for the deleted slot
            delete set._indexes[value];

            return true;
        } else {
            return false;
        }
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function _contains(Set storage set, bytes32 value) private view returns (bool) {
        return set._indexes[value] != 0;
    }

    /**
     * @dev Returns the number of values on the set. O(1).
     */
    function _length(Set storage set) private view returns (uint256) {
        return set._values.length;
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function _at(Set storage set, uint256 index) private view returns (bytes32) {
        return set._values[index];
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function _values(Set storage set) private view returns (bytes32[] memory) {
        return set._values;
    }

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _add(set._inner, value);
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) {
        return _remove(set._inner, value);
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) {
        return _contains(set._inner, value);
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(Bytes32Set storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) {
        return _at(set._inner, index);
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(Bytes32Set storage set) internal view returns (bytes32[] memory) {
        bytes32[] memory store = _values(set._inner);
        bytes32[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(AddressSet storage set, address value) internal returns (bool) {
        return _add(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(AddressSet storage set, address value) internal returns (bool) {
        return _remove(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(AddressSet storage set, address value) internal view returns (bool) {
        return _contains(set._inner, bytes32(uint256(uint160(value))));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(AddressSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(AddressSet storage set, uint256 index) internal view returns (address) {
        return address(uint160(uint256(_at(set._inner, index))));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(AddressSet storage set) internal view returns (address[] memory) {
        bytes32[] memory store = _values(set._inner);
        address[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

    /**
     * @dev Add a value to a set. O(1).
     *
     * Returns true if the value was added to the set, that is if it was not
     * already present.
     */
    function add(UintSet storage set, uint256 value) internal returns (bool) {
        return _add(set._inner, bytes32(value));
    }

    /**
     * @dev Removes a value from a set. O(1).
     *
     * Returns true if the value was removed from the set, that is if it was
     * present.
     */
    function remove(UintSet storage set, uint256 value) internal returns (bool) {
        return _remove(set._inner, bytes32(value));
    }

    /**
     * @dev Returns true if the value is in the set. O(1).
     */
    function contains(UintSet storage set, uint256 value) internal view returns (bool) {
        return _contains(set._inner, bytes32(value));
    }

    /**
     * @dev Returns the number of values in the set. O(1).
     */
    function length(UintSet storage set) internal view returns (uint256) {
        return _length(set._inner);
    }

    /**
     * @dev Returns the value stored at position `index` in the set. O(1).
     *
     * Note that there are no guarantees on the ordering of values inside the
     * array, and it may change when more values are added or removed.
     *
     * Requirements:
     *
     * - `index` must be strictly less than {length}.
     */
    function at(UintSet storage set, uint256 index) internal view returns (uint256) {
        return uint256(_at(set._inner, index));
    }

    /**
     * @dev Return the entire set in an array
     *
     * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed
     * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that
     * this function has an unbounded cost, and using it as part of a state-changing function may render the function
     * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block.
     */
    function values(UintSet storage set) internal view returns (uint256[] memory) {
        bytes32[] memory store = _values(set._inner);
        uint256[] memory result;

        /// @solidity memory-safe-assembly
        assembly {
            result := store
        }

        return result;
    }
}

// File: @openzeppelin/[email protected]/access/IAccessControl.sol


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

pragma solidity ^0.8.0;

/**
 * @dev External interface of AccessControl declared to support ERC165 detection.
 */
interface IAccessControl {
    /**
     * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`
     *
     * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite
     * {RoleAdminChanged} not being emitted signaling this.
     *
     * _Available since v3.1._
     */
    event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);

    /**
     * @dev Emitted when `account` is granted `role`.
     *
     * `sender` is the account that originated the contract call, an admin role
     * bearer except when using {AccessControl-_setupRole}.
     */
    event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Emitted when `account` is revoked `role`.
     *
     * `sender` is the account that originated the contract call:
     *   - if using `revokeRole`, it is the admin role bearer
     *   - if using `renounceRole`, it is the role bearer (i.e. `account`)
     */
    event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) external view returns (bool);

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {AccessControl-_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) external view returns (bytes32);

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function grantRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     */
    function revokeRole(bytes32 role, address account) external;

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been granted `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     */
    function renounceRole(bytes32 role, address account) external;
}

// File: @openzeppelin/[email protected]/access/IAccessControlEnumerable.sol


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

pragma solidity ^0.8.0;


/**
 * @dev External interface of AccessControlEnumerable declared to support ERC165 detection.
 */
interface IAccessControlEnumerable is IAccessControl {
    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) external view returns (address);

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) external view returns (uint256);
}

// File: @openzeppelin/[email protected]/utils/math/Math.sol


// 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/[email protected]/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/[email protected]/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/[email protected]/security/Pausable.sol


// OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol)

pragma solidity ^0.8.0;


/**
 * @dev Contract module which allows children to implement an emergency stop
 * mechanism that can be triggered by an authorized account.
 *
 * This module is used through inheritance. It will make available the
 * modifiers `whenNotPaused` and `whenPaused`, which can be applied to
 * the functions of your contract. Note that they will not be pausable by
 * simply including this module, only once the modifiers are put in place.
 */
abstract contract Pausable is Context {
    /**
     * @dev Emitted when the pause is triggered by `account`.
     */
    event Paused(address account);

    /**
     * @dev Emitted when the pause is lifted by `account`.
     */
    event Unpaused(address account);

    bool private _paused;

    /**
     * @dev Initializes the contract in unpaused state.
     */
    constructor() {
        _paused = false;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is not paused.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    modifier whenNotPaused() {
        _requireNotPaused();
        _;
    }

    /**
     * @dev Modifier to make a function callable only when the contract is paused.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    modifier whenPaused() {
        _requirePaused();
        _;
    }

    /**
     * @dev Returns true if the contract is paused, and false otherwise.
     */
    function paused() public view virtual returns (bool) {
        return _paused;
    }

    /**
     * @dev Throws if the contract is paused.
     */
    function _requireNotPaused() internal view virtual {
        require(!paused(), "Pausable: paused");
    }

    /**
     * @dev Throws if the contract is not paused.
     */
    function _requirePaused() internal view virtual {
        require(paused(), "Pausable: not paused");
    }

    /**
     * @dev Triggers stopped state.
     *
     * Requirements:
     *
     * - The contract must not be paused.
     */
    function _pause() internal virtual whenNotPaused {
        _paused = true;
        emit Paused(_msgSender());
    }

    /**
     * @dev Returns to normal state.
     *
     * Requirements:
     *
     * - The contract must be paused.
     */
    function _unpause() internal virtual whenPaused {
        _paused = false;
        emit Unpaused(_msgSender());
    }
}

// File: @openzeppelin/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/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/[email protected]/access/AccessControl.sol


// OpenZeppelin Contracts (last updated v4.8.0) (access/AccessControl.sol)

pragma solidity ^0.8.0;





/**
 * @dev Contract module that allows children to implement role-based access
 * control mechanisms. This is a lightweight version that doesn't allow enumerating role
 * members except through off-chain means by accessing the contract event logs. Some
 * applications may benefit from on-chain enumerability, for those cases see
 * {AccessControlEnumerable}.
 *
 * Roles are referred to by their `bytes32` identifier. These should be exposed
 * in the external API and be unique. The best way to achieve this is by
 * using `public constant` hash digests:
 *
 * ```
 * bytes32 public constant MY_ROLE = keccak256("MY_ROLE");
 * ```
 *
 * Roles can be used to represent a set of permissions. To restrict access to a
 * function call, use {hasRole}:
 *
 * ```
 * function foo() public {
 *     require(hasRole(MY_ROLE, msg.sender));
 *     ...
 * }
 * ```
 *
 * Roles can be granted and revoked dynamically via the {grantRole} and
 * {revokeRole} functions. Each role has an associated admin role, and only
 * accounts that have a role's admin role can call {grantRole} and {revokeRole}.
 *
 * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means
 * that only accounts with this role will be able to grant or revoke other
 * roles. More complex role relationships can be created by using
 * {_setRoleAdmin}.
 *
 * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to
 * grant and revoke this role. Extra precautions should be taken to secure
 * accounts that have been granted it.
 */
abstract contract AccessControl is Context, IAccessControl, ERC165 {
    struct RoleData {
        mapping(address => bool) members;
        bytes32 adminRole;
    }

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

    /**
     * @dev Modifier that checks that an account has a specific role. Reverts
     * with a standardized message including the required role.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     *
     * _Available since v4.1._
     */
    modifier onlyRole(bytes32 role) {
        _checkRole(role);
        _;
    }

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

    /**
     * @dev Returns `true` if `account` has been granted `role`.
     */
    function hasRole(bytes32 role, address account) public view virtual override returns (bool) {
        return _roles[role].members[account];
    }

    /**
     * @dev Revert with a standard message if `_msgSender()` is missing `role`.
     * Overriding this function changes the behavior of the {onlyRole} modifier.
     *
     * Format of the revert message is described in {_checkRole}.
     *
     * _Available since v4.6._
     */
    function _checkRole(bytes32 role) internal view virtual {
        _checkRole(role, _msgSender());
    }

    /**
     * @dev Revert with a standard message if `account` is missing `role`.
     *
     * The format of the revert reason is given by the following regular expression:
     *
     *  /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/
     */
    function _checkRole(bytes32 role, address account) internal view virtual {
        if (!hasRole(role, account)) {
            revert(
                string(
                    abi.encodePacked(
                        "AccessControl: account ",
                        Strings.toHexString(account),
                        " is missing role ",
                        Strings.toHexString(uint256(role), 32)
                    )
                )
            );
        }
    }

    /**
     * @dev Returns the admin role that controls `role`. See {grantRole} and
     * {revokeRole}.
     *
     * To change a role's admin, use {_setRoleAdmin}.
     */
    function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {
        return _roles[role].adminRole;
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleGranted} event.
     */
    function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _grantRole(role, account);
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * If `account` had been granted `role`, emits a {RoleRevoked} event.
     *
     * Requirements:
     *
     * - the caller must have ``role``'s admin role.
     *
     * May emit a {RoleRevoked} event.
     */
    function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {
        _revokeRole(role, account);
    }

    /**
     * @dev Revokes `role` from the calling account.
     *
     * Roles are often managed via {grantRole} and {revokeRole}: this function's
     * purpose is to provide a mechanism for accounts to lose their privileges
     * if they are compromised (such as when a trusted device is misplaced).
     *
     * If the calling account had been revoked `role`, emits a {RoleRevoked}
     * event.
     *
     * Requirements:
     *
     * - the caller must be `account`.
     *
     * May emit a {RoleRevoked} event.
     */
    function renounceRole(bytes32 role, address account) public virtual override {
        require(account == _msgSender(), "AccessControl: can only renounce roles for self");

        _revokeRole(role, account);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * If `account` had not been already granted `role`, emits a {RoleGranted}
     * event. Note that unlike {grantRole}, this function doesn't perform any
     * checks on the calling account.
     *
     * May emit a {RoleGranted} event.
     *
     * [WARNING]
     * ====
     * This function should only be called from the constructor when setting
     * up the initial roles for the system.
     *
     * Using this function in any other way is effectively circumventing the admin
     * system imposed by {AccessControl}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

    /**
     * @dev Sets `adminRole` as ``role``'s admin role.
     *
     * Emits a {RoleAdminChanged} event.
     */
    function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {
        bytes32 previousAdminRole = getRoleAdmin(role);
        _roles[role].adminRole = adminRole;
        emit RoleAdminChanged(role, previousAdminRole, adminRole);
    }

    /**
     * @dev Grants `role` to `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleGranted} event.
     */
    function _grantRole(bytes32 role, address account) internal virtual {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    /**
     * @dev Revokes `role` from `account`.
     *
     * Internal function without access restriction.
     *
     * May emit a {RoleRevoked} event.
     */
    function _revokeRole(bytes32 role, address account) internal virtual {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

// File: @openzeppelin/[email protected]/access/AccessControlEnumerable.sol


// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol)

pragma solidity ^0.8.0;




/**
 * @dev Extension of {AccessControl} that allows enumerating the members of each role.
 */
abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl {
    using EnumerableSet for EnumerableSet.AddressSet;

    mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers;

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

    /**
     * @dev Returns one of the accounts that have `role`. `index` must be a
     * value between 0 and {getRoleMemberCount}, non-inclusive.
     *
     * Role bearers are not sorted in any particular way, and their ordering may
     * change at any point.
     *
     * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure
     * you perform all queries on the same block. See the following
     * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post]
     * for more information.
     */
    function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) {
        return _roleMembers[role].at(index);
    }

    /**
     * @dev Returns the number of accounts that have `role`. Can be used
     * together with {getRoleMember} to enumerate all bearers of a role.
     */
    function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) {
        return _roleMembers[role].length();
    }

    /**
     * @dev Overload {_grantRole} to track enumerable memberships
     */
    function _grantRole(bytes32 role, address account) internal virtual override {
        super._grantRole(role, account);
        _roleMembers[role].add(account);
    }

    /**
     * @dev Overload {_revokeRole} to track enumerable memberships
     */
    function _revokeRole(bytes32 role, address account) internal virtual override {
        super._revokeRole(role, account);
        _roleMembers[role].remove(account);
    }
}

// File: @openzeppelin/[email protected]/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/[email protected]/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/[email protected]/token/ERC721/extensions/IERC721Enumerable.sol


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

pragma solidity ^0.8.0;


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

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

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

// File: @openzeppelin/[email protected]/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/[email protected]/token/ERC721/ERC721.sol


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

pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        _requireMinted(tokenId);

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");

        _transfer(from, to, tokenId);
    }

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

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

    /**
     * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients
     * are aware of the ERC721 protocol to prevent tokens from being forever locked.
     *
     * `data` is additional data, it has no specified format and it is sent in call to `to`.
     *
     * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.
     * implement alternative mechanisms to perform token transfer, such as signature-based.
     *
     * Requirements:
     *
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     * - `tokenId` token must exist and be owned by `from`.
     * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.
     *
     * Emits a {Transfer} event.
     */
    function _safeTransfer(
        address from,
        address to,
        uint256 tokenId,
        bytes memory data
    ) internal virtual {
        _transfer(from, to, tokenId);
        require(_checkOnERC721Received(from, to, tokenId, data), "ERC721: transfer to non ERC721Receiver implementer");
    }

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

    /**
     * @dev Returns whether `tokenId` exists.
     *
     * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.
     *
     * Tokens start existing when they are minted (`_mint`),
     * and stop existing when they are burned (`_burn`).
     */
    function _exists(uint256 tokenId) internal view virtual returns (bool) {
        return _ownerOf(tokenId) != address(0);
    }

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

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

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

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

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

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

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

        _owners[tokenId] = to;

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

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

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

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

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

        // Clear approvals
        delete _tokenApprovals[tokenId];

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

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

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

    /**
     * @dev Transfers `tokenId` from `from` to `to`.
     *  As opposed to {transferFrom}, this imposes no restrictions on msg.sender.
     *
     * Requirements:
     *
     * - `to` cannot be the zero address.
     * - `tokenId` token must be owned by `from`.
     *
     * Emits a {Transfer} event.
     */
    function _transfer(
        address from,
        address to,
        uint256 tokenId
    ) internal virtual {
        require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer from incorrect owner");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId, 1);

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

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

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

        emit Transfer(from, to, tokenId);

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

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

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

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

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

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

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

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Royalty.sol


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

pragma solidity ^0.8.0;




/**
 * @dev Extension of ERC721 with the ERC2981 NFT Royalty Standard, a standardized way to retrieve royalty payment
 * information.
 *
 * Royalty information can be specified globally for all token ids via {ERC2981-_setDefaultRoyalty}, and/or individually for
 * specific token ids via {ERC2981-_setTokenRoyalty}. The latter takes precedence over the first.
 *
 * 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 ERC721Royalty is ERC2981, ERC721 {
    /**
     * @dev See {IERC165-supportsInterface}.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721, ERC2981) returns (bool) {
        return super.supportsInterface(interfaceId);
    }

    /**
     * @dev See {ERC721-_burn}. This override additionally clears the royalty information for the token.
     */
    function _burn(uint256 tokenId) internal virtual override {
        super._burn(tokenId);
        _resetTokenRoyalty(tokenId);
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Pausable.sol


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

pragma solidity ^0.8.0;



/**
 * @dev ERC721 token with pausable token transfers, minting and burning.
 *
 * Useful for scenarios such as preventing trades until the end of an evaluation
 * period, or having an emergency switch for freezing all token transfers in the
 * event of a large bug.
 */
abstract contract ERC721Pausable is ERC721, Pausable {
    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     *
     * Requirements:
     *
     * - the contract must not be paused.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        require(!paused(), "ERC721Pausable: token transfer while paused");
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Burnable.sol


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

pragma solidity ^0.8.0;



/**
 * @title ERC721 Burnable Token
 * @dev ERC721 Token that can be burned (destroyed).
 */
abstract contract ERC721Burnable is Context, ERC721 {
    /**
     * @dev Burns `tokenId`. See {ERC721-_burn}.
     *
     * Requirements:
     *
     * - The caller must own `tokenId` or be an approved operator.
     */
    function burn(uint256 tokenId) public virtual {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: caller is not token owner or approved");
        _burn(tokenId);
    }
}

// File: @openzeppelin/[email protected]/token/ERC721/extensions/ERC721Enumerable.sol


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

pragma solidity ^0.8.0;



/**
 * @dev This implements an optional extension of {ERC721} defined in the EIP that adds
 * enumerability of all the token ids in the contract as well as all token ids owned by each
 * account.
 */
abstract contract ERC721Enumerable is ERC721, IERC721Enumerable {
    // Mapping from owner to list of owned token IDs
    mapping(address => mapping(uint256 => uint256)) private _ownedTokens;

    // Mapping from token ID to index of the owner tokens list
    mapping(uint256 => uint256) private _ownedTokensIndex;

    // Array with all token ids, used for enumeration
    uint256[] private _allTokens;

    // Mapping from token id to position in the allTokens array
    mapping(uint256 => uint256) private _allTokensIndex;

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

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds");
        return _ownedTokens[owner][index];
    }

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

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

    /**
     * @dev See {ERC721-_beforeTokenTransfer}.
     */
    function _beforeTokenTransfer(
        address from,
        address to,
        uint256 firstTokenId,
        uint256 batchSize
    ) internal virtual override {
        super._beforeTokenTransfer(from, to, firstTokenId, batchSize);

        if (batchSize > 1) {
            // Will only trigger during construction. Batch transferring (minting) is not available afterwards.
            revert("ERC721Enumerable: consecutive transfers not supported");
        }

        uint256 tokenId = firstTokenId;

        if (from == address(0)) {
            _addTokenToAllTokensEnumeration(tokenId);
        } else if (from != to) {
            _removeTokenFromOwnerEnumeration(from, tokenId);
        }
        if (to == address(0)) {
            _removeTokenFromAllTokensEnumeration(tokenId);
        } else if (to != from) {
            _addTokenToOwnerEnumeration(to, tokenId);
        }
    }

    /**
     * @dev Private function to add a token to this extension's ownership-tracking data structures.
     * @param to address representing the new owner of the given token ID
     * @param tokenId uint256 ID of the token to be added to the tokens list of the given address
     */
    function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private {
        uint256 length = ERC721.balanceOf(to);
        _ownedTokens[to][length] = tokenId;
        _ownedTokensIndex[tokenId] = length;
    }

    /**
     * @dev Private function to add a token to this extension's token tracking data structures.
     * @param tokenId uint256 ID of the token to be added to the tokens list
     */
    function _addTokenToAllTokensEnumeration(uint256 tokenId) private {
        _allTokensIndex[tokenId] = _allTokens.length;
        _allTokens.push(tokenId);
    }

    /**
     * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that
     * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for
     * gas optimizations e.g. when performing a transfer operation (avoiding double writes).
     * This has O(1) time complexity, but alters the order of the _ownedTokens array.
     * @param from address representing the previous owner of the given token ID
     * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address
     */
    function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private {
        // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = ERC721.balanceOf(from) - 1;
        uint256 tokenIndex = _ownedTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary
        if (tokenIndex != lastTokenIndex) {
            uint256 lastTokenId = _ownedTokens[from][lastTokenIndex];

            _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
            _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index
        }

        // This also deletes the contents at the last position of the array
        delete _ownedTokensIndex[tokenId];
        delete _ownedTokens[from][lastTokenIndex];
    }

    /**
     * @dev Private function to remove a token from this extension's token tracking data structures.
     * This has O(1) time complexity, but alters the order of the _allTokens array.
     * @param tokenId uint256 ID of the token to be removed from the tokens list
     */
    function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private {
        // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and
        // then delete the last slot (swap and pop).

        uint256 lastTokenIndex = _allTokens.length - 1;
        uint256 tokenIndex = _allTokensIndex[tokenId];

        // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so
        // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding
        // an 'if' statement (like in _removeTokenFromOwnerEnumeration)
        uint256 lastTokenId = _allTokens[lastTokenIndex];

        _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token
        _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index

        // This also deletes the contents at the last position of the array
        delete _allTokensIndex[tokenId];
        _allTokens.pop();
    }
}

// File: contracts/Iko3NftV1.sol



pragma solidity ^0.8.0;








contract Iko3OperaEmergenceNft is
  Context,
  AccessControlEnumerable,
  ERC721Enumerable,
  ERC721Burnable,
  ERC721Pausable,
  ERC721Royalty 
{
  bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
  bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

  string private _baseTokenURI;

  constructor(
    string memory name,
    string memory symbol,
    string memory baseTokenURI,
    address royaltyReceiver
  ) ERC721(name, symbol) {
    _baseTokenURI = baseTokenURI;

    _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

    _setupRole(MINTER_ROLE, _msgSender());
    _setupRole(PAUSER_ROLE, _msgSender());

    // 5% => 500 / 10000
    _setDefaultRoyalty(royaltyReceiver, 500);
  }

  // Protocol: https://docs.opensea.io/docs/contract-level-metadata
  function contractURI() public view returns (string memory) {
    string memory baseURI = _baseURI();
    return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, "_")) : "";
  }

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


  /// Smart contract admin

  function setBaseURI(string memory baseURI) public onlyRole(DEFAULT_ADMIN_ROLE) {
    _baseTokenURI = baseURI;
  }

  
  // Minting

  function mint(address to, uint256 tokenId) public virtual onlyRole(MINTER_ROLE) {
    _mint(to, tokenId);
  }

  function mint(address approved, address to, uint256 tokenId) public virtual onlyRole(MINTER_ROLE)  {
    _mint(to, tokenId);
    _approve(approved, tokenId);
  }

  function batchMint(address to, uint256 startTokenId, uint256 endTokenIdExclusive) public onlyRole(MINTER_ROLE) {
    for (uint256 current = startTokenId; current < endTokenIdExclusive; current++) {
      _mint(to, current);
    }
  }


  /// Pause feature public exposition

  function pause() public virtual onlyRole(PAUSER_ROLE) {
    _pause();
  }

  function unpause() public virtual onlyRole(PAUSER_ROLE) {
    _unpause();
  }


  /// Overrides

  function _burn(uint256 tokenId) internal virtual override(ERC721, ERC721Royalty) {
    super._burn(tokenId);
  }

  function _beforeTokenTransfer(
    address from,
    address to,
    uint256 firstTokenId,
    uint256 batchSize
  ) internal virtual override(ERC721, ERC721Enumerable, ERC721Pausable) {
    super._beforeTokenTransfer(from, to, firstTokenId, batchSize);
  }

  function supportsInterface(bytes4 interfaceId)
    public
    view
    virtual
    override(AccessControlEnumerable, ERC721, ERC721Enumerable, ERC721Royalty)
    returns (bool)
  {
    return super.supportsInterface(interfaceId);
  }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseTokenURI","type":"string"},{"internalType":"address","name":"royaltyReceiver","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":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"startTokenId","type":"uint256"},{"internalType":"uint256","name":"endTokenIdExclusive","type":"uint256"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","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":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"approved","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","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":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b5060405162005be638038062005be683398181016040528101906200003791906200078b565b838381600490816200004a919062000aa5565b5080600590816200005c919062000aa5565b5050506000600e60006101000a81548160ff02191690831515021790555081600f90816200008b919062000aa5565b50620000b06000801b620000a46200015060201b60201c565b6200015860201b60201c565b620000f17f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6620000e56200015060201b60201c565b6200015860201b60201c565b620001327f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a620001266200015060201b60201c565b6200015860201b60201c565b62000146816101f46200016e60201b60201c565b5050505062000ca7565b600033905090565b6200016a82826200031160201b60201c565b5050565b6200017e6200035960201b60201c565b6bffffffffffffffffffffffff16816bffffffffffffffffffffffff161115620001df576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620001d69062000c13565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160362000251576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620002489062000c85565b60405180910390fd5b60405180604001604052808373ffffffffffffffffffffffffffffffffffffffff168152602001826bffffffffffffffffffffffff16815250600260008201518160000160006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555060208201518160000160146101000a8154816bffffffffffffffffffffffff02191690836bffffffffffffffffffffffff1602179055509050505050565b6200032882826200036360201b620013ed1760201c565b6200035481600160008581526020019081526020016000206200045460201b620014cd1790919060201c565b505050565b6000612710905090565b6200037582826200048c60201b60201c565b6200045057600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620003f56200015060201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600062000484836000018373ffffffffffffffffffffffffffffffffffffffff1660001b620004f660201b60201c565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b60006200050a83836200057060201b60201c565b620005655782600001829080600181540180825580915050600190039060005260206000200160009091909190915055826000018054905083600101600084815260200190815260200160002081905550600190506200056a565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b6000604051905090565b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b620005fc82620005b1565b810181811067ffffffffffffffff821117156200061e576200061d620005c2565b5b80604052505050565b60006200063362000593565b9050620006418282620005f1565b919050565b600067ffffffffffffffff821115620006645762000663620005c2565b5b6200066f82620005b1565b9050602081019050919050565b60005b838110156200069c5780820151818401526020810190506200067f565b60008484015250505050565b6000620006bf620006b98462000646565b62000627565b905082815260208101848484011115620006de57620006dd620005ac565b5b620006eb8482856200067c565b509392505050565b600082601f8301126200070b576200070a620005a7565b5b81516200071d848260208601620006a8565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000620007538262000726565b9050919050565b620007658162000746565b81146200077157600080fd5b50565b60008151905062000785816200075a565b92915050565b60008060008060808587031215620007a857620007a76200059d565b5b600085015167ffffffffffffffff811115620007c957620007c8620005a2565b5b620007d787828801620006f3565b945050602085015167ffffffffffffffff811115620007fb57620007fa620005a2565b5b6200080987828801620006f3565b935050604085015167ffffffffffffffff8111156200082d576200082c620005a2565b5b6200083b87828801620006f3565b92505060606200084e8782880162000774565b91505092959194509250565b600081519050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680620008ad57607f821691505b602082108103620008c357620008c262000865565b5b50919050565b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b6000600883026200092d7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82620008ee565b620009398683620008ee565b95508019841693508086168417925050509392505050565b6000819050919050565b6000819050919050565b600062000986620009806200097a8462000951565b6200095b565b62000951565b9050919050565b6000819050919050565b620009a28362000965565b620009ba620009b1826200098d565b848454620008fb565b825550505050565b600090565b620009d1620009c2565b620009de81848462000997565b505050565b5b8181101562000a0657620009fa600082620009c7565b600181019050620009e4565b5050565b601f82111562000a555762000a1f81620008c9565b62000a2a84620008de565b8101602085101562000a3a578190505b62000a5262000a4985620008de565b830182620009e3565b50505b505050565b600082821c905092915050565b600062000a7a6000198460080262000a5a565b1980831691505092915050565b600062000a95838362000a67565b9150826002028217905092915050565b62000ab0826200085a565b67ffffffffffffffff81111562000acc5762000acb620005c2565b5b62000ad8825462000894565b62000ae582828562000a0a565b600060209050601f83116001811462000b1d576000841562000b08578287015190505b62000b14858262000a87565b86555062000b84565b601f19841662000b2d86620008c9565b60005b8281101562000b575784890151825560018201915060208501945060208101905062000b30565b8683101562000b77578489015162000b73601f89168262000a67565b8355505b6001600288020188555050505b505050505050565b600082825260208201905092915050565b7f455243323938313a20726f79616c7479206665652077696c6c2065786365656460008201527f2073616c65507269636500000000000000000000000000000000000000000000602082015250565b600062000bfb602a8362000b8c565b915062000c088262000b9d565b604082019050919050565b6000602082019050818103600083015262000c2e8162000bec565b9050919050565b7f455243323938313a20696e76616c696420726563656976657200000000000000600082015250565b600062000c6d60198362000b8c565b915062000c7a8262000c35565b602082019050919050565b6000602082019050818103600083015262000ca08162000c5e565b9050919050565b614f2f8062000cb76000396000f3fe608060405234801561001057600080fd5b506004361061021c5760003560e01c80635c975abb11610125578063b88d4fde116100ad578063d53913931161007c578063d53913931461065c578063d547741f1461067a578063e63ab1e914610696578063e8a3d485146106b4578063e985e9c5146106d25761021c565b8063b88d4fde146105c4578063c6c3bbe6146105e0578063c87b56dd146105fc578063ca15c8731461062c5761021c565b80639010d07c116100f45780639010d07c1461050c57806391d148541461053c57806395d89b411461056c578063a217fddf1461058a578063a22cb465146105a85761021c565b80635c975abb146104845780636352211e146104a257806370a08231146104d25780638456cb59146105025761021c565b80632f2ff15d116101a857806340c10f191161017757806340c10f19146103e457806342842e0e1461040057806342966c681461041c5780634f6ccce71461043857806355f804b3146104685761021c565b80632f2ff15d146103725780632f745c591461038e57806336568abe146103be5780633f4ba83a146103da5761021c565b806318160ddd116101ef57806318160ddd146102bb57806323b872dd146102d9578063248a9ca3146102f55780632a55205a146103255780632a959b89146103565761021c565b806301ffc9a71461022157806306fdde0314610251578063081812fc1461026f578063095ea7b31461029f575b600080fd5b61023b600480360381019061023691906135c3565b610702565b604051610248919061360b565b60405180910390f35b610259610714565b60405161026691906136b6565b60405180910390f35b6102896004803603810190610284919061370e565b6107a6565b604051610296919061377c565b60405180910390f35b6102b960048036038101906102b491906137c3565b6107ec565b005b6102c3610903565b6040516102d09190613812565b60405180910390f35b6102f360048036038101906102ee919061382d565b610910565b005b61030f600480360381019061030a91906138b6565b610970565b60405161031c91906138f2565b60405180910390f35b61033f600480360381019061033a919061390d565b61098f565b60405161034d92919061394d565b60405180910390f35b610370600480360381019061036b9190613976565b610b79565b005b61038c600480360381019061038791906139c9565b610bd5565b005b6103a860048036038101906103a391906137c3565b610bf6565b6040516103b59190613812565b60405180910390f35b6103d860048036038101906103d391906139c9565b610c9b565b005b6103e2610d1e565b005b6103fe60048036038101906103f991906137c3565b610d53565b005b61041a6004803603810190610415919061382d565b610d8c565b005b6104366004803603810190610431919061370e565b610dac565b005b610452600480360381019061044d919061370e565b610e08565b60405161045f9190613812565b60405180910390f35b610482600480360381019061047d9190613b3e565b610e79565b005b61048c610e9a565b604051610499919061360b565b60405180910390f35b6104bc60048036038101906104b7919061370e565b610eb1565b6040516104c9919061377c565b60405180910390f35b6104ec60048036038101906104e79190613b87565b610f37565b6040516104f99190613812565b60405180910390f35b61050a610fee565b005b61052660048036038101906105219190613bb4565b611023565b604051610533919061377c565b60405180910390f35b610556600480360381019061055191906139c9565b611052565b604051610563919061360b565b60405180910390f35b6105746110bc565b60405161058191906136b6565b60405180910390f35b61059261114e565b60405161059f91906138f2565b60405180910390f35b6105c260048036038101906105bd9190613c20565b611155565b005b6105de60048036038101906105d99190613d01565b61116b565b005b6105fa60048036038101906105f5919061382d565b6111cd565b005b6106166004803603810190610611919061370e565b611211565b60405161062391906136b6565b60405180910390f35b610646600480360381019061064191906138b6565b611279565b6040516106539190613812565b60405180910390f35b61066461129d565b60405161067191906138f2565b60405180910390f35b610694600480360381019061068f91906139c9565b6112c1565b005b61069e6112e2565b6040516106ab91906138f2565b60405180910390f35b6106bc611306565b6040516106c991906136b6565b60405180910390f35b6106ec60048036038101906106e79190613d84565b611359565b6040516106f9919061360b565b60405180910390f35b600061070d826114fd565b9050919050565b60606004805461072390613df3565b80601f016020809104026020016040519081016040528092919081815260200182805461074f90613df3565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b5050505050905090565b60006107b18261150f565b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107f782610eb1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085e90613e96565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661088661155a565b73ffffffffffffffffffffffffffffffffffffffff1614806108b557506108b4816108af61155a565b611359565b5b6108f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108eb90613f28565b60405180910390fd5b6108fe8383611562565b505050565b6000600c80549050905090565b61092161091b61155a565b8261161b565b610960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095790613fba565b60405180910390fd5b61096b8383836116b0565b505050565b6000806000838152602001908152602001600020600101549050919050565b6000806000600360008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610b245760026040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610b2e6119a9565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610b5a9190614009565b610b64919061407a565b90508160000151819350935050509250929050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610ba3816119b3565b60008390505b82811015610bce57610bbb85826119c7565b8080610bc6906140ab565b915050610ba9565b5050505050565b610bde82610970565b610be7816119b3565b610bf18383611be4565b505050565b6000610c0183610f37565b8210610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3990614165565b60405180910390fd5b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ca361155a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d07906141f7565b60405180910390fd5b610d1a8282611c18565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610d48816119b3565b610d50611c4c565b50565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610d7d816119b3565b610d8783836119c7565b505050565b610da78383836040518060200160405280600081525061116b565b505050565b610dbd610db761155a565b8261161b565b610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390613fba565b60405180910390fd5b610e0581611caf565b50565b6000610e12610903565b8210610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90614289565b60405180910390fd5b600c8281548110610e6757610e666142a9565b5b90600052602060002001549050919050565b6000801b610e86816119b3565b81600f9081610e959190614484565b505050565b6000600e60009054906101000a900460ff16905090565b600080610ebd83611cbb565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f25906145a2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e90614634565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611018816119b3565b611020611cf8565b50565b600061104a8260016000868152602001908152602001600020611d5b90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600580546110cb90613df3565b80601f01602080910402602001604051908101604052809291908181526020018280546110f790613df3565b80156111445780601f1061111957610100808354040283529160200191611144565b820191906000526020600020905b81548152906001019060200180831161112757829003601f168201915b5050505050905090565b6000801b81565b61116761116061155a565b8383611d75565b5050565b61117c61117661155a565b8361161b565b6111bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b290613fba565b60405180910390fd5b6111c784848484611ee1565b50505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66111f7816119b3565b61120183836119c7565b61120b8483611562565b50505050565b606061121c8261150f565b6000611226611f3d565b905060008151116112465760405180602001604052806000815250611271565b8061125084611fcf565b604051602001611261929190614690565b6040516020818303038152906040525b915050919050565b60006112966001600084815260200190815260200160002061209d565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6112ca82610970565b6112d3816119b3565b6112dd8383611c18565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60606000611312611f3d565b905060008151116113325760405180602001604052806000815250611353565b806040516020016113439190614700565b6040516020818303038152906040525b91505090565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113f78282611052565b6114c957600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061146e61155a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006114f5836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6120b2565b905092915050565b600061150882612122565b9050919050565b6115188161219c565b611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e906145a2565b60405180910390fd5b50565b600033905090565b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115d583610eb1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061162783610eb1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061166957506116688185611359565b5b806116a757508373ffffffffffffffffffffffffffffffffffffffff1661168f846107a6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116d082610eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171d90614794565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c90614826565b60405180910390fd5b6117a283838360016121dd565b8273ffffffffffffffffffffffffffffffffffffffff166117c282610eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180f90614794565b60405180910390fd5b6008600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119a483838360016121ef565b505050565b6000612710905090565b6119c4816119bf61155a565b6121f5565b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90614892565b60405180910390fd5b611a3f8161219c565b15611a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a76906148fe565b60405180910390fd5b611a8d6000838360016121dd565b611a968161219c565b15611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd906148fe565b60405180910390fd5b6001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611be06000838360016121ef565b5050565b611bee82826113ed565b611c1381600160008581526020019081526020016000206114cd90919063ffffffff16565b505050565b611c22828261227a565b611c47816001600085815260200190815260200160002061235b90919063ffffffff16565b505050565b611c5461238b565b6000600e60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c9861155a565b604051611ca5919061377c565b60405180910390a1565b611cb8816123d4565b50565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611d006123e9565b6001600e60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611d4461155a565b604051611d51919061377c565b60405180910390a1565b6000611d6a8360000183612433565b60001c905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dda9061496a565b60405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ed4919061360b565b60405180910390a3505050565b611eec8484846116b0565b611ef88484848461245e565b611f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e906149fc565b60405180910390fd5b50505050565b6060600f8054611f4c90613df3565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7890613df3565b8015611fc55780601f10611f9a57610100808354040283529160200191611fc5565b820191906000526020600020905b815481529060010190602001808311611fa857829003601f168201915b5050505050905090565b606060006001611fde846125e5565b01905060008167ffffffffffffffff811115611ffd57611ffc613a13565b5b6040519080825280601f01601f19166020018201604052801561202f5781602001600182028036833780820191505090505b509050600082602001820190505b600115612092578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816120865761208561404b565b5b0494506000850361203d575b819350505050919050565b60006120ab82600001612738565b9050919050565b60006120be8383612749565b61211757826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061211c565b600090505b92915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061219557506121948261276c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166121be83611cbb565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6121e98484848461284e565b50505050565b50505050565b6121ff8282611052565b6122765761220c816128a8565b61221a8360001c60206128d5565b60405160200161222b929190614ab4565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226d91906136b6565b60405180910390fd5b5050565b6122848282611052565b1561235757600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506122fc61155a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612383836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612b11565b905092915050565b612393610e9a565b6123d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c990614b3a565b60405180910390fd5b565b6123dd81612c25565b6123e681612d73565b50565b6123f1610e9a565b15612431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242890614ba6565b60405180910390fd5b565b600082600001828154811061244b5761244a6142a9565b5b9060005260206000200154905092915050565b600061247f8473ffffffffffffffffffffffffffffffffffffffff16612dd2565b156125d8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124a861155a565b8786866040518563ffffffff1660e01b81526004016124ca9493929190614c1b565b6020604051808303816000875af192505050801561250657506040513d601f19601f820116820180604052508101906125039190614c7c565b60015b612588573d8060008114612536576040519150601f19603f3d011682016040523d82523d6000602084013e61253b565b606091505b506000815103612580576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612577906149fc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125dd565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612643577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816126395761263861404b565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612680576d04ee2d6d415b85acef810000000083816126765761267561404b565b5b0492506020810190505b662386f26fc1000083106126af57662386f26fc1000083816126a5576126a461404b565b5b0492506010810190505b6305f5e10083106126d8576305f5e10083816126ce576126cd61404b565b5b0492506008810190505b61271083106126fd5761271083816126f3576126f261404b565b5b0492506004810190505b6064831061272057606483816127165761271561404b565b5b0492506002810190505b600a831061272f576001810190505b80915050919050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061283757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612847575061284682612df5565b5b9050919050565b61285a84848484612e6f565b612862610e9a565b156128a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289990614d1b565b60405180910390fd5b50505050565b60606128ce8273ffffffffffffffffffffffffffffffffffffffff16601460ff166128d5565b9050919050565b6060600060028360026128e89190614009565b6128f29190614d3b565b67ffffffffffffffff81111561290b5761290a613a13565b5b6040519080825280601f01601f19166020018201604052801561293d5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612975576129746142a9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106129d9576129d86142a9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612a199190614009565b612a239190614d3b565b90505b6001811115612ac3577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612a6557612a646142a9565b5b1a60f81b828281518110612a7c57612a7b6142a9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612abc90614d6f565b9050612a26565b5060008414612b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afe90614de4565b60405180910390fd5b8091505092915050565b60008083600101600084815260200190815260200160002054905060008114612c19576000600182612b439190614e04565b9050600060018660000180549050612b5b9190614e04565b9050818114612bca576000866000018281548110612b7c57612b7b6142a9565b5b9060005260206000200154905080876000018481548110612ba057612b9f6142a9565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612bde57612bdd614e38565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612c1f565b60009150505b92915050565b6000612c3082610eb1565b9050612c408160008460016121dd565b612c4982610eb1565b90506008600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506006600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d6f8160008460016121ef565b5050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e685750612e6782612fcd565b5b9050919050565b612e7b84848484613047565b6001811115612ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb690614ed9565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f0657612f018161316d565b612f45565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612f4457612f4385826131b6565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612f8757612f8281613323565b612fc6565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612fc557612fc484826133f4565b5b5b5050505050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613040575061303f82613473565b5b9050919050565b600181111561316757600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146130db5780600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130d39190614e04565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131665780600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461315e9190614d3b565b925050819055505b5b50505050565b600c80549050600d600083815260200190815260200160002081905550600c81908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131c384610f37565b6131cd9190614e04565b90506000600b60008481526020019081526020016000205490508181146132b2576000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555081600b600083815260200190815260200160002081905550505b600b600084815260200190815260200160002060009055600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600c805490506133379190614e04565b90506000600d60008481526020019081526020016000205490506000600c8381548110613367576133666142a9565b5b9060005260206000200154905080600c8381548110613389576133886142a9565b5b906000526020600020018190555081600d600083815260200190815260200160002081905550600d600085815260200190815260200160002060009055600c8054806133d8576133d7614e38565b5b6001900381819060005260206000200160009055905550505050565b60006133ff83610f37565b905081600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555080600b600084815260200190815260200160002081905550505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806134e657506134e5826134ed565b5b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135a08161356b565b81146135ab57600080fd5b50565b6000813590506135bd81613597565b92915050565b6000602082840312156135d9576135d8613561565b5b60006135e7848285016135ae565b91505092915050565b60008115159050919050565b613605816135f0565b82525050565b600060208201905061362060008301846135fc565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613660578082015181840152602081019050613645565b60008484015250505050565b6000601f19601f8301169050919050565b600061368882613626565b6136928185613631565b93506136a2818560208601613642565b6136ab8161366c565b840191505092915050565b600060208201905081810360008301526136d0818461367d565b905092915050565b6000819050919050565b6136eb816136d8565b81146136f657600080fd5b50565b600081359050613708816136e2565b92915050565b60006020828403121561372457613723613561565b5b6000613732848285016136f9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137668261373b565b9050919050565b6137768161375b565b82525050565b6000602082019050613791600083018461376d565b92915050565b6137a08161375b565b81146137ab57600080fd5b50565b6000813590506137bd81613797565b92915050565b600080604083850312156137da576137d9613561565b5b60006137e8858286016137ae565b92505060206137f9858286016136f9565b9150509250929050565b61380c816136d8565b82525050565b60006020820190506138276000830184613803565b92915050565b60008060006060848603121561384657613845613561565b5b6000613854868287016137ae565b9350506020613865868287016137ae565b9250506040613876868287016136f9565b9150509250925092565b6000819050919050565b61389381613880565b811461389e57600080fd5b50565b6000813590506138b08161388a565b92915050565b6000602082840312156138cc576138cb613561565b5b60006138da848285016138a1565b91505092915050565b6138ec81613880565b82525050565b600060208201905061390760008301846138e3565b92915050565b6000806040838503121561392457613923613561565b5b6000613932858286016136f9565b9250506020613943858286016136f9565b9150509250929050565b6000604082019050613962600083018561376d565b61396f6020830184613803565b9392505050565b60008060006060848603121561398f5761398e613561565b5b600061399d868287016137ae565b93505060206139ae868287016136f9565b92505060406139bf868287016136f9565b9150509250925092565b600080604083850312156139e0576139df613561565b5b60006139ee858286016138a1565b92505060206139ff858286016137ae565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a4b8261366c565b810181811067ffffffffffffffff82111715613a6a57613a69613a13565b5b80604052505050565b6000613a7d613557565b9050613a898282613a42565b919050565b600067ffffffffffffffff821115613aa957613aa8613a13565b5b613ab28261366c565b9050602081019050919050565b82818337600083830152505050565b6000613ae1613adc84613a8e565b613a73565b905082815260208101848484011115613afd57613afc613a0e565b5b613b08848285613abf565b509392505050565b600082601f830112613b2557613b24613a09565b5b8135613b35848260208601613ace565b91505092915050565b600060208284031215613b5457613b53613561565b5b600082013567ffffffffffffffff811115613b7257613b71613566565b5b613b7e84828501613b10565b91505092915050565b600060208284031215613b9d57613b9c613561565b5b6000613bab848285016137ae565b91505092915050565b60008060408385031215613bcb57613bca613561565b5b6000613bd9858286016138a1565b9250506020613bea858286016136f9565b9150509250929050565b613bfd816135f0565b8114613c0857600080fd5b50565b600081359050613c1a81613bf4565b92915050565b60008060408385031215613c3757613c36613561565b5b6000613c45858286016137ae565b9250506020613c5685828601613c0b565b9150509250929050565b600067ffffffffffffffff821115613c7b57613c7a613a13565b5b613c848261366c565b9050602081019050919050565b6000613ca4613c9f84613c60565b613a73565b905082815260208101848484011115613cc057613cbf613a0e565b5b613ccb848285613abf565b509392505050565b600082601f830112613ce857613ce7613a09565b5b8135613cf8848260208601613c91565b91505092915050565b60008060008060808587031215613d1b57613d1a613561565b5b6000613d29878288016137ae565b9450506020613d3a878288016137ae565b9350506040613d4b878288016136f9565b925050606085013567ffffffffffffffff811115613d6c57613d6b613566565b5b613d7887828801613cd3565b91505092959194509250565b60008060408385031215613d9b57613d9a613561565b5b6000613da9858286016137ae565b9250506020613dba858286016137ae565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e0b57607f821691505b602082108103613e1e57613e1d613dc4565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e80602183613631565b9150613e8b82613e24565b604082019050919050565b60006020820190508181036000830152613eaf81613e73565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613f12603d83613631565b9150613f1d82613eb6565b604082019050919050565b60006020820190508181036000830152613f4181613f05565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613fa4602d83613631565b9150613faf82613f48565b604082019050919050565b60006020820190508181036000830152613fd381613f97565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614014826136d8565b915061401f836136d8565b925082820261402d816136d8565b9150828204841483151761404457614043613fda565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614085826136d8565b9150614090836136d8565b9250826140a05761409f61404b565b5b828204905092915050565b60006140b6826136d8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140e8576140e7613fda565b5b600182019050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061414f602b83613631565b915061415a826140f3565b604082019050919050565b6000602082019050818103600083015261417e81614142565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006141e1602f83613631565b91506141ec82614185565b604082019050919050565b60006020820190508181036000830152614210816141d4565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614273602c83613631565b915061427e82614217565b604082019050919050565b600060208201905081810360008301526142a281614266565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261433a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826142fd565b61434486836142fd565b95508019841693508086168417925050509392505050565b6000819050919050565b600061438161437c614377846136d8565b61435c565b6136d8565b9050919050565b6000819050919050565b61439b83614366565b6143af6143a782614388565b84845461430a565b825550505050565b600090565b6143c46143b7565b6143cf818484614392565b505050565b5b818110156143f3576143e86000826143bc565b6001810190506143d5565b5050565b601f82111561443857614409816142d8565b614412846142ed565b81016020851015614421578190505b61443561442d856142ed565b8301826143d4565b50505b505050565b600082821c905092915050565b600061445b6000198460080261443d565b1980831691505092915050565b6000614474838361444a565b9150826002028217905092915050565b61448d82613626565b67ffffffffffffffff8111156144a6576144a5613a13565b5b6144b08254613df3565b6144bb8282856143f7565b600060209050601f8311600181146144ee57600084156144dc578287015190505b6144e68582614468565b86555061454e565b601f1984166144fc866142d8565b60005b82811015614524578489015182556001820191506020850194506020810190506144ff565b86831015614541578489015161453d601f89168261444a565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061458c601883613631565b915061459782614556565b602082019050919050565b600060208201905081810360008301526145bb8161457f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061461e602983613631565b9150614629826145c2565b604082019050919050565b6000602082019050818103600083015261464d81614611565b9050919050565b600081905092915050565b600061466a82613626565b6146748185614654565b9350614684818560208601613642565b80840191505092915050565b600061469c828561465f565b91506146a8828461465f565b91508190509392505050565b7f5f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006146ea600183614654565b91506146f5826146b4565b600182019050919050565b600061470c828461465f565b9150614717826146dd565b915081905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061477e602583613631565b915061478982614722565b604082019050919050565b600060208201905081810360008301526147ad81614771565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614810602483613631565b915061481b826147b4565b604082019050919050565b6000602082019050818103600083015261483f81614803565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061487c602083613631565b915061488782614846565b602082019050919050565b600060208201905081810360008301526148ab8161486f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006148e8601c83613631565b91506148f3826148b2565b602082019050919050565b60006020820190508181036000830152614917816148db565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614954601983613631565b915061495f8261491e565b602082019050919050565b6000602082019050818103600083015261498381614947565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006149e6603283613631565b91506149f18261498a565b604082019050919050565b60006020820190508181036000830152614a15816149d9565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614a52601783614654565b9150614a5d82614a1c565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614a9e601183614654565b9150614aa982614a68565b601182019050919050565b6000614abf82614a45565b9150614acb828561465f565b9150614ad682614a91565b9150614ae2828461465f565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614b24601483613631565b9150614b2f82614aee565b602082019050919050565b60006020820190508181036000830152614b5381614b17565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614b90601083613631565b9150614b9b82614b5a565b602082019050919050565b60006020820190508181036000830152614bbf81614b83565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614bed82614bc6565b614bf78185614bd1565b9350614c07818560208601613642565b614c108161366c565b840191505092915050565b6000608082019050614c30600083018761376d565b614c3d602083018661376d565b614c4a6040830185613803565b8181036060830152614c5c8184614be2565b905095945050505050565b600081519050614c7681613597565b92915050565b600060208284031215614c9257614c91613561565b5b6000614ca084828501614c67565b91505092915050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b6000614d05602b83613631565b9150614d1082614ca9565b604082019050919050565b60006020820190508181036000830152614d3481614cf8565b9050919050565b6000614d46826136d8565b9150614d51836136d8565b9250828201905080821115614d6957614d68613fda565b5b92915050565b6000614d7a826136d8565b915060008203614d8d57614d8c613fda565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614dce602083613631565b9150614dd982614d98565b602082019050919050565b60006020820190508181036000830152614dfd81614dc1565b9050919050565b6000614e0f826136d8565b9150614e1a836136d8565b9250828203905081811115614e3257614e31613fda565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614ec3603583613631565b9150614ece82614e67565b604082019050919050565b60006020820190508181036000830152614ef281614eb6565b905091905056fea26469706673582212201bb3806df59c28122dd991cbd50218e6a06141a62c7ba6348b4e0ba97fc7941864736f6c63430008120033000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000e89985d5bc085972eaeb5ad95499625d19ed1020000000000000000000000000000000000000000000000000000000000000001450617269734f70657261416c676f42616c6c657400000000000000000000000000000000000000000000000000000000000000000000000000000000000000064f50455241310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d68747470733a2f2f637671727462687770662e657865637574652d6170692e65752d776573742d332e616d617a6f6e6177732e636f6d2f70726f642f6e66746d657461646174612f30323065346564612d653636332d343335382d386535362d3466316438623238353232612f00000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b506004361061021c5760003560e01c80635c975abb11610125578063b88d4fde116100ad578063d53913931161007c578063d53913931461065c578063d547741f1461067a578063e63ab1e914610696578063e8a3d485146106b4578063e985e9c5146106d25761021c565b8063b88d4fde146105c4578063c6c3bbe6146105e0578063c87b56dd146105fc578063ca15c8731461062c5761021c565b80639010d07c116100f45780639010d07c1461050c57806391d148541461053c57806395d89b411461056c578063a217fddf1461058a578063a22cb465146105a85761021c565b80635c975abb146104845780636352211e146104a257806370a08231146104d25780638456cb59146105025761021c565b80632f2ff15d116101a857806340c10f191161017757806340c10f19146103e457806342842e0e1461040057806342966c681461041c5780634f6ccce71461043857806355f804b3146104685761021c565b80632f2ff15d146103725780632f745c591461038e57806336568abe146103be5780633f4ba83a146103da5761021c565b806318160ddd116101ef57806318160ddd146102bb57806323b872dd146102d9578063248a9ca3146102f55780632a55205a146103255780632a959b89146103565761021c565b806301ffc9a71461022157806306fdde0314610251578063081812fc1461026f578063095ea7b31461029f575b600080fd5b61023b600480360381019061023691906135c3565b610702565b604051610248919061360b565b60405180910390f35b610259610714565b60405161026691906136b6565b60405180910390f35b6102896004803603810190610284919061370e565b6107a6565b604051610296919061377c565b60405180910390f35b6102b960048036038101906102b491906137c3565b6107ec565b005b6102c3610903565b6040516102d09190613812565b60405180910390f35b6102f360048036038101906102ee919061382d565b610910565b005b61030f600480360381019061030a91906138b6565b610970565b60405161031c91906138f2565b60405180910390f35b61033f600480360381019061033a919061390d565b61098f565b60405161034d92919061394d565b60405180910390f35b610370600480360381019061036b9190613976565b610b79565b005b61038c600480360381019061038791906139c9565b610bd5565b005b6103a860048036038101906103a391906137c3565b610bf6565b6040516103b59190613812565b60405180910390f35b6103d860048036038101906103d391906139c9565b610c9b565b005b6103e2610d1e565b005b6103fe60048036038101906103f991906137c3565b610d53565b005b61041a6004803603810190610415919061382d565b610d8c565b005b6104366004803603810190610431919061370e565b610dac565b005b610452600480360381019061044d919061370e565b610e08565b60405161045f9190613812565b60405180910390f35b610482600480360381019061047d9190613b3e565b610e79565b005b61048c610e9a565b604051610499919061360b565b60405180910390f35b6104bc60048036038101906104b7919061370e565b610eb1565b6040516104c9919061377c565b60405180910390f35b6104ec60048036038101906104e79190613b87565b610f37565b6040516104f99190613812565b60405180910390f35b61050a610fee565b005b61052660048036038101906105219190613bb4565b611023565b604051610533919061377c565b60405180910390f35b610556600480360381019061055191906139c9565b611052565b604051610563919061360b565b60405180910390f35b6105746110bc565b60405161058191906136b6565b60405180910390f35b61059261114e565b60405161059f91906138f2565b60405180910390f35b6105c260048036038101906105bd9190613c20565b611155565b005b6105de60048036038101906105d99190613d01565b61116b565b005b6105fa60048036038101906105f5919061382d565b6111cd565b005b6106166004803603810190610611919061370e565b611211565b60405161062391906136b6565b60405180910390f35b610646600480360381019061064191906138b6565b611279565b6040516106539190613812565b60405180910390f35b61066461129d565b60405161067191906138f2565b60405180910390f35b610694600480360381019061068f91906139c9565b6112c1565b005b61069e6112e2565b6040516106ab91906138f2565b60405180910390f35b6106bc611306565b6040516106c991906136b6565b60405180910390f35b6106ec60048036038101906106e79190613d84565b611359565b6040516106f9919061360b565b60405180910390f35b600061070d826114fd565b9050919050565b60606004805461072390613df3565b80601f016020809104026020016040519081016040528092919081815260200182805461074f90613df3565b801561079c5780601f106107715761010080835404028352916020019161079c565b820191906000526020600020905b81548152906001019060200180831161077f57829003601f168201915b5050505050905090565b60006107b18261150f565b6008600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107f782610eb1565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603610867576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161085e90613e96565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff1661088661155a565b73ffffffffffffffffffffffffffffffffffffffff1614806108b557506108b4816108af61155a565b611359565b5b6108f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108eb90613f28565b60405180910390fd5b6108fe8383611562565b505050565b6000600c80549050905090565b61092161091b61155a565b8261161b565b610960576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095790613fba565b60405180910390fd5b61096b8383836116b0565b505050565b6000806000838152602001908152602001600020600101549050919050565b6000806000600360008681526020019081526020016000206040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff16815250509050600073ffffffffffffffffffffffffffffffffffffffff16816000015173ffffffffffffffffffffffffffffffffffffffff1603610b245760026040518060400160405290816000820160009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020016000820160149054906101000a90046bffffffffffffffffffffffff166bffffffffffffffffffffffff166bffffffffffffffffffffffff168152505090505b6000610b2e6119a9565b6bffffffffffffffffffffffff1682602001516bffffffffffffffffffffffff1686610b5a9190614009565b610b64919061407a565b90508160000151819350935050509250929050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610ba3816119b3565b60008390505b82811015610bce57610bbb85826119c7565b8080610bc6906140ab565b915050610ba9565b5050505050565b610bde82610970565b610be7816119b3565b610bf18383611be4565b505050565b6000610c0183610f37565b8210610c42576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3990614165565b60405180910390fd5b600a60008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610ca361155a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d07906141f7565b60405180910390fd5b610d1a8282611c18565b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610d48816119b3565b610d50611c4c565b50565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610d7d816119b3565b610d8783836119c7565b505050565b610da78383836040518060200160405280600081525061116b565b505050565b610dbd610db761155a565b8261161b565b610dfc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610df390613fba565b60405180910390fd5b610e0581611caf565b50565b6000610e12610903565b8210610e53576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e4a90614289565b60405180910390fd5b600c8281548110610e6757610e666142a9565b5b90600052602060002001549050919050565b6000801b610e86816119b3565b81600f9081610e959190614484565b505050565b6000600e60009054906101000a900460ff16905090565b600080610ebd83611cbb565b9050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1603610f2e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f25906145a2565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603610fa7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f9e90614634565b60405180910390fd5b600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a611018816119b3565b611020611cf8565b50565b600061104a8260016000868152602001908152602001600020611d5b90919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600580546110cb90613df3565b80601f01602080910402602001604051908101604052809291908181526020018280546110f790613df3565b80156111445780601f1061111957610100808354040283529160200191611144565b820191906000526020600020905b81548152906001019060200180831161112757829003601f168201915b5050505050905090565b6000801b81565b61116761116061155a565b8383611d75565b5050565b61117c61117661155a565b8361161b565b6111bb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111b290613fba565b60405180910390fd5b6111c784848484611ee1565b50505050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66111f7816119b3565b61120183836119c7565b61120b8483611562565b50505050565b606061121c8261150f565b6000611226611f3d565b905060008151116112465760405180602001604052806000815250611271565b8061125084611fcf565b604051602001611261929190614690565b6040516020818303038152906040525b915050919050565b60006112966001600084815260200190815260200160002061209d565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6112ca82610970565b6112d3816119b3565b6112dd8383611c18565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b60606000611312611f3d565b905060008151116113325760405180602001604052806000815250611353565b806040516020016113439190614700565b6040516020818303038152906040525b91505090565b6000600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6113f78282611052565b6114c957600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061146e61155a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60006114f5836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6120b2565b905092915050565b600061150882612122565b9050919050565b6115188161219c565b611557576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161154e906145a2565b60405180910390fd5b50565b600033905090565b816008600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115d583610eb1565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60008061162783610eb1565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061166957506116688185611359565b5b806116a757508373ffffffffffffffffffffffffffffffffffffffff1661168f846107a6565b73ffffffffffffffffffffffffffffffffffffffff16145b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166116d082610eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611726576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161171d90614794565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c90614826565b60405180910390fd5b6117a283838360016121dd565b8273ffffffffffffffffffffffffffffffffffffffff166117c282610eb1565b73ffffffffffffffffffffffffffffffffffffffff1614611818576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161180f90614794565b60405180910390fd5b6008600082815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119a483838360016121ef565b505050565b6000612710905090565b6119c4816119bf61155a565b6121f5565b50565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a36576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a2d90614892565b60405180910390fd5b611a3f8161219c565b15611a7f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a76906148fe565b60405180910390fd5b611a8d6000838360016121dd565b611a968161219c565b15611ad6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611acd906148fe565b60405180910390fd5b6001600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4611be06000838360016121ef565b5050565b611bee82826113ed565b611c1381600160008581526020019081526020016000206114cd90919063ffffffff16565b505050565b611c22828261227a565b611c47816001600085815260200190815260200160002061235b90919063ffffffff16565b505050565b611c5461238b565b6000600e60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611c9861155a565b604051611ca5919061377c565b60405180910390a1565b611cb8816123d4565b50565b60006006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b611d006123e9565b6001600e60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611d4461155a565b604051611d51919061377c565b60405180910390a1565b6000611d6a8360000183612433565b60001c905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603611de3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dda9061496a565b60405180910390fd5b80600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611ed4919061360b565b60405180910390a3505050565b611eec8484846116b0565b611ef88484848461245e565b611f37576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f2e906149fc565b60405180910390fd5b50505050565b6060600f8054611f4c90613df3565b80601f0160208091040260200160405190810160405280929190818152602001828054611f7890613df3565b8015611fc55780601f10611f9a57610100808354040283529160200191611fc5565b820191906000526020600020905b815481529060010190602001808311611fa857829003601f168201915b5050505050905090565b606060006001611fde846125e5565b01905060008167ffffffffffffffff811115611ffd57611ffc613a13565b5b6040519080825280601f01601f19166020018201604052801561202f5781602001600182028036833780820191505090505b509050600082602001820190505b600115612092578080600190039150507f3031323334353637383961626364656600000000000000000000000000000000600a86061a8153600a85816120865761208561404b565b5b0494506000850361203d575b819350505050919050565b60006120ab82600001612738565b9050919050565b60006120be8383612749565b61211757826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061211c565b600090505b92915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061219557506121948261276c565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166121be83611cbb565b73ffffffffffffffffffffffffffffffffffffffff1614159050919050565b6121e98484848461284e565b50505050565b50505050565b6121ff8282611052565b6122765761220c816128a8565b61221a8360001c60206128d5565b60405160200161222b929190614ab4565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161226d91906136b6565b60405180910390fd5b5050565b6122848282611052565b1561235757600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506122fc61155a565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000612383836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612b11565b905092915050565b612393610e9a565b6123d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016123c990614b3a565b60405180910390fd5b565b6123dd81612c25565b6123e681612d73565b50565b6123f1610e9a565b15612431576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161242890614ba6565b60405180910390fd5b565b600082600001828154811061244b5761244a6142a9565b5b9060005260206000200154905092915050565b600061247f8473ffffffffffffffffffffffffffffffffffffffff16612dd2565b156125d8578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026124a861155a565b8786866040518563ffffffff1660e01b81526004016124ca9493929190614c1b565b6020604051808303816000875af192505050801561250657506040513d601f19601f820116820180604052508101906125039190614c7c565b60015b612588573d8060008114612536576040519150601f19603f3d011682016040523d82523d6000602084013e61253b565b606091505b506000815103612580576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612577906149fc565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149150506125dd565b600190505b949350505050565b600080600090507a184f03e93ff9f4daa797ed6e38ed64bf6a1f0100000000000000008310612643577a184f03e93ff9f4daa797ed6e38ed64bf6a1f01000000000000000083816126395761263861404b565b5b0492506040810190505b6d04ee2d6d415b85acef81000000008310612680576d04ee2d6d415b85acef810000000083816126765761267561404b565b5b0492506020810190505b662386f26fc1000083106126af57662386f26fc1000083816126a5576126a461404b565b5b0492506010810190505b6305f5e10083106126d8576305f5e10083816126ce576126cd61404b565b5b0492506008810190505b61271083106126fd5761271083816126f3576126f261404b565b5b0492506004810190505b6064831061272057606483816127165761271561404b565b5b0492506002810190505b600a831061272f576001810190505b80915050919050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061283757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612847575061284682612df5565b5b9050919050565b61285a84848484612e6f565b612862610e9a565b156128a2576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161289990614d1b565b60405180910390fd5b50505050565b60606128ce8273ffffffffffffffffffffffffffffffffffffffff16601460ff166128d5565b9050919050565b6060600060028360026128e89190614009565b6128f29190614d3b565b67ffffffffffffffff81111561290b5761290a613a13565b5b6040519080825280601f01601f19166020018201604052801561293d5781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612975576129746142a9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106129d9576129d86142a9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612a199190614009565b612a239190614d3b565b90505b6001811115612ac3577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612a6557612a646142a9565b5b1a60f81b828281518110612a7c57612a7b6142a9565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612abc90614d6f565b9050612a26565b5060008414612b07576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612afe90614de4565b60405180910390fd5b8091505092915050565b60008083600101600084815260200190815260200160002054905060008114612c19576000600182612b439190614e04565b9050600060018660000180549050612b5b9190614e04565b9050818114612bca576000866000018281548110612b7c57612b7b6142a9565b5b9060005260206000200154905080876000018481548110612ba057612b9f6142a9565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612bde57612bdd614e38565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612c1f565b60009150505b92915050565b6000612c3082610eb1565b9050612c408160008460016121dd565b612c4982610eb1565b90506008600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556001600760008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825403925050819055506006600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4612d6f8160008460016121ef565b5050565b60036000828152602001908152602001600020600080820160006101000a81549073ffffffffffffffffffffffffffffffffffffffff02191690556000820160146101000a8154906bffffffffffffffffffffffff0219169055505050565b6000808273ffffffffffffffffffffffffffffffffffffffff163b119050919050565b60007f2a55205a000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612e685750612e6782612fcd565b5b9050919050565b612e7b84848484613047565b6001811115612ebf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612eb690614ed9565b60405180910390fd5b6000829050600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603612f0657612f018161316d565b612f45565b8373ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1614612f4457612f4385826131b6565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1603612f8757612f8281613323565b612fc6565b8473ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff1614612fc557612fc484826133f4565b5b5b5050505050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480613040575061303f82613473565b5b9050919050565b600181111561316757600073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16146130db5780600760008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546130d39190614e04565b925050819055505b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16146131665780600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461315e9190614d3b565b925050819055505b5b50505050565b600c80549050600d600083815260200190815260200160002081905550600c81908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131c384610f37565b6131cd9190614e04565b90506000600b60008481526020019081526020016000205490508181146132b2576000600a60008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600a60008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555081600b600083815260200190815260200160002081905550505b600b600084815260200190815260200160002060009055600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600c805490506133379190614e04565b90506000600d60008481526020019081526020016000205490506000600c8381548110613367576133666142a9565b5b9060005260206000200154905080600c8381548110613389576133886142a9565b5b906000526020600020018190555081600d600083815260200190815260200160002081905550600d600085815260200190815260200160002060009055600c8054806133d8576133d7614e38565b5b6001900381819060005260206000200160009055905550505050565b60006133ff83610f37565b905081600a60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555080600b600084815260200190815260200160002081905550505050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806134e657506134e5826134ed565b5b9050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b6135a08161356b565b81146135ab57600080fd5b50565b6000813590506135bd81613597565b92915050565b6000602082840312156135d9576135d8613561565b5b60006135e7848285016135ae565b91505092915050565b60008115159050919050565b613605816135f0565b82525050565b600060208201905061362060008301846135fc565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b83811015613660578082015181840152602081019050613645565b60008484015250505050565b6000601f19601f8301169050919050565b600061368882613626565b6136928185613631565b93506136a2818560208601613642565b6136ab8161366c565b840191505092915050565b600060208201905081810360008301526136d0818461367d565b905092915050565b6000819050919050565b6136eb816136d8565b81146136f657600080fd5b50565b600081359050613708816136e2565b92915050565b60006020828403121561372457613723613561565b5b6000613732848285016136f9565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006137668261373b565b9050919050565b6137768161375b565b82525050565b6000602082019050613791600083018461376d565b92915050565b6137a08161375b565b81146137ab57600080fd5b50565b6000813590506137bd81613797565b92915050565b600080604083850312156137da576137d9613561565b5b60006137e8858286016137ae565b92505060206137f9858286016136f9565b9150509250929050565b61380c816136d8565b82525050565b60006020820190506138276000830184613803565b92915050565b60008060006060848603121561384657613845613561565b5b6000613854868287016137ae565b9350506020613865868287016137ae565b9250506040613876868287016136f9565b9150509250925092565b6000819050919050565b61389381613880565b811461389e57600080fd5b50565b6000813590506138b08161388a565b92915050565b6000602082840312156138cc576138cb613561565b5b60006138da848285016138a1565b91505092915050565b6138ec81613880565b82525050565b600060208201905061390760008301846138e3565b92915050565b6000806040838503121561392457613923613561565b5b6000613932858286016136f9565b9250506020613943858286016136f9565b9150509250929050565b6000604082019050613962600083018561376d565b61396f6020830184613803565b9392505050565b60008060006060848603121561398f5761398e613561565b5b600061399d868287016137ae565b93505060206139ae868287016136f9565b92505060406139bf868287016136f9565b9150509250925092565b600080604083850312156139e0576139df613561565b5b60006139ee858286016138a1565b92505060206139ff858286016137ae565b9150509250929050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b613a4b8261366c565b810181811067ffffffffffffffff82111715613a6a57613a69613a13565b5b80604052505050565b6000613a7d613557565b9050613a898282613a42565b919050565b600067ffffffffffffffff821115613aa957613aa8613a13565b5b613ab28261366c565b9050602081019050919050565b82818337600083830152505050565b6000613ae1613adc84613a8e565b613a73565b905082815260208101848484011115613afd57613afc613a0e565b5b613b08848285613abf565b509392505050565b600082601f830112613b2557613b24613a09565b5b8135613b35848260208601613ace565b91505092915050565b600060208284031215613b5457613b53613561565b5b600082013567ffffffffffffffff811115613b7257613b71613566565b5b613b7e84828501613b10565b91505092915050565b600060208284031215613b9d57613b9c613561565b5b6000613bab848285016137ae565b91505092915050565b60008060408385031215613bcb57613bca613561565b5b6000613bd9858286016138a1565b9250506020613bea858286016136f9565b9150509250929050565b613bfd816135f0565b8114613c0857600080fd5b50565b600081359050613c1a81613bf4565b92915050565b60008060408385031215613c3757613c36613561565b5b6000613c45858286016137ae565b9250506020613c5685828601613c0b565b9150509250929050565b600067ffffffffffffffff821115613c7b57613c7a613a13565b5b613c848261366c565b9050602081019050919050565b6000613ca4613c9f84613c60565b613a73565b905082815260208101848484011115613cc057613cbf613a0e565b5b613ccb848285613abf565b509392505050565b600082601f830112613ce857613ce7613a09565b5b8135613cf8848260208601613c91565b91505092915050565b60008060008060808587031215613d1b57613d1a613561565b5b6000613d29878288016137ae565b9450506020613d3a878288016137ae565b9350506040613d4b878288016136f9565b925050606085013567ffffffffffffffff811115613d6c57613d6b613566565b5b613d7887828801613cd3565b91505092959194509250565b60008060408385031215613d9b57613d9a613561565b5b6000613da9858286016137ae565b9250506020613dba858286016137ae565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613e0b57607f821691505b602082108103613e1e57613e1d613dc4565b5b50919050565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b6000613e80602183613631565b9150613e8b82613e24565b604082019050919050565b60006020820190508181036000830152613eaf81613e73565b9050919050565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60008201527f6b656e206f776e6572206f7220617070726f76656420666f7220616c6c000000602082015250565b6000613f12603d83613631565b9150613f1d82613eb6565b604082019050919050565b60006020820190508181036000830152613f4181613f05565b9050919050565b7f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560008201527f72206f7220617070726f76656400000000000000000000000000000000000000602082015250565b6000613fa4602d83613631565b9150613faf82613f48565b604082019050919050565b60006020820190508181036000830152613fd381613f97565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000614014826136d8565b915061401f836136d8565b925082820261402d816136d8565b9150828204841483151761404457614043613fda565b5b5092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b6000614085826136d8565b9150614090836136d8565b9250826140a05761409f61404b565b5b828204905092915050565b60006140b6826136d8565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff82036140e8576140e7613fda565b5b600182019050919050565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b600061414f602b83613631565b915061415a826140f3565b604082019050919050565b6000602082019050818103600083015261417e81614142565b9050919050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b60006141e1602f83613631565b91506141ec82614185565b604082019050919050565b60006020820190508181036000830152614210816141d4565b9050919050565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b6000614273602c83613631565b915061427e82614217565b604082019050919050565b600060208201905081810360008301526142a281614266565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60008190508160005260206000209050919050565b60006020601f8301049050919050565b600082821b905092915050565b60006008830261433a7fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff826142fd565b61434486836142fd565b95508019841693508086168417925050509392505050565b6000819050919050565b600061438161437c614377846136d8565b61435c565b6136d8565b9050919050565b6000819050919050565b61439b83614366565b6143af6143a782614388565b84845461430a565b825550505050565b600090565b6143c46143b7565b6143cf818484614392565b505050565b5b818110156143f3576143e86000826143bc565b6001810190506143d5565b5050565b601f82111561443857614409816142d8565b614412846142ed565b81016020851015614421578190505b61443561442d856142ed565b8301826143d4565b50505b505050565b600082821c905092915050565b600061445b6000198460080261443d565b1980831691505092915050565b6000614474838361444a565b9150826002028217905092915050565b61448d82613626565b67ffffffffffffffff8111156144a6576144a5613a13565b5b6144b08254613df3565b6144bb8282856143f7565b600060209050601f8311600181146144ee57600084156144dc578287015190505b6144e68582614468565b86555061454e565b601f1984166144fc866142d8565b60005b82811015614524578489015182556001820191506020850194506020810190506144ff565b86831015614541578489015161453d601f89168261444a565b8355505b6001600288020188555050505b505050505050565b7f4552433732313a20696e76616c696420746f6b656e2049440000000000000000600082015250565b600061458c601883613631565b915061459782614556565b602082019050919050565b600060208201905081810360008301526145bb8161457f565b9050919050565b7f4552433732313a2061646472657373207a65726f206973206e6f74206120766160008201527f6c6964206f776e65720000000000000000000000000000000000000000000000602082015250565b600061461e602983613631565b9150614629826145c2565b604082019050919050565b6000602082019050818103600083015261464d81614611565b9050919050565b600081905092915050565b600061466a82613626565b6146748185614654565b9350614684818560208601613642565b80840191505092915050565b600061469c828561465f565b91506146a8828461465f565b91508190509392505050565b7f5f00000000000000000000000000000000000000000000000000000000000000600082015250565b60006146ea600183614654565b91506146f5826146b4565b600182019050919050565b600061470c828461465f565b9150614717826146dd565b915081905092915050565b7f4552433732313a207472616e736665722066726f6d20696e636f72726563742060008201527f6f776e6572000000000000000000000000000000000000000000000000000000602082015250565b600061477e602583613631565b915061478982614722565b604082019050919050565b600060208201905081810360008301526147ad81614771565b9050919050565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b6000614810602483613631565b915061481b826147b4565b604082019050919050565b6000602082019050818103600083015261483f81614803565b9050919050565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b600061487c602083613631565b915061488782614846565b602082019050919050565b600060208201905081810360008301526148ab8161486f565b9050919050565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b60006148e8601c83613631565b91506148f3826148b2565b602082019050919050565b60006020820190508181036000830152614917816148db565b9050919050565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b6000614954601983613631565b915061495f8261491e565b602082019050919050565b6000602082019050818103600083015261498381614947565b9050919050565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b60006149e6603283613631565b91506149f18261498a565b604082019050919050565b60006020820190508181036000830152614a15816149d9565b9050919050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b6000614a52601783614654565b9150614a5d82614a1c565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b6000614a9e601183614654565b9150614aa982614a68565b601182019050919050565b6000614abf82614a45565b9150614acb828561465f565b9150614ad682614a91565b9150614ae2828461465f565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b6000614b24601483613631565b9150614b2f82614aee565b602082019050919050565b60006020820190508181036000830152614b5381614b17565b9050919050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b6000614b90601083613631565b9150614b9b82614b5a565b602082019050919050565b60006020820190508181036000830152614bbf81614b83565b9050919050565b600081519050919050565b600082825260208201905092915050565b6000614bed82614bc6565b614bf78185614bd1565b9350614c07818560208601613642565b614c108161366c565b840191505092915050565b6000608082019050614c30600083018761376d565b614c3d602083018661376d565b614c4a6040830185613803565b8181036060830152614c5c8184614be2565b905095945050505050565b600081519050614c7681613597565b92915050565b600060208284031215614c9257614c91613561565b5b6000614ca084828501614c67565b91505092915050565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b6000614d05602b83613631565b9150614d1082614ca9565b604082019050919050565b60006020820190508181036000830152614d3481614cf8565b9050919050565b6000614d46826136d8565b9150614d51836136d8565b9250828201905080821115614d6957614d68613fda565b5b92915050565b6000614d7a826136d8565b915060008203614d8d57614d8c613fda565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b6000614dce602083613631565b9150614dd982614d98565b602082019050919050565b60006020820190508181036000830152614dfd81614dc1565b9050919050565b6000614e0f826136d8565b9150614e1a836136d8565b9250828203905081811115614e3257614e31613fda565b5b92915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f455243373231456e756d657261626c653a20636f6e736563757469766520747260008201527f616e7366657273206e6f7420737570706f727465640000000000000000000000602082015250565b6000614ec3603583613631565b9150614ece82614e67565b604082019050919050565b60006020820190508181036000830152614ef281614eb6565b905091905056fea26469706673582212201bb3806df59c28122dd991cbd50218e6a06141a62c7ba6348b4e0ba97fc7941864736f6c63430008120033

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

000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000000000c00000000000000000000000000000000000000000000000000000000000000100000000000000000000000000e89985d5bc085972eaeb5ad95499625d19ed1020000000000000000000000000000000000000000000000000000000000000001450617269734f70657261416c676f42616c6c657400000000000000000000000000000000000000000000000000000000000000000000000000000000000000064f50455241310000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000006d68747470733a2f2f637671727462687770662e657865637574652d6170692e65752d776573742d332e616d617a6f6e6177732e636f6d2f70726f642f6e66746d657461646174612f30323065346564612d653636332d343335382d386535362d3466316438623238353232612f00000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): ParisOperaAlgoBallet
Arg [1] : symbol (string): OPERA1
Arg [2] : baseTokenURI (string): https://cvqrtbhwpf.execute-api.eu-west-3.amazonaws.com/prod/nftmetadata/020e4eda-e663-4358-8e56-4f1d8b28522a/
Arg [3] : royaltyReceiver (address): 0xe89985d5bc085972EaEB5ad95499625d19ED1020

-----Encoded View---------------
13 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000080
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000c0
Arg [2] : 0000000000000000000000000000000000000000000000000000000000000100
Arg [3] : 000000000000000000000000e89985d5bc085972eaeb5ad95499625d19ed1020
Arg [4] : 0000000000000000000000000000000000000000000000000000000000000014
Arg [5] : 50617269734f70657261416c676f42616c6c6574000000000000000000000000
Arg [6] : 0000000000000000000000000000000000000000000000000000000000000006
Arg [7] : 4f50455241310000000000000000000000000000000000000000000000000000
Arg [8] : 000000000000000000000000000000000000000000000000000000000000006d
Arg [9] : 68747470733a2f2f637671727462687770662e657865637574652d6170692e65
Arg [10] : 752d776573742d332e616d617a6f6e6177732e636f6d2f70726f642f6e66746d
Arg [11] : 657461646174612f30323065346564612d653636332d343335382d386535362d
Arg [12] : 3466316438623238353232612f00000000000000000000000000000000000000


Deployed Bytecode Sourcemap

99309:2693:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;101758:241;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73996:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75508:171;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75026:416;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93933:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76208:335;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54231:131;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;62143:442;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;;:::i;:::-;;;;;;;;100895:237;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;54672:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;93601:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55816:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;101262:79;;;:::i;:::-;;100608:111;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76614:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;92012:242;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;94123:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100467:115;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35487:86;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73706:223;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73437:207;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101181:75;;;:::i;:::-;;59475:153;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52704:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74165:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51809:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75751:155;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76870:322;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;100725:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74340:281;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;59802:142;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;99466:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55112:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;99533:62;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;100124:191;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75977:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;101758:241;101934:4;101957:36;101981:11;101957:23;:36::i;:::-;101950:43;;101758:241;;;:::o;73996:100::-;74050:13;74083:5;74076:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73996:100;:::o;75508:171::-;75584:7;75604:23;75619:7;75604:14;:23::i;:::-;75647:15;:24;75663:7;75647:24;;;;;;;;;;;;;;;;;;;;;75640:31;;75508:171;;;:::o;75026:416::-;75107:13;75123:23;75138:7;75123:14;:23::i;:::-;75107:39;;75171:5;75165:11;;:2;:11;;;75157:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;75265:5;75249:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;75274:37;75291:5;75298:12;:10;:12::i;:::-;75274:16;:37::i;:::-;75249:62;75227:173;;;;;;;;;;;;:::i;:::-;;;;;;;;;75413:21;75422:2;75426:7;75413:8;:21::i;:::-;75096:346;75026:416;;:::o;93933:113::-;93994:7;94021:10;:17;;;;94014:24;;93933:113;:::o;76208:335::-;76403:41;76422:12;:10;:12::i;:::-;76436:7;76403:18;:41::i;:::-;76395:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;76507:28;76517:4;76523:2;76527:7;76507:9;:28::i;:::-;76208:335;;;:::o;54231:131::-;54305:7;54332:6;:12;54339:4;54332:12;;;;;;;;;;;:22;;;54325:29;;54231:131;;;:::o;62143:442::-;62240:7;62249;62269:26;62298:17;:27;62316:8;62298:27;;;;;;;;;;;62269:56;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62370:1;62342:30;;:7;:16;;;:30;;;62338:92;;62399:19;62389:29;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;62338:92;62442:21;62507:17;:15;:17::i;:::-;62466:58;;62480:7;:23;;;62467:36;;:10;:36;;;;:::i;:::-;62466:58;;;;:::i;:::-;62442:82;;62545:7;:16;;;62563:13;62537:40;;;;;;62143:442;;;;;:::o;100895:237::-;99504:24;52300:16;52311:4;52300:10;:16::i;:::-;101018:15:::1;101036:12;101018:30;;101013:114;101060:19;101050:7;:29;101013:114;;;101101:18;101107:2;101111:7;101101:5;:18::i;:::-;101081:9;;;;;:::i;:::-;;;;101013:114;;;;100895:237:::0;;;;:::o;54672:147::-;54755:18;54768:4;54755:12;:18::i;:::-;52300:16;52311:4;52300:10;:16::i;:::-;54786:25:::1;54797:4;54803:7;54786:10;:25::i;:::-;54672:147:::0;;;:::o;93601:256::-;93698:7;93734:23;93751:5;93734:16;:23::i;:::-;93726:5;:31;93718:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;93823:12;:19;93836:5;93823:19;;;;;;;;;;;;;;;:26;93843:5;93823:26;;;;;;;;;;;;93816:33;;93601:256;;;;:::o;55816:218::-;55923:12;:10;:12::i;:::-;55912:23;;:7;:23;;;55904:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;56000:26;56012:4;56018:7;56000:11;:26::i;:::-;55816:218;;:::o;101262:79::-;99571:24;52300:16;52311:4;52300:10;:16::i;:::-;101325:10:::1;:8;:10::i;:::-;101262:79:::0;:::o;100608:111::-;99504:24;52300:16;52311:4;52300:10;:16::i;:::-;100695:18:::1;100701:2;100705:7;100695:5;:18::i;:::-;100608:111:::0;;;:::o;76614:185::-;76752:39;76769:4;76775:2;76779:7;76752:39;;;;;;;;;;;;:16;:39::i;:::-;76614:185;;;:::o;92012:242::-;92130:41;92149:12;:10;:12::i;:::-;92163:7;92130:18;:41::i;:::-;92122:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;92232:14;92238:7;92232:5;:14::i;:::-;92012:242;:::o;94123:233::-;94198:7;94234:30;:28;:30::i;:::-;94226:5;:38;94218:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;94331:10;94342:5;94331:17;;;;;;;;:::i;:::-;;;;;;;;;;94324:24;;94123:233;;;:::o;100467:115::-;51854:4;100526:18;;52300:16;52311:4;52300:10;:16::i;:::-;100569:7:::1;100553:13;:23;;;;;;:::i;:::-;;100467:115:::0;;:::o;35487:86::-;35534:4;35558:7;;;;;;;;;;;35551:14;;35487:86;:::o;73706:223::-;73778:7;73798:13;73814:17;73823:7;73814:8;:17::i;:::-;73798:33;;73867:1;73850:19;;:5;:19;;;73842:56;;;;;;;;;;;;:::i;:::-;;;;;;;;;73916:5;73909:12;;;73706:223;;;:::o;73437:207::-;73509:7;73554:1;73537:19;;:5;:19;;;73529:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;73620:9;:16;73630:5;73620:16;;;;;;;;;;;;;;;;73613:23;;73437:207;;;:::o;101181:75::-;99571:24;52300:16;52311:4;52300:10;:16::i;:::-;101242:8:::1;:6;:8::i;:::-;101181:75:::0;:::o;59475:153::-;59565:7;59592:28;59614:5;59592:12;:18;59605:4;59592:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;59585:35;;59475:153;;;;:::o;52704:147::-;52790:4;52814:6;:12;52821:4;52814:12;;;;;;;;;;;:20;;:29;52835:7;52814:29;;;;;;;;;;;;;;;;;;;;;;;;;52807:36;;52704:147;;;;:::o;74165:104::-;74221:13;74254:7;74247:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;74165:104;:::o;51809:49::-;51854:4;51809:49;;;:::o;75751:155::-;75846:52;75865:12;:10;:12::i;:::-;75879:8;75889;75846:18;:52::i;:::-;75751:155;;:::o;76870:322::-;77044:41;77063:12;:10;:12::i;:::-;77077:7;77044:18;:41::i;:::-;77036:99;;;;;;;;;;;;:::i;:::-;;;;;;;;;77146:38;77160:4;77166:2;77170:7;77179:4;77146:13;:38::i;:::-;76870:322;;;;:::o;100725:164::-;99504:24;52300:16;52311:4;52300:10;:16::i;:::-;100831:18:::1;100837:2;100841:7;100831:5;:18::i;:::-;100856:27;100865:8;100875:7;100856:8;:27::i;:::-;100725:164:::0;;;;:::o;74340:281::-;74413:13;74439:23;74454:7;74439:14;:23::i;:::-;74475:21;74499:10;:8;:10::i;:::-;74475:34;;74551:1;74533:7;74527:21;:25;:86;;;;;;;;;;;;;;;;;74579:7;74588:18;:7;:16;:18::i;:::-;74562:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;74527:86;74520:93;;;74340:281;;;:::o;59802:142::-;59882:7;59909:27;:12;:18;59922:4;59909:18;;;;;;;;;;;:25;:27::i;:::-;59902:34;;59802:142;;;:::o;99466:62::-;99504:24;99466:62;:::o;55112:149::-;55196:18;55209:4;55196:12;:18::i;:::-;52300:16;52311:4;52300:10;:16::i;:::-;55227:26:::1;55239:4;55245:7;55227:11;:26::i;:::-;55112:149:::0;;;:::o;99533:62::-;99571:24;99533:62;:::o;100124:191::-;100168:13;100190:21;100214:10;:8;:10::i;:::-;100190:34;;100262:1;100244:7;100238:21;:25;:71;;;;;;;;;;;;;;;;;100290:7;100273:30;;;;;;;;:::i;:::-;;;;;;;;;;;;;100238:71;100231:78;;;100124:191;:::o;75977:164::-;76074:4;76098:18;:25;76117:5;76098:25;;;;;;;;;;;;;;;:35;76124:8;76098:35;;;;;;;;;;;;;;;;;;;;;;;;;76091:42;;75977:164;;;;:::o;57413:238::-;57497:22;57505:4;57511:7;57497;:22::i;:::-;57492:152;;57568:4;57536:6;:12;57543:4;57536:12;;;;;;;;;;;:20;;:29;57557:7;57536:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;57619:12;:10;:12::i;:::-;57592:40;;57610:7;57592:40;;57604:4;57592:40;;;;;;;;;;57492:152;57413:238;;:::o;8582:152::-;8652:4;8676:50;8681:3;:10;;8717:5;8701:23;;8693:32;;8676:4;:50::i;:::-;8669:57;;8582:152;;;;:::o;89994:170::-;90096:4;90120:36;90144:11;90120:23;:36::i;:::-;90113:43;;89994:170;;;:::o;85327:135::-;85409:16;85417:7;85409;:16::i;:::-;85401:53;;;;;;;;;;;;:::i;:::-;;;;;;;;;85327:135;:::o;33594:98::-;33647:7;33674:10;33667:17;;33594:98;:::o;84606:174::-;84708:2;84681:15;:24;84697:7;84681:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;84764:7;84760:2;84726:46;;84735:23;84750:7;84735:14;:23::i;:::-;84726:46;;;;;;;;;;;;84606:174;;:::o;79225:264::-;79318:4;79335:13;79351:23;79366:7;79351:14;:23::i;:::-;79335:39;;79404:5;79393:16;;:7;:16;;;:52;;;;79413:32;79430:5;79437:7;79413:16;:32::i;:::-;79393:52;:87;;;;79473:7;79449:31;;:20;79461:7;79449:11;:20::i;:::-;:31;;;79393:87;79385:96;;;79225:264;;;;:::o;83224:1263::-;83383:4;83356:31;;:23;83371:7;83356:14;:23::i;:::-;:31;;;83348:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;83462:1;83448:16;;:2;:16;;;83440:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;83518:42;83539:4;83545:2;83549:7;83558:1;83518:20;:42::i;:::-;83690:4;83663:31;;:23;83678:7;83663:14;:23::i;:::-;:31;;;83655:81;;;;;;;;;;;;:::i;:::-;;;;;;;;;83808:15;:24;83824:7;83808:24;;;;;;;;;;;;83801:31;;;;;;;;;;;84303:1;84284:9;:15;84294:4;84284:15;;;;;;;;;;;;;;;;:20;;;;;;;;;;;84336:1;84319:9;:13;84329:2;84319:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;84378:2;84359:7;:16;84367:7;84359:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;84417:7;84413:2;84398:27;;84407:4;84398:27;;;;;;;;;;;;84438:41;84458:4;84464:2;84468:7;84477:1;84438:19;:41::i;:::-;83224:1263;;;:::o;62867:97::-;62925:6;62951:5;62944:12;;62867:97;:::o;53155:105::-;53222:30;53233:4;53239:12;:10;:12::i;:::-;53222:10;:30::i;:::-;53155:105;:::o;80823:942::-;80917:1;80903:16;;:2;:16;;;80895:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;80976:16;80984:7;80976;:16::i;:::-;80975:17;80967:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;81038:48;81067:1;81071:2;81075:7;81084:1;81038:20;:48::i;:::-;81185:16;81193:7;81185;:16::i;:::-;81184:17;81176:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;81600:1;81583:9;:13;81593:2;81583:13;;;;;;;;;;;;;;;;:18;;;;;;;;;;;81644:2;81625:7;:16;81633:7;81625:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;81689:7;81685:2;81664:33;;81681:1;81664:33;;;;;;;;;;;;81710:47;81738:1;81742:2;81746:7;81755:1;81710:19;:47::i;:::-;80823:942;;:::o;60037:169::-;60125:31;60142:4;60148:7;60125:16;:31::i;:::-;60167;60190:7;60167:12;:18;60180:4;60167:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;60037:169;;:::o;60300:174::-;60389:32;60407:4;60413:7;60389:17;:32::i;:::-;60432:34;60458:7;60432:12;:18;60445:4;60432:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;60300:174;;:::o;36342:120::-;35351:16;:14;:16::i;:::-;36411:5:::1;36401:7;;:15;;;;;;;;;;;;;;;;;;36432:22;36441:12;:10;:12::i;:::-;36432:22;;;;;;:::i;:::-;;;;;;;;36342:120::o:0;101368:114::-;101456:20;101468:7;101456:11;:20::i;:::-;101368:114;:::o;78500:117::-;78566:7;78593;:16;78601:7;78593:16;;;;;;;;;;;;;;;;;;;;;78586:23;;78500:117;;;:::o;36083:118::-;35092:19;:17;:19::i;:::-;36153:4:::1;36143:7;;:14;;;;;;;;;;;;;;;;;;36173:20;36180:12;:10;:12::i;:::-;36173:20;;;;;;:::i;:::-;;;;;;;;36083:118::o:0;9878:158::-;9952:7;10003:22;10007:3;:10;;10019:5;10003:3;:22::i;:::-;9995:31;;9972:56;;9878:158;;;;:::o;84923:315::-;85078:8;85069:17;;:5;:17;;;85061:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;85165:8;85127:18;:25;85146:5;85127:25;;;;;;;;;;;;;;;:35;85153:8;85127:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;85211:8;85189:41;;85204:5;85189:41;;;85221:8;85189:41;;;;;;:::i;:::-;;;;;;;;84923:315;;;:::o;78073:313::-;78229:28;78239:4;78245:2;78249:7;78229:9;:28::i;:::-;78276:47;78299:4;78305:2;78309:7;78318:4;78276:22;:47::i;:::-;78268:110;;;;;;;;;;;;:::i;:::-;;;;;;;;;78073:313;;;;:::o;100321:108::-;100381:13;100410;100403:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;100321:108;:::o;31015:716::-;31071:13;31122:14;31159:1;31139:17;31150:5;31139:10;:17::i;:::-;:21;31122:38;;31175:20;31209:6;31198:18;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31175:41;;31231:11;31360:6;31356:2;31352:15;31344:6;31340:28;31333:35;;31397:288;31404:4;31397:288;;;31429:5;;;;;;;;31571:8;31566:2;31559:5;31555:14;31550:30;31545:3;31537:44;31627:2;31618:11;;;;;;:::i;:::-;;;;;31661:1;31652:5;:10;31397:288;31648:21;31397:288;31706:6;31699:13;;;;;31015:716;;;:::o;9407:117::-;9470:7;9497:19;9505:3;:10;;9497:7;:19::i;:::-;9490:26;;9407:117;;;:::o;2313:414::-;2376:4;2398:21;2408:3;2413:5;2398:9;:21::i;:::-;2393:327;;2436:3;:11;;2453:5;2436:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2619:3;:11;;:18;;;;2597:3;:12;;:19;2610:5;2597:19;;;;;;;;;;;:40;;;;2659:4;2652:11;;;;2393:327;2703:5;2696:12;;2313:414;;;;;:::o;93293:224::-;93395:4;93434:35;93419:50;;;:11;:50;;;;:90;;;;93473:36;93497:11;93473:23;:36::i;:::-;93419:90;93412:97;;93293:224;;;:::o;78930:128::-;78995:4;79048:1;79019:31;;:17;79028:7;79019:8;:17::i;:::-;:31;;;;79012:38;;78930:128;;;:::o;101488:264::-;101685:61;101712:4;101718:2;101722:12;101736:9;101685:26;:61::i;:::-;101488:264;;;;:::o;88743:158::-;;;;;:::o;53550:492::-;53639:22;53647:4;53653:7;53639;:22::i;:::-;53634:401;;53827:28;53847:7;53827:19;:28::i;:::-;53928:38;53956:4;53948:13;;53963:2;53928:19;:38::i;:::-;53732:257;;;;;;;;;:::i;:::-;;;;;;;;;;;;;53678:345;;;;;;;;;;;:::i;:::-;;;;;;;;53634:401;53550:492;;:::o;57831:239::-;57915:22;57923:4;57929:7;57915;:22::i;:::-;57911:152;;;57986:5;57954:6;:12;57961:4;57954:12;;;;;;;;;;;:20;;:29;57975:7;57954:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;58038:12;:10;:12::i;:::-;58011:40;;58029:7;58011:40;;58023:4;58011:40;;;;;;;;;;57911:152;57831:239;;:::o;8910:158::-;8983:4;9007:53;9015:3;:10;;9051:5;9035:23;;9027:32;;9007:7;:53::i;:::-;9000:60;;8910:158;;;;:::o;35831:108::-;35898:8;:6;:8::i;:::-;35890:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;35831:108::o;90296:135::-;90365:20;90377:7;90365:11;:20::i;:::-;90396:27;90415:7;90396:18;:27::i;:::-;90296:135;:::o;35646:108::-;35717:8;:6;:8::i;:::-;35716:9;35708:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;35646:108::o;5087:120::-;5154:7;5181:3;:11;;5193:5;5181:18;;;;;;;;:::i;:::-;;;;;;;;;;5174:25;;5087:120;;;;:::o;86026:853::-;86180:4;86201:15;:2;:13;;;:15::i;:::-;86197:675;;;86253:2;86237:36;;;86274:12;:10;:12::i;:::-;86288:4;86294:7;86303:4;86237:71;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;86233:584;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;86495:1;86478:6;:13;:18;86474:328;;86521:60;;;;;;;;;;:::i;:::-;;;;;;;;86474:328;86752:6;86746:13;86737:6;86733:2;86729:15;86722:38;86233:584;86369:41;;;86359:51;;;:6;:51;;;;86352:58;;;;;86197:675;86856:4;86849:11;;86026:853;;;;;;;:::o;27875:922::-;27928:7;27948:14;27965:1;27948:18;;28015:6;28006:5;:15;28002:102;;28051:6;28042:15;;;;;;:::i;:::-;;;;;28086:2;28076:12;;;;28002:102;28131:6;28122:5;:15;28118:102;;28167:6;28158:15;;;;;;:::i;:::-;;;;;28202:2;28192:12;;;;28118:102;28247:6;28238:5;:15;28234:102;;28283:6;28274:15;;;;;;:::i;:::-;;;;;28318:2;28308:12;;;;28234:102;28363:5;28354;:14;28350:99;;28398:5;28389:14;;;;;;:::i;:::-;;;;;28432:1;28422:11;;;;28350:99;28476:5;28467;:14;28463:99;;28511:5;28502:14;;;;;;:::i;:::-;;;;;28545:1;28535:11;;;;28463:99;28589:5;28580;:14;28576:99;;28624:5;28615:14;;;;;;:::i;:::-;;;;;28658:1;28648:11;;;;28576:99;28702:5;28693;:14;28689:66;;28738:1;28728:11;;;;28689:66;28783:6;28776:13;;;27875:922;;;:::o;4624:109::-;4680:7;4707:3;:11;;:18;;;;4700:25;;4624:109;;;:::o;4409:129::-;4482:4;4529:1;4506:3;:12;;:19;4519:5;4506:19;;;;;;;;;;;;:24;;4499:31;;4409:129;;;;:::o;73068:305::-;73170:4;73222:25;73207:40;;;:11;:40;;;;:105;;;;73279:33;73264:48;;;:11;:48;;;;73207:105;:158;;;;73329:36;73353:11;73329:23;:36::i;:::-;73207:158;73187:178;;73068:305;;;:::o;91137:324::-;91314:61;91341:4;91347:2;91351:12;91365:9;91314:26;:61::i;:::-;91397:8;:6;:8::i;:::-;91396:9;91388:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;91137:324;;;;:::o;32751:151::-;32809:13;32842:52;32870:4;32854:22;;30906:2;32842:52;;:11;:52::i;:::-;32835:59;;32751:151;;;:::o;32147:447::-;32222:13;32248:19;32293:1;32284:6;32280:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;32270:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32248:47;;32306:15;:6;32313:1;32306:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;32332;:6;32339:1;32332:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;32363:9;32388:1;32379:6;32375:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;32363:26;;32358:131;32395:1;32391;:5;32358:131;;;32430:8;32447:3;32439:5;:11;32430:21;;;;;;;:::i;:::-;;;;;32418:6;32425:1;32418:9;;;;;;;;:::i;:::-;;;;;:33;;;;;;;;;;;32476:1;32466:11;;;;;32398:3;;;;:::i;:::-;;;32358:131;;;;32516:1;32507:5;:10;32499:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;32579:6;32565:21;;;32147:447;;;;:::o;2903:1420::-;2969:4;3087:18;3108:3;:12;;:19;3121:5;3108:19;;;;;;;;;;;;3087:40;;3158:1;3144:10;:15;3140:1176;;3519:21;3556:1;3543:10;:14;;;;:::i;:::-;3519:38;;3572:17;3613:1;3592:3;:11;;:18;;;;:22;;;;:::i;:::-;3572:42;;3648:13;3635:9;:26;3631:405;;3682:17;3702:3;:11;;3714:9;3702:22;;;;;;;;:::i;:::-;;;;;;;;;;3682:42;;3856:9;3827:3;:11;;3839:13;3827:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3967:10;3941:3;:12;;:23;3954:9;3941:23;;;;;;;;;;;:36;;;;3663:373;3631:405;4117:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;4212:3;:12;;:19;4225:5;4212:19;;;;;;;;;;;4205:26;;;4255:4;4248:11;;;;;;;3140:1176;4299:5;4292:12;;;2903:1420;;;;;:::o;82104:783::-;82164:13;82180:23;82195:7;82180:14;:23::i;:::-;82164:39;;82216:51;82237:5;82252:1;82256:7;82265:1;82216:20;:51::i;:::-;82380:23;82395:7;82380:14;:23::i;:::-;82372:31;;82451:15;:24;82467:7;82451:24;;;;;;;;;;;;82444:31;;;;;;;;;;;82716:1;82696:9;:16;82706:5;82696:16;;;;;;;;;;;;;;;;:21;;;;;;;;;;;82746:7;:16;82754:7;82746:16;;;;;;;;;;;;82739:23;;;;;;;;;;;82808:7;82804:1;82780:36;;82789:5;82780:36;;;;;;;;;;;;82829:50;82849:5;82864:1;82868:7;82877:1;82829:19;:50::i;:::-;82153:734;82104:783;:::o;64519:114::-;64599:17;:26;64617:7;64599:26;;;;;;;;;;;;64592:33;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;64519:114;:::o;37708:326::-;37768:4;38025:1;38003:7;:19;;;:23;37996:30;;37708:326;;;:::o;61873:215::-;61975:4;62014:26;61999:41;;;:11;:41;;;;:81;;;;62044:36;62068:11;62044:23;:36::i;:::-;61999:81;61992:88;;61873:215;;;:::o;94430:915::-;94607:61;94634:4;94640:2;94644:12;94658:9;94607:26;:61::i;:::-;94697:1;94685:9;:13;94681:222;;;94828:63;;;;;;;;;;:::i;:::-;;;;;;;;94681:222;94915:15;94933:12;94915:30;;94978:1;94962:18;;:4;:18;;;94958:187;;94997:40;95029:7;94997:31;:40::i;:::-;94958:187;;;95067:2;95059:10;;:4;:10;;;95055:90;;95086:47;95119:4;95125:7;95086:32;:47::i;:::-;95055:90;94958:187;95173:1;95159:16;;:2;:16;;;95155:183;;95192:45;95229:7;95192:36;:45::i;:::-;95155:183;;;95265:4;95259:10;;:2;:10;;;95255:83;;95286:40;95314:2;95318:7;95286:27;:40::i;:::-;95255:83;95155:183;94596:749;94430:915;;;;:::o;58662:214::-;58747:4;58786:42;58771:57;;;:11;:57;;;;:97;;;;58832:36;58856:11;58832:23;:36::i;:::-;58771:97;58764:104;;58662:214;;;:::o;87611:410::-;87801:1;87789:9;:13;87785:229;;;87839:1;87823:18;;:4;:18;;;87819:87;;87881:9;87862;:15;87872:4;87862:15;;;;;;;;;;;;;;;;:28;;;;;;;:::i;:::-;;;;;;;;87819:87;87938:1;87924:16;;:2;:16;;;87920:83;;87978:9;87961;:13;87971:2;87961:13;;;;;;;;;;;;;;;;:26;;;;;;;:::i;:::-;;;;;;;;87920:83;87785:229;87611:410;;;;:::o;96068:164::-;96172:10;:17;;;;96145:15;:24;96161:7;96145:24;;;;;;;;;;;:44;;;;96200:10;96216:7;96200:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;96068:164;:::o;96859:988::-;97125:22;97175:1;97150:22;97167:4;97150:16;:22::i;:::-;:26;;;;:::i;:::-;97125:51;;97187:18;97208:17;:26;97226:7;97208:26;;;;;;;;;;;;97187:47;;97355:14;97341:10;:28;97337:328;;97386:19;97408:12;:18;97421:4;97408:18;;;;;;;;;;;;;;;:34;97427:14;97408:34;;;;;;;;;;;;97386:56;;97492:11;97459:12;:18;97472:4;97459:18;;;;;;;;;;;;;;;:30;97478:10;97459:30;;;;;;;;;;;:44;;;;97609:10;97576:17;:30;97594:11;97576:30;;;;;;;;;;;:43;;;;97371:294;97337:328;97761:17;:26;97779:7;97761:26;;;;;;;;;;;97754:33;;;97805:12;:18;97818:4;97805:18;;;;;;;;;;;;;;;:34;97824:14;97805:34;;;;;;;;;;;97798:41;;;96940:907;;96859:988;;:::o;98142:1079::-;98395:22;98440:1;98420:10;:17;;;;:21;;;;:::i;:::-;98395:46;;98452:18;98473:15;:24;98489:7;98473:24;;;;;;;;;;;;98452:45;;98824:19;98846:10;98857:14;98846:26;;;;;;;;:::i;:::-;;;;;;;;;;98824:48;;98910:11;98885:10;98896;98885:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;99021:10;98990:15;:28;99006:11;98990:28;;;;;;;;;;;:41;;;;99162:15;:24;99178:7;99162:24;;;;;;;;;;;99155:31;;;99197:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;98213:1008;;;98142:1079;:::o;95646:221::-;95731:14;95748:20;95765:2;95748:16;:20::i;:::-;95731:37;;95806:7;95779:12;:16;95792:2;95779:16;;;;;;;;;;;;;;;:24;95796:6;95779:24;;;;;;;;;;;:34;;;;95853:6;95824:17;:26;95842:7;95824:26;;;;;;;;;;;:35;;;;95720:147;95646:221;;:::o;52408:204::-;52493:4;52532:32;52517:47;;;:11;:47;;;;:87;;;;52568:36;52592:11;52568:23;:36::i;:::-;52517:87;52510:94;;52408:204;;;:::o;49661:157::-;49746:4;49785:25;49770:40;;;:11;:40;;;;49763:47;;49661:157;;;:::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:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:246::-;1879:1;1889:113;1903:6;1900:1;1897:13;1889:113;;;1988:1;1983:3;1979:11;1973:18;1969:1;1964:3;1960:11;1953:39;1925:2;1922:1;1918:10;1913:15;;1889:113;;;2036:1;2027:6;2022:3;2018:16;2011:27;1860:184;1798:246;;;:::o;2050:102::-;2091:6;2142:2;2138:7;2133:2;2126:5;2122:14;2118:28;2108:38;;2050:102;;;:::o;2158:377::-;2246:3;2274:39;2307:5;2274:39;:::i;:::-;2329:71;2393:6;2388:3;2329:71;:::i;:::-;2322:78;;2409:65;2467:6;2462:3;2455:4;2448:5;2444:16;2409:65;:::i;:::-;2499:29;2521:6;2499:29;:::i;:::-;2494:3;2490:39;2483:46;;2250:285;2158:377;;;;:::o;2541:313::-;2654:4;2692:2;2681:9;2677:18;2669:26;;2741:9;2735:4;2731:20;2727:1;2716:9;2712:17;2705:47;2769:78;2842:4;2833:6;2769:78;:::i;:::-;2761:86;;2541:313;;;;:::o;2860:77::-;2897:7;2926:5;2915:16;;2860:77;;;:::o;2943:122::-;3016:24;3034:5;3016:24;:::i;:::-;3009:5;3006:35;2996:63;;3055:1;3052;3045:12;2996:63;2943:122;:::o;3071:139::-;3117:5;3155:6;3142:20;3133:29;;3171:33;3198:5;3171:33;:::i;:::-;3071:139;;;;:::o;3216:329::-;3275:6;3324:2;3312:9;3303:7;3299:23;3295:32;3292:119;;;3330:79;;:::i;:::-;3292:119;3450:1;3475:53;3520:7;3511:6;3500:9;3496:22;3475:53;:::i;:::-;3465:63;;3421:117;3216:329;;;;:::o;3551:126::-;3588:7;3628:42;3621:5;3617:54;3606:65;;3551:126;;;:::o;3683:96::-;3720:7;3749:24;3767:5;3749:24;:::i;:::-;3738:35;;3683:96;;;:::o;3785:118::-;3872:24;3890:5;3872:24;:::i;:::-;3867:3;3860:37;3785:118;;:::o;3909:222::-;4002:4;4040:2;4029:9;4025:18;4017:26;;4053:71;4121:1;4110:9;4106:17;4097:6;4053:71;:::i;:::-;3909:222;;;;:::o;4137:122::-;4210:24;4228:5;4210:24;:::i;:::-;4203:5;4200:35;4190:63;;4249:1;4246;4239:12;4190:63;4137:122;:::o;4265:139::-;4311:5;4349:6;4336:20;4327:29;;4365:33;4392:5;4365:33;:::i;:::-;4265:139;;;;:::o;4410:474::-;4478:6;4486;4535:2;4523:9;4514:7;4510:23;4506:32;4503:119;;;4541:79;;:::i;:::-;4503:119;4661:1;4686:53;4731:7;4722:6;4711:9;4707:22;4686:53;:::i;:::-;4676:63;;4632:117;4788:2;4814:53;4859:7;4850:6;4839:9;4835:22;4814:53;:::i;:::-;4804:63;;4759:118;4410:474;;;;;:::o;4890:118::-;4977:24;4995:5;4977:24;:::i;:::-;4972:3;4965:37;4890:118;;:::o;5014:222::-;5107:4;5145:2;5134:9;5130:18;5122:26;;5158:71;5226:1;5215:9;5211:17;5202:6;5158:71;:::i;:::-;5014:222;;;;:::o;5242:619::-;5319:6;5327;5335;5384:2;5372:9;5363:7;5359:23;5355:32;5352:119;;;5390:79;;:::i;:::-;5352:119;5510:1;5535:53;5580:7;5571:6;5560:9;5556:22;5535:53;:::i;:::-;5525:63;;5481:117;5637:2;5663:53;5708:7;5699:6;5688:9;5684:22;5663:53;:::i;:::-;5653:63;;5608:118;5765:2;5791:53;5836:7;5827:6;5816:9;5812:22;5791:53;:::i;:::-;5781:63;;5736:118;5242:619;;;;;:::o;5867:77::-;5904:7;5933:5;5922:16;;5867:77;;;:::o;5950:122::-;6023:24;6041:5;6023:24;:::i;:::-;6016:5;6013:35;6003:63;;6062:1;6059;6052:12;6003:63;5950:122;:::o;6078:139::-;6124:5;6162:6;6149:20;6140:29;;6178:33;6205:5;6178:33;:::i;:::-;6078:139;;;;:::o;6223:329::-;6282:6;6331:2;6319:9;6310:7;6306:23;6302:32;6299:119;;;6337:79;;:::i;:::-;6299:119;6457:1;6482:53;6527:7;6518:6;6507:9;6503:22;6482:53;:::i;:::-;6472:63;;6428:117;6223:329;;;;:::o;6558:118::-;6645:24;6663:5;6645:24;:::i;:::-;6640:3;6633:37;6558:118;;:::o;6682:222::-;6775:4;6813:2;6802:9;6798:18;6790:26;;6826:71;6894:1;6883:9;6879:17;6870:6;6826:71;:::i;:::-;6682:222;;;;:::o;6910:474::-;6978:6;6986;7035:2;7023:9;7014:7;7010:23;7006:32;7003:119;;;7041:79;;:::i;:::-;7003:119;7161:1;7186:53;7231:7;7222:6;7211:9;7207:22;7186:53;:::i;:::-;7176:63;;7132:117;7288:2;7314:53;7359:7;7350:6;7339:9;7335:22;7314:53;:::i;:::-;7304:63;;7259:118;6910:474;;;;;:::o;7390:332::-;7511:4;7549:2;7538:9;7534:18;7526:26;;7562:71;7630:1;7619:9;7615:17;7606:6;7562:71;:::i;:::-;7643:72;7711:2;7700:9;7696:18;7687:6;7643:72;:::i;:::-;7390:332;;;;;:::o;7728:619::-;7805:6;7813;7821;7870:2;7858:9;7849:7;7845:23;7841:32;7838:119;;;7876:79;;:::i;:::-;7838:119;7996:1;8021:53;8066:7;8057:6;8046:9;8042:22;8021:53;:::i;:::-;8011:63;;7967:117;8123:2;8149:53;8194:7;8185:6;8174:9;8170:22;8149:53;:::i;:::-;8139:63;;8094:118;8251:2;8277:53;8322:7;8313:6;8302:9;8298:22;8277:53;:::i;:::-;8267:63;;8222:118;7728:619;;;;;:::o;8353:474::-;8421:6;8429;8478:2;8466:9;8457:7;8453:23;8449:32;8446:119;;;8484:79;;:::i;:::-;8446:119;8604:1;8629:53;8674:7;8665:6;8654:9;8650:22;8629:53;:::i;:::-;8619:63;;8575:117;8731:2;8757:53;8802:7;8793:6;8782:9;8778:22;8757:53;:::i;:::-;8747:63;;8702:118;8353:474;;;;;:::o;8833:117::-;8942:1;8939;8932:12;8956:117;9065:1;9062;9055:12;9079:180;9127:77;9124:1;9117:88;9224:4;9221:1;9214:15;9248:4;9245:1;9238:15;9265:281;9348:27;9370:4;9348:27;:::i;:::-;9340:6;9336:40;9478:6;9466:10;9463:22;9442:18;9430:10;9427:34;9424:62;9421:88;;;9489:18;;:::i;:::-;9421:88;9529:10;9525:2;9518:22;9308:238;9265:281;;:::o;9552:129::-;9586:6;9613:20;;:::i;:::-;9603:30;;9642:33;9670:4;9662:6;9642:33;:::i;:::-;9552:129;;;:::o;9687:308::-;9749:4;9839:18;9831:6;9828:30;9825:56;;;9861:18;;:::i;:::-;9825:56;9899:29;9921:6;9899:29;:::i;:::-;9891:37;;9983:4;9977;9973:15;9965:23;;9687:308;;;:::o;10001:146::-;10098:6;10093:3;10088;10075:30;10139:1;10130:6;10125:3;10121:16;10114:27;10001:146;;;:::o;10153:425::-;10231:5;10256:66;10272:49;10314:6;10272:49;:::i;:::-;10256:66;:::i;:::-;10247:75;;10345:6;10338:5;10331:21;10383:4;10376:5;10372:16;10421:3;10412:6;10407:3;10403:16;10400:25;10397:112;;;10428:79;;:::i;:::-;10397:112;10518:54;10565:6;10560:3;10555;10518:54;:::i;:::-;10237:341;10153:425;;;;;:::o;10598:340::-;10654:5;10703:3;10696:4;10688:6;10684:17;10680:27;10670:122;;10711:79;;:::i;:::-;10670:122;10828:6;10815:20;10853:79;10928:3;10920:6;10913:4;10905:6;10901:17;10853:79;:::i;:::-;10844:88;;10660:278;10598:340;;;;:::o;10944:509::-;11013:6;11062:2;11050:9;11041:7;11037:23;11033:32;11030:119;;;11068:79;;:::i;:::-;11030:119;11216:1;11205:9;11201:17;11188:31;11246:18;11238:6;11235:30;11232:117;;;11268:79;;:::i;:::-;11232:117;11373:63;11428:7;11419:6;11408:9;11404:22;11373:63;:::i;:::-;11363:73;;11159:287;10944:509;;;;:::o;11459:329::-;11518:6;11567:2;11555:9;11546:7;11542:23;11538:32;11535:119;;;11573:79;;:::i;:::-;11535:119;11693:1;11718:53;11763:7;11754:6;11743:9;11739:22;11718:53;:::i;:::-;11708:63;;11664:117;11459:329;;;;:::o;11794:474::-;11862:6;11870;11919:2;11907:9;11898:7;11894:23;11890:32;11887:119;;;11925:79;;:::i;:::-;11887:119;12045:1;12070:53;12115:7;12106:6;12095:9;12091:22;12070:53;:::i;:::-;12060:63;;12016:117;12172:2;12198:53;12243:7;12234:6;12223:9;12219:22;12198:53;:::i;:::-;12188:63;;12143:118;11794:474;;;;;:::o;12274:116::-;12344:21;12359:5;12344:21;:::i;:::-;12337:5;12334:32;12324:60;;12380:1;12377;12370:12;12324:60;12274:116;:::o;12396:133::-;12439:5;12477:6;12464:20;12455:29;;12493:30;12517:5;12493:30;:::i;:::-;12396:133;;;;:::o;12535:468::-;12600:6;12608;12657:2;12645:9;12636:7;12632:23;12628:32;12625:119;;;12663:79;;:::i;:::-;12625:119;12783:1;12808:53;12853:7;12844:6;12833:9;12829:22;12808:53;:::i;:::-;12798:63;;12754:117;12910:2;12936:50;12978:7;12969:6;12958:9;12954:22;12936:50;:::i;:::-;12926:60;;12881:115;12535:468;;;;;:::o;13009:307::-;13070:4;13160:18;13152:6;13149:30;13146:56;;;13182:18;;:::i;:::-;13146:56;13220:29;13242:6;13220:29;:::i;:::-;13212:37;;13304:4;13298;13294:15;13286:23;;13009:307;;;:::o;13322:423::-;13399:5;13424:65;13440:48;13481:6;13440:48;:::i;:::-;13424:65;:::i;:::-;13415:74;;13512:6;13505:5;13498:21;13550:4;13543:5;13539:16;13588:3;13579:6;13574:3;13570:16;13567:25;13564:112;;;13595:79;;:::i;:::-;13564:112;13685:54;13732:6;13727:3;13722;13685:54;:::i;:::-;13405:340;13322:423;;;;;:::o;13764:338::-;13819:5;13868:3;13861:4;13853:6;13849:17;13845:27;13835:122;;13876:79;;:::i;:::-;13835:122;13993:6;13980:20;14018:78;14092:3;14084:6;14077:4;14069:6;14065:17;14018:78;:::i;:::-;14009:87;;13825:277;13764:338;;;;:::o;14108:943::-;14203:6;14211;14219;14227;14276:3;14264:9;14255:7;14251:23;14247:33;14244:120;;;14283:79;;:::i;:::-;14244:120;14403:1;14428:53;14473:7;14464:6;14453:9;14449:22;14428:53;:::i;:::-;14418:63;;14374:117;14530:2;14556:53;14601:7;14592:6;14581:9;14577:22;14556:53;:::i;:::-;14546:63;;14501:118;14658:2;14684:53;14729:7;14720:6;14709:9;14705:22;14684:53;:::i;:::-;14674:63;;14629:118;14814:2;14803:9;14799:18;14786:32;14845:18;14837:6;14834:30;14831:117;;;14867:79;;:::i;:::-;14831:117;14972:62;15026:7;15017:6;15006:9;15002:22;14972:62;:::i;:::-;14962:72;;14757:287;14108:943;;;;;;;:::o;15057:474::-;15125:6;15133;15182:2;15170:9;15161:7;15157:23;15153:32;15150:119;;;15188:79;;:::i;:::-;15150:119;15308:1;15333:53;15378:7;15369:6;15358:9;15354:22;15333:53;:::i;:::-;15323:63;;15279:117;15435:2;15461:53;15506:7;15497:6;15486:9;15482:22;15461:53;:::i;:::-;15451:63;;15406:118;15057:474;;;;;:::o;15537:180::-;15585:77;15582:1;15575:88;15682:4;15679:1;15672:15;15706:4;15703:1;15696:15;15723:320;15767:6;15804:1;15798:4;15794:12;15784:22;;15851:1;15845:4;15841:12;15872:18;15862:81;;15928:4;15920:6;15916:17;15906:27;;15862:81;15990:2;15982:6;15979:14;15959:18;15956:38;15953:84;;16009:18;;:::i;:::-;15953:84;15774:269;15723:320;;;:::o;16049:220::-;16189:34;16185:1;16177:6;16173:14;16166:58;16258:3;16253:2;16245:6;16241:15;16234:28;16049:220;:::o;16275:366::-;16417:3;16438:67;16502:2;16497:3;16438:67;:::i;:::-;16431:74;;16514:93;16603:3;16514:93;:::i;:::-;16632:2;16627:3;16623:12;16616:19;;16275:366;;;:::o;16647:419::-;16813:4;16851:2;16840:9;16836:18;16828:26;;16900:9;16894:4;16890:20;16886:1;16875:9;16871:17;16864:47;16928:131;17054:4;16928:131;:::i;:::-;16920:139;;16647:419;;;:::o;17072:248::-;17212:34;17208:1;17200:6;17196:14;17189:58;17281:31;17276:2;17268:6;17264:15;17257:56;17072:248;:::o;17326:366::-;17468:3;17489:67;17553:2;17548:3;17489:67;:::i;:::-;17482:74;;17565:93;17654:3;17565:93;:::i;:::-;17683:2;17678:3;17674:12;17667:19;;17326:366;;;:::o;17698:419::-;17864:4;17902:2;17891:9;17887:18;17879:26;;17951:9;17945:4;17941:20;17937:1;17926:9;17922:17;17915:47;17979:131;18105:4;17979:131;:::i;:::-;17971:139;;17698:419;;;:::o;18123:232::-;18263:34;18259:1;18251:6;18247:14;18240:58;18332:15;18327:2;18319:6;18315:15;18308:40;18123:232;:::o;18361:366::-;18503:3;18524:67;18588:2;18583:3;18524:67;:::i;:::-;18517:74;;18600:93;18689:3;18600:93;:::i;:::-;18718:2;18713:3;18709:12;18702:19;;18361:366;;;:::o;18733:419::-;18899:4;18937:2;18926:9;18922:18;18914:26;;18986:9;18980:4;18976:20;18972:1;18961:9;18957:17;18950:47;19014:131;19140:4;19014:131;:::i;:::-;19006:139;;18733:419;;;:::o;19158:180::-;19206:77;19203:1;19196:88;19303:4;19300:1;19293:15;19327:4;19324:1;19317:15;19344:410;19384:7;19407:20;19425:1;19407:20;:::i;:::-;19402:25;;19441:20;19459:1;19441:20;:::i;:::-;19436:25;;19496:1;19493;19489:9;19518:30;19536:11;19518:30;:::i;:::-;19507:41;;19697:1;19688:7;19684:15;19681:1;19678:22;19658:1;19651:9;19631:83;19608:139;;19727:18;;:::i;:::-;19608:139;19392:362;19344:410;;;;:::o;19760:180::-;19808:77;19805:1;19798:88;19905:4;19902:1;19895:15;19929:4;19926:1;19919:15;19946:185;19986:1;20003:20;20021:1;20003:20;:::i;:::-;19998:25;;20037:20;20055:1;20037:20;:::i;:::-;20032:25;;20076:1;20066:35;;20081:18;;:::i;:::-;20066:35;20123:1;20120;20116:9;20111:14;;19946:185;;;;:::o;20137:233::-;20176:3;20199:24;20217:5;20199:24;:::i;:::-;20190:33;;20245:66;20238:5;20235:77;20232:103;;20315:18;;:::i;:::-;20232:103;20362:1;20355:5;20351:13;20344:20;;20137:233;;;:::o;20376:230::-;20516:34;20512:1;20504:6;20500:14;20493:58;20585:13;20580:2;20572:6;20568:15;20561:38;20376:230;:::o;20612:366::-;20754:3;20775:67;20839:2;20834:3;20775:67;:::i;:::-;20768:74;;20851:93;20940:3;20851:93;:::i;:::-;20969:2;20964:3;20960:12;20953:19;;20612:366;;;:::o;20984:419::-;21150:4;21188:2;21177:9;21173:18;21165:26;;21237:9;21231:4;21227:20;21223:1;21212:9;21208:17;21201:47;21265:131;21391:4;21265:131;:::i;:::-;21257:139;;20984:419;;;:::o;21409:234::-;21549:34;21545:1;21537:6;21533:14;21526:58;21618:17;21613:2;21605:6;21601:15;21594:42;21409:234;:::o;21649:366::-;21791:3;21812:67;21876:2;21871:3;21812:67;:::i;:::-;21805:74;;21888:93;21977:3;21888:93;:::i;:::-;22006:2;22001:3;21997:12;21990:19;;21649:366;;;:::o;22021:419::-;22187:4;22225:2;22214:9;22210:18;22202:26;;22274:9;22268:4;22264:20;22260:1;22249:9;22245:17;22238:47;22302:131;22428:4;22302:131;:::i;:::-;22294:139;;22021:419;;;:::o;22446:231::-;22586:34;22582:1;22574:6;22570:14;22563:58;22655:14;22650:2;22642:6;22638:15;22631:39;22446:231;:::o;22683:366::-;22825:3;22846:67;22910:2;22905:3;22846:67;:::i;:::-;22839:74;;22922:93;23011:3;22922:93;:::i;:::-;23040:2;23035:3;23031:12;23024:19;;22683:366;;;:::o;23055:419::-;23221:4;23259:2;23248:9;23244:18;23236:26;;23308:9;23302:4;23298:20;23294:1;23283:9;23279:17;23272:47;23336:131;23462:4;23336:131;:::i;:::-;23328:139;;23055:419;;;:::o;23480:180::-;23528:77;23525:1;23518:88;23625:4;23622:1;23615:15;23649:4;23646:1;23639:15;23666:141;23715:4;23738:3;23730:11;;23761:3;23758:1;23751:14;23795:4;23792:1;23782:18;23774:26;;23666:141;;;:::o;23813:93::-;23850:6;23897:2;23892;23885:5;23881:14;23877:23;23867:33;;23813:93;;;:::o;23912:107::-;23956:8;24006:5;24000:4;23996:16;23975:37;;23912:107;;;;:::o;24025:393::-;24094:6;24144:1;24132:10;24128:18;24167:97;24197:66;24186:9;24167:97;:::i;:::-;24285:39;24315:8;24304:9;24285:39;:::i;:::-;24273:51;;24357:4;24353:9;24346:5;24342:21;24333:30;;24406:4;24396:8;24392:19;24385:5;24382:30;24372:40;;24101:317;;24025:393;;;;;:::o;24424:60::-;24452:3;24473:5;24466:12;;24424:60;;;:::o;24490:142::-;24540:9;24573:53;24591:34;24600:24;24618:5;24600:24;:::i;:::-;24591:34;:::i;:::-;24573:53;:::i;:::-;24560:66;;24490:142;;;:::o;24638:75::-;24681:3;24702:5;24695:12;;24638:75;;;:::o;24719:269::-;24829:39;24860:7;24829:39;:::i;:::-;24890:91;24939:41;24963:16;24939:41;:::i;:::-;24931:6;24924:4;24918:11;24890:91;:::i;:::-;24884:4;24877:105;24795:193;24719:269;;;:::o;24994:73::-;25039:3;24994:73;:::o;25073:189::-;25150:32;;:::i;:::-;25191:65;25249:6;25241;25235:4;25191:65;:::i;:::-;25126:136;25073:189;;:::o;25268:186::-;25328:120;25345:3;25338:5;25335:14;25328:120;;;25399:39;25436:1;25429:5;25399:39;:::i;:::-;25372:1;25365:5;25361:13;25352:22;;25328:120;;;25268:186;;:::o;25460:543::-;25561:2;25556:3;25553:11;25550:446;;;25595:38;25627:5;25595:38;:::i;:::-;25679:29;25697:10;25679:29;:::i;:::-;25669:8;25665:44;25862:2;25850:10;25847:18;25844:49;;;25883:8;25868:23;;25844:49;25906:80;25962:22;25980:3;25962:22;:::i;:::-;25952:8;25948:37;25935:11;25906:80;:::i;:::-;25565:431;;25550:446;25460:543;;;:::o;26009:117::-;26063:8;26113:5;26107:4;26103:16;26082:37;;26009:117;;;;:::o;26132:169::-;26176:6;26209:51;26257:1;26253:6;26245:5;26242:1;26238:13;26209:51;:::i;:::-;26205:56;26290:4;26284;26280:15;26270:25;;26183:118;26132:169;;;;:::o;26306:295::-;26382:4;26528:29;26553:3;26547:4;26528:29;:::i;:::-;26520:37;;26590:3;26587:1;26583:11;26577:4;26574:21;26566:29;;26306:295;;;;:::o;26606:1395::-;26723:37;26756:3;26723:37;:::i;:::-;26825:18;26817:6;26814:30;26811:56;;;26847:18;;:::i;:::-;26811:56;26891:38;26923:4;26917:11;26891:38;:::i;:::-;26976:67;27036:6;27028;27022:4;26976:67;:::i;:::-;27070:1;27094:4;27081:17;;27126:2;27118:6;27115:14;27143:1;27138:618;;;;27800:1;27817:6;27814:77;;;27866:9;27861:3;27857:19;27851:26;27842:35;;27814:77;27917:67;27977:6;27970:5;27917:67;:::i;:::-;27911:4;27904:81;27773:222;27108:887;;27138:618;27190:4;27186:9;27178:6;27174:22;27224:37;27256:4;27224:37;:::i;:::-;27283:1;27297:208;27311:7;27308:1;27305:14;27297:208;;;27390:9;27385:3;27381:19;27375:26;27367:6;27360:42;27441:1;27433:6;27429:14;27419:24;;27488:2;27477:9;27473:18;27460:31;;27334:4;27331:1;27327:12;27322:17;;27297:208;;;27533:6;27524:7;27521:19;27518:179;;;27591:9;27586:3;27582:19;27576:26;27634:48;27676:4;27668:6;27664:17;27653:9;27634:48;:::i;:::-;27626:6;27619:64;27541:156;27518:179;27743:1;27739;27731:6;27727:14;27723:22;27717:4;27710:36;27145:611;;;27108:887;;26698:1303;;;26606:1395;;:::o;28007:174::-;28147:26;28143:1;28135:6;28131:14;28124:50;28007:174;:::o;28187:366::-;28329:3;28350:67;28414:2;28409:3;28350:67;:::i;:::-;28343:74;;28426:93;28515:3;28426:93;:::i;:::-;28544:2;28539:3;28535:12;28528:19;;28187:366;;;:::o;28559:419::-;28725:4;28763:2;28752:9;28748:18;28740:26;;28812:9;28806:4;28802:20;28798:1;28787:9;28783:17;28776:47;28840:131;28966:4;28840:131;:::i;:::-;28832:139;;28559:419;;;:::o;28984:228::-;29124:34;29120:1;29112:6;29108:14;29101:58;29193:11;29188:2;29180:6;29176:15;29169:36;28984:228;:::o;29218:366::-;29360:3;29381:67;29445:2;29440:3;29381:67;:::i;:::-;29374:74;;29457:93;29546:3;29457:93;:::i;:::-;29575:2;29570:3;29566:12;29559:19;;29218:366;;;:::o;29590:419::-;29756:4;29794:2;29783:9;29779:18;29771:26;;29843:9;29837:4;29833:20;29829:1;29818:9;29814:17;29807:47;29871:131;29997:4;29871:131;:::i;:::-;29863:139;;29590:419;;;:::o;30015:148::-;30117:11;30154:3;30139:18;;30015:148;;;;:::o;30169:390::-;30275:3;30303:39;30336:5;30303:39;:::i;:::-;30358:89;30440:6;30435:3;30358:89;:::i;:::-;30351:96;;30456:65;30514:6;30509:3;30502:4;30495:5;30491:16;30456:65;:::i;:::-;30546:6;30541:3;30537:16;30530:23;;30279:280;30169:390;;;;:::o;30565:435::-;30745:3;30767:95;30858:3;30849:6;30767:95;:::i;:::-;30760:102;;30879:95;30970:3;30961:6;30879:95;:::i;:::-;30872:102;;30991:3;30984:10;;30565:435;;;;;:::o;31006:151::-;31146:3;31142:1;31134:6;31130:14;31123:27;31006:151;:::o;31163:400::-;31323:3;31344:84;31426:1;31421:3;31344:84;:::i;:::-;31337:91;;31437:93;31526:3;31437:93;:::i;:::-;31555:1;31550:3;31546:11;31539:18;;31163:400;;;:::o;31569:541::-;31802:3;31824:95;31915:3;31906:6;31824:95;:::i;:::-;31817:102;;31936:148;32080:3;31936:148;:::i;:::-;31929:155;;32101:3;32094:10;;31569:541;;;;:::o;32116:224::-;32256:34;32252:1;32244:6;32240:14;32233:58;32325:7;32320:2;32312:6;32308:15;32301:32;32116:224;:::o;32346:366::-;32488:3;32509:67;32573:2;32568:3;32509:67;:::i;:::-;32502:74;;32585:93;32674:3;32585:93;:::i;:::-;32703:2;32698:3;32694:12;32687:19;;32346:366;;;:::o;32718:419::-;32884:4;32922:2;32911:9;32907:18;32899:26;;32971:9;32965:4;32961:20;32957:1;32946:9;32942:17;32935:47;32999:131;33125:4;32999:131;:::i;:::-;32991:139;;32718:419;;;:::o;33143:223::-;33283:34;33279:1;33271:6;33267:14;33260:58;33352:6;33347:2;33339:6;33335:15;33328:31;33143:223;:::o;33372:366::-;33514:3;33535:67;33599:2;33594:3;33535:67;:::i;:::-;33528:74;;33611:93;33700:3;33611:93;:::i;:::-;33729:2;33724:3;33720:12;33713:19;;33372:366;;;:::o;33744:419::-;33910:4;33948:2;33937:9;33933:18;33925:26;;33997:9;33991:4;33987:20;33983:1;33972:9;33968:17;33961:47;34025:131;34151:4;34025:131;:::i;:::-;34017:139;;33744:419;;;:::o;34169:182::-;34309:34;34305:1;34297:6;34293:14;34286:58;34169:182;:::o;34357:366::-;34499:3;34520:67;34584:2;34579:3;34520:67;:::i;:::-;34513:74;;34596:93;34685:3;34596:93;:::i;:::-;34714:2;34709:3;34705:12;34698:19;;34357:366;;;:::o;34729:419::-;34895:4;34933:2;34922:9;34918:18;34910:26;;34982:9;34976:4;34972:20;34968:1;34957:9;34953:17;34946:47;35010:131;35136:4;35010:131;:::i;:::-;35002:139;;34729:419;;;:::o;35154:178::-;35294:30;35290:1;35282:6;35278:14;35271:54;35154:178;:::o;35338:366::-;35480:3;35501:67;35565:2;35560:3;35501:67;:::i;:::-;35494:74;;35577:93;35666:3;35577:93;:::i;:::-;35695:2;35690:3;35686:12;35679:19;;35338:366;;;:::o;35710:419::-;35876:4;35914:2;35903:9;35899:18;35891:26;;35963:9;35957:4;35953:20;35949:1;35938:9;35934:17;35927:47;35991:131;36117:4;35991:131;:::i;:::-;35983:139;;35710:419;;;:::o;36135:175::-;36275:27;36271:1;36263:6;36259:14;36252:51;36135:175;:::o;36316:366::-;36458:3;36479:67;36543:2;36538:3;36479:67;:::i;:::-;36472:74;;36555:93;36644:3;36555:93;:::i;:::-;36673:2;36668:3;36664:12;36657:19;;36316:366;;;:::o;36688:419::-;36854:4;36892:2;36881:9;36877:18;36869:26;;36941:9;36935:4;36931:20;36927:1;36916:9;36912:17;36905:47;36969:131;37095:4;36969:131;:::i;:::-;36961:139;;36688:419;;;:::o;37113:237::-;37253:34;37249:1;37241:6;37237:14;37230:58;37322:20;37317:2;37309:6;37305:15;37298:45;37113:237;:::o;37356:366::-;37498:3;37519:67;37583:2;37578:3;37519:67;:::i;:::-;37512:74;;37595:93;37684:3;37595:93;:::i;:::-;37713:2;37708:3;37704:12;37697:19;;37356:366;;;:::o;37728:419::-;37894:4;37932:2;37921:9;37917:18;37909:26;;37981:9;37975:4;37971:20;37967:1;37956:9;37952:17;37945:47;38009:131;38135:4;38009:131;:::i;:::-;38001:139;;37728:419;;;:::o;38153:173::-;38293:25;38289:1;38281:6;38277:14;38270:49;38153:173;:::o;38332:402::-;38492:3;38513:85;38595:2;38590:3;38513:85;:::i;:::-;38506:92;;38607:93;38696:3;38607:93;:::i;:::-;38725:2;38720:3;38716:12;38709:19;;38332:402;;;:::o;38740:167::-;38880:19;38876:1;38868:6;38864:14;38857:43;38740:167;:::o;38913:402::-;39073:3;39094:85;39176:2;39171:3;39094:85;:::i;:::-;39087:92;;39188:93;39277:3;39188:93;:::i;:::-;39306:2;39301:3;39297:12;39290:19;;38913:402;;;:::o;39321:967::-;39703:3;39725:148;39869:3;39725:148;:::i;:::-;39718:155;;39890:95;39981:3;39972:6;39890:95;:::i;:::-;39883:102;;40002:148;40146:3;40002:148;:::i;:::-;39995:155;;40167:95;40258:3;40249:6;40167:95;:::i;:::-;40160:102;;40279:3;40272:10;;39321:967;;;;;:::o;40294:170::-;40434:22;40430:1;40422:6;40418:14;40411:46;40294:170;:::o;40470:366::-;40612:3;40633:67;40697:2;40692:3;40633:67;:::i;:::-;40626:74;;40709:93;40798:3;40709:93;:::i;:::-;40827:2;40822:3;40818:12;40811:19;;40470:366;;;:::o;40842:419::-;41008:4;41046:2;41035:9;41031:18;41023:26;;41095:9;41089:4;41085:20;41081:1;41070:9;41066:17;41059:47;41123:131;41249:4;41123:131;:::i;:::-;41115:139;;40842:419;;;:::o;41267:166::-;41407:18;41403:1;41395:6;41391:14;41384:42;41267:166;:::o;41439:366::-;41581:3;41602:67;41666:2;41661:3;41602:67;:::i;:::-;41595:74;;41678:93;41767:3;41678:93;:::i;:::-;41796:2;41791:3;41787:12;41780:19;;41439:366;;;:::o;41811:419::-;41977:4;42015:2;42004:9;42000:18;41992:26;;42064:9;42058:4;42054:20;42050:1;42039:9;42035:17;42028:47;42092:131;42218:4;42092:131;:::i;:::-;42084:139;;41811:419;;;:::o;42236:98::-;42287:6;42321:5;42315:12;42305:22;;42236:98;;;:::o;42340:168::-;42423:11;42457:6;42452:3;42445:19;42497:4;42492:3;42488:14;42473:29;;42340:168;;;;:::o;42514:373::-;42600:3;42628:38;42660:5;42628:38;:::i;:::-;42682:70;42745:6;42740:3;42682:70;:::i;:::-;42675:77;;42761:65;42819:6;42814:3;42807:4;42800:5;42796:16;42761:65;:::i;:::-;42851:29;42873:6;42851:29;:::i;:::-;42846:3;42842:39;42835:46;;42604:283;42514:373;;;;:::o;42893:640::-;43088:4;43126:3;43115:9;43111:19;43103:27;;43140:71;43208:1;43197:9;43193:17;43184:6;43140:71;:::i;:::-;43221:72;43289:2;43278:9;43274:18;43265:6;43221:72;:::i;:::-;43303;43371:2;43360:9;43356:18;43347:6;43303:72;:::i;:::-;43422:9;43416:4;43412:20;43407:2;43396:9;43392:18;43385:48;43450:76;43521:4;43512:6;43450:76;:::i;:::-;43442:84;;42893:640;;;;;;;:::o;43539:141::-;43595:5;43626:6;43620:13;43611:22;;43642:32;43668:5;43642:32;:::i;:::-;43539:141;;;;:::o;43686:349::-;43755:6;43804:2;43792:9;43783:7;43779:23;43775:32;43772:119;;;43810:79;;:::i;:::-;43772:119;43930:1;43955:63;44010:7;44001:6;43990:9;43986:22;43955:63;:::i;:::-;43945:73;;43901:127;43686:349;;;;:::o;44041:230::-;44181:34;44177:1;44169:6;44165:14;44158:58;44250:13;44245:2;44237:6;44233:15;44226:38;44041:230;:::o;44277:366::-;44419:3;44440:67;44504:2;44499:3;44440:67;:::i;:::-;44433:74;;44516:93;44605:3;44516:93;:::i;:::-;44634:2;44629:3;44625:12;44618:19;;44277:366;;;:::o;44649:419::-;44815:4;44853:2;44842:9;44838:18;44830:26;;44902:9;44896:4;44892:20;44888:1;44877:9;44873:17;44866:47;44930:131;45056:4;44930:131;:::i;:::-;44922:139;;44649:419;;;:::o;45074:191::-;45114:3;45133:20;45151:1;45133:20;:::i;:::-;45128:25;;45167:20;45185:1;45167:20;:::i;:::-;45162:25;;45210:1;45207;45203:9;45196:16;;45231:3;45228:1;45225:10;45222:36;;;45238:18;;:::i;:::-;45222:36;45074:191;;;;:::o;45271:171::-;45310:3;45333:24;45351:5;45333:24;:::i;:::-;45324:33;;45379:4;45372:5;45369:15;45366:41;;45387:18;;:::i;:::-;45366:41;45434:1;45427:5;45423:13;45416:20;;45271:171;;;:::o;45448:182::-;45588:34;45584:1;45576:6;45572:14;45565:58;45448:182;:::o;45636:366::-;45778:3;45799:67;45863:2;45858:3;45799:67;:::i;:::-;45792:74;;45875:93;45964:3;45875:93;:::i;:::-;45993:2;45988:3;45984:12;45977:19;;45636:366;;;:::o;46008:419::-;46174:4;46212:2;46201:9;46197:18;46189:26;;46261:9;46255:4;46251:20;46247:1;46236:9;46232:17;46225:47;46289:131;46415:4;46289:131;:::i;:::-;46281:139;;46008:419;;;:::o;46433:194::-;46473:4;46493:20;46511:1;46493:20;:::i;:::-;46488:25;;46527:20;46545:1;46527:20;:::i;:::-;46522:25;;46571:1;46568;46564:9;46556:17;;46595:1;46589:4;46586:11;46583:37;;;46600:18;;:::i;:::-;46583:37;46433:194;;;;:::o;46633:180::-;46681:77;46678:1;46671:88;46778:4;46775:1;46768:15;46802:4;46799:1;46792:15;46819:240;46959:34;46955:1;46947:6;46943:14;46936:58;47028:23;47023:2;47015:6;47011:15;47004:48;46819:240;:::o;47065:366::-;47207:3;47228:67;47292:2;47287:3;47228:67;:::i;:::-;47221:74;;47304:93;47393:3;47304:93;:::i;:::-;47422:2;47417:3;47413:12;47406:19;;47065:366;;;:::o;47437:419::-;47603:4;47641:2;47630:9;47626:18;47618:26;;47690:9;47684:4;47680:20;47676:1;47665:9;47661:17;47654:47;47718:131;47844:4;47718:131;:::i;:::-;47710:139;;47437:419;;;:::o

Swarm Source

ipfs://1bb3806df59c28122dd991cbd50218e6a06141a62c7ba6348b4e0ba97fc79418
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.