ETH Price: $3,446.86 (+1.42%)

Token

Clarity (Clarity)
 

Overview

Max Total Supply

986 Clarity

Holders

393

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 Clarity
0xa91332336a3203a03ee73d65f951238ed9348405
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:
Clarity

Compiler Version
v0.8.0+commit.c7dfd78e

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

/**
 *Submitted for verification at Etherscan.io on 2021-10-26
*/

pragma solidity ^0.8.0;

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

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

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

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

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

}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/EnumerableMap.sol




pragma solidity ^0.8.0;

/**
 * @dev Library for managing an enumerable variant of Solidity's
 * https://solidity.readthedocs.io/en/latest/types.html#mapping-types[`mapping`]
 * type.
 *
 * Maps have the following properties:
 *
 * - Entries are added, removed, and checked for existence in constant time
 * (O(1)).
 * - Entries are enumerated in O(n). No guarantees are made on the ordering.
 *
 * ```
 * contract Example {
 *     // Add the library methods
 *     using EnumerableMap for EnumerableMap.UintToAddressMap;
 *
 *     // Declare a set state variable
 *     EnumerableMap.UintToAddressMap private myMap;
 * }
 * ```
 *
 * As of v3.0.0, only maps of type `uint256 -> address` (`UintToAddressMap`) are
 * supported.
 */
library EnumerableMap {
    // To implement this library for multiple types with as little code
    // repetition as possible, we write it in terms of a generic Map type with
    // bytes32 keys and values.
    // The Map implementation uses private functions, and user-facing
    // implementations (such as Uint256ToAddressMap) are just wrappers around
    // the underlying Map.
    // This means that we can only create new EnumerableMaps for types that fit
    // in bytes32.

    struct MapEntry {
        bytes32 _key;
        bytes32 _value;
    }

    struct Map {
        // Storage of map keys and values
        MapEntry[] _entries;

        // Position of the entry defined by a key in the `entries` array, plus 1
        // because index 0 means a key is not in the map.
        mapping (bytes32 => uint256) _indexes;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function _set(Map storage map, bytes32 key, bytes32 value) private returns (bool) {
        // We read and store the key's index to prevent multiple reads from the same storage slot
        uint256 keyIndex = map._indexes[key];

        if (keyIndex == 0) { // Equivalent to !contains(map, key)
            map._entries.push(MapEntry({ _key: key, _value: value }));
            // The entry is stored at length-1, but we add 1 to all indexes
            // and use 0 as a sentinel value
            map._indexes[key] = map._entries.length;
            return true;
        } else {
            map._entries[keyIndex - 1]._value = value;
            return false;
        }
    }

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

        if (keyIndex != 0) { // Equivalent to contains(map, key)
            // To delete a key-value pair from the _entries array in O(1), we swap the entry to delete with the last one
            // in the array, and then remove the last entry (sometimes called as 'swap and pop').
            // This modifies the order of the array, as noted in {at}.

            uint256 toDeleteIndex = keyIndex - 1;
            uint256 lastIndex = map._entries.length - 1;

            // When the entry to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            MapEntry storage lastEntry = map._entries[lastIndex];

            // Move the last entry to the index where the entry to delete is
            map._entries[toDeleteIndex] = lastEntry;
            // Update the index for the moved entry
            map._indexes[lastEntry._key] = toDeleteIndex + 1; // All indexes are 1-based

            // Delete the slot where the moved entry was stored
            map._entries.pop();

            // Delete the index for the deleted slot
            delete map._indexes[key];

            return true;
        } else {
            return false;
        }
    }

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

    /**
     * @dev Returns the number of key-value pairs in the map. O(1).
     */
    function _length(Map storage map) private view returns (uint256) {
        return map._entries.length;
    }

   /**
    * @dev Returns the key-value pair stored at position `index` in the map. O(1).
    *
    * Note that there are no guarantees on the ordering of entries inside the
    * array, and it may change when more entries are added or removed.
    *
    * Requirements:
    *
    * - `index` must be strictly less than {length}.
    */
    function _at(Map storage map, uint256 index) private view returns (bytes32, bytes32) {
        require(map._entries.length > index, "EnumerableMap: index out of bounds");

        MapEntry storage entry = map._entries[index];
        return (entry._key, entry._value);
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     */
    function _tryGet(Map storage map, bytes32 key) private view returns (bool, bytes32) {
        uint256 keyIndex = map._indexes[key];
        if (keyIndex == 0) return (false, 0); // Equivalent to contains(map, key)
        return (true, map._entries[keyIndex - 1]._value); // All indexes are 1-based
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function _get(Map storage map, bytes32 key) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, "EnumerableMap: nonexistent key"); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    /**
     * @dev Same as {_get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {_tryGet}.
     */
    function _get(Map storage map, bytes32 key, string memory errorMessage) private view returns (bytes32) {
        uint256 keyIndex = map._indexes[key];
        require(keyIndex != 0, errorMessage); // Equivalent to contains(map, key)
        return map._entries[keyIndex - 1]._value; // All indexes are 1-based
    }

    // UintToAddressMap

    struct UintToAddressMap {
        Map _inner;
    }

    /**
     * @dev Adds a key-value pair to a map, or updates the value for an existing
     * key. O(1).
     *
     * Returns true if the key was added to the map, that is if it was not
     * already present.
     */
    function set(UintToAddressMap storage map, uint256 key, address value) internal returns (bool) {
        return _set(map._inner, bytes32(key), bytes32(uint256(uint160(value))));
    }

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

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

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

   /**
    * @dev Returns the element 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(UintToAddressMap storage map, uint256 index) internal view returns (uint256, address) {
        (bytes32 key, bytes32 value) = _at(map._inner, index);
        return (uint256(key), address(uint160(uint256(value))));
    }

    /**
     * @dev Tries to returns the value associated with `key`.  O(1).
     * Does not revert if `key` is not in the map.
     *
     * _Available since v3.4._
     */
    function tryGet(UintToAddressMap storage map, uint256 key) internal view returns (bool, address) {
        (bool success, bytes32 value) = _tryGet(map._inner, bytes32(key));
        return (success, address(uint160(uint256(value))));
    }

    /**
     * @dev Returns the value associated with `key`.  O(1).
     *
     * Requirements:
     *
     * - `key` must be in the map.
     */
    function get(UintToAddressMap storage map, uint256 key) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key)))));
    }

    /**
     * @dev Same as {get}, with a custom error message when `key` is not in the map.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryGet}.
     */
    function get(UintToAddressMap storage map, uint256 key, string memory errorMessage) internal view returns (address) {
        return address(uint160(uint256(_get(map._inner, bytes32(key), errorMessage))));
    }
}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/EnumerableSet.sol




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

            // When the value to delete is the last one, the swap operation is unnecessary. However, since this occurs
            // so rarely, we still do the swap anyway to avoid the gas cost of adding an 'if' statement.

            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] = toDeleteIndex + 1; // All indexes are 1-based

            // 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) {
        require(set._values.length > index, "EnumerableSet: index out of bounds");
        return set._values[index];
    }

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

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


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

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/Address.sol




pragma solidity ^0.8.0;

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

        uint256 size;
        // solhint-disable-next-line no-inline-assembly
        assembly { size := extcodesize(account) }
        return size > 0;
    }

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

        // solhint-disable-next-line avoid-low-level-calls, avoid-call-value
        (bool success, ) = recipient.call{ value: amount }("");
        require(success, "Address: unable to send value, recipient may have reverted");
    }

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

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

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.call{ value: value }(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.staticcall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

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

        // solhint-disable-next-line avoid-low-level-calls
        (bool success, bytes memory returndata) = target.delegatecall(data);
        return _verifyCallResult(success, returndata, errorMessage);
    }

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

                // solhint-disable-next-line no-inline-assembly
                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/introspection/ERC165.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: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721.sol


pragma solidity ^0.8.0;


/**
 * @dev Implementation of the {IERC165} interface.
 *
 * Contracts may inherit from this and call {_registerInterface} to declare
 * their support of an interface.
 */
abstract contract ERC165 is IERC165 {
    /**
     * @dev Mapping of interface ids to whether or not it's supported.
     */
    mapping(bytes4 => bool) private _supportedInterfaces;

    constructor () {
        // Derived contracts need only register support for their own interfaces,
        // we register support for ERC165 itself here
        _registerInterface(type(IERC165).interfaceId);
    }

    /**
     * @dev See {IERC165-supportsInterface}.
     *
     * Time complexity O(1), guaranteed to always use less than 30 000 gas.
     */
    function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {
        return _supportedInterfaces[interfaceId];
    }

    /**
     * @dev Registers the contract as an implementer of the interface defined by
     * `interfaceId`. Support of the actual ERC165 interface is automatic and
     * registering its interface id is not required.
     *
     * See {IERC165-supportsInterface}.
     *
     * Requirements:
     *
     * - `interfaceId` cannot be the ERC165 invalid interface (`0xffffffff`).
     */
    function _registerInterface(bytes4 interfaceId) internal virtual {
        require(interfaceId != 0xffffffff, "ERC165: invalid interface id");
        _supportedInterfaces[interfaceId] = true;
    }
}

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721Receiver.sol




pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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


pragma solidity ^0.8.0;

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

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/IERC721Enumerable.sol




pragma solidity ^0.8.0;


/**
 * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension
 * @dev See https://eips.ethereum.org/EIPS/eip-721
 */
interface IERC721Enumerable is IERC721 {

    /**
     * @dev Returns the total amount of tokens stored by the contract.
     */
    function totalSupply() external view returns (uint256);

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

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

// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/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: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/introspection/IERC165.sol



// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/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 GSN 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) {
        this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691
        return msg.data;
    }
}



// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/token/ERC721/ERC721.sol




pragma solidity ^0.8.0;











/**
 * @title ERC721 Non-Fungible Token Standard basic implementation
 * @dev see https://eips.ethereum.org/EIPS/eip-721
 */
contract ERC721 is Context, ERC165, IERC721, IERC721Metadata, IERC721Enumerable {
    using Address for address;
    using EnumerableSet for EnumerableSet.UintSet;
    using EnumerableMap for EnumerableMap.UintToAddressMap;
    using Strings for uint256;
    
    // Mapping from holder address to their (enumerable) set of owned tokens
    mapping (address => EnumerableSet.UintSet) private _holderTokens;

    
    // Enumerable mapping from token ids to their owners
    EnumerableMap.UintToAddressMap private _tokenOwners;

    // 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;

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

    // Optional mapping for token URIs
    mapping (uint256 => string) private _tokenURIs;

    // Base URI
    string private _baseURI;

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

        // register the supported interfaces to conform to ERC721 via ERC165
        _registerInterface(type(IERC721).interfaceId);
        _registerInterface(type(IERC721Metadata).interfaceId);
        _registerInterface(type(IERC721Enumerable).interfaceId);
    }

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

    
 
    
    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        return _tokenOwners.get(tokenId, "ERC721: owner query for nonexistent token");
    }

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

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

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

        string memory _tokenURI = _tokenURIs[tokenId];
        string memory base = baseURI();

        // If there is no base URI, return the token URI.
        if (bytes(base).length == 0) {
            return _tokenURI;
        }
        // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).
        if (bytes(_tokenURI).length > 0) {
            return string(abi.encodePacked(base, _tokenURI));
        }
        // If there is a baseURI but no tokenURI, concatenate the tokenID to the baseURI.
        return string(abi.encodePacked(base, tokenId.toString()));
    }

    /**
    * @dev Returns the base URI set via {_setBaseURI}. This will be
    * automatically added as a prefix in {tokenURI} to each token's URI, or
    * to the token ID if no specific URI is set for that token ID.
    */
    function baseURI() public view virtual returns (string memory) {
        return _baseURI;
    }

    /**
     * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) {
        return _holderTokens[owner].at(index);
    }

    /**
     * @dev See {IERC721Enumerable-totalSupply}.
     */
    function totalSupply() public view virtual override returns (uint256) {
        // _tokenOwners are indexed by tokenIds, so .length() returns the number of tokenIds
        return _tokenOwners.length();
    }

    /**
     * @dev See {IERC721Enumerable-tokenByIndex}.
     */
    function tokenByIndex(uint256 index) public view virtual override returns (uint256) {
        (uint256 tokenId, ) = _tokenOwners.at(index);
        return tokenId;
    }

    /**
     * @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 || ERC721.isApprovedForAll(owner, _msgSender()),
            "ERC721: approve caller is not owner nor approved for all"
        );

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

    /**
     * @dev Safely mints `tokenId` and transfers it to `to`.
     *
     * Requirements:
     d*
     * - `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);

        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);

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

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

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

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

        // Clear metadata (if any)
        if (bytes(_tokenURIs[tokenId]).length != 0) {
            delete _tokenURIs[tokenId];
        }

        _holderTokens[owner].remove(tokenId);

        _tokenOwners.remove(tokenId);

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

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

        _beforeTokenTransfer(from, to, tokenId);

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

        _holderTokens[from].remove(tokenId);
        _holderTokens[to].add(tokenId);

        _tokenOwners.set(tokenId, to);
        emit Transfer(from, to, tokenId);
    }

    /**
     * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.
     *
     * Requirements:
     *
     * - `tokenId` must exist.
     */
    function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {
        require(_exists(tokenId), "ERC721Metadata: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @dev Internal function to set the base URI for all token IDs. It is
     * automatically added as a prefix to the value returned in {tokenURI},
     * or to the token ID if {tokenURI} is empty.
     */
    function _setBaseURI(string memory baseURI_) internal virtual {
        _baseURI = baseURI_;
    }

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

    function _approve(address to, uint256 tokenId) private {
        _tokenApprovals[tokenId] = to;
        emit Approval(ERC721.ownerOf(tokenId), to, tokenId); // internal owner
    }

    /**
     * @dev Hook that is called before any token transfer. This includes minting
     * and burning.
     *
     * Calling conditions:
     *
     * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be
     * transferred to `to`.
     * - When `from` is zero, `tokenId` will be minted for `to`.
     * - When `to` is zero, ``from``'s `tokenId` will be burned.
     * - `from` cannot be the zero address.
     * - `to` cannot be the zero address.
     *
     * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].
     */
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) internal virtual { }
}



// File: http://github.com/OpenZeppelin/openzeppelin-contracts/contracts/access/Ownable.sol




pragma solidity ^0.8.0;

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

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



    /**
     * @dev Initializes the contract setting the deployer as the initial owner.
     */
    constructor () {
        address msgSender = _msgSender();
        _owner = msgSender;
        emit OwnershipTransferred(address(0), msgSender);
    }

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

    /**
     * @dev Throws if called by any account other than the owner.
     */
    modifier onlyOwner() {
        require(owner() == _msgSender(), "Ownable: caller is not the owner");
        _;
    }

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

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

// File: https://github.com/OpenZeppelin/openzeppelin-contracts/contracts/utils/math/SafeMath.sol




pragma solidity ^0.8.0;

// CAUTION
// This version of SafeMath should only be used with Solidity 0.8 or later,
// because it relies on the compiler's built in overflow checks.

/**
 * @dev Wrappers over Solidity's arithmetic operations.
 *
 * NOTE: `SafeMath` is no longer needed starting with Solidity 0.8. The compiler
 * now has built in overflow checking.
 */
library SafeMath {
    /**
     * @dev Returns the addition of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryAdd(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            uint256 c = a + b;
            if (c < a) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the substraction of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function trySub(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b > a) return (false, 0);
            return (true, a - b);
        }
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, with an overflow flag.
     *
     * _Available since v3.4._
     */
    function tryMul(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            // Gas optimization: this is cheaper than requiring 'a' not being zero, but the
            // benefit is lost if 'b' is also tested.
            // See: https://github.com/OpenZeppelin/openzeppelin-contracts/pull/522
            if (a == 0) return (true, 0);
            uint256 c = a * b;
            if (c / a != b) return (false, 0);
            return (true, c);
        }
    }

    /**
     * @dev Returns the division of two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryDiv(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a / b);
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers, with a division by zero flag.
     *
     * _Available since v3.4._
     */
    function tryMod(uint256 a, uint256 b) internal pure returns (bool, uint256) {
        unchecked {
            if (b == 0) return (false, 0);
            return (true, a % b);
        }
    }

    /**
     * @dev Returns the addition of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `+` operator.
     *
     * Requirements:
     *
     * - Addition cannot overflow.
     */
    function add(uint256 a, uint256 b) internal pure returns (uint256) {
        return a + b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting on
     * overflow (when the result is negative).
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b) internal pure returns (uint256) {
        return a - b;
    }

    /**
     * @dev Returns the multiplication of two unsigned integers, reverting on
     * overflow.
     *
     * Counterpart to Solidity's `*` operator.
     *
     * Requirements:
     *
     * - Multiplication cannot overflow.
     */
    function mul(uint256 a, uint256 b) internal pure returns (uint256) {
        return a * b;
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `/` operator.
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b) internal pure returns (uint256) {
        return a / b;
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting when dividing by zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b) internal pure returns (uint256) {
        return a % b;
    }

    /**
     * @dev Returns the subtraction of two unsigned integers, reverting with custom message on
     * overflow (when the result is negative).
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {trySub}.
     *
     * Counterpart to Solidity's `-` operator.
     *
     * Requirements:
     *
     * - Subtraction cannot overflow.
     */
    function sub(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b <= a, errorMessage);
            return a - b;
        }
    }

    /**
     * @dev Returns the integer division of two unsigned integers, reverting with custom message on
     * division by zero. The result is rounded towards zero.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Counterpart to Solidity's `/` operator. Note: this function uses a
     * `revert` opcode (which leaves remaining gas untouched) while Solidity
     * uses an invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function div(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a / b;
        }
    }

    /**
     * @dev Returns the remainder of dividing two unsigned integers. (unsigned integer modulo),
     * reverting with custom message when dividing by zero.
     *
     * CAUTION: This function is deprecated because it requires allocating memory for the error
     * message unnecessarily. For custom revert reasons use {tryMod}.
     *
     * Counterpart to Solidity's `%` operator. This function uses a `revert`
     * opcode (which leaves remaining gas untouched) while Solidity uses an
     * invalid opcode to revert (consuming all remaining gas).
     *
     * Requirements:
     *
     * - The divisor cannot be zero.
     */
    function mod(uint256 a, uint256 b, string memory errorMessage) internal pure returns (uint256) {
        unchecked {
            require(b > 0, errorMessage);
            return a % b;
        }
    }
}


//  ██████ ██       █████  ██████  ██ ████████ ██    ██ 
// ██      ██      ██   ██ ██   ██ ██    ██     ██  ██  
// ██      ██      ███████ ██████  ██    ██      ████   
// ██      ██      ██   ██ ██   ██ ██    ██       ██    
//  ██████ ███████ ██   ██ ██   ██ ██    ██       ██    
//                                                
// by @encapsuled_

pragma solidity ^0.8.0;


// SPDX-License-Identifier: MIT

contract Clarity is ERC721, Ownable {
    using SafeMath for uint256;
    using Strings for uint256;
    uint public constant MAX_TOKENS = 1536;
    uint public constant RESERVED_TOKENS = 1024;
    uint256 public constant TOKEN_PRICE = 100000000000000000; // 0.1 ETH
    uint public constant DEVELOPER_SHARE = 34;
    uint public constant ARTIST_SHARE = 33;
    uint public constant ADVISOR_SHARE = 33;
    uint public constant SHARE_SUM = 100;
    address public developerAddress = 0xf049ED4da9E12c6E2a0928fA6c975eBb60C872F3;
    address public artistAddress = 0xb7275Da969bCa3112D1fDBa03385eD2C02002642;
    address public constant ADVISOR_ADDRESS = 0x0b8F4C4E7626A91460dac057eB43e0de59d5b44F;
    string public script;
    string public scriptType = "p5js";
    bool public saleStarted = false;
    bool public claimStarted = false;
    bool public saleLocked = false;
    bool public claimLocked = false;
    mapping (uint256 => uint256) public creationDates;
    mapping (uint256 => uint256) public poiClaimed;
    address public constant POI_ADDRESS = 0x02560112988e2495261b8ff6f9daD64ee566a324;

    constructor() ERC721("Clarity","Clarity")  {
        setBaseURI("https://api.chromorphs.xyz/clarity/json/");
        uint mintIndex = totalSupply().add(RESERVED_TOKENS);
        _safeMint(developerAddress, mintIndex);
        creationDates[mintIndex] = block.number;
    }
    
    function tokensClaimed() external view returns(uint256[] memory) {
        uint256[] memory ret = new uint256[](MAX_TOKENS);
        for (uint i = 0; i < MAX_TOKENS; i++) {
            ret[i] = poiClaimed[i];
        }
        return ret;
    }
    
    function tokensOfOwner(address _owner) external view returns(uint256[] memory ) {
        uint256 tokenCount = balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }
    
    function tokensOfOwnerPOI(address _owner) public view returns(uint256[] memory ) {
        uint256 tokenCount = IERC721(POI_ADDRESS).balanceOf(_owner);
        if (tokenCount == 0) {
            return new uint256[](0);
        } else {
            uint256[] memory result = new uint256[](tokenCount);
            uint256 index;
            for (index = 0; index < tokenCount; index++) {
                result[index] = IERC721Enumerable(POI_ADDRESS).tokenOfOwnerByIndex(_owner, index);
            }
            return result;
        }
    }
    
    
    function claimMultiple(uint256[] memory tokenIDs) public {
        require(claimStarted, "Claim is not possible now.");
        require(!claimLocked, "Claim is forever locked.");
        require(tokenIDs.length <= 20, "Cannot claim more than 20 at a time");
        require(totalSupply().add(tokenIDs.length) <= MAX_TOKENS, "Exceeds MAX_TOKENS");
        for (uint256 i = 0; i < tokenIDs.length; i++) {
            require(poiClaimed[tokenIDs[i]] == 0, "Already claimed this POI");
            require(IERC721(POI_ADDRESS).ownerOf(tokenIDs[i]) == msg.sender, "Not the owner of this POI");
            _safeMint(msg.sender, tokenIDs[i]);
            poiClaimed[tokenIDs[i]] = 1;
            creationDates[tokenIDs[i]] = block.number;
        }
    }
    
    function mint(uint256 tokensNumber) public payable {
        require(saleStarted, "Sale is not active");
        require(!saleLocked, "Sale is forever locked.");
        require(totalSupply().add(RESERVED_TOKENS) < MAX_TOKENS, "Sale has already ended");
        require(tokensNumber > 0 && tokensNumber <= 3, "Tokens amount must be between 1 and 3");
        require(totalSupply().add(RESERVED_TOKENS).add(tokensNumber) <= MAX_TOKENS, "Exceeds MAX_TOKENS");
        require(msg.value == TOKEN_PRICE.mul(tokensNumber), "Ether value sent is not correct");

        for (uint i = 0; i < tokensNumber; i++) {
            uint mintIndex = totalSupply().add(RESERVED_TOKENS);
            _safeMint(msg.sender, mintIndex);
            creationDates[mintIndex] = block.number;
        }
    }
    
    
    function lockSale() public onlyOwner {
        saleLocked = true;
    }
    
    function lockClaim() public onlyOwner {
        claimLocked = true;
    }
    
    function setScript(string memory _script) public onlyOwner {
        script = _script;
    }
    
    function setScriptType(string memory _scriptType) public onlyOwner {
        script = _scriptType;
    }
    
    function setDeveloperAddress(address _developerAddress) public onlyOwner {
        developerAddress = _developerAddress;
    }
    
    function setArtistAddress(address _artistAddress) public onlyOwner {
        artistAddress = _artistAddress;
    }
    
    function setBaseURI(string memory baseURI) public onlyOwner {
        _setBaseURI(baseURI);
    }
    
    function flipSaleState() public onlyOwner {
        saleStarted = !saleStarted;
    }
    
    function flipClaimState() public onlyOwner {
        claimStarted = !claimStarted;
    }
    
    function tokenHash(uint256 tokenId) public view returns(bytes32){
        require(_exists(tokenId), "DOES NOT EXIST");
        return bytes32(keccak256(abi.encodePacked(address(this), creationDates[tokenId], tokenId)));
    }
    
    function withdraw() public payable onlyOwner {
        uint256 balance = address(this).balance;
        uint toDeveloper = balance.mul(DEVELOPER_SHARE).div(SHARE_SUM);
        uint toArtist = balance.mul(ARTIST_SHARE).div(SHARE_SUM);
        uint toAdvisor = balance.mul(ADVISOR_SHARE).div(SHARE_SUM);
        payable(developerAddress).transfer(toDeveloper);
        payable(artistAddress).transfer(toArtist);
        payable(ADVISOR_ADDRESS).transfer(toAdvisor);
        assert(address(this).balance == 0);
    }
    
    function withdrawFailsafe() public payable onlyOwner {
        uint256 balance = address(this).balance;
        payable(msg.sender).transfer(balance);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"previousOwner","type":"address"},{"indexed":true,"internalType":"address","name":"newOwner","type":"address"}],"name":"OwnershipTransferred","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ADVISOR_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ADVISOR_SHARE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"ARTIST_SHARE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEVELOPER_SHARE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MAX_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"POI_ADDRESS","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"RESERVED_TOKENS","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"SHARE_SUM","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"TOKEN_PRICE","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"artistAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"claimLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIDs","type":"uint256[]"}],"name":"claimMultiple","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"claimStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"creationDates","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"developerAddress","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"flipClaimState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"flipSaleState","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"lockClaim","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"lockSale","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokensNumber","type":"uint256"}],"name":"mint","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"owner","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"poiClaimed","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"renounceOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"saleLocked","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"saleStarted","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"script","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"scriptType","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_artistAddress","type":"address"}],"name":"setArtistAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"baseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_developerAddress","type":"address"}],"name":"setDeveloperAddress","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_script","type":"string"}],"name":"setScript","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"_scriptType","type":"string"}],"name":"setScriptType","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":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenHash","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"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":"tokensClaimed","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"}],"name":"tokensOfOwnerPOI","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"newOwner","type":"address"}],"name":"transferOwnership","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[],"name":"withdrawFailsafe","outputs":[],"stateMutability":"payable","type":"function"}]

608060405273f049ed4da9e12c6e2a0928fa6c975ebb60c872f3600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555073b7275da969bca3112d1fdba03385ed2c02002642600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055506040518060400160405280600481526020017f70356a7300000000000000000000000000000000000000000000000000000000815250600e9080519060200190620000fb92919062000cf8565b506000600f60006101000a81548160ff0219169083151502179055506000600f60016101000a81548160ff0219169083151502179055506000600f60026101000a81548160ff0219169083151502179055506000600f60036101000a81548160ff0219169083151502179055503480156200017557600080fd5b506040518060400160405280600781526020017f436c6172697479000000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f436c617269747900000000000000000000000000000000000000000000000000815250620002137f01ffc9a7000000000000000000000000000000000000000000000000000000006200043760201b60201c565b81600690805190602001906200022b92919062000cf8565b5080600790805190602001906200024492919062000cf8565b50620002767f80ac58cd000000000000000000000000000000000000000000000000000000006200043760201b60201c565b620002a77f5b5e139f000000000000000000000000000000000000000000000000000000006200043760201b60201c565b620002d87f780e9d63000000000000000000000000000000000000000000000000000000006200043760201b60201c565b50506000620002ec6200050f60201b60201c565b905080600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff1602179055508073ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a350620003b560405180606001604052806028815260200162006ffe602891396200051760201b60201c565b6000620003e2610400620003ce620005ba60201b60201c565b620005d860201b620031481790919060201c565b905062000418600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1682620005f060201b60201c565b43601060008381526020019081526020016000208190555050620012e0565b63ffffffff60e01b817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161415620004a3576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200049a9062001034565b60405180910390fd5b6001600080837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060006101000a81548160ff02191690831515021790555050565b600033905090565b620005276200050f60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff166200054d6200061660201b60201c565b73ffffffffffffffffffffffffffffffffffffffff1614620005a6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016200059d906200109a565b60405180910390fd5b620005b7816200064060201b60201c565b50565b6000620005d360026200065c60201b6200315e1760201c565b905090565b60008183620005e89190620010e9565b905092915050565b620006128282604051806020016040528060008152506200067960201b60201c565b5050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b80600990805190602001906200065892919062000cf8565b5050565b60006200067282600001620006e760201b60201c565b9050919050565b6200068b8383620006f860201b60201c565b620006a06000848484620008aa60201b60201c565b620006e2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620006d99062001012565b60405180910390fd5b505050565b600081600001805490509050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156200076b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007629062001078565b60405180910390fd5b6200077c8162000a6460201b60201c565b15620007bf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620007b69062001056565b60405180910390fd5b620007d36000838362000a8860201b60201c565b6200082b81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002062000a8d60201b620031731790919060201c565b50620008498183600262000aaf60201b6200318d179092919060201c565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6000620008d88473ffffffffffffffffffffffffffffffffffffffff1662000aec60201b620031c21760201c565b1562000a57578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026200090a6200050f60201b60201c565b8786866040518563ffffffff1660e01b81526004016200092e949392919062000fbe565b602060405180830381600087803b1580156200094957600080fd5b505af19250505080156200097d57506040513d601f19601f820116820180604052508101906200097a919062000dbf565b60015b62000a06573d8060008114620009b0576040519150601f19603f3d011682016040523d82523d6000602084013e620009b5565b606091505b50600081511415620009fe576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401620009f59062001012565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505062000a5c565b600190505b949350505050565b600062000a8182600262000aff60201b620031d51790919060201c565b9050919050565b505050565b600062000aa7836000018360001b62000b2160201b60201c565b905092915050565b600062000ae3846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b62000b9b60201b60201c565b90509392505050565b600080823b905060008111915050919050565b600062000b19836000018360001b62000cb260201b60201c565b905092915050565b600062000b35838362000cd560201b60201c565b62000b9057826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000b95565b600090505b92915050565b600080846001016000858152602001908152602001600020549050600081141562000c445784600001604051806040016040528086815260200185815250908060018154018082558091505060019003906000526020600020906002020160009091909190915060008201518160000155602082015181600101555050846000018054905085600101600086815260200190815260200160002081905550600191505062000cab565b828560000160018362000c58919062001146565b8154811062000c90577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b600080836001016000848152602001908152602001600020541415905092915050565b82805462000d069062001221565b90600052602060002090601f01602090048101928262000d2a576000855562000d76565b82601f1062000d4557805160ff191683800117855562000d76565b8280016001018555821562000d76579182015b8281111562000d7557825182559160200191906001019062000d58565b5b50905062000d85919062000d89565b5090565b5b8082111562000da457600081600090555060010162000d8a565b5090565b60008151905062000db981620012c6565b92915050565b60006020828403121562000dd257600080fd5b600062000de28482850162000da8565b91505092915050565b62000df68162001181565b82525050565b600062000e0982620010bc565b62000e158185620010c7565b935062000e27818560208601620011eb565b62000e3281620012b5565b840191505092915050565b600062000e4c603283620010d8565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b600062000eb4601c83620010d8565b91507f4552433136353a20696e76616c696420696e74657266616365206964000000006000830152602082019050919050565b600062000ef6601c83620010d8565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b600062000f38602083620010d8565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b600062000f7a602083620010d8565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b62000fb881620011e1565b82525050565b600060808201905062000fd5600083018762000deb565b62000fe4602083018662000deb565b62000ff3604083018562000fad565b818103606083015262001007818462000dfc565b905095945050505050565b600060208201905081810360008301526200102d8162000e3d565b9050919050565b600060208201905081810360008301526200104f8162000ea5565b9050919050565b60006020820190508181036000830152620010718162000ee7565b9050919050565b60006020820190508181036000830152620010938162000f29565b9050919050565b60006020820190508181036000830152620010b58162000f6b565b9050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b6000620010f682620011e1565b91506200110383620011e1565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156200113b576200113a62001257565b5b828201905092915050565b60006200115382620011e1565b91506200116083620011e1565b92508282101562001176576200117562001257565b5b828203905092915050565b60006200118e82620011c1565b9050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b60005b838110156200120b578082015181840152602081019050620011ee565b838111156200121b576000848401525b50505050565b600060028204905060018216806200123a57607f821691505b6020821081141562001251576200125062001286565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b6000601f19601f8301169050919050565b620012d18162001195565b8114620012dd57600080fd5b50565b615d0e80620012f06000396000f3fe60806040526004361061036b5760003560e01c8063771658ba116101c6578063c623c543116100f7578063dcc345f211610095578063ebe9eb9f1161006f578063ebe9eb9f14610c4b578063f069062a14610c76578063f2fde38b14610ca1578063f47c84c514610cca5761036b565b8063dcc345f214610bba578063e406a6b914610be3578063e985e9c514610c0e5761036b565b8063caccd7f7116100d1578063caccd7f714610b0e578063d2d8cb6714610b39578063d423d60814610b64578063d7eb3f3a14610b8f5761036b565b8063c623c54314610a69578063c87b56dd14610a94578063c8a0122614610ad15761036b565b8063a0712d6811610164578063a38643971161013e578063a3864397146109ad578063b44df72d146109ea578063b88d4fde14610a15578063c1664b1314610a3e5761036b565b8063a0712d681461093f578063a22cb4651461095b578063a22e4faa146109845761036b565b80638da5cb5b116101a05780638da5cb5b146108955780639051cce9146108c057806394bc2ae7146108e957806395d89b41146109145761036b565b8063771658ba146107f257806378a4ab851461082f5780638462151c146108585761036b565b80633ccfd60b116102a05780636352211e1161023e5780636c0360eb116102185780636c0360eb1461075c5780636d60e6c11461078757806370a082311461079e578063715018a6146107db5761036b565b80636352211e146106dd57806368fc68c71461071a57806369d8a608146107455761036b565b806355f804b31161027a57806355f804b3146106335780635c474f9e1461065c5780635d69dbdd1461068757806362aee544146106b25761036b565b80633ccfd60b146105c357806342842e0e146105cd5780634f6ccce7146105f65761036b565b8063171ce0941161030d5780632ec7c11e116102e75780632ec7c11e146105285780632f745c591461056557806334918dfd146105a25780633af03e8a146105b95761036b565b8063171ce094146104ab57806318160ddd146104d457806323b872dd146104ff5761036b565b8063081812fc11610349578063081812fc146103ef578063095ea7b31461042c578063120bcac91461045557806312822a75146104805761036b565b806301ffc9a71461037057806306fdde03146103ad57806307c60dac146103d8575b600080fd5b34801561037c57600080fd5b506103976004803603810190610392919061467a565b610cf5565b6040516103a4919061537e565b60405180910390f35b3480156103b957600080fd5b506103c2610d5c565b6040516103cf91906153b4565b60405180910390f35b3480156103e457600080fd5b506103ed610dee565b005b3480156103fb57600080fd5b506104166004803603810190610411919061470d565b610e87565b60405161042391906152cc565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e91906145fd565b610f0c565b005b34801561046157600080fd5b5061046a611024565b60405161047791906152cc565b60405180910390f35b34801561048c57600080fd5b5061049561103c565b6040516104a2919061537e565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd91906146cc565b61104f565b005b3480156104e057600080fd5b506104e96110e5565b6040516104f69190615776565b60405180910390f35b34801561050b57600080fd5b50610526600480360381019061052191906144f7565b6110f6565b005b34801561053457600080fd5b5061054f600480360381019061054a9190614469565b611156565b60405161055c919061535c565b60405180910390f35b34801561057157600080fd5b5061058c600480360381019061058791906145fd565b6113fb565b6040516105999190615776565b60405180910390f35b3480156105ae57600080fd5b506105b7611456565b005b6105c16114fe565b005b6105cb6115c9565b005b3480156105d957600080fd5b506105f460048036038101906105ef91906144f7565b611835565b005b34801561060257600080fd5b5061061d6004803603810190610618919061470d565b611855565b60405161062a9190615776565b60405180910390f35b34801561063f57600080fd5b5061065a600480360381019061065591906146cc565b611878565b005b34801561066857600080fd5b50610671611900565b60405161067e919061537e565b60405180910390f35b34801561069357600080fd5b5061069c611913565b6040516106a991906153b4565b60405180910390f35b3480156106be57600080fd5b506106c76119a1565b6040516106d49190615776565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff919061470d565b6119a6565b60405161071191906152cc565b60405180910390f35b34801561072657600080fd5b5061072f6119dd565b60405161073c9190615776565b60405180910390f35b34801561075157600080fd5b5061075a6119e3565b005b34801561076857600080fd5b50610771611a7c565b60405161077e91906153b4565b60405180910390f35b34801561079357600080fd5b5061079c611b0e565b005b3480156107aa57600080fd5b506107c560048036038101906107c09190614469565b611bb6565b6040516107d29190615776565b60405180910390f35b3480156107e757600080fd5b506107f0611c75565b005b3480156107fe57600080fd5b506108196004803603810190610814919061470d565b611db2565b6040516108269190615776565b60405180910390f35b34801561083b57600080fd5b50610856600480360381019061085191906146cc565b611dca565b005b34801561086457600080fd5b5061087f600480360381019061087a9190614469565b611e60565b60405161088c919061535c565b60405180910390f35b3480156108a157600080fd5b506108aa611fdc565b6040516108b791906152cc565b60405180910390f35b3480156108cc57600080fd5b506108e760048036038101906108e29190614639565b612006565b005b3480156108f557600080fd5b506108fe612447565b60405161090b9190615776565b60405180910390f35b34801561092057600080fd5b5061092961244c565b60405161093691906153b4565b60405180910390f35b6109596004803603810190610954919061470d565b6124de565b005b34801561096757600080fd5b50610982600480360381019061097d91906145c1565b61275f565b005b34801561099057600080fd5b506109ab60048036038101906109a69190614469565b6128e0565b005b3480156109b957600080fd5b506109d460048036038101906109cf919061470d565b6129a0565b6040516109e19190615399565b60405180910390f35b3480156109f657600080fd5b506109ff612a2f565b604051610a0c919061535c565b60405180910390f35b348015610a2157600080fd5b50610a3c6004803603810190610a379190614546565b612b27565b005b348015610a4a57600080fd5b50610a53612b89565b604051610a60919061537e565b60405180910390f35b348015610a7557600080fd5b50610a7e612b9c565b604051610a8b9190615776565b60405180910390f35b348015610aa057600080fd5b50610abb6004803603810190610ab6919061470d565b612ba1565b604051610ac891906153b4565b60405180910390f35b348015610add57600080fd5b50610af86004803603810190610af3919061470d565b612d14565b604051610b059190615776565b60405180910390f35b348015610b1a57600080fd5b50610b23612d2c565b604051610b3091906152cc565b60405180910390f35b348015610b4557600080fd5b50610b4e612d52565b604051610b5b9190615776565b60405180910390f35b348015610b7057600080fd5b50610b79612d5e565b604051610b86919061537e565b60405180910390f35b348015610b9b57600080fd5b50610ba4612d71565b604051610bb191906152cc565b60405180910390f35b348015610bc657600080fd5b50610be16004803603810190610bdc9190614469565b612d97565b005b348015610bef57600080fd5b50610bf8612e57565b604051610c059190615776565b60405180910390f35b348015610c1a57600080fd5b50610c356004803603810190610c3091906144bb565b612e5c565b604051610c42919061537e565b60405180910390f35b348015610c5757600080fd5b50610c60612ef0565b604051610c6d91906153b4565b60405180910390f35b348015610c8257600080fd5b50610c8b612f7e565b604051610c9891906152cc565b60405180910390f35b348015610cad57600080fd5b50610cc86004803603810190610cc39190614469565b612f96565b005b348015610cd657600080fd5b50610cdf613142565b604051610cec9190615776565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054610d6b90615a9f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9790615a9f565b8015610de45780601f10610db957610100808354040283529160200191610de4565b820191906000526020600020905b815481529060010190602001808311610dc757829003601f168201915b5050505050905090565b610df66131ef565b73ffffffffffffffffffffffffffffffffffffffff16610e14611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614610e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e61906155d6565b60405180910390fd5b6001600f60026101000a81548160ff021916908315150217905550565b6000610e92826131f7565b610ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec8906155b6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f17826119a6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f90615656565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fa76131ef565b73ffffffffffffffffffffffffffffffffffffffff161480610fd65750610fd581610fd06131ef565b612e5c565b5b611015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100c90615516565b60405180910390fd5b61101f8383613214565b505050565b7302560112988e2495261b8ff6f9dad64ee566a32481565b600f60029054906101000a900460ff1681565b6110576131ef565b73ffffffffffffffffffffffffffffffffffffffff16611075611fdc565b73ffffffffffffffffffffffffffffffffffffffff16146110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c2906155d6565b60405180910390fd5b80600d90805190602001906110e19291906141cd565b5050565b60006110f1600261315e565b905090565b6111076111016131ef565b826132cd565b611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d90615696565b60405180910390fd5b6111518383836133ab565b505050565b606060007302560112988e2495261b8ff6f9dad64ee566a32473ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016111a791906152cc565b60206040518083038186803b1580156111bf57600080fd5b505afa1580156111d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f79190614736565b9050600081141561127a57600067ffffffffffffffff811115611243577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156112715781602001602082028036833780820191505090505b509150506113f6565b60008167ffffffffffffffff8111156112bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156112ea5781602001602082028036833780820191505090505b50905060005b828110156113ef577302560112988e2495261b8ff6f9dad64ee566a32473ffffffffffffffffffffffffffffffffffffffff16632f745c5986836040518363ffffffff1660e01b8152600401611347929190615333565b60206040518083038186803b15801561135f57600080fd5b505afa158015611373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113979190614736565b8282815181106113d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806113e790615ad1565b9150506112f0565b8193505050505b919050565b600061144e82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206135c290919063ffffffff16565b905092915050565b61145e6131ef565b73ffffffffffffffffffffffffffffffffffffffff1661147c611fdc565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c9906155d6565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b6115066131ef565b73ffffffffffffffffffffffffffffffffffffffff16611524611fdc565b73ffffffffffffffffffffffffffffffffffffffff161461157a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611571906155d6565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156115c5573d6000803e3d6000fd5b5050565b6115d16131ef565b73ffffffffffffffffffffffffffffffffffffffff166115ef611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614611645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163c906155d6565b60405180910390fd5b6000479050600061167360646116656022856135dc90919063ffffffff16565b6135f290919063ffffffff16565b9050600061169e60646116906021866135dc90919063ffffffff16565b6135f290919063ffffffff16565b905060006116c960646116bb6021876135dc90919063ffffffff16565b6135f290919063ffffffff16565b9050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611733573d6000803e3d6000fd5b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561179c573d6000803e3d6000fd5b50730b8f4c4e7626a91460dac057eb43e0de59d5b44f73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117f7573d6000803e3d6000fd5b506000471461182f577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b50505050565b61185083838360405180602001604052806000815250612b27565b505050565b60008061186c83600261360890919063ffffffff16565b50905080915050919050565b6118806131ef565b73ffffffffffffffffffffffffffffffffffffffff1661189e611fdc565b73ffffffffffffffffffffffffffffffffffffffff16146118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb906155d6565b60405180910390fd5b6118fd81613634565b50565b600f60009054906101000a900460ff1681565b600e805461192090615a9f565b80601f016020809104026020016040519081016040528092919081815260200182805461194c90615a9f565b80156119995780601f1061196e57610100808354040283529160200191611999565b820191906000526020600020905b81548152906001019060200180831161197c57829003601f168201915b505050505081565b602181565b60006119d682604051806060016040528060298152602001615cb060299139600261364e9092919063ffffffff16565b9050919050565b61040081565b6119eb6131ef565b73ffffffffffffffffffffffffffffffffffffffff16611a09611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614611a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a56906155d6565b60405180910390fd5b6001600f60036101000a81548160ff021916908315150217905550565b606060098054611a8b90615a9f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab790615a9f565b8015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b5050505050905090565b611b166131ef565b73ffffffffffffffffffffffffffffffffffffffff16611b34611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614611b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b81906155d6565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1e90615536565b60405180910390fd5b611c6e600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061366d565b9050919050565b611c7d6131ef565b73ffffffffffffffffffffffffffffffffffffffff16611c9b611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614611cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce8906155d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60116020528060005260406000206000915090505481565b611dd26131ef565b73ffffffffffffffffffffffffffffffffffffffff16611df0611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614611e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3d906155d6565b60405180910390fd5b80600d9080519060200190611e5c9291906141cd565b5050565b60606000611e6d83611bb6565b90506000811415611ef057600067ffffffffffffffff811115611eb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611ee75781602001602082028036833780820191505090505b50915050611fd7565b60008167ffffffffffffffff811115611f32577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611f605781602001602082028036833780820191505090505b50905060005b82811015611fd057611f7885826113fb565b828281518110611fb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611fc890615ad1565b915050611f66565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f60019054906101000a900460ff16612055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204c90615556565b60405180910390fd5b600f60039054906101000a900460ff16156120a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209c90615756565b60405180910390fd5b6014815111156120ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e1906156f6565b60405180910390fd5b61060061210882516120fa6110e5565b61314890919063ffffffff16565b1115612149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214090615736565b60405180910390fd5b60005b815181101561244357600060116000848481518110612194577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002054146121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e2906154f6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167302560112988e2495261b8ff6f9dad64ee566a32473ffffffffffffffffffffffffffffffffffffffff16636352211e84848151811061226b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b815260040161228f9190615776565b60206040518083038186803b1580156122a757600080fd5b505afa1580156122bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122df9190614492565b73ffffffffffffffffffffffffffffffffffffffff1614612335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232c906156b6565b60405180910390fd5b61237f33838381518110612372577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151613682565b6001601160008484815181106123be577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001908152602001600020819055504360106000848481518110612416577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002081905550808061243b90615ad1565b91505061214c565b5050565b606481565b60606007805461245b90615a9f565b80601f016020809104026020016040519081016040528092919081815260200182805461248790615a9f565b80156124d45780601f106124a9576101008083540402835291602001916124d4565b820191906000526020600020905b8154815290600101906020018083116124b757829003601f168201915b5050505050905090565b600f60009054906101000a900460ff1661252d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252490615496565b60405180910390fd5b600f60029054906101000a900460ff161561257d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612574906155f6565b60405180910390fd5b61060061259c61040061258e6110e5565b61314890919063ffffffff16565b106125dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d390615676565b60405180910390fd5b6000811180156125ed575060038111155b61262c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612623906156d6565b60405180910390fd5b61060061265d8261264f6104006126416110e5565b61314890919063ffffffff16565b61314890919063ffffffff16565b111561269e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269590615736565b60405180910390fd5b6126b98167016345785d8a00006135dc90919063ffffffff16565b34146126fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f1906154b6565b60405180910390fd5b60005b8181101561275b5760006127236104006127156110e5565b61314890919063ffffffff16565b905061272f3382613682565b43601060008381526020019081526020016000208190555050808061275390615ad1565b9150506126fd565b5050565b6127676131ef565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127cc90615476565b60405180910390fd5b80600560006127e26131ef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661288f6131ef565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128d4919061537e565b60405180910390a35050565b6128e86131ef565b73ffffffffffffffffffffffffffffffffffffffff16612906611fdc565b73ffffffffffffffffffffffffffffffffffffffff161461295c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612953906155d6565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006129ab826131f7565b6129ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e190615716565b60405180910390fd5b30601060008481526020019081526020016000205483604051602001612a129392919061526b565b604051602081830303815290604052805190602001209050919050565b6060600061060067ffffffffffffffff811115612a75577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612aa35781602001602082028036833780820191505090505b50905060005b610600811015612b1f576011600082815260200190815260200160002054828281518110612b00577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080612b1790615ad1565b915050612aa9565b508091505090565b612b38612b326131ef565b836132cd565b612b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6e90615696565b60405180910390fd5b612b83848484846136a0565b50505050565b600f60019054906101000a900460ff1681565b602281565b6060612bac826131f7565b612beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be290615636565b60405180910390fd5b6000600860008481526020019081526020016000208054612c0b90615a9f565b80601f0160208091040260200160405190810160405280929190818152602001828054612c3790615a9f565b8015612c845780601f10612c5957610100808354040283529160200191612c84565b820191906000526020600020905b815481529060010190602001808311612c6757829003601f168201915b505050505090506000612c95611a7c565b9050600081511415612cab578192505050612d0f565b600082511115612ce0578082604051602001612cc89291906152a8565b60405160208183030381529060405292505050612d0f565b80612cea856136fc565b604051602001612cfb9291906152a8565b604051602081830303815290604052925050505b919050565b60106020528060005260406000206000915090505481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b67016345785d8a000081565b600f60039054906101000a900460ff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612d9f6131ef565b73ffffffffffffffffffffffffffffffffffffffff16612dbd611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a906155d6565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b602181565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d8054612efd90615a9f565b80601f0160208091040260200160405190810160405280929190818152602001828054612f2990615a9f565b8015612f765780601f10612f4b57610100808354040283529160200191612f76565b820191906000526020600020905b815481529060010190602001808311612f5957829003601f168201915b505050505081565b730b8f4c4e7626a91460dac057eb43e0de59d5b44f81565b612f9e6131ef565b73ffffffffffffffffffffffffffffffffffffffff16612fbc611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614613012576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613009906155d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307990615416565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61060081565b6000818361315691906158ca565b905092915050565b600061316c826000016138a9565b9050919050565b6000613185836000018360001b6138ba565b905092915050565b60006131b9846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61392a565b90509392505050565b600080823b905060008111915050919050565b60006131e7836000018360001b613a3c565b905092915050565b600033905090565b600061320d8260026131d590919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16613287836119a6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006132d8826131f7565b613317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330e906154d6565b60405180910390fd5b6000613322836119a6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061339157508373ffffffffffffffffffffffffffffffffffffffff1661337984610e87565b73ffffffffffffffffffffffffffffffffffffffff16145b806133a257506133a18185612e5c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166133cb826119a6565b73ffffffffffffffffffffffffffffffffffffffff1614613421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341890615616565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348890615456565b60405180910390fd5b61349c838383613a5f565b6134a7600082613214565b6134f881600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613a6490919063ffffffff16565b5061354a81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061317390919063ffffffff16565b506135618183600261318d9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006135d18360000183613a7e565b60001c905092915050565b600081836135ea9190615951565b905092915050565b600081836136009190615920565b905092915050565b60008060008061361b8660000186613b18565b915091508160001c8160001c9350935050509250929050565b806009908051906020019061364a9291906141cd565b5050565b6000613661846000018460001b84613bc8565b60001c90509392505050565b600061367b82600001613c8f565b9050919050565b61369c828260405180602001604052806000815250613ca0565b5050565b6136ab8484846133ab565b6136b784848484613cfb565b6136f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ed906153f6565b60405180910390fd5b50505050565b60606000821415613744576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506138a4565b600082905060005b6000821461377657808061375f90615ad1565b915050600a8261376f9190615920565b915061374c565b60008167ffffffffffffffff8111156137b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156137ea5781602001600182028036833780820191505090505b5090505b6000851461389d5760018261380391906159ab565b9150600a856138129190615b48565b603061381e91906158ca565b60f81b81838151811061385a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138969190615920565b94506137ee565b8093505050505b919050565b600081600001805490509050919050565b60006138c68383613e92565b61391f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613924565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156139d157846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613a35565b82856000016001836139e391906159ab565b81548110613a1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b6000613a76836000018360001b613eb5565b905092915050565b600081836000018054905011613ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac0906153d6565b60405180910390fd5b826000018281548110613b05577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008082846000018054905011613b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5b90615576565b60405180910390fd5b6000846000018481548110613ba2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390613c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c2191906153b4565b60405180910390fd5b5084600001600182613c3c91906159ab565b81548110613c73577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b613caa838361403f565b613cb76000848484613cfb565b613cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ced906153f6565b60405180910390fd5b505050565b6000613d1c8473ffffffffffffffffffffffffffffffffffffffff166131c2565b15613e85578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d456131ef565b8786866040518563ffffffff1660e01b8152600401613d6794939291906152e7565b602060405180830381600087803b158015613d8157600080fd5b505af1925050508015613db257506040513d601f19601f82011682018060405250810190613daf91906146a3565b60015b613e35573d8060008114613de2576040519150601f19603f3d011682016040523d82523d6000602084013e613de7565b606091505b50600081511415613e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e24906153f6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613e8a565b600190505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114614033576000600182613ee791906159ab565b9050600060018660000180549050613eff91906159ab565b90506000866000018281548110613f3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613f89577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600183613fa491906158ca565b8760010160008381526020019081526020016000208190555086600001805480613ff7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050614039565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156140af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140a690615596565b60405180910390fd5b6140b8816131f7565b156140f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140ef90615436565b60405180910390fd5b61410460008383613a5f565b61415581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061317390919063ffffffff16565b5061416c8183600261318d9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546141d990615a9f565b90600052602060002090601f0160209004810192826141fb5760008555614242565b82601f1061421457805160ff1916838001178555614242565b82800160010185558215614242579182015b82811115614241578251825591602001919060010190614226565b5b50905061424f9190614253565b5090565b5b8082111561426c576000816000905550600101614254565b5090565b600061428361427e846157c2565b615791565b905080838252602082019050828560208602820111156142a257600080fd5b60005b858110156142d257816142b8888261443f565b8452602084019350602083019250506001810190506142a5565b5050509392505050565b60006142ef6142ea846157ee565b615791565b90508281526020810184848401111561430757600080fd5b614312848285615a5d565b509392505050565b600061432d6143288461581e565b615791565b90508281526020810184848401111561434557600080fd5b614350848285615a5d565b509392505050565b60008135905061436781615c53565b92915050565b60008151905061437c81615c53565b92915050565b600082601f83011261439357600080fd5b81356143a3848260208601614270565b91505092915050565b6000813590506143bb81615c6a565b92915050565b6000813590506143d081615c81565b92915050565b6000815190506143e581615c81565b92915050565b600082601f8301126143fc57600080fd5b813561440c8482602086016142dc565b91505092915050565b600082601f83011261442657600080fd5b813561443684826020860161431a565b91505092915050565b60008135905061444e81615c98565b92915050565b60008151905061446381615c98565b92915050565b60006020828403121561447b57600080fd5b600061448984828501614358565b91505092915050565b6000602082840312156144a457600080fd5b60006144b28482850161436d565b91505092915050565b600080604083850312156144ce57600080fd5b60006144dc85828601614358565b92505060206144ed85828601614358565b9150509250929050565b60008060006060848603121561450c57600080fd5b600061451a86828701614358565b935050602061452b86828701614358565b925050604061453c8682870161443f565b9150509250925092565b6000806000806080858703121561455c57600080fd5b600061456a87828801614358565b945050602061457b87828801614358565b935050604061458c8782880161443f565b925050606085013567ffffffffffffffff8111156145a957600080fd5b6145b5878288016143eb565b91505092959194509250565b600080604083850312156145d457600080fd5b60006145e285828601614358565b92505060206145f3858286016143ac565b9150509250929050565b6000806040838503121561461057600080fd5b600061461e85828601614358565b925050602061462f8582860161443f565b9150509250929050565b60006020828403121561464b57600080fd5b600082013567ffffffffffffffff81111561466557600080fd5b61467184828501614382565b91505092915050565b60006020828403121561468c57600080fd5b600061469a848285016143c1565b91505092915050565b6000602082840312156146b557600080fd5b60006146c3848285016143d6565b91505092915050565b6000602082840312156146de57600080fd5b600082013567ffffffffffffffff8111156146f857600080fd5b61470484828501614415565b91505092915050565b60006020828403121561471f57600080fd5b600061472d8482850161443f565b91505092915050565b60006020828403121561474857600080fd5b600061475684828501614454565b91505092915050565b600061476b8383615236565b60208301905092915050565b614780816159df565b82525050565b614797614792826159df565b615b1a565b82525050565b60006147a88261585e565b6147b2818561588c565b93506147bd8361584e565b8060005b838110156147ee5781516147d5888261475f565b97506147e08361587f565b9250506001810190506147c1565b5085935050505092915050565b614804816159f1565b82525050565b614813816159fd565b82525050565b600061482482615869565b61482e818561589d565b935061483e818560208601615a6c565b61484781615c35565b840191505092915050565b600061485d82615874565b61486781856158ae565b9350614877818560208601615a6c565b61488081615c35565b840191505092915050565b600061489682615874565b6148a081856158bf565b93506148b0818560208601615a6c565b80840191505092915050565b60006148c96022836158ae565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061492f6032836158ae565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006149956026836158ae565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149fb601c836158ae565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614a3b6024836158ae565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614aa16019836158ae565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614ae16012836158ae565b91507f53616c65206973206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b6000614b21601f836158ae565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614b61602c836158ae565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614bc76018836158ae565b91507f416c726561647920636c61696d6564207468697320504f4900000000000000006000830152602082019050919050565b6000614c076038836158ae565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614c6d602a836158ae565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614cd3601a836158ae565b91507f436c61696d206973206e6f7420706f737369626c65206e6f772e0000000000006000830152602082019050919050565b6000614d136022836158ae565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d796020836158ae565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614db9602c836158ae565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614e1f6020836158ae565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614e5f6017836158ae565b91507f53616c6520697320666f7265766572206c6f636b65642e0000000000000000006000830152602082019050919050565b6000614e9f6029836158ae565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f05602f836158ae565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614f6b6021836158ae565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614fd16016836158ae565b91507f53616c652068617320616c726561647920656e646564000000000000000000006000830152602082019050919050565b60006150116031836158ae565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006150776019836158ae565b91507f4e6f7420746865206f776e6572206f66207468697320504f49000000000000006000830152602082019050919050565b60006150b76025836158ae565b91507f546f6b656e7320616d6f756e74206d757374206265206265747765656e20312060008301527f616e6420330000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061511d6023836158ae565b91507f43616e6e6f7420636c61696d206d6f7265207468616e2032302061742061207460008301527f696d6500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615183600e836158ae565b91507f444f4553204e4f542045584953540000000000000000000000000000000000006000830152602082019050919050565b60006151c36012836158ae565b91507f45786365656473204d41585f544f4b454e5300000000000000000000000000006000830152602082019050919050565b60006152036018836158ae565b91507f436c61696d20697320666f7265766572206c6f636b65642e00000000000000006000830152602082019050919050565b61523f81615a53565b82525050565b61524e81615a53565b82525050565b61526561526082615a53565b615b3e565b82525050565b60006152778286614786565b6014820191506152878285615254565b6020820191506152978284615254565b602082019150819050949350505050565b60006152b4828561488b565b91506152c0828461488b565b91508190509392505050565b60006020820190506152e16000830184614777565b92915050565b60006080820190506152fc6000830187614777565b6153096020830186614777565b6153166040830185615245565b81810360608301526153288184614819565b905095945050505050565b60006040820190506153486000830185614777565b6153556020830184615245565b9392505050565b60006020820190508181036000830152615376818461479d565b905092915050565b600060208201905061539360008301846147fb565b92915050565b60006020820190506153ae600083018461480a565b92915050565b600060208201905081810360008301526153ce8184614852565b905092915050565b600060208201905081810360008301526153ef816148bc565b9050919050565b6000602082019050818103600083015261540f81614922565b9050919050565b6000602082019050818103600083015261542f81614988565b9050919050565b6000602082019050818103600083015261544f816149ee565b9050919050565b6000602082019050818103600083015261546f81614a2e565b9050919050565b6000602082019050818103600083015261548f81614a94565b9050919050565b600060208201905081810360008301526154af81614ad4565b9050919050565b600060208201905081810360008301526154cf81614b14565b9050919050565b600060208201905081810360008301526154ef81614b54565b9050919050565b6000602082019050818103600083015261550f81614bba565b9050919050565b6000602082019050818103600083015261552f81614bfa565b9050919050565b6000602082019050818103600083015261554f81614c60565b9050919050565b6000602082019050818103600083015261556f81614cc6565b9050919050565b6000602082019050818103600083015261558f81614d06565b9050919050565b600060208201905081810360008301526155af81614d6c565b9050919050565b600060208201905081810360008301526155cf81614dac565b9050919050565b600060208201905081810360008301526155ef81614e12565b9050919050565b6000602082019050818103600083015261560f81614e52565b9050919050565b6000602082019050818103600083015261562f81614e92565b9050919050565b6000602082019050818103600083015261564f81614ef8565b9050919050565b6000602082019050818103600083015261566f81614f5e565b9050919050565b6000602082019050818103600083015261568f81614fc4565b9050919050565b600060208201905081810360008301526156af81615004565b9050919050565b600060208201905081810360008301526156cf8161506a565b9050919050565b600060208201905081810360008301526156ef816150aa565b9050919050565b6000602082019050818103600083015261570f81615110565b9050919050565b6000602082019050818103600083015261572f81615176565b9050919050565b6000602082019050818103600083015261574f816151b6565b9050919050565b6000602082019050818103600083015261576f816151f6565b9050919050565b600060208201905061578b6000830184615245565b92915050565b6000604051905081810181811067ffffffffffffffff821117156157b8576157b7615c06565b5b8060405250919050565b600067ffffffffffffffff8211156157dd576157dc615c06565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561580957615808615c06565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561583957615838615c06565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006158d582615a53565b91506158e083615a53565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561591557615914615b79565b5b828201905092915050565b600061592b82615a53565b915061593683615a53565b92508261594657615945615ba8565b5b828204905092915050565b600061595c82615a53565b915061596783615a53565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156159a05761599f615b79565b5b828202905092915050565b60006159b682615a53565b91506159c183615a53565b9250828210156159d4576159d3615b79565b5b828203905092915050565b60006159ea82615a33565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615a8a578082015181840152602081019050615a6f565b83811115615a99576000848401525b50505050565b60006002820490506001821680615ab757607f821691505b60208210811415615acb57615aca615bd7565b5b50919050565b6000615adc82615a53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615b0f57615b0e615b79565b5b600182019050919050565b6000615b2582615b2c565b9050919050565b6000615b3782615c46565b9050919050565b6000819050919050565b6000615b5382615a53565b9150615b5e83615a53565b925082615b6e57615b6d615ba8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b615c5c816159df565b8114615c6757600080fd5b50565b615c73816159f1565b8114615c7e57600080fd5b50565b615c8a81615a07565b8114615c9557600080fd5b50565b615ca181615a53565b8114615cac57600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122016ac1623007402362632b3cf3aba78ed7057282d473e7f3174e2f36666c3d43c64736f6c6343000800003368747470733a2f2f6170692e6368726f6d6f727068732e78797a2f636c61726974792f6a736f6e2f

Deployed Bytecode

0x60806040526004361061036b5760003560e01c8063771658ba116101c6578063c623c543116100f7578063dcc345f211610095578063ebe9eb9f1161006f578063ebe9eb9f14610c4b578063f069062a14610c76578063f2fde38b14610ca1578063f47c84c514610cca5761036b565b8063dcc345f214610bba578063e406a6b914610be3578063e985e9c514610c0e5761036b565b8063caccd7f7116100d1578063caccd7f714610b0e578063d2d8cb6714610b39578063d423d60814610b64578063d7eb3f3a14610b8f5761036b565b8063c623c54314610a69578063c87b56dd14610a94578063c8a0122614610ad15761036b565b8063a0712d6811610164578063a38643971161013e578063a3864397146109ad578063b44df72d146109ea578063b88d4fde14610a15578063c1664b1314610a3e5761036b565b8063a0712d681461093f578063a22cb4651461095b578063a22e4faa146109845761036b565b80638da5cb5b116101a05780638da5cb5b146108955780639051cce9146108c057806394bc2ae7146108e957806395d89b41146109145761036b565b8063771658ba146107f257806378a4ab851461082f5780638462151c146108585761036b565b80633ccfd60b116102a05780636352211e1161023e5780636c0360eb116102185780636c0360eb1461075c5780636d60e6c11461078757806370a082311461079e578063715018a6146107db5761036b565b80636352211e146106dd57806368fc68c71461071a57806369d8a608146107455761036b565b806355f804b31161027a57806355f804b3146106335780635c474f9e1461065c5780635d69dbdd1461068757806362aee544146106b25761036b565b80633ccfd60b146105c357806342842e0e146105cd5780634f6ccce7146105f65761036b565b8063171ce0941161030d5780632ec7c11e116102e75780632ec7c11e146105285780632f745c591461056557806334918dfd146105a25780633af03e8a146105b95761036b565b8063171ce094146104ab57806318160ddd146104d457806323b872dd146104ff5761036b565b8063081812fc11610349578063081812fc146103ef578063095ea7b31461042c578063120bcac91461045557806312822a75146104805761036b565b806301ffc9a71461037057806306fdde03146103ad57806307c60dac146103d8575b600080fd5b34801561037c57600080fd5b506103976004803603810190610392919061467a565b610cf5565b6040516103a4919061537e565b60405180910390f35b3480156103b957600080fd5b506103c2610d5c565b6040516103cf91906153b4565b60405180910390f35b3480156103e457600080fd5b506103ed610dee565b005b3480156103fb57600080fd5b506104166004803603810190610411919061470d565b610e87565b60405161042391906152cc565b60405180910390f35b34801561043857600080fd5b50610453600480360381019061044e91906145fd565b610f0c565b005b34801561046157600080fd5b5061046a611024565b60405161047791906152cc565b60405180910390f35b34801561048c57600080fd5b5061049561103c565b6040516104a2919061537e565b60405180910390f35b3480156104b757600080fd5b506104d260048036038101906104cd91906146cc565b61104f565b005b3480156104e057600080fd5b506104e96110e5565b6040516104f69190615776565b60405180910390f35b34801561050b57600080fd5b50610526600480360381019061052191906144f7565b6110f6565b005b34801561053457600080fd5b5061054f600480360381019061054a9190614469565b611156565b60405161055c919061535c565b60405180910390f35b34801561057157600080fd5b5061058c600480360381019061058791906145fd565b6113fb565b6040516105999190615776565b60405180910390f35b3480156105ae57600080fd5b506105b7611456565b005b6105c16114fe565b005b6105cb6115c9565b005b3480156105d957600080fd5b506105f460048036038101906105ef91906144f7565b611835565b005b34801561060257600080fd5b5061061d6004803603810190610618919061470d565b611855565b60405161062a9190615776565b60405180910390f35b34801561063f57600080fd5b5061065a600480360381019061065591906146cc565b611878565b005b34801561066857600080fd5b50610671611900565b60405161067e919061537e565b60405180910390f35b34801561069357600080fd5b5061069c611913565b6040516106a991906153b4565b60405180910390f35b3480156106be57600080fd5b506106c76119a1565b6040516106d49190615776565b60405180910390f35b3480156106e957600080fd5b5061070460048036038101906106ff919061470d565b6119a6565b60405161071191906152cc565b60405180910390f35b34801561072657600080fd5b5061072f6119dd565b60405161073c9190615776565b60405180910390f35b34801561075157600080fd5b5061075a6119e3565b005b34801561076857600080fd5b50610771611a7c565b60405161077e91906153b4565b60405180910390f35b34801561079357600080fd5b5061079c611b0e565b005b3480156107aa57600080fd5b506107c560048036038101906107c09190614469565b611bb6565b6040516107d29190615776565b60405180910390f35b3480156107e757600080fd5b506107f0611c75565b005b3480156107fe57600080fd5b506108196004803603810190610814919061470d565b611db2565b6040516108269190615776565b60405180910390f35b34801561083b57600080fd5b50610856600480360381019061085191906146cc565b611dca565b005b34801561086457600080fd5b5061087f600480360381019061087a9190614469565b611e60565b60405161088c919061535c565b60405180910390f35b3480156108a157600080fd5b506108aa611fdc565b6040516108b791906152cc565b60405180910390f35b3480156108cc57600080fd5b506108e760048036038101906108e29190614639565b612006565b005b3480156108f557600080fd5b506108fe612447565b60405161090b9190615776565b60405180910390f35b34801561092057600080fd5b5061092961244c565b60405161093691906153b4565b60405180910390f35b6109596004803603810190610954919061470d565b6124de565b005b34801561096757600080fd5b50610982600480360381019061097d91906145c1565b61275f565b005b34801561099057600080fd5b506109ab60048036038101906109a69190614469565b6128e0565b005b3480156109b957600080fd5b506109d460048036038101906109cf919061470d565b6129a0565b6040516109e19190615399565b60405180910390f35b3480156109f657600080fd5b506109ff612a2f565b604051610a0c919061535c565b60405180910390f35b348015610a2157600080fd5b50610a3c6004803603810190610a379190614546565b612b27565b005b348015610a4a57600080fd5b50610a53612b89565b604051610a60919061537e565b60405180910390f35b348015610a7557600080fd5b50610a7e612b9c565b604051610a8b9190615776565b60405180910390f35b348015610aa057600080fd5b50610abb6004803603810190610ab6919061470d565b612ba1565b604051610ac891906153b4565b60405180910390f35b348015610add57600080fd5b50610af86004803603810190610af3919061470d565b612d14565b604051610b059190615776565b60405180910390f35b348015610b1a57600080fd5b50610b23612d2c565b604051610b3091906152cc565b60405180910390f35b348015610b4557600080fd5b50610b4e612d52565b604051610b5b9190615776565b60405180910390f35b348015610b7057600080fd5b50610b79612d5e565b604051610b86919061537e565b60405180910390f35b348015610b9b57600080fd5b50610ba4612d71565b604051610bb191906152cc565b60405180910390f35b348015610bc657600080fd5b50610be16004803603810190610bdc9190614469565b612d97565b005b348015610bef57600080fd5b50610bf8612e57565b604051610c059190615776565b60405180910390f35b348015610c1a57600080fd5b50610c356004803603810190610c3091906144bb565b612e5c565b604051610c42919061537e565b60405180910390f35b348015610c5757600080fd5b50610c60612ef0565b604051610c6d91906153b4565b60405180910390f35b348015610c8257600080fd5b50610c8b612f7e565b604051610c9891906152cc565b60405180910390f35b348015610cad57600080fd5b50610cc86004803603810190610cc39190614469565b612f96565b005b348015610cd657600080fd5b50610cdf613142565b604051610cec9190615776565b60405180910390f35b6000806000837bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19167bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916815260200190815260200160002060009054906101000a900460ff169050919050565b606060068054610d6b90615a9f565b80601f0160208091040260200160405190810160405280929190818152602001828054610d9790615a9f565b8015610de45780601f10610db957610100808354040283529160200191610de4565b820191906000526020600020905b815481529060010190602001808311610dc757829003601f168201915b5050505050905090565b610df66131ef565b73ffffffffffffffffffffffffffffffffffffffff16610e14611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614610e6a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e61906155d6565b60405180910390fd5b6001600f60026101000a81548160ff021916908315150217905550565b6000610e92826131f7565b610ed1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ec8906155b6565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610f17826119a6565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610f88576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f7f90615656565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610fa76131ef565b73ffffffffffffffffffffffffffffffffffffffff161480610fd65750610fd581610fd06131ef565b612e5c565b5b611015576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161100c90615516565b60405180910390fd5b61101f8383613214565b505050565b7302560112988e2495261b8ff6f9dad64ee566a32481565b600f60029054906101000a900460ff1681565b6110576131ef565b73ffffffffffffffffffffffffffffffffffffffff16611075611fdc565b73ffffffffffffffffffffffffffffffffffffffff16146110cb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110c2906155d6565b60405180910390fd5b80600d90805190602001906110e19291906141cd565b5050565b60006110f1600261315e565b905090565b6111076111016131ef565b826132cd565b611146576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161113d90615696565b60405180910390fd5b6111518383836133ab565b505050565b606060007302560112988e2495261b8ff6f9dad64ee566a32473ffffffffffffffffffffffffffffffffffffffff166370a08231846040518263ffffffff1660e01b81526004016111a791906152cc565b60206040518083038186803b1580156111bf57600080fd5b505afa1580156111d3573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906111f79190614736565b9050600081141561127a57600067ffffffffffffffff811115611243577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156112715781602001602082028036833780820191505090505b509150506113f6565b60008167ffffffffffffffff8111156112bc577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280602002602001820160405280156112ea5781602001602082028036833780820191505090505b50905060005b828110156113ef577302560112988e2495261b8ff6f9dad64ee566a32473ffffffffffffffffffffffffffffffffffffffff16632f745c5986836040518363ffffffff1660e01b8152600401611347929190615333565b60206040518083038186803b15801561135f57600080fd5b505afa158015611373573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906113979190614736565b8282815181106113d0577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101818152505080806113e790615ad1565b9150506112f0565b8193505050505b919050565b600061144e82600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206135c290919063ffffffff16565b905092915050565b61145e6131ef565b73ffffffffffffffffffffffffffffffffffffffff1661147c611fdc565b73ffffffffffffffffffffffffffffffffffffffff16146114d2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016114c9906155d6565b60405180910390fd5b600f60009054906101000a900460ff1615600f60006101000a81548160ff021916908315150217905550565b6115066131ef565b73ffffffffffffffffffffffffffffffffffffffff16611524611fdc565b73ffffffffffffffffffffffffffffffffffffffff161461157a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611571906155d6565b60405180910390fd5b60004790503373ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156115c5573d6000803e3d6000fd5b5050565b6115d16131ef565b73ffffffffffffffffffffffffffffffffffffffff166115ef611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614611645576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161163c906155d6565b60405180910390fd5b6000479050600061167360646116656022856135dc90919063ffffffff16565b6135f290919063ffffffff16565b9050600061169e60646116906021866135dc90919063ffffffff16565b6135f290919063ffffffff16565b905060006116c960646116bb6021876135dc90919063ffffffff16565b6135f290919063ffffffff16565b9050600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc849081150290604051600060405180830381858888f19350505050158015611733573d6000803e3d6000fd5b50600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff166108fc839081150290604051600060405180830381858888f1935050505015801561179c573d6000803e3d6000fd5b50730b8f4c4e7626a91460dac057eb43e0de59d5b44f73ffffffffffffffffffffffffffffffffffffffff166108fc829081150290604051600060405180830381858888f193505050501580156117f7573d6000803e3d6000fd5b506000471461182f577f4e487b7100000000000000000000000000000000000000000000000000000000600052600160045260246000fd5b50505050565b61185083838360405180602001604052806000815250612b27565b505050565b60008061186c83600261360890919063ffffffff16565b50905080915050919050565b6118806131ef565b73ffffffffffffffffffffffffffffffffffffffff1661189e611fdc565b73ffffffffffffffffffffffffffffffffffffffff16146118f4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016118eb906155d6565b60405180910390fd5b6118fd81613634565b50565b600f60009054906101000a900460ff1681565b600e805461192090615a9f565b80601f016020809104026020016040519081016040528092919081815260200182805461194c90615a9f565b80156119995780601f1061196e57610100808354040283529160200191611999565b820191906000526020600020905b81548152906001019060200180831161197c57829003601f168201915b505050505081565b602181565b60006119d682604051806060016040528060298152602001615cb060299139600261364e9092919063ffffffff16565b9050919050565b61040081565b6119eb6131ef565b73ffffffffffffffffffffffffffffffffffffffff16611a09611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614611a5f576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a56906155d6565b60405180910390fd5b6001600f60036101000a81548160ff021916908315150217905550565b606060098054611a8b90615a9f565b80601f0160208091040260200160405190810160405280929190818152602001828054611ab790615a9f565b8015611b045780601f10611ad957610100808354040283529160200191611b04565b820191906000526020600020905b815481529060010190602001808311611ae757829003601f168201915b5050505050905090565b611b166131ef565b73ffffffffffffffffffffffffffffffffffffffff16611b34611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614611b8a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611b81906155d6565b60405180910390fd5b600f60019054906101000a900460ff1615600f60016101000a81548160ff021916908315150217905550565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611c27576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1e90615536565b60405180910390fd5b611c6e600160008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061366d565b9050919050565b611c7d6131ef565b73ffffffffffffffffffffffffffffffffffffffff16611c9b611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614611cf1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ce8906155d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a36000600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550565b60116020528060005260406000206000915090505481565b611dd26131ef565b73ffffffffffffffffffffffffffffffffffffffff16611df0611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614611e46576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e3d906155d6565b60405180910390fd5b80600d9080519060200190611e5c9291906141cd565b5050565b60606000611e6d83611bb6565b90506000811415611ef057600067ffffffffffffffff811115611eb9577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611ee75781602001602082028036833780820191505090505b50915050611fd7565b60008167ffffffffffffffff811115611f32577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015611f605781602001602082028036833780820191505090505b50905060005b82811015611fd057611f7885826113fb565b828281518110611fb1577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080611fc890615ad1565b915050611f66565b8193505050505b919050565b6000600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff16905090565b600f60019054906101000a900460ff16612055576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161204c90615556565b60405180910390fd5b600f60039054906101000a900460ff16156120a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209c90615756565b60405180910390fd5b6014815111156120ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016120e1906156f6565b60405180910390fd5b61060061210882516120fa6110e5565b61314890919063ffffffff16565b1115612149576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161214090615736565b60405180910390fd5b60005b815181101561244357600060116000848481518110612194577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002054146121eb576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016121e2906154f6565b60405180910390fd5b3373ffffffffffffffffffffffffffffffffffffffff167302560112988e2495261b8ff6f9dad64ee566a32473ffffffffffffffffffffffffffffffffffffffff16636352211e84848151811061226b577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101516040518263ffffffff1660e01b815260040161228f9190615776565b60206040518083038186803b1580156122a757600080fd5b505afa1580156122bb573d6000803e3d6000fd5b505050506040513d601f19601f820116820180604052508101906122df9190614492565b73ffffffffffffffffffffffffffffffffffffffff1614612335576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161232c906156b6565b60405180910390fd5b61237f33838381518110612372577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151613682565b6001601160008484815181106123be577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101518152602001908152602001600020819055504360106000848481518110612416577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010151815260200190815260200160002081905550808061243b90615ad1565b91505061214c565b5050565b606481565b60606007805461245b90615a9f565b80601f016020809104026020016040519081016040528092919081815260200182805461248790615a9f565b80156124d45780601f106124a9576101008083540402835291602001916124d4565b820191906000526020600020905b8154815290600101906020018083116124b757829003601f168201915b5050505050905090565b600f60009054906101000a900460ff1661252d576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161252490615496565b60405180910390fd5b600f60029054906101000a900460ff161561257d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612574906155f6565b60405180910390fd5b61060061259c61040061258e6110e5565b61314890919063ffffffff16565b106125dc576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125d390615676565b60405180910390fd5b6000811180156125ed575060038111155b61262c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612623906156d6565b60405180910390fd5b61060061265d8261264f6104006126416110e5565b61314890919063ffffffff16565b61314890919063ffffffff16565b111561269e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161269590615736565b60405180910390fd5b6126b98167016345785d8a00006135dc90919063ffffffff16565b34146126fa576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016126f1906154b6565b60405180910390fd5b60005b8181101561275b5760006127236104006127156110e5565b61314890919063ffffffff16565b905061272f3382613682565b43601060008381526020019081526020016000208190555050808061275390615ad1565b9150506126fd565b5050565b6127676131ef565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156127d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016127cc90615476565b60405180910390fd5b80600560006127e26131ef565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff1661288f6131ef565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516128d4919061537e565b60405180910390a35050565b6128e86131ef565b73ffffffffffffffffffffffffffffffffffffffff16612906611fdc565b73ffffffffffffffffffffffffffffffffffffffff161461295c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612953906155d6565b60405180910390fd5b80600c60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b60006129ab826131f7565b6129ea576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129e190615716565b60405180910390fd5b30601060008481526020019081526020016000205483604051602001612a129392919061526b565b604051602081830303815290604052805190602001209050919050565b6060600061060067ffffffffffffffff811115612a75577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015612aa35781602001602082028036833780820191505090505b50905060005b610600811015612b1f576011600082815260200190815260200160002054828281518110612b00577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080612b1790615ad1565b915050612aa9565b508091505090565b612b38612b326131ef565b836132cd565b612b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b6e90615696565b60405180910390fd5b612b83848484846136a0565b50505050565b600f60019054906101000a900460ff1681565b602281565b6060612bac826131f7565b612beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612be290615636565b60405180910390fd5b6000600860008481526020019081526020016000208054612c0b90615a9f565b80601f0160208091040260200160405190810160405280929190818152602001828054612c3790615a9f565b8015612c845780601f10612c5957610100808354040283529160200191612c84565b820191906000526020600020905b815481529060010190602001808311612c6757829003601f168201915b505050505090506000612c95611a7c565b9050600081511415612cab578192505050612d0f565b600082511115612ce0578082604051602001612cc89291906152a8565b60405160208183030381529060405292505050612d0f565b80612cea856136fc565b604051602001612cfb9291906152a8565b604051602081830303815290604052925050505b919050565b60106020528060005260406000206000915090505481565b600b60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b67016345785d8a000081565b600f60039054906101000a900460ff1681565b600c60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1681565b612d9f6131ef565b73ffffffffffffffffffffffffffffffffffffffff16612dbd611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614612e13576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e0a906155d6565b60405180910390fd5b80600b60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b602181565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600d8054612efd90615a9f565b80601f0160208091040260200160405190810160405280929190818152602001828054612f2990615a9f565b8015612f765780601f10612f4b57610100808354040283529160200191612f76565b820191906000526020600020905b815481529060010190602001808311612f5957829003601f168201915b505050505081565b730b8f4c4e7626a91460dac057eb43e0de59d5b44f81565b612f9e6131ef565b73ffffffffffffffffffffffffffffffffffffffff16612fbc611fdc565b73ffffffffffffffffffffffffffffffffffffffff1614613012576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613009906155d6565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415613082576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161307990615416565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16600a60009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a380600a60006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff16021790555050565b61060081565b6000818361315691906158ca565b905092915050565b600061316c826000016138a9565b9050919050565b6000613185836000018360001b6138ba565b905092915050565b60006131b9846000018460001b8473ffffffffffffffffffffffffffffffffffffffff1660001b61392a565b90509392505050565b600080823b905060008111915050919050565b60006131e7836000018360001b613a3c565b905092915050565b600033905090565b600061320d8260026131d590919063ffffffff16565b9050919050565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16613287836119a6565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b60006132d8826131f7565b613317576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161330e906154d6565b60405180910390fd5b6000613322836119a6565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061339157508373ffffffffffffffffffffffffffffffffffffffff1661337984610e87565b73ffffffffffffffffffffffffffffffffffffffff16145b806133a257506133a18185612e5c565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff166133cb826119a6565b73ffffffffffffffffffffffffffffffffffffffff1614613421576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161341890615616565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415613491576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161348890615456565b60405180910390fd5b61349c838383613a5f565b6134a7600082613214565b6134f881600160008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020613a6490919063ffffffff16565b5061354a81600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061317390919063ffffffff16565b506135618183600261318d9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b60006135d18360000183613a7e565b60001c905092915050565b600081836135ea9190615951565b905092915050565b600081836136009190615920565b905092915050565b60008060008061361b8660000186613b18565b915091508160001c8160001c9350935050509250929050565b806009908051906020019061364a9291906141cd565b5050565b6000613661846000018460001b84613bc8565b60001c90509392505050565b600061367b82600001613c8f565b9050919050565b61369c828260405180602001604052806000815250613ca0565b5050565b6136ab8484846133ab565b6136b784848484613cfb565b6136f6576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016136ed906153f6565b60405180910390fd5b50505050565b60606000821415613744576040518060400160405280600181526020017f300000000000000000000000000000000000000000000000000000000000000081525090506138a4565b600082905060005b6000821461377657808061375f90615ad1565b915050600a8261376f9190615920565b915061374c565b60008167ffffffffffffffff8111156137b8577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156137ea5781602001600182028036833780820191505090505b5090505b6000851461389d5760018261380391906159ab565b9150600a856138129190615b48565b603061381e91906158ca565b60f81b81838151811061385a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856138969190615920565b94506137ee565b8093505050505b919050565b600081600001805490509050919050565b60006138c68383613e92565b61391f578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050613924565b600090505b92915050565b60008084600101600085815260200190815260200160002054905060008114156139d157846000016040518060400160405280868152602001858152509080600181540180825580915050600190039060005260206000209060020201600090919091909150600082015181600001556020820151816001015550508460000180549050856001016000868152602001908152602001600020819055506001915050613a35565b82856000016001836139e391906159ab565b81548110613a1a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002090600202016001018190555060009150505b9392505050565b600080836001016000848152602001908152602001600020541415905092915050565b505050565b6000613a76836000018360001b613eb5565b905092915050565b600081836000018054905011613ac9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ac0906153d6565b60405180910390fd5b826000018281548110613b05577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905092915050565b60008082846000018054905011613b64576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613b5b90615576565b60405180910390fd5b6000846000018481548110613ba2577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b906000526020600020906002020190508060000154816001015492509250509250929050565b60008084600101600085815260200190815260200160002054905060008114158390613c2a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613c2191906153b4565b60405180910390fd5b5084600001600182613c3c91906159ab565b81548110613c73577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000209060020201600101549150509392505050565b600081600001805490509050919050565b613caa838361403f565b613cb76000848484613cfb565b613cf6576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613ced906153f6565b60405180910390fd5b505050565b6000613d1c8473ffffffffffffffffffffffffffffffffffffffff166131c2565b15613e85578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02613d456131ef565b8786866040518563ffffffff1660e01b8152600401613d6794939291906152e7565b602060405180830381600087803b158015613d8157600080fd5b505af1925050508015613db257506040513d601f19601f82011682018060405250810190613daf91906146a3565b60015b613e35573d8060008114613de2576040519150601f19603f3d011682016040523d82523d6000602084013e613de7565b606091505b50600081511415613e2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401613e24906153f6565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050613e8a565b600190505b949350505050565b600080836001016000848152602001908152602001600020541415905092915050565b60008083600101600084815260200190815260200160002054905060008114614033576000600182613ee791906159ab565b9050600060018660000180549050613eff91906159ab565b90506000866000018281548110613f3f577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080876000018481548110613f89577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200181905550600183613fa491906158ca565b8760010160008381526020019081526020016000208190555086600001805480613ff7577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b60019003818190600052602060002001600090559055866001016000878152602001908152602001600020600090556001945050505050614039565b60009150505b92915050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156140af576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140a690615596565b60405180910390fd5b6140b8816131f7565b156140f8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016140ef90615436565b60405180910390fd5b61410460008383613a5f565b61415581600160008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002061317390919063ffffffff16565b5061416c8183600261318d9092919063ffffffff16565b50808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b8280546141d990615a9f565b90600052602060002090601f0160209004810192826141fb5760008555614242565b82601f1061421457805160ff1916838001178555614242565b82800160010185558215614242579182015b82811115614241578251825591602001919060010190614226565b5b50905061424f9190614253565b5090565b5b8082111561426c576000816000905550600101614254565b5090565b600061428361427e846157c2565b615791565b905080838252602082019050828560208602820111156142a257600080fd5b60005b858110156142d257816142b8888261443f565b8452602084019350602083019250506001810190506142a5565b5050509392505050565b60006142ef6142ea846157ee565b615791565b90508281526020810184848401111561430757600080fd5b614312848285615a5d565b509392505050565b600061432d6143288461581e565b615791565b90508281526020810184848401111561434557600080fd5b614350848285615a5d565b509392505050565b60008135905061436781615c53565b92915050565b60008151905061437c81615c53565b92915050565b600082601f83011261439357600080fd5b81356143a3848260208601614270565b91505092915050565b6000813590506143bb81615c6a565b92915050565b6000813590506143d081615c81565b92915050565b6000815190506143e581615c81565b92915050565b600082601f8301126143fc57600080fd5b813561440c8482602086016142dc565b91505092915050565b600082601f83011261442657600080fd5b813561443684826020860161431a565b91505092915050565b60008135905061444e81615c98565b92915050565b60008151905061446381615c98565b92915050565b60006020828403121561447b57600080fd5b600061448984828501614358565b91505092915050565b6000602082840312156144a457600080fd5b60006144b28482850161436d565b91505092915050565b600080604083850312156144ce57600080fd5b60006144dc85828601614358565b92505060206144ed85828601614358565b9150509250929050565b60008060006060848603121561450c57600080fd5b600061451a86828701614358565b935050602061452b86828701614358565b925050604061453c8682870161443f565b9150509250925092565b6000806000806080858703121561455c57600080fd5b600061456a87828801614358565b945050602061457b87828801614358565b935050604061458c8782880161443f565b925050606085013567ffffffffffffffff8111156145a957600080fd5b6145b5878288016143eb565b91505092959194509250565b600080604083850312156145d457600080fd5b60006145e285828601614358565b92505060206145f3858286016143ac565b9150509250929050565b6000806040838503121561461057600080fd5b600061461e85828601614358565b925050602061462f8582860161443f565b9150509250929050565b60006020828403121561464b57600080fd5b600082013567ffffffffffffffff81111561466557600080fd5b61467184828501614382565b91505092915050565b60006020828403121561468c57600080fd5b600061469a848285016143c1565b91505092915050565b6000602082840312156146b557600080fd5b60006146c3848285016143d6565b91505092915050565b6000602082840312156146de57600080fd5b600082013567ffffffffffffffff8111156146f857600080fd5b61470484828501614415565b91505092915050565b60006020828403121561471f57600080fd5b600061472d8482850161443f565b91505092915050565b60006020828403121561474857600080fd5b600061475684828501614454565b91505092915050565b600061476b8383615236565b60208301905092915050565b614780816159df565b82525050565b614797614792826159df565b615b1a565b82525050565b60006147a88261585e565b6147b2818561588c565b93506147bd8361584e565b8060005b838110156147ee5781516147d5888261475f565b97506147e08361587f565b9250506001810190506147c1565b5085935050505092915050565b614804816159f1565b82525050565b614813816159fd565b82525050565b600061482482615869565b61482e818561589d565b935061483e818560208601615a6c565b61484781615c35565b840191505092915050565b600061485d82615874565b61486781856158ae565b9350614877818560208601615a6c565b61488081615c35565b840191505092915050565b600061489682615874565b6148a081856158bf565b93506148b0818560208601615a6c565b80840191505092915050565b60006148c96022836158ae565b91507f456e756d657261626c655365743a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061492f6032836158ae565b91507f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008301527f63656976657220696d706c656d656e74657200000000000000000000000000006020830152604082019050919050565b60006149956026836158ae565b91507f4f776e61626c653a206e6577206f776e657220697320746865207a65726f206160008301527f64647265737300000000000000000000000000000000000000000000000000006020830152604082019050919050565b60006149fb601c836158ae565b91507f4552433732313a20746f6b656e20616c7265616479206d696e746564000000006000830152602082019050919050565b6000614a3b6024836158ae565b91507f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008301527f72657373000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614aa16019836158ae565b91507f4552433732313a20617070726f766520746f2063616c6c6572000000000000006000830152602082019050919050565b6000614ae16012836158ae565b91507f53616c65206973206e6f742061637469766500000000000000000000000000006000830152602082019050919050565b6000614b21601f836158ae565b91507f45746865722076616c75652073656e74206973206e6f7420636f7272656374006000830152602082019050919050565b6000614b61602c836158ae565b91507f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614bc76018836158ae565b91507f416c726561647920636c61696d6564207468697320504f4900000000000000006000830152602082019050919050565b6000614c076038836158ae565b91507f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008301527f6e6572206e6f7220617070726f76656420666f7220616c6c00000000000000006020830152604082019050919050565b6000614c6d602a836158ae565b91507f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008301527f726f2061646472657373000000000000000000000000000000000000000000006020830152604082019050919050565b6000614cd3601a836158ae565b91507f436c61696d206973206e6f7420706f737369626c65206e6f772e0000000000006000830152602082019050919050565b6000614d136022836158ae565b91507f456e756d657261626c654d61703a20696e646578206f7574206f6620626f756e60008301527f64730000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614d796020836158ae565b91507f4552433732313a206d696e7420746f20746865207a65726f20616464726573736000830152602082019050919050565b6000614db9602c836158ae565b91507f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008301527f697374656e7420746f6b656e00000000000000000000000000000000000000006020830152604082019050919050565b6000614e1f6020836158ae565b91507f4f776e61626c653a2063616c6c6572206973206e6f7420746865206f776e65726000830152602082019050919050565b6000614e5f6017836158ae565b91507f53616c6520697320666f7265766572206c6f636b65642e0000000000000000006000830152602082019050919050565b6000614e9f6029836158ae565b91507f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008301527f73206e6f74206f776e00000000000000000000000000000000000000000000006020830152604082019050919050565b6000614f05602f836158ae565b91507f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008301527f6e6578697374656e7420746f6b656e00000000000000000000000000000000006020830152604082019050919050565b6000614f6b6021836158ae565b91507f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008301527f72000000000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000614fd16016836158ae565b91507f53616c652068617320616c726561647920656e646564000000000000000000006000830152602082019050919050565b60006150116031836158ae565b91507f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008301527f776e6572206e6f7220617070726f7665640000000000000000000000000000006020830152604082019050919050565b60006150776019836158ae565b91507f4e6f7420746865206f776e6572206f66207468697320504f49000000000000006000830152602082019050919050565b60006150b76025836158ae565b91507f546f6b656e7320616d6f756e74206d757374206265206265747765656e20312060008301527f616e6420330000000000000000000000000000000000000000000000000000006020830152604082019050919050565b600061511d6023836158ae565b91507f43616e6e6f7420636c61696d206d6f7265207468616e2032302061742061207460008301527f696d6500000000000000000000000000000000000000000000000000000000006020830152604082019050919050565b6000615183600e836158ae565b91507f444f4553204e4f542045584953540000000000000000000000000000000000006000830152602082019050919050565b60006151c36012836158ae565b91507f45786365656473204d41585f544f4b454e5300000000000000000000000000006000830152602082019050919050565b60006152036018836158ae565b91507f436c61696d20697320666f7265766572206c6f636b65642e00000000000000006000830152602082019050919050565b61523f81615a53565b82525050565b61524e81615a53565b82525050565b61526561526082615a53565b615b3e565b82525050565b60006152778286614786565b6014820191506152878285615254565b6020820191506152978284615254565b602082019150819050949350505050565b60006152b4828561488b565b91506152c0828461488b565b91508190509392505050565b60006020820190506152e16000830184614777565b92915050565b60006080820190506152fc6000830187614777565b6153096020830186614777565b6153166040830185615245565b81810360608301526153288184614819565b905095945050505050565b60006040820190506153486000830185614777565b6153556020830184615245565b9392505050565b60006020820190508181036000830152615376818461479d565b905092915050565b600060208201905061539360008301846147fb565b92915050565b60006020820190506153ae600083018461480a565b92915050565b600060208201905081810360008301526153ce8184614852565b905092915050565b600060208201905081810360008301526153ef816148bc565b9050919050565b6000602082019050818103600083015261540f81614922565b9050919050565b6000602082019050818103600083015261542f81614988565b9050919050565b6000602082019050818103600083015261544f816149ee565b9050919050565b6000602082019050818103600083015261546f81614a2e565b9050919050565b6000602082019050818103600083015261548f81614a94565b9050919050565b600060208201905081810360008301526154af81614ad4565b9050919050565b600060208201905081810360008301526154cf81614b14565b9050919050565b600060208201905081810360008301526154ef81614b54565b9050919050565b6000602082019050818103600083015261550f81614bba565b9050919050565b6000602082019050818103600083015261552f81614bfa565b9050919050565b6000602082019050818103600083015261554f81614c60565b9050919050565b6000602082019050818103600083015261556f81614cc6565b9050919050565b6000602082019050818103600083015261558f81614d06565b9050919050565b600060208201905081810360008301526155af81614d6c565b9050919050565b600060208201905081810360008301526155cf81614dac565b9050919050565b600060208201905081810360008301526155ef81614e12565b9050919050565b6000602082019050818103600083015261560f81614e52565b9050919050565b6000602082019050818103600083015261562f81614e92565b9050919050565b6000602082019050818103600083015261564f81614ef8565b9050919050565b6000602082019050818103600083015261566f81614f5e565b9050919050565b6000602082019050818103600083015261568f81614fc4565b9050919050565b600060208201905081810360008301526156af81615004565b9050919050565b600060208201905081810360008301526156cf8161506a565b9050919050565b600060208201905081810360008301526156ef816150aa565b9050919050565b6000602082019050818103600083015261570f81615110565b9050919050565b6000602082019050818103600083015261572f81615176565b9050919050565b6000602082019050818103600083015261574f816151b6565b9050919050565b6000602082019050818103600083015261576f816151f6565b9050919050565b600060208201905061578b6000830184615245565b92915050565b6000604051905081810181811067ffffffffffffffff821117156157b8576157b7615c06565b5b8060405250919050565b600067ffffffffffffffff8211156157dd576157dc615c06565b5b602082029050602081019050919050565b600067ffffffffffffffff82111561580957615808615c06565b5b601f19601f8301169050602081019050919050565b600067ffffffffffffffff82111561583957615838615c06565b5b601f19601f8301169050602081019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006158d582615a53565b91506158e083615a53565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561591557615914615b79565b5b828201905092915050565b600061592b82615a53565b915061593683615a53565b92508261594657615945615ba8565b5b828204905092915050565b600061595c82615a53565b915061596783615a53565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156159a05761599f615b79565b5b828202905092915050565b60006159b682615a53565b91506159c183615a53565b9250828210156159d4576159d3615b79565b5b828203905092915050565b60006159ea82615a33565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b83811015615a8a578082015181840152602081019050615a6f565b83811115615a99576000848401525b50505050565b60006002820490506001821680615ab757607f821691505b60208210811415615acb57615aca615bd7565b5b50919050565b6000615adc82615a53565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415615b0f57615b0e615b79565b5b600182019050919050565b6000615b2582615b2c565b9050919050565b6000615b3782615c46565b9050919050565b6000819050919050565b6000615b5382615a53565b9150615b5e83615a53565b925082615b6e57615b6d615ba8565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b60008160601b9050919050565b615c5c816159df565b8114615c6757600080fd5b50565b615c73816159f1565b8114615c7e57600080fd5b50565b615c8a81615a07565b8114615c9557600080fd5b50565b615ca181615a53565b8114615cac57600080fd5b5056fe4552433732313a206f776e657220717565727920666f72206e6f6e6578697374656e7420746f6b656ea264697066735822122016ac1623007402362632b3cf3aba78ed7057282d473e7f3174e2f36666c3d43c64736f6c63430008000033

Deployed Bytecode Sourcemap

66577:6267:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;31648:150;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43361:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70932:73;;;;;;;;;;;;;:::i;:::-;;46147:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45677:404;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67618:80;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67434:30;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71210:106;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45155:211;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47037:305;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68772:555;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44917:162;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71707:87;;;;;;;;;;;;;:::i;:::-;;72682:159;;;:::i;:::-;;72148:522;;;:::i;:::-;;47413:151;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45443:172;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71596:99;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67357:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67317:33;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66947:39;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43117:177;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66730:43;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71017:75;;;;;;;;;;;;;:::i;:::-;;44736:97;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71806:90;;;;;;;;;;;;;:::i;:::-;;42807:221;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58222:148;;;;;;;;;;;;;:::i;:::-;;67565:46;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71104:94;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68258:502;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;57571:87;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;69345:760;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66993:36;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43530:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70117:797;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;46440:295;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71468:116;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;71908:228;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67996:250;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;47635:285;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;67395:32;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66854:41;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43705:792;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67509:49;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67036:76;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;66780:56;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67471:31;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67119:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71328:128;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66902:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46806:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67290:20;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;67199:84;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58525:244;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;66685:38;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31648:150;31733:4;31757:20;:33;31778:11;31757:33;;;;;;;;;;;;;;;;;;;;;;;;;;;31750:40;;31648:150;;;:::o;43361:100::-;43415:13;43448:5;43441:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43361:100;:::o;70932:73::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;70993:4:::1;70980:10;;:17;;;;;;;;;;;;;;;;;;70932:73::o:0;46147:221::-;46223:7;46251:16;46259:7;46251;:16::i;:::-;46243:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;46336:15;:24;46352:7;46336:24;;;;;;;;;;;;;;;;;;;;;46329:31;;46147:221;;;:::o;45677:404::-;45758:13;45774:23;45789:7;45774:14;:23::i;:::-;45758:39;;45822:5;45816:11;;:2;:11;;;;45808:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;45902:5;45886:21;;:12;:10;:12::i;:::-;:21;;;:69;;;;45911:44;45935:5;45942:12;:10;:12::i;:::-;45911:23;:44::i;:::-;45886:69;45878:161;;;;;;;;;;;;:::i;:::-;;;;;;;;;46052:21;46061:2;46065:7;46052:8;:21::i;:::-;45677:404;;;:::o;67618:80::-;67656:42;67618:80;:::o;67434:30::-;;;;;;;;;;;;;:::o;71210:106::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71297:11:::1;71288:6;:20;;;;;;;;;;;;:::i;:::-;;71210:106:::0;:::o;45155:211::-;45216:7;45337:21;:12;:19;:21::i;:::-;45330:28;;45155:211;:::o;47037:305::-;47198:41;47217:12;:10;:12::i;:::-;47231:7;47198:18;:41::i;:::-;47190:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;47306:28;47316:4;47322:2;47326:7;47306:9;:28::i;:::-;47037:305;;;:::o;68772:555::-;68834:16;68864:18;67656:42;68885:30;;;68916:6;68885:38;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;68864:59;;68952:1;68938:10;:15;68934:386;;;68991:1;68977:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68970:23;;;;;68934:386;69026:23;69066:10;69052:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;69026:51;;69092:13;69120:161;69144:10;69136:5;:18;69120:161;;;67656:42;69200:50;;;69251:6;69259:5;69200:65;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;69184:6;69191:5;69184:13;;;;;;;;;;;;;;;;;;;;;:81;;;;;69156:7;;;;;:::i;:::-;;;;69120:161;;;69302:6;69295:13;;;;;68772:555;;;;:::o;44917:162::-;45014:7;45041:30;45065:5;45041:13;:20;45055:5;45041:20;;;;;;;;;;;;;;;:23;;:30;;;;:::i;:::-;45034:37;;44917:162;;;;:::o;71707:87::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71775:11:::1;;;;;;;;;;;71774:12;71760:11;;:26;;;;;;;;;;;;;;;;;;71707:87::o:0;72682:159::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72746:15:::1;72764:21;72746:39;;72804:10;72796:28;;:37;72825:7;72796:37;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;57862:1;72682:159::o:0;72148:522::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;72204:15:::1;72222:21;72204:39;;72254:16;72273:43;67026:3;72273:28;66893:2;72273:7;:11;;:28;;;;:::i;:::-;:32;;:43;;;;:::i;:::-;72254:62;;72327:13;72343:40;67026:3;72343:25;66938:2;72343:7;:11;;:25;;;;:::i;:::-;:29;;:40;;;;:::i;:::-;72327:56;;72394:14;72411:41;67026:3;72411:26;66984:2;72411:7;:11;;:26;;;;:::i;:::-;:30;;:41;;;;:::i;:::-;72394:58;;72471:16;;;;;;;;;;;72463:34;;:47;72498:11;72463:47;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;72529:13;;;;;;;;;;;72521:31;;:41;72553:8;72521:41;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;67241:42;72573:33;;:44;72607:9;72573:44;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;::::0;::::1;;;;;;72660:1;72635:21;:26;72628:34;;;;;;;;;;;;57862:1;;;;72148:522::o:0;47413:151::-;47517:39;47534:4;47540:2;47544:7;47517:39;;;;;;;;;;;;:16;:39::i;:::-;47413:151;;;:::o;45443:172::-;45518:7;45539:15;45560:22;45576:5;45560:12;:15;;:22;;;;:::i;:::-;45538:44;;;45600:7;45593:14;;;45443:172;;;:::o;71596:99::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71667:20:::1;71679:7;71667:11;:20::i;:::-;71596:99:::0;:::o;67357:31::-;;;;;;;;;;;;;:::o;67317:33::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;66947:39::-;66984:2;66947:39;:::o;43117:177::-;43189:7;43216:70;43233:7;43216:70;;;;;;;;;;;;;;;;;:12;:16;;:70;;;;;:::i;:::-;43209:77;;43117:177;;;:::o;66730:43::-;66769:4;66730:43;:::o;71017:75::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71080:4:::1;71066:11;;:18;;;;;;;;;;;;;;;;;;71017:75::o:0;44736:97::-;44784:13;44817:8;44810:15;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;44736:97;:::o;71806:90::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71876:12:::1;;;;;;;;;;;71875:13;71860:12;;:28;;;;;;;;;;;;;;;;;;71806:90::o:0;42807:221::-;42879:7;42924:1;42907:19;;:5;:19;;;;42899:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;42991:29;:13;:20;43005:5;42991:20;;;;;;;;;;;;;;;:27;:29::i;:::-;42984:36;;42807:221;;;:::o;58222:148::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58329:1:::1;58292:40;;58313:6;;;;;;;;;;;58292:40;;;;;;;;;;;;58360:1;58343:6;;:19;;;;;;;;;;;;;;;;;;58222:148::o:0;67565:46::-;;;;;;;;;;;;;;;;;:::o;71104:94::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71183:7:::1;71174:6;:16;;;;;;;;;;;;:::i;:::-;;71104:94:::0;:::o;68258:502::-;68319:16;68349:18;68370:17;68380:6;68370:9;:17::i;:::-;68349:38;;68416:1;68402:10;:15;68398:355;;;68455:1;68441:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68434:23;;;;;68398:355;68490:23;68530:10;68516:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68490:51;;68556:13;68584:130;68608:10;68600:5;:18;68584:130;;;68664:34;68684:6;68692:5;68664:19;:34::i;:::-;68648:6;68655:5;68648:13;;;;;;;;;;;;;;;;;;;;;:50;;;;;68620:7;;;;;:::i;:::-;;;;68584:130;;;68735:6;68728:13;;;;;68258:502;;;;:::o;57571:87::-;57617:7;57644:6;;;;;;;;;;;57637:13;;57571:87;:::o;69345:760::-;69421:12;;;;;;;;;;;69413:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;69484:11;;;;;;;;;;;69483:12;69475:49;;;;;;;;;;;;:::i;:::-;;;;;;;;;69562:2;69543:8;:15;:21;;69535:69;;;;;;;;;;;;:::i;:::-;;;;;;;;;66719:4;69623:34;69641:8;:15;69623:13;:11;:13::i;:::-;:17;;:34;;;;:::i;:::-;:48;;69615:79;;;;;;;;;;;;:::i;:::-;;;;;;;;;69710:9;69705:393;69729:8;:15;69725:1;:19;69705:393;;;69801:1;69774:10;:23;69785:8;69794:1;69785:11;;;;;;;;;;;;;;;;;;;;;;69774:23;;;;;;;;;;;;:28;69766:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;69899:10;69854:55;;67656:42;69854:28;;;69883:8;69892:1;69883:11;;;;;;;;;;;;;;;;;;;;;;69854:41;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;:55;;;69846:93;;;;;;;;;;;;:::i;:::-;;;;;;;;;69954:34;69964:10;69976:8;69985:1;69976:11;;;;;;;;;;;;;;;;;;;;;;69954:9;:34::i;:::-;70029:1;70003:10;:23;70014:8;70023:1;70014:11;;;;;;;;;;;;;;;;;;;;;;70003:23;;;;;;;;;;;:27;;;;70074:12;70045:13;:26;70059:8;70068:1;70059:11;;;;;;;;;;;;;;;;;;;;;;70045:26;;;;;;;;;;;:41;;;;69746:3;;;;;:::i;:::-;;;;69705:393;;;;69345:760;:::o;66993:36::-;67026:3;66993:36;:::o;43530:104::-;43586:13;43619:7;43612:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43530:104;:::o;70117:797::-;70187:11;;;;;;;;;;;70179:42;;;;;;;;;;;;:::i;:::-;;;;;;;;;70241:10;;;;;;;;;;;70240:11;70232:47;;;;;;;;;;;;:::i;:::-;;;;;;;;;66719:4;70298:34;66769:4;70298:13;:11;:13::i;:::-;:17;;:34;;;;:::i;:::-;:47;70290:82;;;;;;;;;;;;:::i;:::-;;;;;;;;;70406:1;70391:12;:16;:37;;;;;70427:1;70411:12;:17;;70391:37;70383:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;66719:4;70489:52;70528:12;70489:34;66769:4;70489:13;:11;:13::i;:::-;:17;;:34;;;;:::i;:::-;:38;;:52;;;;:::i;:::-;:66;;70481:97;;;;;;;;;;;;:::i;:::-;;;;;;;;;70610:29;70626:12;66818:18;70610:15;;:29;;;;:::i;:::-;70597:9;:42;70589:86;;;;;;;;;;;;:::i;:::-;;;;;;;;;70693:6;70688:219;70709:12;70705:1;:16;70688:219;;;70743:14;70760:34;66769:4;70760:13;:11;:13::i;:::-;:17;;:34;;;;:::i;:::-;70743:51;;70809:32;70819:10;70831:9;70809;:32::i;:::-;70883:12;70856:13;:24;70870:9;70856:24;;;;;;;;;;;:39;;;;70688:219;70723:3;;;;;:::i;:::-;;;;70688:219;;;;70117:797;:::o;46440:295::-;46555:12;:10;:12::i;:::-;46543:24;;:8;:24;;;;46535:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;46655:8;46610:18;:32;46629:12;:10;:12::i;:::-;46610:32;;;;;;;;;;;;;;;:42;46643:8;46610:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;46708:8;46679:48;;46694:12;:10;:12::i;:::-;46679:48;;;46718:8;46679:48;;;;;;:::i;:::-;;;;;;;;46440:295;;:::o;71468:116::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71562:14:::1;71546:13;;:30;;;;;;;;;;;;;;;;;;71468:116:::0;:::o;71908:228::-;71964:7;71991:16;71999:7;71991;:16::i;:::-;71983:43;;;;;;;;;;;;:::i;:::-;;;;;;;;;72087:4;72094:13;:22;72108:7;72094:22;;;;;;;;;;;;72118:7;72062:64;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;72052:75;;;;;;72037:91;;71908:228;;;:::o;67996:250::-;68043:16;68072:20;66719:4;68095:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;68072:48;;68136:6;68131:87;66719:4;68148:1;:14;68131:87;;;68193:10;:13;68204:1;68193:13;;;;;;;;;;;;68184:3;68188:1;68184:6;;;;;;;;;;;;;;;;;;;;;:22;;;;;68164:3;;;;;:::i;:::-;;;;68131:87;;;;68235:3;68228:10;;;67996:250;:::o;47635:285::-;47767:41;47786:12;:10;:12::i;:::-;47800:7;47767:18;:41::i;:::-;47759:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;47873:39;47887:4;47893:2;47897:7;47906:5;47873:13;:39::i;:::-;47635:285;;;;:::o;67395:32::-;;;;;;;;;;;;;:::o;66854:41::-;66893:2;66854:41;:::o;43705:792::-;43778:13;43812:16;43820:7;43812;:16::i;:::-;43804:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;43893:23;43919:10;:19;43930:7;43919:19;;;;;;;;;;;43893:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43949:18;43970:9;:7;:9::i;:::-;43949:30;;44077:1;44061:4;44055:18;:23;44051:72;;;44102:9;44095:16;;;;;;44051:72;44253:1;44233:9;44227:23;:27;44223:108;;;44302:4;44308:9;44285:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44271:48;;;;;;44223:108;44463:4;44469:18;:7;:16;:18::i;:::-;44446:42;;;;;;;;;:::i;:::-;;;;;;;;;;;;;44432:57;;;;43705:792;;;;:::o;67509:49::-;;;;;;;;;;;;;;;;;:::o;67036:76::-;;;;;;;;;;;;;:::o;66780:56::-;66818:18;66780:56;:::o;67471:31::-;;;;;;;;;;;;;:::o;67119:73::-;;;;;;;;;;;;;:::o;71328:128::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;71431:17:::1;71412:16;;:36;;;;;;;;;;;;;;;;;;71328:128:::0;:::o;66902:38::-;66938:2;66902:38;:::o;46806:164::-;46903:4;46927:18;:25;46946:5;46927:25;;;;;;;;;;;;;;;:35;46953:8;46927:35;;;;;;;;;;;;;;;;;;;;;;;;;46920:42;;46806:164;;;;:::o;67290:20::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;67199:84::-;67241:42;67199:84;:::o;58525:244::-;57802:12;:10;:12::i;:::-;57791:23;;:7;:5;:7::i;:::-;:23;;;57783:68;;;;;;;;;;;;:::i;:::-;;;;;;;;;58634:1:::1;58614:22;;:8;:22;;;;58606:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;58724:8;58695:38;;58716:6;;;;;;;;;;;58695:38;;;;;;;;;;;;58753:8;58744:6;;:17;;;;;;;;;;;;;;;;;;58525:244:::0;:::o;66685:38::-;66719:4;66685:38;:::o;61611:98::-;61669:7;61700:1;61696;:5;;;;:::i;:::-;61689:12;;61611:98;;;;:::o;10105:123::-;10174:7;10201:19;10209:3;:10;;10201:7;:19::i;:::-;10194:26;;10105:123;;;:::o;20459:131::-;20526:4;20550:32;20555:3;:10;;20575:5;20567:14;;20550:4;:32::i;:::-;20543:39;;20459:131;;;;:::o;9289:185::-;9378:4;9402:64;9407:3;:10;;9427:3;9419:12;;9457:5;9441:23;;9433:32;;9402:4;:64::i;:::-;9395:71;;9289:185;;;;;:::o;22631:422::-;22691:4;22899:12;23010:7;22998:20;22990:28;;23044:1;23037:4;:8;23030:15;;;22631:422;;;:::o;9866:151::-;9950:4;9974:35;9984:3;:10;;10004:3;9996:12;;9974:9;:35::i;:::-;9967:42;;9866:151;;;;:::o;40579:98::-;40632:7;40659:10;40652:17;;40579:98;:::o;49387:127::-;49452:4;49476:30;49498:7;49476:12;:21;;:30;;;;:::i;:::-;49469:37;;49387:127;;;:::o;55531:183::-;55624:2;55597:15;:24;55613:7;55597:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;55680:7;55676:2;55642:46;;55651:23;55666:7;55651:14;:23::i;:::-;55642:46;;;;;;;;;;;;55531:183;;:::o;49681:355::-;49774:4;49799:16;49807:7;49799;:16::i;:::-;49791:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;49875:13;49891:23;49906:7;49891:14;:23::i;:::-;49875:39;;49944:5;49933:16;;:7;:16;;;:51;;;;49977:7;49953:31;;:20;49965:7;49953:11;:20::i;:::-;:31;;;49933:51;:94;;;;49988:39;50012:5;50019:7;49988:23;:39::i;:::-;49933:94;49925:103;;;49681:355;;;;:::o;52817:597::-;52942:4;52915:31;;:23;52930:7;52915:14;:23::i;:::-;:31;;;52907:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;53043:1;53029:16;;:2;:16;;;;53021:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;53099:39;53120:4;53126:2;53130:7;53099:20;:39::i;:::-;53203:29;53220:1;53224:7;53203:8;:29::i;:::-;53245:35;53272:7;53245:13;:19;53259:4;53245:19;;;;;;;;;;;;;;;:26;;:35;;;;:::i;:::-;;53291:30;53313:7;53291:13;:17;53305:2;53291:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;53334:29;53351:7;53360:2;53334:12;:16;;:29;;;;;:::i;:::-;;53398:7;53394:2;53379:27;;53388:4;53379:27;;;;;;;;;;;;52817:597;;;:::o;21679:137::-;21750:7;21785:22;21789:3;:10;;21801:5;21785:3;:22::i;:::-;21777:31;;21770:38;;21679:137;;;;:::o;62349:98::-;62407:7;62438:1;62434;:5;;;;:::i;:::-;62427:12;;62349:98;;;;:::o;62748:::-;62806:7;62837:1;62833;:5;;;;:::i;:::-;62826:12;;62748:98;;;;:::o;10567:236::-;10647:7;10656;10677:11;10690:13;10707:22;10711:3;:10;;10723:5;10707:3;:22::i;:::-;10676:53;;;;10756:3;10748:12;;10786:5;10778:14;;10740:55;;;;;;10567:236;;;;;:::o;54015:100::-;54099:8;54088;:19;;;;;;;;;;;;:::i;:::-;;54015:100;:::o;11853:213::-;11960:7;12011:44;12016:3;:10;;12036:3;12028:12;;12042;12011:4;:44::i;:::-;12003:53;;11980:78;;11853:213;;;;;:::o;21221:114::-;21281:7;21308:19;21316:3;:10;;21308:7;:19::i;:::-;21301:26;;21221:114;;;:::o;50379:110::-;50455:26;50465:2;50469:7;50455:26;;;;;;;;;;;;:9;:26::i;:::-;50379:110;;:::o;48802:272::-;48916:28;48926:4;48932:2;48936:7;48916:9;:28::i;:::-;48963:48;48986:4;48992:2;48996:7;49005:5;48963:22;:48::i;:::-;48955:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;48802:272;;;;:::o;249:723::-;305:13;535:1;526:5;:10;522:53;;;553:10;;;;;;;;;;;;;;;;;;;;;522:53;585:12;600:5;585:20;;616:14;641:78;656:1;648:4;:9;641:78;;674:8;;;;;:::i;:::-;;;;705:2;697:10;;;;;:::i;:::-;;;641:78;;;729:19;761:6;751:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;729:39;;779:154;795:1;786:5;:10;779:154;;823:1;813:11;;;;;:::i;:::-;;;890:2;882:5;:10;;;;:::i;:::-;869:2;:24;;;;:::i;:::-;856:39;;839:6;846;839:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;919:2;910:11;;;;;:::i;:::-;;;779:154;;;957:6;943:21;;;;;249:723;;;;:::o;6684:110::-;6740:7;6767:3;:12;;:19;;;;6760:26;;6684:110;;;:::o;13829:414::-;13892:4;13914:21;13924:3;13929:5;13914:9;:21::i;:::-;13909:327;;13952:3;:11;;13969:5;13952:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;14135:3;:11;;:18;;;;14113:3;:12;;:19;14126:5;14113:19;;;;;;;;;;;:40;;;;14175:4;14168:11;;;;13909:327;14219:5;14212:12;;13829:414;;;;;:::o;3964:692::-;4040:4;4156:16;4175:3;:12;;:17;4188:3;4175:17;;;;;;;;;;;;4156:36;;4221:1;4209:8;:13;4205:444;;;4276:3;:12;;4294:38;;;;;;;;4311:3;4294:38;;;;4324:5;4294:38;;;4276:57;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4491:3;:12;;:19;;;;4471:3;:12;;:17;4484:3;4471:17;;;;;;;;;;;:39;;;;4532:4;4525:11;;;;;4205:444;4605:5;4569:3;:12;;4593:1;4582:8;:12;;;;:::i;:::-;4569:26;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;:41;;;;4632:5;4625:12;;;3964:692;;;;;;:::o;6464:125::-;6535:4;6580:1;6559:3;:12;;:17;6572:3;6559:17;;;;;;;;;;;;:22;;6552:29;;6464:125;;;;:::o;56327:93::-;;;;:::o;20766:137::-;20836:4;20860:35;20868:3;:10;;20888:5;20880:14;;20860:7;:35::i;:::-;20853:42;;20766:137;;;;:::o;16717:204::-;16784:7;16833:5;16812:3;:11;;:18;;;;:26;16804:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;16895:3;:11;;16907:5;16895:18;;;;;;;;;;;;;;;;;;;;;;;;16888:25;;16717:204;;;;:::o;7149:279::-;7216:7;7225;7275:5;7253:3;:12;;:19;;;;:27;7245:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;7332:22;7357:3;:12;;7370:5;7357:19;;;;;;;;;;;;;;;;;;;;;;;;;;7332:44;;7395:5;:10;;;7407:5;:12;;;7387:33;;;;;7149:279;;;;;:::o;8646:319::-;8740:7;8760:16;8779:3;:12;;:17;8792:3;8779:17;;;;;;;;;;;;8760:36;;8827:1;8815:8;:13;;8830:12;8807:36;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;8897:3;:12;;8921:1;8910:8;:12;;;;:::i;:::-;8897:26;;;;;;;;;;;;;;;;;;;;;;;;;;:33;;;8890:40;;;8646:319;;;;;:::o;16264:109::-;16320:7;16347:3;:11;;:18;;;;16340:25;;16264:109;;;:::o;50716:250::-;50812:18;50818:2;50822:7;50812:5;:18::i;:::-;50849:54;50880:1;50884:2;50888:7;50897:5;50849:22;:54::i;:::-;50841:117;;;;;;;;;;;;:::i;:::-;;;;;;;;;50716:250;;;:::o;54680:843::-;54801:4;54827:15;:2;:13;;;:15::i;:::-;54823:693;;;54879:2;54863:36;;;54900:12;:10;:12::i;:::-;54914:4;54920:7;54929:5;54863:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;54859:602;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55126:1;55109:6;:13;:18;55105:341;;;55152:60;;;;;;;;;;:::i;:::-;;;;;;;;55105:341;55396:6;55390:13;55381:6;55377:2;55373:15;55366:38;54859:602;54996:45;;;54986:55;;;:6;:55;;;;54979:62;;;;;54823:693;55500:4;55493:11;;54680:843;;;;;;;:::o;16049:129::-;16122:4;16169:1;16146:3;:12;;:19;16159:5;16146:19;;;;;;;;;;;;:24;;16139:31;;16049:129;;;;:::o;14419:1544::-;14485:4;14603:18;14624:3;:12;;:19;14637:5;14624:19;;;;;;;;;;;;14603:40;;14674:1;14660:10;:15;14656:1300;;15022:21;15059:1;15046:10;:14;;;;:::i;:::-;15022:38;;15075:17;15116:1;15095:3;:11;;:18;;;;:22;;;;:::i;:::-;15075:42;;15362:17;15382:3;:11;;15394:9;15382:22;;;;;;;;;;;;;;;;;;;;;;;;15362:42;;15528:9;15499:3;:11;;15511:13;15499:26;;;;;;;;;;;;;;;;;;;;;;;:38;;;;15647:1;15631:13;:17;;;;:::i;:::-;15605:3;:12;;:23;15618:9;15605:23;;;;;;;;;;;:43;;;;15757:3;:11;;:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;15852:3;:12;;:19;15865:5;15852:19;;;;;;;;;;;15845:26;;;15895:4;15888:11;;;;;;;;14656:1300;15939:5;15932:12;;;14419:1544;;;;;:::o;51302:404::-;51396:1;51382:16;;:2;:16;;;;51374:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;51455:16;51463:7;51455;:16::i;:::-;51454:17;51446:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;51517:45;51546:1;51550:2;51554:7;51517:20;:45::i;:::-;51575:30;51597:7;51575:13;:17;51589:2;51575:17;;;;;;;;;;;;;;;:21;;:30;;;;:::i;:::-;;51618:29;51635:7;51644:2;51618:12;:16;;:29;;;;;:::i;:::-;;51690:7;51686:2;51665:33;;51682:1;51665:33;;;;;;;;;;;;51302:404;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;24:622:1:-;;145:80;160:64;217:6;160:64;:::i;:::-;145:80;:::i;:::-;136:89;;245:5;273:6;266:5;259:21;299:4;292:5;288:16;281:23;;324:6;374:3;366:4;358:6;354:17;349:3;345:27;342:36;339:2;;;391:1;388;381:12;339:2;419:1;404:236;429:6;426:1;423:13;404:236;;;496:3;524:37;557:3;545:10;524:37;:::i;:::-;519:3;512:50;591:4;586:3;582:14;575:21;;625:4;620:3;616:14;609:21;;464:176;451:1;448;444:9;439:14;;404:236;;;408:14;126:520;;;;;;;:::o;652:342::-;;754:64;769:48;810:6;769:48;:::i;:::-;754:64;:::i;:::-;745:73;;841:6;834:5;827:21;879:4;872:5;868:16;917:3;908:6;903:3;899:16;896:25;893:2;;;934:1;931;924:12;893:2;947:41;981:6;976:3;971;947:41;:::i;:::-;735:259;;;;;;:::o;1000:344::-;;1103:65;1118:49;1160:6;1118:49;:::i;:::-;1103:65;:::i;:::-;1094:74;;1191:6;1184:5;1177:21;1229:4;1222:5;1218:16;1267:3;1258:6;1253:3;1249:16;1246:25;1243:2;;;1284:1;1281;1274:12;1243:2;1297:41;1331:6;1326:3;1321;1297:41;:::i;:::-;1084:260;;;;;;:::o;1350:139::-;;1434:6;1421:20;1412:29;;1450:33;1477:5;1450:33;:::i;:::-;1402:87;;;;:::o;1495:143::-;;1583:6;1577:13;1568:22;;1599:33;1626:5;1599:33;:::i;:::-;1558:80;;;;:::o;1661:303::-;;1781:3;1774:4;1766:6;1762:17;1758:27;1748:2;;1799:1;1796;1789:12;1748:2;1839:6;1826:20;1864:94;1954:3;1946:6;1939:4;1931:6;1927:17;1864:94;:::i;:::-;1855:103;;1738:226;;;;;:::o;1970:133::-;;2051:6;2038:20;2029:29;;2067:30;2091:5;2067:30;:::i;:::-;2019:84;;;;:::o;2109:137::-;;2192:6;2179:20;2170:29;;2208:32;2234:5;2208:32;:::i;:::-;2160:86;;;;:::o;2252:141::-;;2339:6;2333:13;2324:22;;2355:32;2381:5;2355:32;:::i;:::-;2314:79;;;;:::o;2412:271::-;;2516:3;2509:4;2501:6;2497:17;2493:27;2483:2;;2534:1;2531;2524:12;2483:2;2574:6;2561:20;2599:78;2673:3;2665:6;2658:4;2650:6;2646:17;2599:78;:::i;:::-;2590:87;;2473:210;;;;;:::o;2703:273::-;;2808:3;2801:4;2793:6;2789:17;2785:27;2775:2;;2826:1;2823;2816:12;2775:2;2866:6;2853:20;2891:79;2966:3;2958:6;2951:4;2943:6;2939:17;2891:79;:::i;:::-;2882:88;;2765:211;;;;;:::o;2982:139::-;;3066:6;3053:20;3044:29;;3082:33;3109:5;3082:33;:::i;:::-;3034:87;;;;:::o;3127:143::-;;3215:6;3209:13;3200:22;;3231:33;3258:5;3231:33;:::i;:::-;3190:80;;;;:::o;3276:262::-;;3384:2;3372:9;3363:7;3359:23;3355:32;3352:2;;;3400:1;3397;3390:12;3352:2;3443:1;3468:53;3513:7;3504:6;3493:9;3489:22;3468:53;:::i;:::-;3458:63;;3414:117;3342:196;;;;:::o;3544:284::-;;3663:2;3651:9;3642:7;3638:23;3634:32;3631:2;;;3679:1;3676;3669:12;3631:2;3722:1;3747:64;3803:7;3794:6;3783:9;3779:22;3747:64;:::i;:::-;3737:74;;3693:128;3621:207;;;;:::o;3834:407::-;;;3959:2;3947:9;3938:7;3934:23;3930:32;3927:2;;;3975:1;3972;3965:12;3927:2;4018:1;4043:53;4088:7;4079:6;4068:9;4064:22;4043:53;:::i;:::-;4033:63;;3989:117;4145:2;4171:53;4216:7;4207:6;4196:9;4192:22;4171:53;:::i;:::-;4161:63;;4116:118;3917:324;;;;;:::o;4247:552::-;;;;4389:2;4377:9;4368:7;4364:23;4360:32;4357:2;;;4405:1;4402;4395:12;4357:2;4448:1;4473:53;4518:7;4509:6;4498:9;4494:22;4473:53;:::i;:::-;4463:63;;4419:117;4575:2;4601:53;4646:7;4637:6;4626:9;4622:22;4601:53;:::i;:::-;4591:63;;4546:118;4703:2;4729:53;4774:7;4765:6;4754:9;4750:22;4729:53;:::i;:::-;4719:63;;4674:118;4347:452;;;;;:::o;4805:809::-;;;;;4973:3;4961:9;4952:7;4948:23;4944:33;4941:2;;;4990:1;4987;4980:12;4941:2;5033:1;5058:53;5103:7;5094:6;5083:9;5079:22;5058:53;:::i;:::-;5048:63;;5004:117;5160:2;5186:53;5231:7;5222:6;5211:9;5207:22;5186:53;:::i;:::-;5176:63;;5131:118;5288:2;5314:53;5359:7;5350:6;5339:9;5335:22;5314:53;:::i;:::-;5304:63;;5259:118;5444:2;5433:9;5429:18;5416:32;5475:18;5467:6;5464:30;5461:2;;;5507:1;5504;5497:12;5461:2;5535:62;5589:7;5580:6;5569:9;5565:22;5535:62;:::i;:::-;5525:72;;5387:220;4931:683;;;;;;;:::o;5620:401::-;;;5742:2;5730:9;5721:7;5717:23;5713:32;5710:2;;;5758:1;5755;5748:12;5710:2;5801:1;5826:53;5871:7;5862:6;5851:9;5847:22;5826:53;:::i;:::-;5816:63;;5772:117;5928:2;5954:50;5996:7;5987:6;5976:9;5972:22;5954:50;:::i;:::-;5944:60;;5899:115;5700:321;;;;;:::o;6027:407::-;;;6152:2;6140:9;6131:7;6127:23;6123:32;6120:2;;;6168:1;6165;6158:12;6120:2;6211:1;6236:53;6281:7;6272:6;6261:9;6257:22;6236:53;:::i;:::-;6226:63;;6182:117;6338:2;6364:53;6409:7;6400:6;6389:9;6385:22;6364:53;:::i;:::-;6354:63;;6309:118;6110:324;;;;;:::o;6440:405::-;;6573:2;6561:9;6552:7;6548:23;6544:32;6541:2;;;6589:1;6586;6579:12;6541:2;6660:1;6649:9;6645:17;6632:31;6690:18;6682:6;6679:30;6676:2;;;6722:1;6719;6712:12;6676:2;6750:78;6820:7;6811:6;6800:9;6796:22;6750:78;:::i;:::-;6740:88;;6603:235;6531:314;;;;:::o;6851:260::-;;6958:2;6946:9;6937:7;6933:23;6929:32;6926:2;;;6974:1;6971;6964:12;6926:2;7017:1;7042:52;7086:7;7077:6;7066:9;7062:22;7042:52;:::i;:::-;7032:62;;6988:116;6916:195;;;;:::o;7117:282::-;;7235:2;7223:9;7214:7;7210:23;7206:32;7203:2;;;7251:1;7248;7241:12;7203:2;7294:1;7319:63;7374:7;7365:6;7354:9;7350:22;7319:63;:::i;:::-;7309:73;;7265:127;7193:206;;;;:::o;7405:375::-;;7523:2;7511:9;7502:7;7498:23;7494:32;7491:2;;;7539:1;7536;7529:12;7491:2;7610:1;7599:9;7595:17;7582:31;7640:18;7632:6;7629:30;7626:2;;;7672:1;7669;7662:12;7626:2;7700:63;7755:7;7746:6;7735:9;7731:22;7700:63;:::i;:::-;7690:73;;7553:220;7481:299;;;;:::o;7786:262::-;;7894:2;7882:9;7873:7;7869:23;7865:32;7862:2;;;7910:1;7907;7900:12;7862:2;7953:1;7978:53;8023:7;8014:6;8003:9;7999:22;7978:53;:::i;:::-;7968:63;;7924:117;7852:196;;;;:::o;8054:284::-;;8173:2;8161:9;8152:7;8148:23;8144:32;8141:2;;;8189:1;8186;8179:12;8141:2;8232:1;8257:64;8313:7;8304:6;8293:9;8289:22;8257:64;:::i;:::-;8247:74;;8203:128;8131:207;;;;:::o;8344:179::-;;8434:46;8476:3;8468:6;8434:46;:::i;:::-;8512:4;8507:3;8503:14;8489:28;;8424:99;;;;:::o;8529:118::-;8616:24;8634:5;8616:24;:::i;:::-;8611:3;8604:37;8594:53;;:::o;8653:157::-;8758:45;8778:24;8796:5;8778:24;:::i;:::-;8758:45;:::i;:::-;8753:3;8746:58;8736:74;;:::o;8846:732::-;;8994:54;9042:5;8994:54;:::i;:::-;9064:86;9143:6;9138:3;9064:86;:::i;:::-;9057:93;;9174:56;9224:5;9174:56;:::i;:::-;9253:7;9284:1;9269:284;9294:6;9291:1;9288:13;9269:284;;;9370:6;9364:13;9397:63;9456:3;9441:13;9397:63;:::i;:::-;9390:70;;9483:60;9536:6;9483:60;:::i;:::-;9473:70;;9329:224;9316:1;9313;9309:9;9304:14;;9269:284;;;9273:14;9569:3;9562:10;;8970:608;;;;;;;:::o;9584:109::-;9665:21;9680:5;9665:21;:::i;:::-;9660:3;9653:34;9643:50;;:::o;9699:118::-;9786:24;9804:5;9786:24;:::i;:::-;9781:3;9774:37;9764:53;;:::o;9823:360::-;;9937:38;9969:5;9937:38;:::i;:::-;9991:70;10054:6;10049:3;9991:70;:::i;:::-;9984:77;;10070:52;10115:6;10110:3;10103:4;10096:5;10092:16;10070:52;:::i;:::-;10147:29;10169:6;10147:29;:::i;:::-;10142:3;10138:39;10131:46;;9913:270;;;;;:::o;10189:364::-;;10305:39;10338:5;10305:39;:::i;:::-;10360:71;10424:6;10419:3;10360:71;:::i;:::-;10353:78;;10440:52;10485:6;10480:3;10473:4;10466:5;10462:16;10440:52;:::i;:::-;10517:29;10539:6;10517:29;:::i;:::-;10512:3;10508:39;10501:46;;10281:272;;;;;:::o;10559:377::-;;10693:39;10726:5;10693:39;:::i;:::-;10748:89;10830:6;10825:3;10748:89;:::i;:::-;10741:96;;10846:52;10891:6;10886:3;10879:4;10872:5;10868:16;10846:52;:::i;:::-;10923:6;10918:3;10914:16;10907:23;;10669:267;;;;;:::o;10942:366::-;;11105:67;11169:2;11164:3;11105:67;:::i;:::-;11098:74;;11202:34;11198:1;11193:3;11189:11;11182:55;11268:4;11263:2;11258:3;11254:12;11247:26;11299:2;11294:3;11290:12;11283:19;;11088:220;;;:::o;11314:382::-;;11477:67;11541:2;11536:3;11477:67;:::i;:::-;11470:74;;11574:34;11570:1;11565:3;11561:11;11554:55;11640:20;11635:2;11630:3;11626:12;11619:42;11687:2;11682:3;11678:12;11671:19;;11460:236;;;:::o;11702:370::-;;11865:67;11929:2;11924:3;11865:67;:::i;:::-;11858:74;;11962:34;11958:1;11953:3;11949:11;11942:55;12028:8;12023:2;12018:3;12014:12;12007:30;12063:2;12058:3;12054:12;12047:19;;11848:224;;;:::o;12078:326::-;;12241:67;12305:2;12300:3;12241:67;:::i;:::-;12234:74;;12338:30;12334:1;12329:3;12325:11;12318:51;12395:2;12390:3;12386:12;12379:19;;12224:180;;;:::o;12410:368::-;;12573:67;12637:2;12632:3;12573:67;:::i;:::-;12566:74;;12670:34;12666:1;12661:3;12657:11;12650:55;12736:6;12731:2;12726:3;12722:12;12715:28;12769:2;12764:3;12760:12;12753:19;;12556:222;;;:::o;12784:323::-;;12947:67;13011:2;13006:3;12947:67;:::i;:::-;12940:74;;13044:27;13040:1;13035:3;13031:11;13024:48;13098:2;13093:3;13089:12;13082:19;;12930:177;;;:::o;13113:316::-;;13276:67;13340:2;13335:3;13276:67;:::i;:::-;13269:74;;13373:20;13369:1;13364:3;13360:11;13353:41;13420:2;13415:3;13411:12;13404:19;;13259:170;;;:::o;13435:329::-;;13598:67;13662:2;13657:3;13598:67;:::i;:::-;13591:74;;13695:33;13691:1;13686:3;13682:11;13675:54;13755:2;13750:3;13746:12;13739:19;;13581:183;;;:::o;13770:376::-;;13933:67;13997:2;13992:3;13933:67;:::i;:::-;13926:74;;14030:34;14026:1;14021:3;14017:11;14010:55;14096:14;14091:2;14086:3;14082:12;14075:36;14137:2;14132:3;14128:12;14121:19;;13916:230;;;:::o;14152:322::-;;14315:67;14379:2;14374:3;14315:67;:::i;:::-;14308:74;;14412:26;14408:1;14403:3;14399:11;14392:47;14465:2;14460:3;14456:12;14449:19;;14298:176;;;:::o;14480:388::-;;14643:67;14707:2;14702:3;14643:67;:::i;:::-;14636:74;;14740:34;14736:1;14731:3;14727:11;14720:55;14806:26;14801:2;14796:3;14792:12;14785:48;14859:2;14854:3;14850:12;14843:19;;14626:242;;;:::o;14874:374::-;;15037:67;15101:2;15096:3;15037:67;:::i;:::-;15030:74;;15134:34;15130:1;15125:3;15121:11;15114:55;15200:12;15195:2;15190:3;15186:12;15179:34;15239:2;15234:3;15230:12;15223:19;;15020:228;;;:::o;15254:324::-;;15417:67;15481:2;15476:3;15417:67;:::i;:::-;15410:74;;15514:28;15510:1;15505:3;15501:11;15494:49;15569:2;15564:3;15560:12;15553:19;;15400:178;;;:::o;15584:366::-;;15747:67;15811:2;15806:3;15747:67;:::i;:::-;15740:74;;15844:34;15840:1;15835:3;15831:11;15824:55;15910:4;15905:2;15900:3;15896:12;15889:26;15941:2;15936:3;15932:12;15925:19;;15730:220;;;:::o;15956:330::-;;16119:67;16183:2;16178:3;16119:67;:::i;:::-;16112:74;;16216:34;16212:1;16207:3;16203:11;16196:55;16277:2;16272:3;16268:12;16261:19;;16102:184;;;:::o;16292:376::-;;16455:67;16519:2;16514:3;16455:67;:::i;:::-;16448:74;;16552:34;16548:1;16543:3;16539:11;16532:55;16618:14;16613:2;16608:3;16604:12;16597:36;16659:2;16654:3;16650:12;16643:19;;16438:230;;;:::o;16674:330::-;;16837:67;16901:2;16896:3;16837:67;:::i;:::-;16830:74;;16934:34;16930:1;16925:3;16921:11;16914:55;16995:2;16990:3;16986:12;16979:19;;16820:184;;;:::o;17010:321::-;;17173:67;17237:2;17232:3;17173:67;:::i;:::-;17166:74;;17270:25;17266:1;17261:3;17257:11;17250:46;17322:2;17317:3;17313:12;17306:19;;17156:175;;;:::o;17337:373::-;;17500:67;17564:2;17559:3;17500:67;:::i;:::-;17493:74;;17597:34;17593:1;17588:3;17584:11;17577:55;17663:11;17658:2;17653:3;17649:12;17642:33;17701:2;17696:3;17692:12;17685:19;;17483:227;;;:::o;17716:379::-;;17879:67;17943:2;17938:3;17879:67;:::i;:::-;17872:74;;17976:34;17972:1;17967:3;17963:11;17956:55;18042:17;18037:2;18032:3;18028:12;18021:39;18086:2;18081:3;18077:12;18070:19;;17862:233;;;:::o;18101:365::-;;18264:67;18328:2;18323:3;18264:67;:::i;:::-;18257:74;;18361:34;18357:1;18352:3;18348:11;18341:55;18427:3;18422:2;18417:3;18413:12;18406:25;18457:2;18452:3;18448:12;18441:19;;18247:219;;;:::o;18472:320::-;;18635:67;18699:2;18694:3;18635:67;:::i;:::-;18628:74;;18732:24;18728:1;18723:3;18719:11;18712:45;18783:2;18778:3;18774:12;18767:19;;18618:174;;;:::o;18798:381::-;;18961:67;19025:2;19020:3;18961:67;:::i;:::-;18954:74;;19058:34;19054:1;19049:3;19045:11;19038:55;19124:19;19119:2;19114:3;19110:12;19103:41;19170:2;19165:3;19161:12;19154:19;;18944:235;;;:::o;19185:323::-;;19348:67;19412:2;19407:3;19348:67;:::i;:::-;19341:74;;19445:27;19441:1;19436:3;19432:11;19425:48;19499:2;19494:3;19490:12;19483:19;;19331:177;;;:::o;19514:369::-;;19677:67;19741:2;19736:3;19677:67;:::i;:::-;19670:74;;19774:34;19770:1;19765:3;19761:11;19754:55;19840:7;19835:2;19830:3;19826:12;19819:29;19874:2;19869:3;19865:12;19858:19;;19660:223;;;:::o;19889:367::-;;20052:67;20116:2;20111:3;20052:67;:::i;:::-;20045:74;;20149:34;20145:1;20140:3;20136:11;20129:55;20215:5;20210:2;20205:3;20201:12;20194:27;20247:2;20242:3;20238:12;20231:19;;20035:221;;;:::o;20262:312::-;;20425:67;20489:2;20484:3;20425:67;:::i;:::-;20418:74;;20522:16;20518:1;20513:3;20509:11;20502:37;20565:2;20560:3;20556:12;20549:19;;20408:166;;;:::o;20580:316::-;;20743:67;20807:2;20802:3;20743:67;:::i;:::-;20736:74;;20840:20;20836:1;20831:3;20827:11;20820:41;20887:2;20882:3;20878:12;20871:19;;20726:170;;;:::o;20902:322::-;;21065:67;21129:2;21124:3;21065:67;:::i;:::-;21058:74;;21162:26;21158:1;21153:3;21149:11;21142:47;21215:2;21210:3;21206:12;21199:19;;21048:176;;;:::o;21230:108::-;21307:24;21325:5;21307:24;:::i;:::-;21302:3;21295:37;21285:53;;:::o;21344:118::-;21431:24;21449:5;21431:24;:::i;:::-;21426:3;21419:37;21409:53;;:::o;21468:157::-;21573:45;21593:24;21611:5;21593:24;:::i;:::-;21573:45;:::i;:::-;21568:3;21561:58;21551:74;;:::o;21631:538::-;;21814:75;21885:3;21876:6;21814:75;:::i;:::-;21914:2;21909:3;21905:12;21898:19;;21927:75;21998:3;21989:6;21927:75;:::i;:::-;22027:2;22022:3;22018:12;22011:19;;22040:75;22111:3;22102:6;22040:75;:::i;:::-;22140:2;22135:3;22131:12;22124:19;;22160:3;22153:10;;21803:366;;;;;;:::o;22175:435::-;;22377:95;22468:3;22459:6;22377:95;:::i;:::-;22370:102;;22489:95;22580:3;22571:6;22489:95;:::i;:::-;22482:102;;22601:3;22594:10;;22359:251;;;;;:::o;22616:222::-;;22747:2;22736:9;22732:18;22724:26;;22760:71;22828:1;22817:9;22813:17;22804:6;22760:71;:::i;:::-;22714:124;;;;:::o;22844:640::-;;23077:3;23066:9;23062:19;23054:27;;23091:71;23159:1;23148:9;23144:17;23135:6;23091:71;:::i;:::-;23172:72;23240:2;23229:9;23225:18;23216:6;23172:72;:::i;:::-;23254;23322:2;23311:9;23307:18;23298:6;23254:72;:::i;:::-;23373:9;23367:4;23363:20;23358:2;23347:9;23343:18;23336:48;23401:76;23472:4;23463:6;23401:76;:::i;:::-;23393:84;;23044:440;;;;;;;:::o;23490:332::-;;23649:2;23638:9;23634:18;23626:26;;23662:71;23730:1;23719:9;23715:17;23706:6;23662:71;:::i;:::-;23743:72;23811:2;23800:9;23796:18;23787:6;23743:72;:::i;:::-;23616:206;;;;;:::o;23828:373::-;;24009:2;23998:9;23994:18;23986:26;;24058:9;24052:4;24048:20;24044:1;24033:9;24029:17;24022:47;24086:108;24189:4;24180:6;24086:108;:::i;:::-;24078:116;;23976:225;;;;:::o;24207:210::-;;24332:2;24321:9;24317:18;24309:26;;24345:65;24407:1;24396:9;24392:17;24383:6;24345:65;:::i;:::-;24299:118;;;;:::o;24423:222::-;;24554:2;24543:9;24539:18;24531:26;;24567:71;24635:1;24624:9;24620:17;24611:6;24567:71;:::i;:::-;24521:124;;;;:::o;24651:313::-;;24802:2;24791:9;24787:18;24779:26;;24851:9;24845:4;24841:20;24837:1;24826:9;24822:17;24815:47;24879:78;24952:4;24943:6;24879:78;:::i;:::-;24871:86;;24769:195;;;;:::o;24970:419::-;;25174:2;25163:9;25159:18;25151:26;;25223:9;25217:4;25213:20;25209:1;25198:9;25194:17;25187:47;25251:131;25377:4;25251:131;:::i;:::-;25243:139;;25141:248;;;:::o;25395:419::-;;25599:2;25588:9;25584:18;25576:26;;25648:9;25642:4;25638:20;25634:1;25623:9;25619:17;25612:47;25676:131;25802:4;25676:131;:::i;:::-;25668:139;;25566:248;;;:::o;25820:419::-;;26024:2;26013:9;26009:18;26001:26;;26073:9;26067:4;26063:20;26059:1;26048:9;26044:17;26037:47;26101:131;26227:4;26101:131;:::i;:::-;26093:139;;25991:248;;;:::o;26245:419::-;;26449:2;26438:9;26434:18;26426:26;;26498:9;26492:4;26488:20;26484:1;26473:9;26469:17;26462:47;26526:131;26652:4;26526:131;:::i;:::-;26518:139;;26416:248;;;:::o;26670:419::-;;26874:2;26863:9;26859:18;26851:26;;26923:9;26917:4;26913:20;26909:1;26898:9;26894:17;26887:47;26951:131;27077:4;26951:131;:::i;:::-;26943:139;;26841:248;;;:::o;27095:419::-;;27299:2;27288:9;27284:18;27276:26;;27348:9;27342:4;27338:20;27334:1;27323:9;27319:17;27312:47;27376:131;27502:4;27376:131;:::i;:::-;27368:139;;27266:248;;;:::o;27520:419::-;;27724:2;27713:9;27709:18;27701:26;;27773:9;27767:4;27763:20;27759:1;27748:9;27744:17;27737:47;27801:131;27927:4;27801:131;:::i;:::-;27793:139;;27691:248;;;:::o;27945:419::-;;28149:2;28138:9;28134:18;28126:26;;28198:9;28192:4;28188:20;28184:1;28173:9;28169:17;28162:47;28226:131;28352:4;28226:131;:::i;:::-;28218:139;;28116:248;;;:::o;28370:419::-;;28574:2;28563:9;28559:18;28551:26;;28623:9;28617:4;28613:20;28609:1;28598:9;28594:17;28587:47;28651:131;28777:4;28651:131;:::i;:::-;28643:139;;28541:248;;;:::o;28795:419::-;;28999:2;28988:9;28984:18;28976:26;;29048:9;29042:4;29038:20;29034:1;29023:9;29019:17;29012:47;29076:131;29202:4;29076:131;:::i;:::-;29068:139;;28966:248;;;:::o;29220:419::-;;29424:2;29413:9;29409:18;29401:26;;29473:9;29467:4;29463:20;29459:1;29448:9;29444:17;29437:47;29501:131;29627:4;29501:131;:::i;:::-;29493:139;;29391:248;;;:::o;29645:419::-;;29849:2;29838:9;29834:18;29826:26;;29898:9;29892:4;29888:20;29884:1;29873:9;29869:17;29862:47;29926:131;30052:4;29926:131;:::i;:::-;29918:139;;29816:248;;;:::o;30070:419::-;;30274:2;30263:9;30259:18;30251:26;;30323:9;30317:4;30313:20;30309:1;30298:9;30294:17;30287:47;30351:131;30477:4;30351:131;:::i;:::-;30343:139;;30241:248;;;:::o;30495:419::-;;30699:2;30688:9;30684:18;30676:26;;30748:9;30742:4;30738:20;30734:1;30723:9;30719:17;30712:47;30776:131;30902:4;30776:131;:::i;:::-;30768:139;;30666:248;;;:::o;30920:419::-;;31124:2;31113:9;31109:18;31101:26;;31173:9;31167:4;31163:20;31159:1;31148:9;31144:17;31137:47;31201:131;31327:4;31201:131;:::i;:::-;31193:139;;31091:248;;;:::o;31345:419::-;;31549:2;31538:9;31534:18;31526:26;;31598:9;31592:4;31588:20;31584:1;31573:9;31569:17;31562:47;31626:131;31752:4;31626:131;:::i;:::-;31618:139;;31516:248;;;:::o;31770:419::-;;31974:2;31963:9;31959:18;31951:26;;32023:9;32017:4;32013:20;32009:1;31998:9;31994:17;31987:47;32051:131;32177:4;32051:131;:::i;:::-;32043:139;;31941:248;;;:::o;32195:419::-;;32399:2;32388:9;32384:18;32376:26;;32448:9;32442:4;32438:20;32434:1;32423:9;32419:17;32412:47;32476:131;32602:4;32476:131;:::i;:::-;32468:139;;32366:248;;;:::o;32620:419::-;;32824:2;32813:9;32809:18;32801:26;;32873:9;32867:4;32863:20;32859:1;32848:9;32844:17;32837:47;32901:131;33027:4;32901:131;:::i;:::-;32893:139;;32791:248;;;:::o;33045:419::-;;33249:2;33238:9;33234:18;33226:26;;33298:9;33292:4;33288:20;33284:1;33273:9;33269:17;33262:47;33326:131;33452:4;33326:131;:::i;:::-;33318:139;;33216:248;;;:::o;33470:419::-;;33674:2;33663:9;33659:18;33651:26;;33723:9;33717:4;33713:20;33709:1;33698:9;33694:17;33687:47;33751:131;33877:4;33751:131;:::i;:::-;33743:139;;33641:248;;;:::o;33895:419::-;;34099:2;34088:9;34084:18;34076:26;;34148:9;34142:4;34138:20;34134:1;34123:9;34119:17;34112:47;34176:131;34302:4;34176:131;:::i;:::-;34168:139;;34066:248;;;:::o;34320:419::-;;34524:2;34513:9;34509:18;34501:26;;34573:9;34567:4;34563:20;34559:1;34548:9;34544:17;34537:47;34601:131;34727:4;34601:131;:::i;:::-;34593:139;;34491:248;;;:::o;34745:419::-;;34949:2;34938:9;34934:18;34926:26;;34998:9;34992:4;34988:20;34984:1;34973:9;34969:17;34962:47;35026:131;35152:4;35026:131;:::i;:::-;35018:139;;34916:248;;;:::o;35170:419::-;;35374:2;35363:9;35359:18;35351:26;;35423:9;35417:4;35413:20;35409:1;35398:9;35394:17;35387:47;35451:131;35577:4;35451:131;:::i;:::-;35443:139;;35341:248;;;:::o;35595:419::-;;35799:2;35788:9;35784:18;35776:26;;35848:9;35842:4;35838:20;35834:1;35823:9;35819:17;35812:47;35876:131;36002:4;35876:131;:::i;:::-;35868:139;;35766:248;;;:::o;36020:419::-;;36224:2;36213:9;36209:18;36201:26;;36273:9;36267:4;36263:20;36259:1;36248:9;36244:17;36237:47;36301:131;36427:4;36301:131;:::i;:::-;36293:139;;36191:248;;;:::o;36445:419::-;;36649:2;36638:9;36634:18;36626:26;;36698:9;36692:4;36688:20;36684:1;36673:9;36669:17;36662:47;36726:131;36852:4;36726:131;:::i;:::-;36718:139;;36616:248;;;:::o;36870:419::-;;37074:2;37063:9;37059:18;37051:26;;37123:9;37117:4;37113:20;37109:1;37098:9;37094:17;37087:47;37151:131;37277:4;37151:131;:::i;:::-;37143:139;;37041:248;;;:::o;37295:222::-;;37426:2;37415:9;37411:18;37403:26;;37439:71;37507:1;37496:9;37492:17;37483:6;37439:71;:::i;:::-;37393:124;;;;:::o;37523:283::-;;37589:2;37583:9;37573:19;;37631:4;37623:6;37619:17;37738:6;37726:10;37723:22;37702:18;37690:10;37687:34;37684:62;37681:2;;;37749:18;;:::i;:::-;37681:2;37789:10;37785:2;37778:22;37563:243;;;;:::o;37812:311::-;;37979:18;37971:6;37968:30;37965:2;;;38001:18;;:::i;:::-;37965:2;38051:4;38043:6;38039:17;38031:25;;38111:4;38105;38101:15;38093:23;;37894:229;;;:::o;38129:331::-;;38280:18;38272:6;38269:30;38266:2;;;38302:18;;:::i;:::-;38266:2;38387:4;38383:9;38376:4;38368:6;38364:17;38360:33;38352:41;;38448:4;38442;38438:15;38430:23;;38195:265;;;:::o;38466:332::-;;38618:18;38610:6;38607:30;38604:2;;;38640:18;;:::i;:::-;38604:2;38725:4;38721:9;38714:4;38706:6;38702:17;38698:33;38690:41;;38786:4;38780;38776:15;38768:23;;38533:265;;;:::o;38804:132::-;;38894:3;38886:11;;38924:4;38919:3;38915:14;38907:22;;38876:60;;;:::o;38942:114::-;;39043:5;39037:12;39027:22;;39016:40;;;:::o;39062:98::-;;39147:5;39141:12;39131:22;;39120:40;;;:::o;39166:99::-;;39252:5;39246:12;39236:22;;39225:40;;;:::o;39271:113::-;;39373:4;39368:3;39364:14;39356:22;;39346:38;;;:::o;39390:184::-;;39523:6;39518:3;39511:19;39563:4;39558:3;39554:14;39539:29;;39501:73;;;;:::o;39580:168::-;;39697:6;39692:3;39685:19;39737:4;39732:3;39728:14;39713:29;;39675:73;;;;:::o;39754:169::-;;39872:6;39867:3;39860:19;39912:4;39907:3;39903:14;39888:29;;39850:73;;;;:::o;39929:148::-;;40068:3;40053:18;;40043:34;;;;:::o;40083:305::-;;40142:20;40160:1;40142:20;:::i;:::-;40137:25;;40176:20;40194:1;40176:20;:::i;:::-;40171:25;;40330:1;40262:66;40258:74;40255:1;40252:81;40249:2;;;40336:18;;:::i;:::-;40249:2;40380:1;40377;40373:9;40366:16;;40127:261;;;;:::o;40394:185::-;;40451:20;40469:1;40451:20;:::i;:::-;40446:25;;40485:20;40503:1;40485:20;:::i;:::-;40480:25;;40524:1;40514:2;;40529:18;;:::i;:::-;40514:2;40571:1;40568;40564:9;40559:14;;40436:143;;;;:::o;40585:348::-;;40648:20;40666:1;40648:20;:::i;:::-;40643:25;;40682:20;40700:1;40682:20;:::i;:::-;40677:25;;40870:1;40802:66;40798:74;40795:1;40792:81;40787:1;40780:9;40773:17;40769:105;40766:2;;;40877:18;;:::i;:::-;40766:2;40925:1;40922;40918:9;40907:20;;40633:300;;;;:::o;40939:191::-;;40999:20;41017:1;40999:20;:::i;:::-;40994:25;;41033:20;41051:1;41033:20;:::i;:::-;41028:25;;41072:1;41069;41066:8;41063:2;;;41077:18;;:::i;:::-;41063:2;41122:1;41119;41115:9;41107:17;;40984:146;;;;:::o;41136:96::-;;41202:24;41220:5;41202:24;:::i;:::-;41191:35;;41181:51;;;:::o;41238:90::-;;41315:5;41308:13;41301:21;41290:32;;41280:48;;;:::o;41334:77::-;;41400:5;41389:16;;41379:32;;;:::o;41417:149::-;;41493:66;41486:5;41482:78;41471:89;;41461:105;;;:::o;41572:126::-;;41649:42;41642:5;41638:54;41627:65;;41617:81;;;:::o;41704:77::-;;41770:5;41759:16;;41749:32;;;:::o;41787:154::-;41871:6;41866:3;41861;41848:30;41933:1;41924:6;41919:3;41915:16;41908:27;41838:103;;;:::o;41947:307::-;42015:1;42025:113;42039:6;42036:1;42033:13;42025:113;;;42124:1;42119:3;42115:11;42109:18;42105:1;42100:3;42096:11;42089:39;42061:2;42058:1;42054:10;42049:15;;42025:113;;;42156:6;42153:1;42150:13;42147:2;;;42236:1;42227:6;42222:3;42218:16;42211:27;42147:2;41996:258;;;;:::o;42260:320::-;;42341:1;42335:4;42331:12;42321:22;;42388:1;42382:4;42378:12;42409:18;42399:2;;42465:4;42457:6;42453:17;42443:27;;42399:2;42527;42519:6;42516:14;42496:18;42493:38;42490:2;;;42546:18;;:::i;:::-;42490:2;42311:269;;;;:::o;42586:233::-;;42648:24;42666:5;42648:24;:::i;:::-;42639:33;;42694:66;42687:5;42684:77;42681:2;;;42764:18;;:::i;:::-;42681:2;42811:1;42804:5;42800:13;42793:20;;42629:190;;;:::o;42825:100::-;;42893:26;42913:5;42893:26;:::i;:::-;42882:37;;42872:53;;;:::o;42931:94::-;;42999:20;43013:5;42999:20;:::i;:::-;42988:31;;42978:47;;;:::o;43031:79::-;;43099:5;43088:16;;43078:32;;;:::o;43116:176::-;;43165:20;43183:1;43165:20;:::i;:::-;43160:25;;43199:20;43217:1;43199:20;:::i;:::-;43194:25;;43238:1;43228:2;;43243:18;;:::i;:::-;43228:2;43284:1;43281;43277:9;43272:14;;43150:142;;;;:::o;43298:180::-;43346:77;43343:1;43336:88;43443:4;43440:1;43433:15;43467:4;43464:1;43457:15;43484:180;43532:77;43529:1;43522:88;43629:4;43626:1;43619:15;43653:4;43650:1;43643:15;43670:180;43718:77;43715:1;43708:88;43815:4;43812:1;43805:15;43839:4;43836:1;43829:15;43856:180;43904:77;43901:1;43894:88;44001:4;43998:1;43991:15;44025:4;44022:1;44015:15;44042:102;;44134:2;44130:7;44125:2;44118:5;44114:14;44110:28;44100:38;;44090:54;;;:::o;44150:94::-;;44231:5;44227:2;44223:14;44202:35;;44192:52;;;:::o;44250:122::-;44323:24;44341:5;44323:24;:::i;:::-;44316:5;44313:35;44303:2;;44362:1;44359;44352:12;44303:2;44293:79;:::o;44378:116::-;44448:21;44463:5;44448:21;:::i;:::-;44441:5;44438:32;44428:2;;44484:1;44481;44474:12;44428:2;44418:76;:::o;44500:120::-;44572:23;44589:5;44572:23;:::i;:::-;44565:5;44562:34;44552:2;;44610:1;44607;44600:12;44552:2;44542:78;:::o;44626:122::-;44699:24;44717:5;44699:24;:::i;:::-;44692:5;44689:35;44679:2;;44738:1;44735;44728:12;44679:2;44669:79;:::o

Swarm Source

ipfs://16ac1623007402362632b3cf3aba78ed7057282d473e7f3174e2f36666c3d43c
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.