ETH Price: $2,096.12 (-10.69%)

Token

FMTA1YR (1YR)
 

Overview

Max Total Supply

5 1YR

Holders

5

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Filtered by Token Holder
visage.eth
Balance
1 1YR
0x887c3599c4826f7b3cde82003b894430f27d5b92
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:
FMTA1YR

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity)

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

// SPDX-License-Identifier: MIT
// File: @openzeppelin/contracts/utils/structs/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;

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

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

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

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

            return true;
        } else {
            return false;
        }
    }

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

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

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

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

    // Bytes32Set

    struct Bytes32Set {
        Set _inner;
    }

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

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

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

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

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

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

    // AddressSet

    struct AddressSet {
        Set _inner;
    }

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

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

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

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

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

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

        assembly {
            result := store
        }

        return result;
    }

    // UintSet

    struct UintSet {
        Set _inner;
    }

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

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

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

    /**
     * @dev Returns the number of values 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));
    }

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

        assembly {
            result := store
        }

        return result;
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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



pragma solidity ^0.8.0;

/**
 * @title Counters
 * @author Matt Condon (@shrugs)
 * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number
 * of elements in a mapping, issuing ERC721 ids, or counting request ids.
 *
 * Include with `using Counters for Counters.Counter;`
 */
library Counters {
    struct Counter {
        // This variable should never be directly accessed by users of the library: interactions must be restricted to
        // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add
        // this feature: see https://github.com/ethereum/solidity/issues/4637
        uint256 _value; // default: 0
    }

    function current(Counter storage counter) internal view returns (uint256) {
        return counter._value;
    }

    function increment(Counter storage counter) internal {
        unchecked {
            counter._value += 1;
        }
    }

    function decrement(Counter storage counter) internal {
        uint256 value = counter._value;
        require(value > 0, "Counter: decrement overflow");
        unchecked {
            counter._value = value - 1;
        }
    }

    function reset(Counter storage counter) internal {
        counter._value = 0;
    }
}

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



pragma solidity ^0.8.0;

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

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

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

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

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

// File: @openzeppelin/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 meta-transactions the account sending and
 * paying for execution may not be the actual sender (as far as an application
 * is concerned).
 *
 * This contract is only required for intermediate, library-like contracts.
 */
abstract contract Context {
    function _msgSender() internal view virtual returns (address) {
        return msg.sender;
    }

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

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



pragma solidity ^0.8.0;

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

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

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

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

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

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

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

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

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

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

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

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

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

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

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

    /**
     * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the
     * revert reason using the provided one.
     *
     * _Available since v4.3._
     */
    function verifyCallResult(
        bool success,
        bytes memory returndata,
        string memory errorMessage
    ) internal pure returns (bytes memory) {
        if (success) {
            return returndata;
        } else {
            // Look for revert reason and bubble it up if present
            if (returndata.length > 0) {
                // The easiest way to bubble the revert reason is using memory via assembly

                assembly {
                    let returndata_size := mload(returndata)
                    revert(add(32, returndata), returndata_size)
                }
            } else {
                revert(errorMessage);
            }
        }
    }
}

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;

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

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



pragma solidity ^0.8.0;


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

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



pragma solidity ^0.8.0;





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

    mapping(bytes32 => RoleData) private _roles;

    bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;

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

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

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

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

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

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

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

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

        _revokeRole(role, account);
    }

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

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

    function _grantRole(bytes32 role, address account) private {
        if (!hasRole(role, account)) {
            _roles[role].members[account] = true;
            emit RoleGranted(role, account, _msgSender());
        }
    }

    function _revokeRole(bytes32 role, address account) private {
        if (hasRole(role, account)) {
            _roles[role].members[account] = false;
            emit RoleRevoked(role, account, _msgSender());
        }
    }
}

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



pragma solidity ^0.8.0;




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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


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

    /**
     * @dev Returns a token ID owned by `owner` at a given `index` of its token list.
     * Use along with {balanceOf} to enumerate all of ``owner``'s tokens.
     */
    function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 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: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol



pragma solidity ^0.8.0;


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

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

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

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



pragma solidity ^0.8.0;








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

    // Token name
    string private _name;

    // Token symbol
    string private _symbol;

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

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

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

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

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

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

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

    /**
     * @dev See {IERC721-ownerOf}.
     */
    function ownerOf(uint256 tokenId) public view virtual override returns (address) {
        address owner = _owners[tokenId];
        require(owner != address(0), "ERC721: owner query for nonexistent token");
        return owner;
    }

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

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

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

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

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

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

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

        _approve(to, tokenId);
    }

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

        return _tokenApprovals[tokenId];
    }

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

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

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

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

        _transfer(from, to, tokenId);
    }

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

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

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

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

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

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

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

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

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

        _balances[to] += 1;
        _owners[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);

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

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

        _balances[owner] -= 1;
        delete _owners[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");
        require(to != address(0), "ERC721: transfer to the zero address");

        _beforeTokenTransfer(from, to, tokenId);

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

        _balances[from] -= 1;
        _balances[to] += 1;
        _owners[tokenId] = to;

        emit Transfer(from, to, tokenId);
    }

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

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

    /**
     * @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` and `to` are never both zero.
     *
     * 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: @openzeppelin/contracts/token/ERC721/extensions/ERC721Burnable.sol



pragma solidity ^0.8.0;



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

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



pragma solidity ^0.8.0;



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

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

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

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

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

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

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

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

    /**
     * @dev 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 override {
        super._beforeTokenTransfer(from, to, tokenId);

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

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

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

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

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

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

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

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

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

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

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

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

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

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



pragma solidity ^0.8.0;


/**
 * @dev ERC721 token with storage based token URI management.
 */
abstract contract ERC721URIStorage is ERC721 {
    using Strings for uint256;

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

    /**
     * @dev See {IERC721Metadata-tokenURI}.
     */
    function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {
        require(_exists(tokenId), "ERC721URIStorage: 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));
        }

        return super.tokenURI(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), "ERC721URIStorage: URI set of nonexistent token");
        _tokenURIs[tokenId] = _tokenURI;
    }

    /**
     * @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 override {
        super._burn(tokenId);

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

// File: Users/matthewhooft/Projects/nft/contracts/nft.sol


pragma solidity ^0.8.0;







contract FMTA1YR is AccessControlEnumerable, ERC721URIStorage, ERC721Enumerable, ERC721Burnable {
    
    using Counters for Counters.Counter;
    Counters.Counter private _tokenIds;
    
    uint256 public cap;

    constructor(uint256 _initialSupplyCap) ERC721("FMTA1YR", "1YR") {
        _setupRole(DEFAULT_ADMIN_ROLE, 0x82Ab0c69b6548e6Fd61365FeCc3256BcF70dc448);
        cap = _initialSupplyCap;
    }

    bytes32 public constant _MINTER_ROLE = keccak256("_MINTER_ROLE");
    bytes32 public constant _EDIT_URI_ROLE = keccak256("_EDIT_URI_ROLE");
    bytes32 public constant _ADMIN = keccak256("_ADMIN");

    function mint1YR(address recipient, string memory _tokenURI) external returns (uint256) {
        require(hasRole(_MINTER_ROLE, msg.sender), "FMTA1YR: Message Sender requires MINTER_ROLE");
        _tokenIds.increment();
        uint256 newItemId = _tokenIds.current();
        _mint(recipient, newItemId);
        _setTokenURI(newItemId, _tokenURI);

        return newItemId;
    }
    
    function burn1YR (uint256 tokenId) public {
        burn(tokenId);
    }
    
    function setTokenURI (uint256 tokenId, string memory _tokenURI) public {
        require(hasRole(_EDIT_URI_ROLE, msg.sender), "FMTA1YR: Message Sender requires EDIT_URI_ROLE");
        _setTokenURI(tokenId, _tokenURI);
    }
    
    function setCap (uint256 _newCap) public {
        require(hasRole(_ADMIN, msg.sender), "FMTA1YR: Must be ADMIN");
        cap = _newCap;
    }
    
    function supportsInterface(bytes4 interfaceId)
        public
        view
        virtual
        override(AccessControlEnumerable, ERC721, ERC721Enumerable)
        returns (bool)
    {
        return super.supportsInterface(interfaceId);
    }
    
    function _beforeTokenTransfer(address from, address to, uint256 tokenId) 
        internal 
        virtual 
        override(ERC721, ERC721Enumerable) {
        super._beforeTokenTransfer(from, to, tokenId);
        
         if (from == address(0)) { 
            require(totalSupply() <= cap, "FMTA1YR: Minting Limit Reached!");
         }
    }
    
    function _burn (uint256 tokenId) 
        internal 
        virtual 
        override(ERC721, ERC721URIStorage) {
        super._burn(tokenId);
    }

  
   function tokenURI(uint256 tokenId) 
        public 
        view 
        virtual 
        override(ERC721, ERC721URIStorage) returns (string memory) {
        require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token");

        return super.tokenURI(tokenId);
    } 
   
}

Contract Security Audit

Contract ABI

API
[{"inputs":[{"internalType":"uint256","name":"_initialSupplyCap","type":"uint256"}],"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":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_ADMIN","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_EDIT_URI_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"_MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn1YR","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"cap","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"recipient","type":"address"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"mint1YR","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"_newCap","type":"uint256"}],"name":"setCap","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"string","name":"_tokenURI","type":"string"}],"name":"setTokenURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]

60806040523480156200001157600080fd5b50604051620051193803806200511983398181016040528101906200003791906200046b565b6040518060400160405280600781526020017f464d5441315952000000000000000000000000000000000000000000000000008152506040518060400160405280600381526020017f31595200000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000bb929190620003a4565b508060039080519060200190620000d4929190620003a4565b505050620001006000801b7382ab0c69b6548e6fd61365fecc3256bcf70dc4486200010e60201b60201c565b80600e81905550506200052b565b6200012582826200015660201b620013451760201c565b6200015181600160008581526020019081526020016000206200016c60201b620013531790919060201c565b505050565b620001688282620001a460201b60201c565b5050565b60006200019c836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200029560201b60201c565b905092915050565b620001b682826200030f60201b60201c565b6200029157600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002366200037960201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000620002a983836200038160201b60201c565b6200030457826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905062000309565b600090505b92915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b600080836001016000848152602001908152602001600020541415905092915050565b828054620003b290620004a7565b90600052602060002090601f016020900481019282620003d6576000855562000422565b82601f10620003f157805160ff191683800117855562000422565b8280016001018555821562000422579182015b828111156200042157825182559160200191906001019062000404565b5b50905062000431919062000435565b5090565b5b808211156200045057600081600090555060010162000436565b5090565b600081519050620004658162000511565b92915050565b6000602082840312156200048457620004836200050c565b5b6000620004948482850162000454565b91505092915050565b6000819050919050565b60006002820490506001821680620004c057607f821691505b60208210811415620004d757620004d6620004dd565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600080fd5b6200051c816200049d565b81146200052857600080fd5b50565b614bde806200053b6000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063515572891161011a5780639b2721b1116100ad578063b88d4fde1161007c578063b88d4fde146105e8578063c87b56dd14610604578063ca15c87314610634578063d547741f14610664578063e985e9c514610680576101fb565b80639b2721b114610560578063a217fddf1461057e578063a22cb4651461059c578063a3d8b4f1146105b8576101fb565b80638126de35116100e95780638126de35146104c65780639010d07c146104e257806391d148541461051257806395d89b4114610542576101fb565b8063515572891461042a5780635503e8b8146104485780636352211e1461046657806370a0823114610496576101fb565b80632f2ff15d1161019257806342842e0e1161016157806342842e0e146103a657806342966c68146103c257806347786d37146103de5780634f6ccce7146103fa576101fb565b80632f2ff15d146103205780632f745c591461033c578063355274ea1461036c57806336568abe1461038a576101fb565b8063162094c4116101ce578063162094c41461029a57806318160ddd146102b657806323b872dd146102d4578063248a9ca3146102f0576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a60048036038101906102159190613560565b6106b0565b6040516102279190613b98565b60405180910390f35b6102386106c2565b6040516102459190613bce565b60405180910390f35b610268600480360381019061026391906135ba565b610754565b6040516102759190613b31565b60405180910390f35b61029860048036038101906102939190613473565b6107d9565b005b6102b460048036038101906102af91906135e7565b6108f1565b005b6102be610968565b6040516102cb9190613f10565b60405180910390f35b6102ee60048036038101906102e99190613301565b610975565b005b61030a600480360381019061030591906134b3565b6109d5565b6040516103179190613bb3565b60405180910390f35b61033a600480360381019061033591906134e0565b6109f4565b005b61035660048036038101906103519190613473565b610a28565b6040516103639190613f10565b60405180910390f35b610374610acd565b6040516103819190613f10565b60405180910390f35b6103a4600480360381019061039f91906134e0565b610ad3565b005b6103c060048036038101906103bb9190613301565b610b07565b005b6103dc60048036038101906103d791906135ba565b610b27565b005b6103f860048036038101906103f391906135ba565b610b83565b005b610414600480360381019061040f91906135ba565b610bf6565b6040516104219190613f10565b60405180910390f35b610432610c67565b60405161043f9190613bb3565b60405180910390f35b610450610c8b565b60405161045d9190613bb3565b60405180910390f35b610480600480360381019061047b91906135ba565b610caf565b60405161048d9190613b31565b60405180910390f35b6104b060048036038101906104ab9190613294565b610d61565b6040516104bd9190613f10565b60405180910390f35b6104e060048036038101906104db91906135ba565b610e19565b005b6104fc60048036038101906104f79190613520565b610e25565b6040516105099190613b31565b60405180910390f35b61052c600480360381019061052791906134e0565b610e54565b6040516105399190613b98565b60405180910390f35b61054a610ebe565b6040516105579190613bce565b60405180910390f35b610568610f50565b6040516105759190613bb3565b60405180910390f35b610586610f74565b6040516105939190613bb3565b60405180910390f35b6105b660048036038101906105b191906133d7565b610f7b565b005b6105d260048036038101906105cd9190613417565b6110fc565b6040516105df9190613f10565b60405180910390f35b61060260048036038101906105fd9190613354565b61119d565b005b61061e600480360381019061061991906135ba565b6111ff565b60405161062b9190613bce565b60405180910390f35b61064e600480360381019061064991906134b3565b611259565b60405161065b9190613f10565b60405180910390f35b61067e600480360381019061067991906134e0565b61127d565b005b61069a600480360381019061069591906132c1565b6112b1565b6040516106a79190613b98565b60405180910390f35b60006106bb82611383565b9050919050565b6060600280546106d1906141f4565b80601f01602080910402602001604051908101604052809291908181526020018280546106fd906141f4565b801561074a5780601f1061071f5761010080835404028352916020019161074a565b820191906000526020600020905b81548152906001019060200180831161072d57829003601f168201915b5050505050905090565b600061075f826113fd565b61079e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079590613df0565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e482610caf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084c90613e70565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610874611469565b73ffffffffffffffffffffffffffffffffffffffff1614806108a357506108a28161089d611469565b6112b1565b5b6108e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d990613d10565b60405180910390fd5b6108ec8383611471565b505050565b61091b7fba6fd38ede4a07a655ad49a919fab155f998f59e5e628b6cd2857f56407c8d2133610e54565b61095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190613d90565b60405180910390fd5b610964828261152a565b5050565b6000600b80549050905090565b610986610980611469565b8261159e565b6109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90613e90565b60405180910390fd5b6109d083838361167c565b505050565b6000806000838152602001908152602001600020600101549050919050565b6109fe82826118d8565b610a23816001600085815260200190815260200160002061135390919063ffffffff16565b505050565b6000610a3383610d61565b8210610a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6b90613c30565b60405180910390fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e5481565b610add8282611901565b610b02816001600085815260200190815260200160002061198490919063ffffffff16565b505050565b610b228383836040518060200160405280600081525061119d565b505050565b610b38610b32611469565b8261159e565b610b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6e90613ed0565b60405180910390fd5b610b80816119b4565b50565b610bad7fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333610e54565b610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390613cd0565b60405180910390fd5b80600e8190555050565b6000610c00610968565b8210610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3890613eb0565b60405180910390fd5b600b8281548110610c5557610c5461438d565b5b90600052602060002001549050919050565b7fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d381565b7fba6fd38ede4a07a655ad49a919fab155f998f59e5e628b6cd2857f56407c8d2181565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f90613d50565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc990613d30565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e2281610b27565b50565b6000610e4c82600160008681526020019081526020016000206119c090919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060038054610ecd906141f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef9906141f4565b8015610f465780601f10610f1b57610100808354040283529160200191610f46565b820191906000526020600020905b815481529060010190602001808311610f2957829003601f168201915b5050505050905090565b7f8000359b76326a89e9adb95676a4455f7eee9bf304792cd3543c8c98bf58883181565b6000801b81565b610f83611469565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe890613cb0565b60405180910390fd5b8060076000610ffe611469565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110ab611469565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110f09190613b98565b60405180910390a35050565b60006111287f8000359b76326a89e9adb95676a4455f7eee9bf304792cd3543c8c98bf58883133610e54565b611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e90613c10565b60405180910390fd5b611171600d6119da565b600061117d600d6119f0565b905061118984826119fe565b611193818461152a565b8091505092915050565b6111ae6111a8611469565b8361159e565b6111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e490613e90565b60405180910390fd5b6111f984848484611bcc565b50505050565b606061120a826113fd565b611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090613e30565b60405180910390fd5b61125282611c28565b9050919050565b600061127660016000848152602001908152602001600020611d7a565b9050919050565b6112878282611d8f565b6112ac816001600085815260200190815260200160002061198490919063ffffffff16565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61134f8282611db8565b5050565b600061137b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e98565b905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113f657506113f582611f08565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114e483610caf565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611533826113fd565b611572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156990613d70565b60405180910390fd5b80600860008481526020019081526020016000209080519060200190611599929190613053565b505050565b60006115a9826113fd565b6115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df90613cf0565b60405180910390fd5b60006115f383610caf565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061166257508373ffffffffffffffffffffffffffffffffffffffff1661164a84610754565b73ffffffffffffffffffffffffffffffffffffffff16145b80611673575061167281856112b1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661169c82610caf565b73ffffffffffffffffffffffffffffffffffffffff16146116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e990613e10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175990613c90565b60405180910390fd5b61176d838383611fea565b611778600082611471565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117c891906140d6565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461181f9190613ff5565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6118e1826109d5565b6118f2816118ed611469565b61207c565b6118fc8383611db8565b505050565b611909611469565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196d90613ef0565b60405180910390fd5b6119808282612119565b5050565b60006119ac836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6121fa565b905092915050565b6119bd8161230e565b50565b60006119cf8360000183612361565b60001c905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6590613db0565b60405180910390fd5b611a77816113fd565b15611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae90613c70565b60405180910390fd5b611ac360008383611fea565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b139190613ff5565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611bd784848461167c565b611be38484848461238c565b611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1990613c50565b60405180910390fd5b50505050565b6060611c33826113fd565b611c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6990613dd0565b60405180910390fd5b6000600860008481526020019081526020016000208054611c92906141f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611cbe906141f4565b8015611d0b5780601f10611ce057610100808354040283529160200191611d0b565b820191906000526020600020905b815481529060010190602001808311611cee57829003601f168201915b505050505090506000611d1c612523565b9050600081511415611d32578192505050611d75565b600082511115611d67578082604051602001611d4f929190613ad3565b60405160208183030381529060405292505050611d75565b611d708461253a565b925050505b919050565b6000611d88826000016125e1565b9050919050565b611d98826109d5565b611da981611da4611469565b61207c565b611db38383612119565b505050565b611dc28282610e54565b611e9457600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e39611469565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611ea483836125f2565b611efd578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611f02565b600090505b92915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fd357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fe35750611fe282612615565b5b9050919050565b611ff583838361268f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561207757600e54612035610968565b1115612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d90613e50565b60405180910390fd5b5b505050565b6120868282610e54565b612115576120ab8173ffffffffffffffffffffffffffffffffffffffff1660146127a3565b6120b98360001c60206127a3565b6040516020016120ca929190613af7565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210c9190613bce565b60405180910390fd5b5050565b6121238282610e54565b156121f657600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061219b611469565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000808360010160008481526020019081526020016000205490506000811461230257600060018261222c91906140d6565b905060006001866000018054905061224491906140d6565b90508181146122b35760008660000182815481106122655761226461438d565b5b90600052602060002001549050808760000184815481106122895761228861438d565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806122c7576122c661435e565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612308565b60009150505b92915050565b612317816129df565b6000600860008381526020019081526020016000208054612337906141f4565b90501461235e5760086000828152602001908152602001600020600061235d91906130d9565b5b50565b60008260000182815481106123795761237861438d565b5b9060005260206000200154905092915050565b60006123ad8473ffffffffffffffffffffffffffffffffffffffff16612af0565b15612516578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123d6611469565b8786866040518563ffffffff1660e01b81526004016123f89493929190613b4c565b602060405180830381600087803b15801561241257600080fd5b505af192505050801561244357506040513d601f19601f82011682018060405250810190612440919061358d565b60015b6124c6573d8060008114612473576040519150601f19603f3d011682016040523d82523d6000602084013e612478565b606091505b506000815114156124be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b590613c50565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061251b565b600190505b949350505050565b606060405180602001604052806000815250905090565b6060612545826113fd565b612584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257b90613e30565b60405180910390fd5b600061258e612523565b905060008151116125ae57604051806020016040528060008152506125d9565b806125b884612b03565b6040516020016125c9929190613ad3565b6040516020818303038152906040525b915050919050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612688575061268782612c64565b5b9050919050565b61269a838383612cde565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126dd576126d881612ce3565b61271c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461271b5761271a8382612d2c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561275f5761275a81612e99565b61279e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461279d5761279c8282612f6a565b5b5b505050565b6060600060028360026127b6919061407c565b6127c09190613ff5565b67ffffffffffffffff8111156127d9576127d86143bc565b5b6040519080825280601f01601f19166020018201604052801561280b5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106128435761284261438d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106128a7576128a661438d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026128e7919061407c565b6128f19190613ff5565b90505b6001811115612991577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106129335761293261438d565b5b1a60f81b82828151811061294a5761294961438d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061298a906141ca565b90506128f4565b50600084146129d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cc90613bf0565b60405180910390fd5b8091505092915050565b60006129ea82610caf565b90506129f881600084611fea565b612a03600083611471565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a5391906140d6565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415612b4b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c5f565b600082905060005b60008214612b7d578080612b6690614257565b915050600a82612b76919061404b565b9150612b53565b60008167ffffffffffffffff811115612b9957612b986143bc565b5b6040519080825280601f01601f191660200182016040528015612bcb5781602001600182028036833780820191505090505b5090505b60008514612c5857600182612be491906140d6565b9150600a85612bf391906142a0565b6030612bff9190613ff5565b60f81b818381518110612c1557612c1461438d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c51919061404b565b9450612bcf565b8093505050505b919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cd75750612cd682612fe9565b5b9050919050565b505050565b600b80549050600c600083815260200190815260200160002081905550600b81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d3984610d61565b612d4391906140d6565b90506000600a6000848152602001908152602001600020549050818114612e28576000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555081600a600083815260200190815260200160002081905550505b600a600084815260200190815260200160002060009055600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600b80549050612ead91906140d6565b90506000600c60008481526020019081526020016000205490506000600b8381548110612edd57612edc61438d565b5b9060005260206000200154905080600b8381548110612eff57612efe61438d565b5b906000526020600020018190555081600c600083815260200190815260200160002081905550600c600085815260200190815260200160002060009055600b805480612f4e57612f4d61435e565b5b6001900381819060005260206000200160009055905550505050565b6000612f7583610d61565b905081600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555080600a600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461305f906141f4565b90600052602060002090601f01602090048101928261308157600085556130c8565b82601f1061309a57805160ff19168380011785556130c8565b828001600101855582156130c8579182015b828111156130c75782518255916020019190600101906130ac565b5b5090506130d59190613119565b5090565b5080546130e5906141f4565b6000825580601f106130f75750613116565b601f0160209004906000526020600020908101906131159190613119565b5b50565b5b8082111561313257600081600090555060010161311a565b5090565b600061314961314484613f50565b613f2b565b905082815260208101848484011115613165576131646143f0565b5b613170848285614188565b509392505050565b600061318b61318684613f81565b613f2b565b9050828152602081018484840111156131a7576131a66143f0565b5b6131b2848285614188565b509392505050565b6000813590506131c981614b35565b92915050565b6000813590506131de81614b4c565b92915050565b6000813590506131f381614b63565b92915050565b60008135905061320881614b7a565b92915050565b60008151905061321d81614b7a565b92915050565b600082601f830112613238576132376143eb565b5b8135613248848260208601613136565b91505092915050565b600082601f830112613266576132656143eb565b5b8135613276848260208601613178565b91505092915050565b60008135905061328e81614b91565b92915050565b6000602082840312156132aa576132a96143fa565b5b60006132b8848285016131ba565b91505092915050565b600080604083850312156132d8576132d76143fa565b5b60006132e6858286016131ba565b92505060206132f7858286016131ba565b9150509250929050565b60008060006060848603121561331a576133196143fa565b5b6000613328868287016131ba565b9350506020613339868287016131ba565b925050604061334a8682870161327f565b9150509250925092565b6000806000806080858703121561336e5761336d6143fa565b5b600061337c878288016131ba565b945050602061338d878288016131ba565b935050604061339e8782880161327f565b925050606085013567ffffffffffffffff8111156133bf576133be6143f5565b5b6133cb87828801613223565b91505092959194509250565b600080604083850312156133ee576133ed6143fa565b5b60006133fc858286016131ba565b925050602061340d858286016131cf565b9150509250929050565b6000806040838503121561342e5761342d6143fa565b5b600061343c858286016131ba565b925050602083013567ffffffffffffffff81111561345d5761345c6143f5565b5b61346985828601613251565b9150509250929050565b6000806040838503121561348a576134896143fa565b5b6000613498858286016131ba565b92505060206134a98582860161327f565b9150509250929050565b6000602082840312156134c9576134c86143fa565b5b60006134d7848285016131e4565b91505092915050565b600080604083850312156134f7576134f66143fa565b5b6000613505858286016131e4565b9250506020613516858286016131ba565b9150509250929050565b60008060408385031215613537576135366143fa565b5b6000613545858286016131e4565b92505060206135568582860161327f565b9150509250929050565b600060208284031215613576576135756143fa565b5b6000613584848285016131f9565b91505092915050565b6000602082840312156135a3576135a26143fa565b5b60006135b18482850161320e565b91505092915050565b6000602082840312156135d0576135cf6143fa565b5b60006135de8482850161327f565b91505092915050565b600080604083850312156135fe576135fd6143fa565b5b600061360c8582860161327f565b925050602083013567ffffffffffffffff81111561362d5761362c6143f5565b5b61363985828601613251565b9150509250929050565b61364c8161410a565b82525050565b61365b8161411c565b82525050565b61366a81614128565b82525050565b600061367b82613fb2565b6136858185613fc8565b9350613695818560208601614197565b61369e816143ff565b840191505092915050565b60006136b482613fbd565b6136be8185613fd9565b93506136ce818560208601614197565b6136d7816143ff565b840191505092915050565b60006136ed82613fbd565b6136f78185613fea565b9350613707818560208601614197565b80840191505092915050565b6000613720602083613fd9565b915061372b82614410565b602082019050919050565b6000613743602c83613fd9565b915061374e82614439565b604082019050919050565b6000613766602b83613fd9565b915061377182614488565b604082019050919050565b6000613789603283613fd9565b9150613794826144d7565b604082019050919050565b60006137ac601c83613fd9565b91506137b782614526565b602082019050919050565b60006137cf602483613fd9565b91506137da8261454f565b604082019050919050565b60006137f2601983613fd9565b91506137fd8261459e565b602082019050919050565b6000613815601683613fd9565b9150613820826145c7565b602082019050919050565b6000613838602c83613fd9565b9150613843826145f0565b604082019050919050565b600061385b603883613fd9565b91506138668261463f565b604082019050919050565b600061387e602a83613fd9565b91506138898261468e565b604082019050919050565b60006138a1602983613fd9565b91506138ac826146dd565b604082019050919050565b60006138c4602e83613fd9565b91506138cf8261472c565b604082019050919050565b60006138e7602e83613fd9565b91506138f28261477b565b604082019050919050565b600061390a602083613fd9565b9150613915826147ca565b602082019050919050565b600061392d603183613fd9565b9150613938826147f3565b604082019050919050565b6000613950602c83613fd9565b915061395b82614842565b604082019050919050565b6000613973602983613fd9565b915061397e82614891565b604082019050919050565b6000613996602f83613fd9565b91506139a1826148e0565b604082019050919050565b60006139b9601f83613fd9565b91506139c48261492f565b602082019050919050565b60006139dc602183613fd9565b91506139e782614958565b604082019050919050565b60006139ff603183613fd9565b9150613a0a826149a7565b604082019050919050565b6000613a22602c83613fd9565b9150613a2d826149f6565b604082019050919050565b6000613a45601783613fea565b9150613a5082614a45565b601782019050919050565b6000613a68603083613fd9565b9150613a7382614a6e565b604082019050919050565b6000613a8b601183613fea565b9150613a9682614abd565b601182019050919050565b6000613aae602f83613fd9565b9150613ab982614ae6565b604082019050919050565b613acd8161417e565b82525050565b6000613adf82856136e2565b9150613aeb82846136e2565b91508190509392505050565b6000613b0282613a38565b9150613b0e82856136e2565b9150613b1982613a7e565b9150613b2582846136e2565b91508190509392505050565b6000602082019050613b466000830184613643565b92915050565b6000608082019050613b616000830187613643565b613b6e6020830186613643565b613b7b6040830185613ac4565b8181036060830152613b8d8184613670565b905095945050505050565b6000602082019050613bad6000830184613652565b92915050565b6000602082019050613bc86000830184613661565b92915050565b60006020820190508181036000830152613be881846136a9565b905092915050565b60006020820190508181036000830152613c0981613713565b9050919050565b60006020820190508181036000830152613c2981613736565b9050919050565b60006020820190508181036000830152613c4981613759565b9050919050565b60006020820190508181036000830152613c698161377c565b9050919050565b60006020820190508181036000830152613c898161379f565b9050919050565b60006020820190508181036000830152613ca9816137c2565b9050919050565b60006020820190508181036000830152613cc9816137e5565b9050919050565b60006020820190508181036000830152613ce981613808565b9050919050565b60006020820190508181036000830152613d098161382b565b9050919050565b60006020820190508181036000830152613d298161384e565b9050919050565b60006020820190508181036000830152613d4981613871565b9050919050565b60006020820190508181036000830152613d6981613894565b9050919050565b60006020820190508181036000830152613d89816138b7565b9050919050565b60006020820190508181036000830152613da9816138da565b9050919050565b60006020820190508181036000830152613dc9816138fd565b9050919050565b60006020820190508181036000830152613de981613920565b9050919050565b60006020820190508181036000830152613e0981613943565b9050919050565b60006020820190508181036000830152613e2981613966565b9050919050565b60006020820190508181036000830152613e4981613989565b9050919050565b60006020820190508181036000830152613e69816139ac565b9050919050565b60006020820190508181036000830152613e89816139cf565b9050919050565b60006020820190508181036000830152613ea9816139f2565b9050919050565b60006020820190508181036000830152613ec981613a15565b9050919050565b60006020820190508181036000830152613ee981613a5b565b9050919050565b60006020820190508181036000830152613f0981613aa1565b9050919050565b6000602082019050613f256000830184613ac4565b92915050565b6000613f35613f46565b9050613f418282614226565b919050565b6000604051905090565b600067ffffffffffffffff821115613f6b57613f6a6143bc565b5b613f74826143ff565b9050602081019050919050565b600067ffffffffffffffff821115613f9c57613f9b6143bc565b5b613fa5826143ff565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140008261417e565b915061400b8361417e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140405761403f6142d1565b5b828201905092915050565b60006140568261417e565b91506140618361417e565b92508261407157614070614300565b5b828204905092915050565b60006140878261417e565b91506140928361417e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140cb576140ca6142d1565b5b828202905092915050565b60006140e18261417e565b91506140ec8361417e565b9250828210156140ff576140fe6142d1565b5b828203905092915050565b60006141158261415e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141b557808201518184015260208101905061419a565b838111156141c4576000848401525b50505050565b60006141d58261417e565b915060008214156141e9576141e86142d1565b5b600182039050919050565b6000600282049050600182168061420c57607f821691505b602082108114156142205761421f61432f565b5b50919050565b61422f826143ff565b810181811067ffffffffffffffff8211171561424e5761424d6143bc565b5b80604052505050565b60006142628261417e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614295576142946142d1565b5b600182019050919050565b60006142ab8261417e565b91506142b68361417e565b9250826142c6576142c5614300565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f464d54413159523a204d6573736167652053656e64657220726571756972657360008201527f204d494e5445525f524f4c450000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f464d54413159523a204d7573742062652041444d494e00000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f464d54413159523a204d6573736167652053656e64657220726571756972657360008201527f20454449545f5552495f524f4c45000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f464d54413159523a204d696e74696e67204c696d697420526561636865642100600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b614b3e8161410a565b8114614b4957600080fd5b50565b614b558161411c565b8114614b6057600080fd5b50565b614b6c81614128565b8114614b7757600080fd5b50565b614b8381614132565b8114614b8e57600080fd5b50565b614b9a8161417e565b8114614ba557600080fd5b5056fea2646970667358221220a9c2e60a1792ddeea3489ee3569283bea633ba4618309d5855252038742689fa64736f6c634300080700330000000000000000000000000000000000000000000000000000000000000014

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c8063515572891161011a5780639b2721b1116100ad578063b88d4fde1161007c578063b88d4fde146105e8578063c87b56dd14610604578063ca15c87314610634578063d547741f14610664578063e985e9c514610680576101fb565b80639b2721b114610560578063a217fddf1461057e578063a22cb4651461059c578063a3d8b4f1146105b8576101fb565b80638126de35116100e95780638126de35146104c65780639010d07c146104e257806391d148541461051257806395d89b4114610542576101fb565b8063515572891461042a5780635503e8b8146104485780636352211e1461046657806370a0823114610496576101fb565b80632f2ff15d1161019257806342842e0e1161016157806342842e0e146103a657806342966c68146103c257806347786d37146103de5780634f6ccce7146103fa576101fb565b80632f2ff15d146103205780632f745c591461033c578063355274ea1461036c57806336568abe1461038a576101fb565b8063162094c4116101ce578063162094c41461029a57806318160ddd146102b657806323b872dd146102d4578063248a9ca3146102f0576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a60048036038101906102159190613560565b6106b0565b6040516102279190613b98565b60405180910390f35b6102386106c2565b6040516102459190613bce565b60405180910390f35b610268600480360381019061026391906135ba565b610754565b6040516102759190613b31565b60405180910390f35b61029860048036038101906102939190613473565b6107d9565b005b6102b460048036038101906102af91906135e7565b6108f1565b005b6102be610968565b6040516102cb9190613f10565b60405180910390f35b6102ee60048036038101906102e99190613301565b610975565b005b61030a600480360381019061030591906134b3565b6109d5565b6040516103179190613bb3565b60405180910390f35b61033a600480360381019061033591906134e0565b6109f4565b005b61035660048036038101906103519190613473565b610a28565b6040516103639190613f10565b60405180910390f35b610374610acd565b6040516103819190613f10565b60405180910390f35b6103a4600480360381019061039f91906134e0565b610ad3565b005b6103c060048036038101906103bb9190613301565b610b07565b005b6103dc60048036038101906103d791906135ba565b610b27565b005b6103f860048036038101906103f391906135ba565b610b83565b005b610414600480360381019061040f91906135ba565b610bf6565b6040516104219190613f10565b60405180910390f35b610432610c67565b60405161043f9190613bb3565b60405180910390f35b610450610c8b565b60405161045d9190613bb3565b60405180910390f35b610480600480360381019061047b91906135ba565b610caf565b60405161048d9190613b31565b60405180910390f35b6104b060048036038101906104ab9190613294565b610d61565b6040516104bd9190613f10565b60405180910390f35b6104e060048036038101906104db91906135ba565b610e19565b005b6104fc60048036038101906104f79190613520565b610e25565b6040516105099190613b31565b60405180910390f35b61052c600480360381019061052791906134e0565b610e54565b6040516105399190613b98565b60405180910390f35b61054a610ebe565b6040516105579190613bce565b60405180910390f35b610568610f50565b6040516105759190613bb3565b60405180910390f35b610586610f74565b6040516105939190613bb3565b60405180910390f35b6105b660048036038101906105b191906133d7565b610f7b565b005b6105d260048036038101906105cd9190613417565b6110fc565b6040516105df9190613f10565b60405180910390f35b61060260048036038101906105fd9190613354565b61119d565b005b61061e600480360381019061061991906135ba565b6111ff565b60405161062b9190613bce565b60405180910390f35b61064e600480360381019061064991906134b3565b611259565b60405161065b9190613f10565b60405180910390f35b61067e600480360381019061067991906134e0565b61127d565b005b61069a600480360381019061069591906132c1565b6112b1565b6040516106a79190613b98565b60405180910390f35b60006106bb82611383565b9050919050565b6060600280546106d1906141f4565b80601f01602080910402602001604051908101604052809291908181526020018280546106fd906141f4565b801561074a5780601f1061071f5761010080835404028352916020019161074a565b820191906000526020600020905b81548152906001019060200180831161072d57829003601f168201915b5050505050905090565b600061075f826113fd565b61079e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161079590613df0565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107e482610caf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610855576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161084c90613e70565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610874611469565b73ffffffffffffffffffffffffffffffffffffffff1614806108a357506108a28161089d611469565b6112b1565b5b6108e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108d990613d10565b60405180910390fd5b6108ec8383611471565b505050565b61091b7fba6fd38ede4a07a655ad49a919fab155f998f59e5e628b6cd2857f56407c8d2133610e54565b61095a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161095190613d90565b60405180910390fd5b610964828261152a565b5050565b6000600b80549050905090565b610986610980611469565b8261159e565b6109c5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109bc90613e90565b60405180910390fd5b6109d083838361167c565b505050565b6000806000838152602001908152602001600020600101549050919050565b6109fe82826118d8565b610a23816001600085815260200190815260200160002061135390919063ffffffff16565b505050565b6000610a3383610d61565b8210610a74576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a6b90613c30565b60405180910390fd5b600960008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b600e5481565b610add8282611901565b610b02816001600085815260200190815260200160002061198490919063ffffffff16565b505050565b610b228383836040518060200160405280600081525061119d565b505050565b610b38610b32611469565b8261159e565b610b77576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b6e90613ed0565b60405180910390fd5b610b80816119b4565b50565b610bad7fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d333610e54565b610bec576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be390613cd0565b60405180910390fd5b80600e8190555050565b6000610c00610968565b8210610c41576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610c3890613eb0565b60405180910390fd5b600b8281548110610c5557610c5461438d565b5b90600052602060002001549050919050565b7fae6c2fc584631af4c9385b8a55683f1a75c813747e27efef5afece31c6b230d381565b7fba6fd38ede4a07a655ad49a919fab155f998f59e5e628b6cd2857f56407c8d2181565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610d58576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4f90613d50565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610dd2576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610dc990613d30565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b610e2281610b27565b50565b6000610e4c82600160008681526020019081526020016000206119c090919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060038054610ecd906141f4565b80601f0160208091040260200160405190810160405280929190818152602001828054610ef9906141f4565b8015610f465780601f10610f1b57610100808354040283529160200191610f46565b820191906000526020600020905b815481529060010190602001808311610f2957829003601f168201915b5050505050905090565b7f8000359b76326a89e9adb95676a4455f7eee9bf304792cd3543c8c98bf58883181565b6000801b81565b610f83611469565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610ff1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610fe890613cb0565b60405180910390fd5b8060076000610ffe611469565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166110ab611469565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516110f09190613b98565b60405180910390a35050565b60006111287f8000359b76326a89e9adb95676a4455f7eee9bf304792cd3543c8c98bf58883133610e54565b611167576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115e90613c10565b60405180910390fd5b611171600d6119da565b600061117d600d6119f0565b905061118984826119fe565b611193818461152a565b8091505092915050565b6111ae6111a8611469565b8361159e565b6111ed576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111e490613e90565b60405180910390fd5b6111f984848484611bcc565b50505050565b606061120a826113fd565b611249576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161124090613e30565b60405180910390fd5b61125282611c28565b9050919050565b600061127660016000848152602001908152602001600020611d7a565b9050919050565b6112878282611d8f565b6112ac816001600085815260200190815260200160002061198490919063ffffffff16565b505050565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b61134f8282611db8565b5050565b600061137b836000018373ffffffffffffffffffffffffffffffffffffffff1660001b611e98565b905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806113f657506113f582611f08565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166114e483610caf565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611533826113fd565b611572576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161156990613d70565b60405180910390fd5b80600860008481526020019081526020016000209080519060200190611599929190613053565b505050565b60006115a9826113fd565b6115e8576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016115df90613cf0565b60405180910390fd5b60006115f383610caf565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061166257508373ffffffffffffffffffffffffffffffffffffffff1661164a84610754565b73ffffffffffffffffffffffffffffffffffffffff16145b80611673575061167281856112b1565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661169c82610caf565b73ffffffffffffffffffffffffffffffffffffffff16146116f2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016116e990613e10565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611762576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161175990613c90565b60405180910390fd5b61176d838383611fea565b611778600082611471565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546117c891906140d6565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461181f9190613ff5565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6118e1826109d5565b6118f2816118ed611469565b61207c565b6118fc8383611db8565b505050565b611909611469565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611976576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161196d90613ef0565b60405180910390fd5b6119808282612119565b5050565b60006119ac836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6121fa565b905092915050565b6119bd8161230e565b50565b60006119cf8360000183612361565b60001c905092915050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611a6e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a6590613db0565b60405180910390fd5b611a77816113fd565b15611ab7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611aae90613c70565b60405180910390fd5b611ac360008383611fea565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b139190613ff5565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611bd784848461167c565b611be38484848461238c565b611c22576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c1990613c50565b60405180910390fd5b50505050565b6060611c33826113fd565b611c72576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611c6990613dd0565b60405180910390fd5b6000600860008481526020019081526020016000208054611c92906141f4565b80601f0160208091040260200160405190810160405280929190818152602001828054611cbe906141f4565b8015611d0b5780601f10611ce057610100808354040283529160200191611d0b565b820191906000526020600020905b815481529060010190602001808311611cee57829003601f168201915b505050505090506000611d1c612523565b9050600081511415611d32578192505050611d75565b600082511115611d67578082604051602001611d4f929190613ad3565b60405160208183030381529060405292505050611d75565b611d708461253a565b925050505b919050565b6000611d88826000016125e1565b9050919050565b611d98826109d5565b611da981611da4611469565b61207c565b611db38383612119565b505050565b611dc28282610e54565b611e9457600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550611e39611469565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611ea483836125f2565b611efd578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050611f02565b600090505b92915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611fd357507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80611fe35750611fe282612615565b5b9050919050565b611ff583838361268f565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff16141561207757600e54612035610968565b1115612076576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161206d90613e50565b60405180910390fd5b5b505050565b6120868282610e54565b612115576120ab8173ffffffffffffffffffffffffffffffffffffffff1660146127a3565b6120b98360001c60206127a3565b6040516020016120ca929190613af7565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161210c9190613bce565b60405180910390fd5b5050565b6121238282610e54565b156121f657600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061219b611469565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b6000808360010160008481526020019081526020016000205490506000811461230257600060018261222c91906140d6565b905060006001866000018054905061224491906140d6565b90508181146122b35760008660000182815481106122655761226461438d565b5b90600052602060002001549050808760000184815481106122895761228861438d565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b856000018054806122c7576122c661435e565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612308565b60009150505b92915050565b612317816129df565b6000600860008381526020019081526020016000208054612337906141f4565b90501461235e5760086000828152602001908152602001600020600061235d91906130d9565b5b50565b60008260000182815481106123795761237861438d565b5b9060005260206000200154905092915050565b60006123ad8473ffffffffffffffffffffffffffffffffffffffff16612af0565b15612516578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026123d6611469565b8786866040518563ffffffff1660e01b81526004016123f89493929190613b4c565b602060405180830381600087803b15801561241257600080fd5b505af192505050801561244357506040513d601f19601f82011682018060405250810190612440919061358d565b60015b6124c6573d8060008114612473576040519150601f19603f3d011682016040523d82523d6000602084013e612478565b606091505b506000815114156124be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016124b590613c50565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061251b565b600190505b949350505050565b606060405180602001604052806000815250905090565b6060612545826113fd565b612584576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161257b90613e30565b60405180910390fd5b600061258e612523565b905060008151116125ae57604051806020016040528060008152506125d9565b806125b884612b03565b6040516020016125c9929190613ad3565b6040516020818303038152906040525b915050919050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612688575061268782612c64565b5b9050919050565b61269a838383612cde565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614156126dd576126d881612ce3565b61271c565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161461271b5761271a8382612d2c565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561275f5761275a81612e99565b61279e565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161461279d5761279c8282612f6a565b5b5b505050565b6060600060028360026127b6919061407c565b6127c09190613ff5565b67ffffffffffffffff8111156127d9576127d86143bc565b5b6040519080825280601f01601f19166020018201604052801561280b5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106128435761284261438d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f7800000000000000000000000000000000000000000000000000000000000000816001815181106128a7576128a661438d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026128e7919061407c565b6128f19190613ff5565b90505b6001811115612991577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106129335761293261438d565b5b1a60f81b82828151811061294a5761294961438d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c94508061298a906141ca565b90506128f4565b50600084146129d5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016129cc90613bf0565b60405180910390fd5b8091505092915050565b60006129ea82610caf565b90506129f881600084611fea565b612a03600083611471565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612a5391906140d6565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415612b4b576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612c5f565b600082905060005b60008214612b7d578080612b6690614257565b915050600a82612b76919061404b565b9150612b53565b60008167ffffffffffffffff811115612b9957612b986143bc565b5b6040519080825280601f01601f191660200182016040528015612bcb5781602001600182028036833780820191505090505b5090505b60008514612c5857600182612be491906140d6565b9150600a85612bf391906142a0565b6030612bff9190613ff5565b60f81b818381518110612c1557612c1461438d565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a85612c51919061404b565b9450612bcf565b8093505050505b919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612cd75750612cd682612fe9565b5b9050919050565b505050565b600b80549050600c600083815260200190815260200160002081905550600b81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612d3984610d61565b612d4391906140d6565b90506000600a6000848152602001908152602001600020549050818114612e28576000600960008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600960008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008481526020019081526020016000208190555081600a600083815260200190815260200160002081905550505b600a600084815260200190815260200160002060009055600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600b80549050612ead91906140d6565b90506000600c60008481526020019081526020016000205490506000600b8381548110612edd57612edc61438d565b5b9060005260206000200154905080600b8381548110612eff57612efe61438d565b5b906000526020600020018190555081600c600083815260200190815260200160002081905550600c600085815260200190815260200160002060009055600b805480612f4e57612f4d61435e565b5b6001900381819060005260206000200160009055905550505050565b6000612f7583610d61565b905081600960008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000208190555080600a600084815260200190815260200160002081905550505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b82805461305f906141f4565b90600052602060002090601f01602090048101928261308157600085556130c8565b82601f1061309a57805160ff19168380011785556130c8565b828001600101855582156130c8579182015b828111156130c75782518255916020019190600101906130ac565b5b5090506130d59190613119565b5090565b5080546130e5906141f4565b6000825580601f106130f75750613116565b601f0160209004906000526020600020908101906131159190613119565b5b50565b5b8082111561313257600081600090555060010161311a565b5090565b600061314961314484613f50565b613f2b565b905082815260208101848484011115613165576131646143f0565b5b613170848285614188565b509392505050565b600061318b61318684613f81565b613f2b565b9050828152602081018484840111156131a7576131a66143f0565b5b6131b2848285614188565b509392505050565b6000813590506131c981614b35565b92915050565b6000813590506131de81614b4c565b92915050565b6000813590506131f381614b63565b92915050565b60008135905061320881614b7a565b92915050565b60008151905061321d81614b7a565b92915050565b600082601f830112613238576132376143eb565b5b8135613248848260208601613136565b91505092915050565b600082601f830112613266576132656143eb565b5b8135613276848260208601613178565b91505092915050565b60008135905061328e81614b91565b92915050565b6000602082840312156132aa576132a96143fa565b5b60006132b8848285016131ba565b91505092915050565b600080604083850312156132d8576132d76143fa565b5b60006132e6858286016131ba565b92505060206132f7858286016131ba565b9150509250929050565b60008060006060848603121561331a576133196143fa565b5b6000613328868287016131ba565b9350506020613339868287016131ba565b925050604061334a8682870161327f565b9150509250925092565b6000806000806080858703121561336e5761336d6143fa565b5b600061337c878288016131ba565b945050602061338d878288016131ba565b935050604061339e8782880161327f565b925050606085013567ffffffffffffffff8111156133bf576133be6143f5565b5b6133cb87828801613223565b91505092959194509250565b600080604083850312156133ee576133ed6143fa565b5b60006133fc858286016131ba565b925050602061340d858286016131cf565b9150509250929050565b6000806040838503121561342e5761342d6143fa565b5b600061343c858286016131ba565b925050602083013567ffffffffffffffff81111561345d5761345c6143f5565b5b61346985828601613251565b9150509250929050565b6000806040838503121561348a576134896143fa565b5b6000613498858286016131ba565b92505060206134a98582860161327f565b9150509250929050565b6000602082840312156134c9576134c86143fa565b5b60006134d7848285016131e4565b91505092915050565b600080604083850312156134f7576134f66143fa565b5b6000613505858286016131e4565b9250506020613516858286016131ba565b9150509250929050565b60008060408385031215613537576135366143fa565b5b6000613545858286016131e4565b92505060206135568582860161327f565b9150509250929050565b600060208284031215613576576135756143fa565b5b6000613584848285016131f9565b91505092915050565b6000602082840312156135a3576135a26143fa565b5b60006135b18482850161320e565b91505092915050565b6000602082840312156135d0576135cf6143fa565b5b60006135de8482850161327f565b91505092915050565b600080604083850312156135fe576135fd6143fa565b5b600061360c8582860161327f565b925050602083013567ffffffffffffffff81111561362d5761362c6143f5565b5b61363985828601613251565b9150509250929050565b61364c8161410a565b82525050565b61365b8161411c565b82525050565b61366a81614128565b82525050565b600061367b82613fb2565b6136858185613fc8565b9350613695818560208601614197565b61369e816143ff565b840191505092915050565b60006136b482613fbd565b6136be8185613fd9565b93506136ce818560208601614197565b6136d7816143ff565b840191505092915050565b60006136ed82613fbd565b6136f78185613fea565b9350613707818560208601614197565b80840191505092915050565b6000613720602083613fd9565b915061372b82614410565b602082019050919050565b6000613743602c83613fd9565b915061374e82614439565b604082019050919050565b6000613766602b83613fd9565b915061377182614488565b604082019050919050565b6000613789603283613fd9565b9150613794826144d7565b604082019050919050565b60006137ac601c83613fd9565b91506137b782614526565b602082019050919050565b60006137cf602483613fd9565b91506137da8261454f565b604082019050919050565b60006137f2601983613fd9565b91506137fd8261459e565b602082019050919050565b6000613815601683613fd9565b9150613820826145c7565b602082019050919050565b6000613838602c83613fd9565b9150613843826145f0565b604082019050919050565b600061385b603883613fd9565b91506138668261463f565b604082019050919050565b600061387e602a83613fd9565b91506138898261468e565b604082019050919050565b60006138a1602983613fd9565b91506138ac826146dd565b604082019050919050565b60006138c4602e83613fd9565b91506138cf8261472c565b604082019050919050565b60006138e7602e83613fd9565b91506138f28261477b565b604082019050919050565b600061390a602083613fd9565b9150613915826147ca565b602082019050919050565b600061392d603183613fd9565b9150613938826147f3565b604082019050919050565b6000613950602c83613fd9565b915061395b82614842565b604082019050919050565b6000613973602983613fd9565b915061397e82614891565b604082019050919050565b6000613996602f83613fd9565b91506139a1826148e0565b604082019050919050565b60006139b9601f83613fd9565b91506139c48261492f565b602082019050919050565b60006139dc602183613fd9565b91506139e782614958565b604082019050919050565b60006139ff603183613fd9565b9150613a0a826149a7565b604082019050919050565b6000613a22602c83613fd9565b9150613a2d826149f6565b604082019050919050565b6000613a45601783613fea565b9150613a5082614a45565b601782019050919050565b6000613a68603083613fd9565b9150613a7382614a6e565b604082019050919050565b6000613a8b601183613fea565b9150613a9682614abd565b601182019050919050565b6000613aae602f83613fd9565b9150613ab982614ae6565b604082019050919050565b613acd8161417e565b82525050565b6000613adf82856136e2565b9150613aeb82846136e2565b91508190509392505050565b6000613b0282613a38565b9150613b0e82856136e2565b9150613b1982613a7e565b9150613b2582846136e2565b91508190509392505050565b6000602082019050613b466000830184613643565b92915050565b6000608082019050613b616000830187613643565b613b6e6020830186613643565b613b7b6040830185613ac4565b8181036060830152613b8d8184613670565b905095945050505050565b6000602082019050613bad6000830184613652565b92915050565b6000602082019050613bc86000830184613661565b92915050565b60006020820190508181036000830152613be881846136a9565b905092915050565b60006020820190508181036000830152613c0981613713565b9050919050565b60006020820190508181036000830152613c2981613736565b9050919050565b60006020820190508181036000830152613c4981613759565b9050919050565b60006020820190508181036000830152613c698161377c565b9050919050565b60006020820190508181036000830152613c898161379f565b9050919050565b60006020820190508181036000830152613ca9816137c2565b9050919050565b60006020820190508181036000830152613cc9816137e5565b9050919050565b60006020820190508181036000830152613ce981613808565b9050919050565b60006020820190508181036000830152613d098161382b565b9050919050565b60006020820190508181036000830152613d298161384e565b9050919050565b60006020820190508181036000830152613d4981613871565b9050919050565b60006020820190508181036000830152613d6981613894565b9050919050565b60006020820190508181036000830152613d89816138b7565b9050919050565b60006020820190508181036000830152613da9816138da565b9050919050565b60006020820190508181036000830152613dc9816138fd565b9050919050565b60006020820190508181036000830152613de981613920565b9050919050565b60006020820190508181036000830152613e0981613943565b9050919050565b60006020820190508181036000830152613e2981613966565b9050919050565b60006020820190508181036000830152613e4981613989565b9050919050565b60006020820190508181036000830152613e69816139ac565b9050919050565b60006020820190508181036000830152613e89816139cf565b9050919050565b60006020820190508181036000830152613ea9816139f2565b9050919050565b60006020820190508181036000830152613ec981613a15565b9050919050565b60006020820190508181036000830152613ee981613a5b565b9050919050565b60006020820190508181036000830152613f0981613aa1565b9050919050565b6000602082019050613f256000830184613ac4565b92915050565b6000613f35613f46565b9050613f418282614226565b919050565b6000604051905090565b600067ffffffffffffffff821115613f6b57613f6a6143bc565b5b613f74826143ff565b9050602081019050919050565b600067ffffffffffffffff821115613f9c57613f9b6143bc565b5b613fa5826143ff565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b60006140008261417e565b915061400b8361417e565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff038211156140405761403f6142d1565b5b828201905092915050565b60006140568261417e565b91506140618361417e565b92508261407157614070614300565b5b828204905092915050565b60006140878261417e565b91506140928361417e565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156140cb576140ca6142d1565b5b828202905092915050565b60006140e18261417e565b91506140ec8361417e565b9250828210156140ff576140fe6142d1565b5b828203905092915050565b60006141158261415e565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156141b557808201518184015260208101905061419a565b838111156141c4576000848401525b50505050565b60006141d58261417e565b915060008214156141e9576141e86142d1565b5b600182039050919050565b6000600282049050600182168061420c57607f821691505b602082108114156142205761421f61432f565b5b50919050565b61422f826143ff565b810181811067ffffffffffffffff8211171561424e5761424d6143bc565b5b80604052505050565b60006142628261417e565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff821415614295576142946142d1565b5b600182019050919050565b60006142ab8261417e565b91506142b68361417e565b9250826142c6576142c5614300565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f464d54413159523a204d6573736167652053656e64657220726571756972657360008201527f204d494e5445525f524f4c450000000000000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f464d54413159523a204d7573742062652041444d494e00000000000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f464d54413159523a204d6573736167652053656e64657220726571756972657360008201527f20454449545f5552495f524f4c45000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f464d54413159523a204d696e74696e67204c696d697420526561636865642100600082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b614b3e8161410a565b8114614b4957600080fd5b50565b614b558161411c565b8114614b6057600080fd5b50565b614b6c81614128565b8114614b7757600080fd5b50565b614b8381614132565b8114614b8e57600080fd5b50565b614b9a8161417e565b8114614ba557600080fd5b5056fea2646970667358221220a9c2e60a1792ddeea3489ee3569283bea633ba4618309d5855252038742689fa64736f6c63430008070033

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

0000000000000000000000000000000000000000000000000000000000000014

-----Decoded View---------------
Arg [0] : _initialSupplyCap (uint256): 20

-----Encoded View---------------
1 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000014


Deployed Bytecode Sourcemap

71749:2618:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73266:254;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50757:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52316:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;51839:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72869:227;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64214:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53206:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35834:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40896:196;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;63882:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;71947:18;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41481:205;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53616:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;62392:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;73108:146;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;64404:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72319:52;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72244:68;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50451:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50181:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72783:74;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;40351:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34719:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;50926:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;72173:64;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33810:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52609:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;72380:391;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53872:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74066:292;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;40670:134;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;41185:201;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;52975:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;73266:254;73447:4;73476:36;73500:11;73476:23;:36::i;:::-;73469:43;;73266:254;;;:::o;50757:100::-;50811:13;50844:5;50837:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50757:100;:::o;52316:221::-;52392:7;52420:16;52428:7;52420;:16::i;:::-;52412:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;52505:15;:24;52521:7;52505:24;;;;;;;;;;;;;;;;;;;;;52498:31;;52316:221;;;:::o;51839:411::-;51920:13;51936:23;51951:7;51936:14;:23::i;:::-;51920:39;;51984:5;51978:11;;:2;:11;;;;51970:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;52078:5;52062:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;52087:37;52104:5;52111:12;:10;:12::i;:::-;52087:16;:37::i;:::-;52062:62;52040:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;52221:21;52230:2;52234:7;52221:8;:21::i;:::-;51909:341;51839:411;;:::o;72869:227::-;72959:35;72285:27;72983:10;72959:7;:35::i;:::-;72951:94;;;;;;;;;;;;:::i;:::-;;;;;;;;;73056:32;73069:7;73078:9;73056:12;:32::i;:::-;72869:227;;:::o;64214:113::-;64275:7;64302:10;:17;;;;64295:24;;64214:113;:::o;53206:339::-;53401:41;53420:12;:10;:12::i;:::-;53434:7;53401:18;:41::i;:::-;53393:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;53509:28;53519:4;53525:2;53529:7;53509:9;:28::i;:::-;53206:339;;;:::o;35834:123::-;35900:7;35927:6;:12;35934:4;35927:12;;;;;;;;;;;:22;;;35920:29;;35834:123;;;:::o;40896:196::-;41012:30;41028:4;41034:7;41012:15;:30::i;:::-;41053:31;41076:7;41053:12;:18;41066:4;41053:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;40896:196;;:::o;63882:256::-;63979:7;64015:23;64032:5;64015:16;:23::i;:::-;64007:5;:31;63999:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;64104:12;:19;64117:5;64104:19;;;;;;;;;;;;;;;:26;64124:5;64104:26;;;;;;;;;;;;64097:33;;63882:256;;;;:::o;71947:18::-;;;;:::o;41481:205::-;41600:33;41619:4;41625:7;41600:18;:33::i;:::-;41644:34;41670:7;41644:12;:18;41657:4;41644:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;41481:205;;:::o;53616:185::-;53754:39;53771:4;53777:2;53781:7;53754:39;;;;;;;;;;;;:16;:39::i;:::-;53616:185;;;:::o;62392:245::-;62510:41;62529:12;:10;:12::i;:::-;62543:7;62510:18;:41::i;:::-;62502:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;62615:14;62621:7;62615:5;:14::i;:::-;62392:245;:::o;73108:146::-;73168:27;72352:19;73184:10;73168:7;:27::i;:::-;73160:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;73239:7;73233:3;:13;;;;73108:146;:::o;64404:233::-;64479:7;64515:30;:28;:30::i;:::-;64507:5;:38;64499:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;64612:10;64623:5;64612:17;;;;;;;;:::i;:::-;;;;;;;;;;64605:24;;64404:233;;;:::o;72319:52::-;72352:19;72319:52;:::o;72244:68::-;72285:27;72244:68;:::o;50451:239::-;50523:7;50543:13;50559:7;:16;50567:7;50559:16;;;;;;;;;;;;;;;;;;;;;50543:32;;50611:1;50594:19;;:5;:19;;;;50586:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;50677:5;50670:12;;;50451:239;;;:::o;50181:208::-;50253:7;50298:1;50281:19;;:5;:19;;;;50273:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;50365:9;:16;50375:5;50365:16;;;;;;;;;;;;;;;;50358:23;;50181:208;;;:::o;72783:74::-;72836:13;72841:7;72836:4;:13::i;:::-;72783:74;:::o;40351:145::-;40433:7;40460:28;40482:5;40460:12;:18;40473:4;40460:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;40453:35;;40351:145;;;;:::o;34719:139::-;34797:4;34821:6;:12;34828:4;34821:12;;;;;;;;;;;:20;;:29;34842:7;34821:29;;;;;;;;;;;;;;;;;;;;;;;;;34814:36;;34719:139;;;;:::o;50926:104::-;50982:13;51015:7;51008:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;50926:104;:::o;72173:64::-;72212:25;72173:64;:::o;33810:49::-;33855:4;33810:49;;;:::o;52609:295::-;52724:12;:10;:12::i;:::-;52712:24;;:8;:24;;;;52704:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;52824:8;52779:18;:32;52798:12;:10;:12::i;:::-;52779:32;;;;;;;;;;;;;;;:42;52812:8;52779:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;52877:8;52848:48;;52863:12;:10;:12::i;:::-;52848:48;;;52887:8;52848:48;;;;;;:::i;:::-;;;;;;;;52609:295;;:::o;72380:391::-;72459:7;72487:33;72212:25;72509:10;72487:7;:33::i;:::-;72479:90;;;;;;;;;;;;:::i;:::-;;;;;;;;;72580:21;:9;:19;:21::i;:::-;72612:17;72632:19;:9;:17;:19::i;:::-;72612:39;;72662:27;72668:9;72679;72662:5;:27::i;:::-;72700:34;72713:9;72724;72700:12;:34::i;:::-;72754:9;72747:16;;;72380:391;;;;:::o;53872:328::-;54047:41;54066:12;:10;:12::i;:::-;54080:7;54047:18;:41::i;:::-;54039:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;54153:39;54167:4;54173:2;54177:7;54186:5;54153:13;:39::i;:::-;53872:328;;;;:::o;74066:292::-;74205:13;74239:16;74247:7;74239;:16::i;:::-;74231:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;74327:23;74342:7;74327:14;:23::i;:::-;74320:30;;74066:292;;;:::o;40670:134::-;40742:7;40769:27;:12;:18;40782:4;40769:18;;;;;;;;;;;:25;:27::i;:::-;40762:34;;40670:134;;;:::o;41185:201::-;41302:31;41319:4;41325:7;41302:16;:31::i;:::-;41344:34;41370:7;41344:12;:18;41357:4;41344:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;41185:201;;:::o;52975:164::-;53072:4;53096:18;:25;53115:5;53096:25;;;;;;;;;;;;;;;:35;53122:8;53096:35;;;;;;;;;;;;;;;;;;;;;;;;;53089:42;;52975:164;;;;:::o;38068:112::-;38147:25;38158:4;38164:7;38147:10;:25::i;:::-;38068:112;;:::o;7837:152::-;7907:4;7931:50;7936:3;:10;;7972:5;7956:23;;7948:32;;7931:4;:50::i;:::-;7924:57;;7837:152;;;;:::o;63574:224::-;63676:4;63715:35;63700:50;;;:11;:50;;;;:90;;;;63754:36;63778:11;63754:23;:36::i;:::-;63700:90;63693:97;;63574:224;;;:::o;55710:127::-;55775:4;55827:1;55799:30;;:7;:16;55807:7;55799:16;;;;;;;;;;;;;;;;;;;;;:30;;;;55792:37;;55710:127;;;:::o;20824:98::-;20877:7;20904:10;20897:17;;20824:98;:::o;59692:174::-;59794:2;59767:15;:24;59783:7;59767:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;59850:7;59846:2;59812:46;;59821:23;59836:7;59821:14;:23::i;:::-;59812:46;;;;;;;;;;;;59692:174;;:::o;70987:217::-;71087:16;71095:7;71087;:16::i;:::-;71079:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;71187:9;71165:10;:19;71176:7;71165:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;70987:217;;:::o;56004:348::-;56097:4;56122:16;56130:7;56122;:16::i;:::-;56114:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;56198:13;56214:23;56229:7;56214:14;:23::i;:::-;56198:39;;56267:5;56256:16;;:7;:16;;;:51;;;;56300:7;56276:31;;:20;56288:7;56276:11;:20::i;:::-;:31;;;56256:51;:87;;;;56311:32;56328:5;56335:7;56311:16;:32::i;:::-;56256:87;56248:96;;;56004:348;;;;:::o;58996:578::-;59155:4;59128:31;;:23;59143:7;59128:14;:23::i;:::-;:31;;;59120:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;59238:1;59224:16;;:2;:16;;;;59216:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;59294:39;59315:4;59321:2;59325:7;59294:20;:39::i;:::-;59398:29;59415:1;59419:7;59398:8;:29::i;:::-;59459:1;59440:9;:15;59450:4;59440:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;59488:1;59471:9;:13;59481:2;59471:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;59519:2;59500:7;:16;59508:7;59500:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;59558:7;59554:2;59539:27;;59548:4;59539:27;;;;;;;;;;;;58996:578;;;:::o;36219:147::-;36302:18;36315:4;36302:12;:18::i;:::-;34301:30;34312:4;34318:12;:10;:12::i;:::-;34301:10;:30::i;:::-;36333:25:::1;36344:4;36350:7;36333:10;:25::i;:::-;36219:147:::0;;;:::o;37267:218::-;37374:12;:10;:12::i;:::-;37363:23;;:7;:23;;;37355:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;37451:26;37463:4;37469:7;37451:11;:26::i;:::-;37267:218;;:::o;8165:158::-;8238:4;8262:53;8270:3;:10;;8306:5;8290:23;;8282:32;;8262:7;:53::i;:::-;8255:60;;8165:158;;;;:::o;73901:154::-;74027:20;74039:7;74027:11;:20::i;:::-;73901:154;:::o;9133:158::-;9207:7;9258:22;9262:3;:10;;9274:5;9258:3;:22::i;:::-;9250:31;;9227:56;;9133:158;;;;:::o;17658:127::-;17765:1;17747:7;:14;;;:19;;;;;;;;;;;17658:127;:::o;17536:114::-;17601:7;17628;:14;;;17621:21;;17536:114;;;:::o;57688:382::-;57782:1;57768:16;;:2;:16;;;;57760:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;57841:16;57849:7;57841;:16::i;:::-;57840:17;57832:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;57903:45;57932:1;57936:2;57940:7;57903:20;:45::i;:::-;57978:1;57961:9;:13;57971:2;57961:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;58009:2;57990:7;:16;57998:7;57990:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;58054:7;58050:2;58029:33;;58046:1;58029:33;;;;;;;;;;;;57688:382;;:::o;55082:315::-;55239:28;55249:4;55255:2;55259:7;55239:9;:28::i;:::-;55286:48;55309:4;55315:2;55319:7;55328:5;55286:22;:48::i;:::-;55278:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;55082:315;;;;:::o;70152:679::-;70225:13;70259:16;70267:7;70259;:16::i;:::-;70251:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;70342:23;70368:10;:19;70379:7;70368:19;;;;;;;;;;;70342:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;70398:18;70419:10;:8;:10::i;:::-;70398:31;;70527:1;70511:4;70505:18;:23;70501:72;;;70552:9;70545:16;;;;;;70501:72;70703:1;70683:9;70677:23;:27;70673:108;;;70752:4;70758:9;70735:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;70721:48;;;;;;70673:108;70800:23;70815:7;70800:14;:23::i;:::-;70793:30;;;;70152:679;;;;:::o;8662:117::-;8725:7;8752:19;8760:3;:10;;8752:7;:19::i;:::-;8745:26;;8662:117;;;:::o;36611:149::-;36695:18;36708:4;36695:12;:18::i;:::-;34301:30;34312:4;34318:12;:10;:12::i;:::-;34301:10;:30::i;:::-;36726:26:::1;36738:4;36744:7;36726:11;:26::i;:::-;36611:149:::0;;;:::o;38571:229::-;38646:22;38654:4;38660:7;38646;:22::i;:::-;38641:152;;38717:4;38685:6;:12;38692:4;38685:12;;;;;;;;;;;:20;;:29;38706:7;38685:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;38768:12;:10;:12::i;:::-;38741:40;;38759:7;38741:40;;38753:4;38741:40;;;;;;;;;;38641:152;38571:229;;:::o;1752:414::-;1815:4;1837:21;1847:3;1852:5;1837:9;:21::i;:::-;1832:327;;1875:3;:11;;1892:5;1875:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2058:3;:11;;:18;;;;2036:3;:12;;:19;2049:5;2036:19;;;;;;;;;;;:40;;;;2098:4;2091:11;;;;1832:327;2142:5;2135:12;;1752:414;;;;;:::o;49812:305::-;49914:4;49966:25;49951:40;;;:11;:40;;;;:105;;;;50023:33;50008:48;;;:11;:48;;;;49951:105;:158;;;;50073:36;50097:11;50073:23;:36::i;:::-;49951:158;49931:178;;49812:305;;;:::o;73532:357::-;73698:45;73725:4;73731:2;73735:7;73698:26;:45::i;:::-;73785:1;73769:18;;:4;:18;;;73765:117;;;73830:3;;73813:13;:11;:13::i;:::-;:20;;73805:64;;;;;;;;;;;;:::i;:::-;;;;;;;;;73765:117;73532:357;;;:::o;35148:497::-;35229:22;35237:4;35243:7;35229;:22::i;:::-;35224:414;;35417:41;35445:7;35417:41;;35455:2;35417:19;:41::i;:::-;35531:38;35559:4;35551:13;;35566:2;35531:19;:38::i;:::-;35322:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;35268:358;;;;;;;;;;;:::i;:::-;;;;;;;;35224:414;35148:497;;:::o;38808:230::-;38883:22;38891:4;38897:7;38883;:22::i;:::-;38879:152;;;38954:5;38922:6;:12;38929:4;38922:12;;;;;;;;;;;:20;;:29;38943:7;38922:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;39006:12;:10;:12::i;:::-;38979:40;;38997:7;38979:40;;38991:4;38979:40;;;;;;;;;;38879:152;38808:230;;:::o;2342:1420::-;2408:4;2526:18;2547:3;:12;;:19;2560:5;2547:19;;;;;;;;;;;;2526:40;;2597:1;2583:10;:15;2579:1176;;2958:21;2995:1;2982:10;:14;;;;:::i;:::-;2958:38;;3011:17;3052:1;3031:3;:11;;:18;;;;:22;;;;:::i;:::-;3011:42;;3087:13;3074:9;:26;3070:405;;3121:17;3141:3;:11;;3153:9;3141:22;;;;;;;;:::i;:::-;;;;;;;;;;3121:42;;3295:9;3266:3;:11;;3278:13;3266:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3406:10;3380:3;:12;;:23;3393:9;3380:23;;;;;;;;;;;:36;;;;3102:373;3070:405;3556:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3651:3;:12;;:19;3664:5;3651:19;;;;;;;;;;;3644:26;;;3694:4;3687:11;;;;;;;2579:1176;3738:5;3731:12;;;2342:1420;;;;;:::o;71433:206::-;71502:20;71514:7;71502:11;:20::i;:::-;71576:1;71545:10;:19;71556:7;71545:19;;;;;;;;;;;71539:33;;;;;:::i;:::-;;;:38;71535:97;;71601:10;:19;71612:7;71601:19;;;;;;;;;;;;71594:26;;;;:::i;:::-;71535:97;71433:206;:::o;4526:120::-;4593:7;4620:3;:11;;4632:5;4620:18;;;;;;;;:::i;:::-;;;;;;;;;;4613:25;;4526:120;;;;:::o;60431:799::-;60586:4;60607:15;:2;:13;;;:15::i;:::-;60603:620;;;60659:2;60643:36;;;60680:12;:10;:12::i;:::-;60694:4;60700:7;60709:5;60643:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;60639:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;60902:1;60885:6;:13;:18;60881:272;;;60928:60;;;;;;;;;;:::i;:::-;;;;;;;;60881:272;61103:6;61097:13;61088:6;61084:2;61080:15;61073:38;60639:529;60776:41;;;60766:51;;;:6;:51;;;;60759:58;;;;;60603:620;61207:4;61200:11;;60431:799;;;;;;;:::o;51683:94::-;51734:13;51760:9;;;;;;;;;;;;;;51683:94;:::o;51101:334::-;51174:13;51208:16;51216:7;51208;:16::i;:::-;51200:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;51289:21;51313:10;:8;:10::i;:::-;51289:34;;51365:1;51347:7;51341:21;:25;:86;;;;;;;;;;;;;;;;;51393:7;51402:18;:7;:16;:18::i;:::-;51376:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51341:86;51334:93;;;51101:334;;;:::o;4063:109::-;4119:7;4146:3;:11;;:18;;;;4139:25;;4063:109;;;:::o;3848:129::-;3921:4;3968:1;3945:3;:12;;:19;3958:5;3945:19;;;;;;;;;;;;:24;;3938:31;;3848:129;;;;:::o;39538:214::-;39623:4;39662:42;39647:57;;;:11;:57;;;;:97;;;;39708:36;39732:11;39708:23;:36::i;:::-;39647:97;39640:104;;39538:214;;;:::o;65250:589::-;65394:45;65421:4;65427:2;65431:7;65394:26;:45::i;:::-;65472:1;65456:18;;:4;:18;;;65452:187;;;65491:40;65523:7;65491:31;:40::i;:::-;65452:187;;;65561:2;65553:10;;:4;:10;;;65549:90;;65580:47;65613:4;65619:7;65580:32;:47::i;:::-;65549:90;65452:187;65667:1;65653:16;;:2;:16;;;65649:183;;;65686:45;65723:7;65686:36;:45::i;:::-;65649:183;;;65759:4;65753:10;;:2;:10;;;65749:83;;65780:40;65808:2;65812:7;65780:27;:40::i;:::-;65749:83;65649:183;65250:589;;;:::o;19741:451::-;19816:13;19842:19;19887:1;19878:6;19874:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;19864:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;19842:47;;19900:15;:6;19907:1;19900:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;19926;:6;19933:1;19926:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;19957:9;19982:1;19973:6;19969:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;19957:26;;19952:135;19989:1;19985;:5;19952:135;;;20024:12;20045:3;20037:5;:11;20024:25;;;;;;;:::i;:::-;;;;;20012:6;20019:1;20012:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;20074:1;20064:11;;;;;19992:3;;;;:::i;:::-;;;19952:135;;;;20114:1;20105:5;:10;20097:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;20177:6;20163:21;;;19741:451;;;;:::o;58299:360::-;58359:13;58375:23;58390:7;58375:14;:23::i;:::-;58359:39;;58411:48;58432:5;58447:1;58451:7;58411:20;:48::i;:::-;58500:29;58517:1;58521:7;58500:8;:29::i;:::-;58562:1;58542:9;:16;58552:5;58542:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;58581:7;:16;58589:7;58581:16;;;;;;;;;;;;58574:23;;;;;;;;;;;58643:7;58639:1;58615:36;;58624:5;58615:36;;;;;;;;;;;;58348:311;58299:360;:::o;21804:387::-;21864:4;22072:12;22139:7;22127:20;22119:28;;22182:1;22175:4;:8;22168:15;;;21804:387;;;:::o;18440:723::-;18496:13;18726:1;18717:5;:10;18713:53;;;18744:10;;;;;;;;;;;;;;;;;;;;;18713:53;18776:12;18791:5;18776:20;;18807:14;18832:78;18847:1;18839:4;:9;18832:78;;18865:8;;;;;:::i;:::-;;;;18896:2;18888:10;;;;;:::i;:::-;;;18832:78;;;18920:19;18952:6;18942:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;18920:39;;18970:154;18986:1;18977:5;:10;18970:154;;19014:1;19004:11;;;;;:::i;:::-;;;19081:2;19073:5;:10;;;;:::i;:::-;19060:2;:24;;;;:::i;:::-;19047:39;;19030:6;19037;19030:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;19110:2;19101:11;;;;;:::i;:::-;;;18970:154;;;19148:6;19134:21;;;;;18440:723;;;;:::o;34423:204::-;34508:4;34547:32;34532:47;;;:11;:47;;;;:87;;;;34583:36;34607:11;34583:23;:36::i;:::-;34532:87;34525:94;;34423:204;;;:::o;61802:126::-;;;;:::o;66562:164::-;66666:10;:17;;;;66639:15;:24;66655:7;66639:24;;;;;;;;;;;:44;;;;66694:10;66710:7;66694:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;66562:164;:::o;67353:988::-;67619:22;67669:1;67644:22;67661:4;67644:16;:22::i;:::-;:26;;;;:::i;:::-;67619:51;;67681:18;67702:17;:26;67720:7;67702:26;;;;;;;;;;;;67681:47;;67849:14;67835:10;:28;67831:328;;67880:19;67902:12;:18;67915:4;67902:18;;;;;;;;;;;;;;;:34;67921:14;67902:34;;;;;;;;;;;;67880:56;;67986:11;67953:12;:18;67966:4;67953:18;;;;;;;;;;;;;;;:30;67972:10;67953:30;;;;;;;;;;;:44;;;;68103:10;68070:17;:30;68088:11;68070:30;;;;;;;;;;;:43;;;;67865:294;67831:328;68255:17;:26;68273:7;68255:26;;;;;;;;;;;68248:33;;;68299:12;:18;68312:4;68299:18;;;;;;;;;;;;;;;:34;68318:14;68299:34;;;;;;;;;;;68292:41;;;67434:907;;67353:988;;:::o;68636:1079::-;68889:22;68934:1;68914:10;:17;;;;:21;;;;:::i;:::-;68889:46;;68946:18;68967:15;:24;68983:7;68967:24;;;;;;;;;;;;68946:45;;69318:19;69340:10;69351:14;69340:26;;;;;;;;:::i;:::-;;;;;;;;;;69318:48;;69404:11;69379:10;69390;69379:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;69515:10;69484:15;:28;69500:11;69484:28;;;;;;;;;;;:41;;;;69656:15;:24;69672:7;69656:24;;;;;;;;;;;69649:31;;;69691:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;68707:1008;;;68636:1079;:::o;66140:221::-;66225:14;66242:20;66259:2;66242:16;:20::i;:::-;66225:37;;66300:7;66273:12;:16;66286:2;66273:16;;;;;;;;;;;;;;;:24;66290:6;66273:24;;;;;;;;;;;:34;;;;66347:6;66318:17;:26;66336:7;66318:26;;;;;;;;;;;:35;;;;66214:147;66140:221;;:::o;31744:157::-;31829:4;31868:25;31853:40;;;:11;:40;;;;31846:47;;31744:157;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:410:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:112;;;280:79;;:::i;:::-;249:112;370:41;404:6;399:3;394;370:41;:::i;:::-;90:327;7:410;;;;;:::o;423:412::-;501:5;526:66;542:49;584:6;542:49;:::i;:::-;526:66;:::i;:::-;517:75;;615:6;608:5;601:21;653:4;646:5;642:16;691:3;682:6;677:3;673:16;670:25;667:112;;;698:79;;:::i;:::-;667:112;788:41;822:6;817:3;812;788:41;:::i;:::-;507:328;423:412;;;;;:::o;841:139::-;887:5;925:6;912:20;903:29;;941:33;968:5;941:33;:::i;:::-;841:139;;;;:::o;986:133::-;1029:5;1067:6;1054:20;1045:29;;1083:30;1107:5;1083:30;:::i;:::-;986:133;;;;:::o;1125:139::-;1171:5;1209:6;1196:20;1187:29;;1225:33;1252:5;1225:33;:::i;:::-;1125:139;;;;:::o;1270:137::-;1315:5;1353:6;1340:20;1331:29;;1369:32;1395:5;1369:32;:::i;:::-;1270:137;;;;:::o;1413:141::-;1469:5;1500:6;1494:13;1485:22;;1516:32;1542:5;1516:32;:::i;:::-;1413:141;;;;:::o;1573:338::-;1628:5;1677:3;1670:4;1662:6;1658:17;1654:27;1644:122;;1685:79;;:::i;:::-;1644:122;1802:6;1789:20;1827:78;1901:3;1893:6;1886:4;1878:6;1874:17;1827:78;:::i;:::-;1818:87;;1634:277;1573:338;;;;:::o;1931:340::-;1987:5;2036:3;2029:4;2021:6;2017:17;2013:27;2003:122;;2044:79;;:::i;:::-;2003:122;2161:6;2148:20;2186:79;2261:3;2253:6;2246:4;2238:6;2234:17;2186:79;:::i;:::-;2177:88;;1993:278;1931:340;;;;:::o;2277:139::-;2323:5;2361:6;2348:20;2339:29;;2377:33;2404:5;2377:33;:::i;:::-;2277:139;;;;:::o;2422:329::-;2481:6;2530:2;2518:9;2509:7;2505:23;2501:32;2498:119;;;2536:79;;:::i;:::-;2498:119;2656:1;2681:53;2726:7;2717:6;2706:9;2702:22;2681:53;:::i;:::-;2671:63;;2627:117;2422:329;;;;:::o;2757:474::-;2825:6;2833;2882:2;2870:9;2861:7;2857:23;2853:32;2850:119;;;2888:79;;:::i;:::-;2850:119;3008:1;3033:53;3078:7;3069:6;3058:9;3054:22;3033:53;:::i;:::-;3023:63;;2979:117;3135:2;3161:53;3206:7;3197:6;3186:9;3182:22;3161:53;:::i;:::-;3151:63;;3106:118;2757:474;;;;;:::o;3237:619::-;3314:6;3322;3330;3379:2;3367:9;3358:7;3354:23;3350:32;3347:119;;;3385:79;;:::i;:::-;3347:119;3505:1;3530:53;3575:7;3566:6;3555:9;3551:22;3530:53;:::i;:::-;3520:63;;3476:117;3632:2;3658:53;3703:7;3694:6;3683:9;3679:22;3658:53;:::i;:::-;3648:63;;3603:118;3760:2;3786:53;3831:7;3822:6;3811:9;3807:22;3786:53;:::i;:::-;3776:63;;3731:118;3237:619;;;;;:::o;3862:943::-;3957:6;3965;3973;3981;4030:3;4018:9;4009:7;4005:23;4001:33;3998:120;;;4037:79;;:::i;:::-;3998:120;4157:1;4182:53;4227:7;4218:6;4207:9;4203:22;4182:53;:::i;:::-;4172:63;;4128:117;4284:2;4310:53;4355:7;4346:6;4335:9;4331:22;4310:53;:::i;:::-;4300:63;;4255:118;4412:2;4438:53;4483:7;4474:6;4463:9;4459:22;4438:53;:::i;:::-;4428:63;;4383:118;4568:2;4557:9;4553:18;4540:32;4599:18;4591:6;4588:30;4585:117;;;4621:79;;:::i;:::-;4585:117;4726:62;4780:7;4771:6;4760:9;4756:22;4726:62;:::i;:::-;4716:72;;4511:287;3862:943;;;;;;;:::o;4811:468::-;4876:6;4884;4933:2;4921:9;4912:7;4908:23;4904:32;4901:119;;;4939:79;;:::i;:::-;4901:119;5059:1;5084:53;5129:7;5120:6;5109:9;5105:22;5084:53;:::i;:::-;5074:63;;5030:117;5186:2;5212:50;5254:7;5245:6;5234:9;5230:22;5212:50;:::i;:::-;5202:60;;5157:115;4811:468;;;;;:::o;5285:654::-;5363:6;5371;5420:2;5408:9;5399:7;5395:23;5391:32;5388:119;;;5426:79;;:::i;:::-;5388:119;5546:1;5571:53;5616:7;5607:6;5596:9;5592:22;5571:53;:::i;:::-;5561:63;;5517:117;5701:2;5690:9;5686:18;5673:32;5732:18;5724:6;5721:30;5718:117;;;5754:79;;:::i;:::-;5718:117;5859:63;5914:7;5905:6;5894:9;5890:22;5859:63;:::i;:::-;5849:73;;5644:288;5285:654;;;;;:::o;5945:474::-;6013:6;6021;6070:2;6058:9;6049:7;6045:23;6041:32;6038:119;;;6076:79;;:::i;:::-;6038:119;6196:1;6221:53;6266:7;6257:6;6246:9;6242:22;6221:53;:::i;:::-;6211:63;;6167:117;6323:2;6349:53;6394:7;6385:6;6374:9;6370:22;6349:53;:::i;:::-;6339:63;;6294:118;5945:474;;;;;:::o;6425:329::-;6484:6;6533:2;6521:9;6512:7;6508:23;6504:32;6501:119;;;6539:79;;:::i;:::-;6501:119;6659:1;6684:53;6729:7;6720:6;6709:9;6705:22;6684:53;:::i;:::-;6674:63;;6630:117;6425:329;;;;:::o;6760:474::-;6828:6;6836;6885:2;6873:9;6864:7;6860:23;6856:32;6853:119;;;6891:79;;:::i;:::-;6853:119;7011:1;7036:53;7081:7;7072:6;7061:9;7057:22;7036:53;:::i;:::-;7026:63;;6982:117;7138:2;7164:53;7209:7;7200:6;7189:9;7185:22;7164:53;:::i;:::-;7154:63;;7109:118;6760:474;;;;;:::o;7240:::-;7308:6;7316;7365:2;7353:9;7344:7;7340:23;7336:32;7333:119;;;7371:79;;:::i;:::-;7333:119;7491:1;7516:53;7561:7;7552:6;7541:9;7537:22;7516:53;:::i;:::-;7506:63;;7462:117;7618:2;7644:53;7689:7;7680:6;7669:9;7665:22;7644:53;:::i;:::-;7634:63;;7589:118;7240:474;;;;;:::o;7720:327::-;7778:6;7827:2;7815:9;7806:7;7802:23;7798:32;7795:119;;;7833:79;;:::i;:::-;7795:119;7953:1;7978:52;8022:7;8013:6;8002:9;7998:22;7978:52;:::i;:::-;7968:62;;7924:116;7720:327;;;;:::o;8053:349::-;8122:6;8171:2;8159:9;8150:7;8146:23;8142:32;8139:119;;;8177:79;;:::i;:::-;8139:119;8297:1;8322:63;8377:7;8368:6;8357:9;8353:22;8322:63;:::i;:::-;8312:73;;8268:127;8053:349;;;;:::o;8408:329::-;8467:6;8516:2;8504:9;8495:7;8491:23;8487:32;8484:119;;;8522:79;;:::i;:::-;8484:119;8642:1;8667:53;8712:7;8703:6;8692:9;8688:22;8667:53;:::i;:::-;8657:63;;8613:117;8408:329;;;;:::o;8743:654::-;8821:6;8829;8878:2;8866:9;8857:7;8853:23;8849:32;8846:119;;;8884:79;;:::i;:::-;8846:119;9004:1;9029:53;9074:7;9065:6;9054:9;9050:22;9029:53;:::i;:::-;9019:63;;8975:117;9159:2;9148:9;9144:18;9131:32;9190:18;9182:6;9179:30;9176:117;;;9212:79;;:::i;:::-;9176:117;9317:63;9372:7;9363:6;9352:9;9348:22;9317:63;:::i;:::-;9307:73;;9102:288;8743:654;;;;;:::o;9403:118::-;9490:24;9508:5;9490:24;:::i;:::-;9485:3;9478:37;9403:118;;:::o;9527:109::-;9608:21;9623:5;9608:21;:::i;:::-;9603:3;9596:34;9527:109;;:::o;9642:118::-;9729:24;9747:5;9729:24;:::i;:::-;9724:3;9717:37;9642:118;;:::o;9766:360::-;9852:3;9880:38;9912:5;9880:38;:::i;:::-;9934:70;9997:6;9992:3;9934:70;:::i;:::-;9927:77;;10013:52;10058:6;10053:3;10046:4;10039:5;10035:16;10013:52;:::i;:::-;10090:29;10112:6;10090:29;:::i;:::-;10085:3;10081:39;10074:46;;9856:270;9766:360;;;;:::o;10132:364::-;10220:3;10248:39;10281:5;10248:39;:::i;:::-;10303:71;10367:6;10362:3;10303:71;:::i;:::-;10296:78;;10383:52;10428:6;10423:3;10416:4;10409:5;10405:16;10383:52;:::i;:::-;10460:29;10482:6;10460:29;:::i;:::-;10455:3;10451:39;10444:46;;10224:272;10132:364;;;;:::o;10502:377::-;10608:3;10636:39;10669:5;10636:39;:::i;:::-;10691:89;10773:6;10768:3;10691:89;:::i;:::-;10684:96;;10789:52;10834:6;10829:3;10822:4;10815:5;10811:16;10789:52;:::i;:::-;10866:6;10861:3;10857:16;10850:23;;10612:267;10502:377;;;;:::o;10885:366::-;11027:3;11048:67;11112:2;11107:3;11048:67;:::i;:::-;11041:74;;11124:93;11213:3;11124:93;:::i;:::-;11242:2;11237:3;11233:12;11226:19;;10885:366;;;:::o;11257:::-;11399:3;11420:67;11484:2;11479:3;11420:67;:::i;:::-;11413:74;;11496:93;11585:3;11496:93;:::i;:::-;11614:2;11609:3;11605:12;11598:19;;11257:366;;;:::o;11629:::-;11771:3;11792:67;11856:2;11851:3;11792:67;:::i;:::-;11785:74;;11868:93;11957:3;11868:93;:::i;:::-;11986:2;11981:3;11977:12;11970:19;;11629:366;;;:::o;12001:::-;12143:3;12164:67;12228:2;12223:3;12164:67;:::i;:::-;12157:74;;12240:93;12329:3;12240:93;:::i;:::-;12358:2;12353:3;12349:12;12342:19;;12001:366;;;:::o;12373:::-;12515:3;12536:67;12600:2;12595:3;12536:67;:::i;:::-;12529:74;;12612:93;12701:3;12612:93;:::i;:::-;12730:2;12725:3;12721:12;12714:19;;12373:366;;;:::o;12745:::-;12887:3;12908:67;12972:2;12967:3;12908:67;:::i;:::-;12901:74;;12984:93;13073:3;12984:93;:::i;:::-;13102:2;13097:3;13093:12;13086:19;;12745:366;;;:::o;13117:::-;13259:3;13280:67;13344:2;13339:3;13280:67;:::i;:::-;13273:74;;13356:93;13445:3;13356:93;:::i;:::-;13474:2;13469:3;13465:12;13458:19;;13117:366;;;:::o;13489:::-;13631:3;13652:67;13716:2;13711:3;13652:67;:::i;:::-;13645:74;;13728:93;13817:3;13728:93;:::i;:::-;13846:2;13841:3;13837:12;13830:19;;13489:366;;;:::o;13861:::-;14003:3;14024:67;14088:2;14083:3;14024:67;:::i;:::-;14017:74;;14100:93;14189:3;14100:93;:::i;:::-;14218:2;14213:3;14209:12;14202:19;;13861:366;;;:::o;14233:::-;14375:3;14396:67;14460:2;14455:3;14396:67;:::i;:::-;14389:74;;14472:93;14561:3;14472:93;:::i;:::-;14590:2;14585:3;14581:12;14574:19;;14233:366;;;:::o;14605:::-;14747:3;14768:67;14832:2;14827:3;14768:67;:::i;:::-;14761:74;;14844:93;14933:3;14844:93;:::i;:::-;14962:2;14957:3;14953:12;14946:19;;14605:366;;;:::o;14977:::-;15119:3;15140:67;15204:2;15199:3;15140:67;:::i;:::-;15133:74;;15216:93;15305:3;15216:93;:::i;:::-;15334:2;15329:3;15325:12;15318:19;;14977:366;;;:::o;15349:::-;15491:3;15512:67;15576:2;15571:3;15512:67;:::i;:::-;15505:74;;15588:93;15677:3;15588:93;:::i;:::-;15706:2;15701:3;15697:12;15690:19;;15349:366;;;:::o;15721:::-;15863:3;15884:67;15948:2;15943:3;15884:67;:::i;:::-;15877:74;;15960:93;16049:3;15960:93;:::i;:::-;16078:2;16073:3;16069:12;16062:19;;15721:366;;;:::o;16093:::-;16235:3;16256:67;16320:2;16315:3;16256:67;:::i;:::-;16249:74;;16332:93;16421:3;16332:93;:::i;:::-;16450:2;16445:3;16441:12;16434:19;;16093:366;;;:::o;16465:::-;16607:3;16628:67;16692:2;16687:3;16628:67;:::i;:::-;16621:74;;16704:93;16793:3;16704:93;:::i;:::-;16822:2;16817:3;16813:12;16806:19;;16465:366;;;:::o;16837:::-;16979:3;17000:67;17064:2;17059:3;17000:67;:::i;:::-;16993:74;;17076:93;17165:3;17076:93;:::i;:::-;17194:2;17189:3;17185:12;17178:19;;16837:366;;;:::o;17209:::-;17351:3;17372:67;17436:2;17431:3;17372:67;:::i;:::-;17365:74;;17448:93;17537:3;17448:93;:::i;:::-;17566:2;17561:3;17557:12;17550:19;;17209:366;;;:::o;17581:::-;17723:3;17744:67;17808:2;17803:3;17744:67;:::i;:::-;17737:74;;17820:93;17909:3;17820:93;:::i;:::-;17938:2;17933:3;17929:12;17922:19;;17581:366;;;:::o;17953:::-;18095:3;18116:67;18180:2;18175:3;18116:67;:::i;:::-;18109:74;;18192:93;18281:3;18192:93;:::i;:::-;18310:2;18305:3;18301:12;18294:19;;17953:366;;;:::o;18325:::-;18467:3;18488:67;18552:2;18547:3;18488:67;:::i;:::-;18481:74;;18564:93;18653:3;18564:93;:::i;:::-;18682:2;18677:3;18673:12;18666:19;;18325:366;;;:::o;18697:::-;18839:3;18860:67;18924:2;18919:3;18860:67;:::i;:::-;18853:74;;18936:93;19025:3;18936:93;:::i;:::-;19054:2;19049:3;19045:12;19038:19;;18697:366;;;:::o;19069:::-;19211:3;19232:67;19296:2;19291:3;19232:67;:::i;:::-;19225:74;;19308:93;19397:3;19308:93;:::i;:::-;19426:2;19421:3;19417:12;19410:19;;19069:366;;;:::o;19441:402::-;19601:3;19622:85;19704:2;19699:3;19622:85;:::i;:::-;19615:92;;19716:93;19805:3;19716:93;:::i;:::-;19834:2;19829:3;19825:12;19818:19;;19441:402;;;:::o;19849:366::-;19991:3;20012:67;20076:2;20071:3;20012:67;:::i;:::-;20005:74;;20088:93;20177:3;20088:93;:::i;:::-;20206:2;20201:3;20197:12;20190:19;;19849:366;;;:::o;20221:402::-;20381:3;20402:85;20484:2;20479:3;20402:85;:::i;:::-;20395:92;;20496:93;20585:3;20496:93;:::i;:::-;20614:2;20609:3;20605:12;20598:19;;20221:402;;;:::o;20629:366::-;20771:3;20792:67;20856:2;20851:3;20792:67;:::i;:::-;20785:74;;20868:93;20957:3;20868:93;:::i;:::-;20986:2;20981:3;20977:12;20970:19;;20629:366;;;:::o;21001:118::-;21088:24;21106:5;21088:24;:::i;:::-;21083:3;21076:37;21001:118;;:::o;21125:435::-;21305:3;21327:95;21418:3;21409:6;21327:95;:::i;:::-;21320:102;;21439:95;21530:3;21521:6;21439:95;:::i;:::-;21432:102;;21551:3;21544:10;;21125:435;;;;;:::o;21566:967::-;21948:3;21970:148;22114:3;21970:148;:::i;:::-;21963:155;;22135:95;22226:3;22217:6;22135:95;:::i;:::-;22128:102;;22247:148;22391:3;22247:148;:::i;:::-;22240:155;;22412:95;22503:3;22494:6;22412:95;:::i;:::-;22405:102;;22524:3;22517:10;;21566:967;;;;;:::o;22539:222::-;22632:4;22670:2;22659:9;22655:18;22647:26;;22683:71;22751:1;22740:9;22736:17;22727:6;22683:71;:::i;:::-;22539:222;;;;:::o;22767:640::-;22962:4;23000:3;22989:9;22985:19;22977:27;;23014:71;23082:1;23071:9;23067:17;23058:6;23014:71;:::i;:::-;23095:72;23163:2;23152:9;23148:18;23139:6;23095:72;:::i;:::-;23177;23245:2;23234:9;23230:18;23221:6;23177:72;:::i;:::-;23296:9;23290:4;23286:20;23281:2;23270:9;23266:18;23259:48;23324:76;23395:4;23386:6;23324:76;:::i;:::-;23316:84;;22767:640;;;;;;;:::o;23413:210::-;23500:4;23538:2;23527:9;23523:18;23515:26;;23551:65;23613:1;23602:9;23598:17;23589:6;23551:65;:::i;:::-;23413:210;;;;:::o;23629:222::-;23722:4;23760:2;23749:9;23745:18;23737:26;;23773:71;23841:1;23830:9;23826:17;23817:6;23773:71;:::i;:::-;23629:222;;;;:::o;23857:313::-;23970:4;24008:2;23997:9;23993:18;23985:26;;24057:9;24051:4;24047:20;24043:1;24032:9;24028:17;24021:47;24085:78;24158:4;24149:6;24085:78;:::i;:::-;24077:86;;23857:313;;;;:::o;24176:419::-;24342:4;24380:2;24369:9;24365:18;24357:26;;24429:9;24423:4;24419:20;24415:1;24404:9;24400:17;24393:47;24457:131;24583:4;24457:131;:::i;:::-;24449:139;;24176:419;;;:::o;24601:::-;24767:4;24805:2;24794:9;24790:18;24782:26;;24854:9;24848:4;24844:20;24840:1;24829:9;24825:17;24818:47;24882:131;25008:4;24882:131;:::i;:::-;24874:139;;24601:419;;;:::o;25026:::-;25192:4;25230:2;25219:9;25215:18;25207:26;;25279:9;25273:4;25269:20;25265:1;25254:9;25250:17;25243:47;25307:131;25433:4;25307:131;:::i;:::-;25299:139;;25026:419;;;:::o;25451:::-;25617:4;25655:2;25644:9;25640:18;25632:26;;25704:9;25698:4;25694:20;25690:1;25679:9;25675:17;25668:47;25732:131;25858:4;25732:131;:::i;:::-;25724:139;;25451:419;;;:::o;25876:::-;26042:4;26080:2;26069:9;26065:18;26057:26;;26129:9;26123:4;26119:20;26115:1;26104:9;26100:17;26093:47;26157:131;26283:4;26157:131;:::i;:::-;26149:139;;25876:419;;;:::o;26301:::-;26467:4;26505:2;26494:9;26490:18;26482:26;;26554:9;26548:4;26544:20;26540:1;26529:9;26525:17;26518:47;26582:131;26708:4;26582:131;:::i;:::-;26574:139;;26301:419;;;:::o;26726:::-;26892:4;26930:2;26919:9;26915:18;26907:26;;26979:9;26973:4;26969:20;26965:1;26954:9;26950:17;26943:47;27007:131;27133:4;27007:131;:::i;:::-;26999:139;;26726:419;;;:::o;27151:::-;27317:4;27355:2;27344:9;27340:18;27332:26;;27404:9;27398:4;27394:20;27390:1;27379:9;27375:17;27368:47;27432:131;27558:4;27432:131;:::i;:::-;27424:139;;27151:419;;;:::o;27576:::-;27742:4;27780:2;27769:9;27765:18;27757:26;;27829:9;27823:4;27819:20;27815:1;27804:9;27800:17;27793:47;27857:131;27983:4;27857:131;:::i;:::-;27849:139;;27576:419;;;:::o;28001:::-;28167:4;28205:2;28194:9;28190:18;28182:26;;28254:9;28248:4;28244:20;28240:1;28229:9;28225:17;28218:47;28282:131;28408:4;28282:131;:::i;:::-;28274:139;;28001:419;;;:::o;28426:::-;28592:4;28630:2;28619:9;28615:18;28607:26;;28679:9;28673:4;28669:20;28665:1;28654:9;28650:17;28643:47;28707:131;28833:4;28707:131;:::i;:::-;28699:139;;28426:419;;;:::o;28851:::-;29017:4;29055:2;29044:9;29040:18;29032:26;;29104:9;29098:4;29094:20;29090:1;29079:9;29075:17;29068:47;29132:131;29258:4;29132:131;:::i;:::-;29124:139;;28851:419;;;:::o;29276:::-;29442:4;29480:2;29469:9;29465:18;29457:26;;29529:9;29523:4;29519:20;29515:1;29504:9;29500:17;29493:47;29557:131;29683:4;29557:131;:::i;:::-;29549:139;;29276:419;;;:::o;29701:::-;29867:4;29905:2;29894:9;29890:18;29882:26;;29954:9;29948:4;29944:20;29940:1;29929:9;29925:17;29918:47;29982:131;30108:4;29982:131;:::i;:::-;29974:139;;29701:419;;;:::o;30126:::-;30292:4;30330:2;30319:9;30315:18;30307:26;;30379:9;30373:4;30369:20;30365:1;30354:9;30350:17;30343:47;30407:131;30533:4;30407:131;:::i;:::-;30399:139;;30126:419;;;:::o;30551:::-;30717:4;30755:2;30744:9;30740:18;30732:26;;30804:9;30798:4;30794:20;30790:1;30779:9;30775:17;30768:47;30832:131;30958:4;30832:131;:::i;:::-;30824:139;;30551:419;;;:::o;30976:::-;31142:4;31180:2;31169:9;31165:18;31157:26;;31229:9;31223:4;31219:20;31215:1;31204:9;31200:17;31193:47;31257:131;31383:4;31257:131;:::i;:::-;31249:139;;30976:419;;;:::o;31401:::-;31567:4;31605:2;31594:9;31590:18;31582:26;;31654:9;31648:4;31644:20;31640:1;31629:9;31625:17;31618:47;31682:131;31808:4;31682:131;:::i;:::-;31674:139;;31401:419;;;:::o;31826:::-;31992:4;32030:2;32019:9;32015:18;32007:26;;32079:9;32073:4;32069:20;32065:1;32054:9;32050:17;32043:47;32107:131;32233:4;32107:131;:::i;:::-;32099:139;;31826:419;;;:::o;32251:::-;32417:4;32455:2;32444:9;32440:18;32432:26;;32504:9;32498:4;32494:20;32490:1;32479:9;32475:17;32468:47;32532:131;32658:4;32532:131;:::i;:::-;32524:139;;32251:419;;;:::o;32676:::-;32842:4;32880:2;32869:9;32865:18;32857:26;;32929:9;32923:4;32919:20;32915:1;32904:9;32900:17;32893:47;32957:131;33083:4;32957:131;:::i;:::-;32949:139;;32676:419;;;:::o;33101:::-;33267:4;33305:2;33294:9;33290:18;33282:26;;33354:9;33348:4;33344:20;33340:1;33329:9;33325:17;33318:47;33382:131;33508:4;33382:131;:::i;:::-;33374:139;;33101:419;;;:::o;33526:::-;33692:4;33730:2;33719:9;33715:18;33707:26;;33779:9;33773:4;33769:20;33765:1;33754:9;33750:17;33743:47;33807:131;33933:4;33807:131;:::i;:::-;33799:139;;33526:419;;;:::o;33951:::-;34117:4;34155:2;34144:9;34140:18;34132:26;;34204:9;34198:4;34194:20;34190:1;34179:9;34175:17;34168:47;34232:131;34358:4;34232:131;:::i;:::-;34224:139;;33951:419;;;:::o;34376:::-;34542:4;34580:2;34569:9;34565:18;34557:26;;34629:9;34623:4;34619:20;34615:1;34604:9;34600:17;34593:47;34657:131;34783:4;34657:131;:::i;:::-;34649:139;;34376:419;;;:::o;34801:222::-;34894:4;34932:2;34921:9;34917:18;34909:26;;34945:71;35013:1;35002:9;34998:17;34989:6;34945:71;:::i;:::-;34801:222;;;;:::o;35029:129::-;35063:6;35090:20;;:::i;:::-;35080:30;;35119:33;35147:4;35139:6;35119:33;:::i;:::-;35029:129;;;:::o;35164:75::-;35197:6;35230:2;35224:9;35214:19;;35164:75;:::o;35245:307::-;35306:4;35396:18;35388:6;35385:30;35382:56;;;35418:18;;:::i;:::-;35382:56;35456:29;35478:6;35456:29;:::i;:::-;35448:37;;35540:4;35534;35530:15;35522:23;;35245:307;;;:::o;35558:308::-;35620:4;35710:18;35702:6;35699:30;35696:56;;;35732:18;;:::i;:::-;35696:56;35770:29;35792:6;35770:29;:::i;:::-;35762:37;;35854:4;35848;35844:15;35836:23;;35558:308;;;:::o;35872:98::-;35923:6;35957:5;35951:12;35941:22;;35872:98;;;:::o;35976:99::-;36028:6;36062:5;36056:12;36046:22;;35976:99;;;:::o;36081:168::-;36164:11;36198:6;36193:3;36186:19;36238:4;36233:3;36229:14;36214:29;;36081:168;;;;:::o;36255:169::-;36339:11;36373:6;36368:3;36361:19;36413:4;36408:3;36404:14;36389:29;;36255:169;;;;:::o;36430:148::-;36532:11;36569:3;36554:18;;36430:148;;;;:::o;36584:305::-;36624:3;36643:20;36661:1;36643:20;:::i;:::-;36638:25;;36677:20;36695:1;36677:20;:::i;:::-;36672:25;;36831:1;36763:66;36759:74;36756:1;36753:81;36750:107;;;36837:18;;:::i;:::-;36750:107;36881:1;36878;36874:9;36867:16;;36584:305;;;;:::o;36895:185::-;36935:1;36952:20;36970:1;36952:20;:::i;:::-;36947:25;;36986:20;37004:1;36986:20;:::i;:::-;36981:25;;37025:1;37015:35;;37030:18;;:::i;:::-;37015:35;37072:1;37069;37065:9;37060:14;;36895:185;;;;:::o;37086:348::-;37126:7;37149:20;37167:1;37149:20;:::i;:::-;37144:25;;37183:20;37201:1;37183:20;:::i;:::-;37178:25;;37371:1;37303:66;37299:74;37296:1;37293:81;37288:1;37281:9;37274:17;37270:105;37267:131;;;37378:18;;:::i;:::-;37267:131;37426:1;37423;37419:9;37408:20;;37086:348;;;;:::o;37440:191::-;37480:4;37500:20;37518:1;37500:20;:::i;:::-;37495:25;;37534:20;37552:1;37534:20;:::i;:::-;37529:25;;37573:1;37570;37567:8;37564:34;;;37578:18;;:::i;:::-;37564:34;37623:1;37620;37616:9;37608:17;;37440:191;;;;:::o;37637:96::-;37674:7;37703:24;37721:5;37703:24;:::i;:::-;37692:35;;37637:96;;;:::o;37739:90::-;37773:7;37816:5;37809:13;37802:21;37791:32;;37739:90;;;:::o;37835:77::-;37872:7;37901:5;37890:16;;37835:77;;;:::o;37918:149::-;37954:7;37994:66;37987:5;37983:78;37972:89;;37918:149;;;:::o;38073:126::-;38110:7;38150:42;38143:5;38139:54;38128:65;;38073:126;;;:::o;38205:77::-;38242:7;38271:5;38260:16;;38205:77;;;:::o;38288:154::-;38372:6;38367:3;38362;38349:30;38434:1;38425:6;38420:3;38416:16;38409:27;38288:154;;;:::o;38448:307::-;38516:1;38526:113;38540:6;38537:1;38534:13;38526:113;;;38625:1;38620:3;38616:11;38610:18;38606:1;38601:3;38597:11;38590:39;38562:2;38559:1;38555:10;38550:15;;38526:113;;;38657:6;38654:1;38651:13;38648:101;;;38737:1;38728:6;38723:3;38719:16;38712:27;38648:101;38497:258;38448:307;;;:::o;38761:171::-;38800:3;38823:24;38841:5;38823:24;:::i;:::-;38814:33;;38869:4;38862:5;38859:15;38856:41;;;38877:18;;:::i;:::-;38856:41;38924:1;38917:5;38913:13;38906:20;;38761:171;;;:::o;38938:320::-;38982:6;39019:1;39013:4;39009:12;38999:22;;39066:1;39060:4;39056:12;39087:18;39077:81;;39143:4;39135:6;39131:17;39121:27;;39077:81;39205:2;39197:6;39194:14;39174:18;39171:38;39168:84;;;39224:18;;:::i;:::-;39168:84;38989:269;38938:320;;;:::o;39264:281::-;39347:27;39369:4;39347:27;:::i;:::-;39339:6;39335:40;39477:6;39465:10;39462:22;39441:18;39429:10;39426:34;39423:62;39420:88;;;39488:18;;:::i;:::-;39420:88;39528:10;39524:2;39517:22;39307:238;39264:281;;:::o;39551:233::-;39590:3;39613:24;39631:5;39613:24;:::i;:::-;39604:33;;39659:66;39652:5;39649:77;39646:103;;;39729:18;;:::i;:::-;39646:103;39776:1;39769:5;39765:13;39758:20;;39551:233;;;:::o;39790:176::-;39822:1;39839:20;39857:1;39839:20;:::i;:::-;39834:25;;39873:20;39891:1;39873:20;:::i;:::-;39868:25;;39912:1;39902:35;;39917:18;;:::i;:::-;39902:35;39958:1;39955;39951:9;39946:14;;39790:176;;;;:::o;39972:180::-;40020:77;40017:1;40010:88;40117:4;40114:1;40107:15;40141:4;40138:1;40131:15;40158:180;40206:77;40203:1;40196:88;40303:4;40300:1;40293:15;40327:4;40324:1;40317:15;40344:180;40392:77;40389:1;40382:88;40489:4;40486:1;40479:15;40513:4;40510:1;40503:15;40530:180;40578:77;40575:1;40568:88;40675:4;40672:1;40665:15;40699:4;40696:1;40689:15;40716:180;40764:77;40761:1;40754:88;40861:4;40858:1;40851:15;40885:4;40882:1;40875:15;40902:180;40950:77;40947:1;40940:88;41047:4;41044:1;41037:15;41071:4;41068:1;41061:15;41088:117;41197:1;41194;41187:12;41211:117;41320:1;41317;41310:12;41334:117;41443:1;41440;41433:12;41457:117;41566:1;41563;41556:12;41580:102;41621:6;41672:2;41668:7;41663:2;41656:5;41652:14;41648:28;41638:38;;41580:102;;;:::o;41688:182::-;41828:34;41824:1;41816:6;41812:14;41805:58;41688:182;:::o;41876:231::-;42016:34;42012:1;42004:6;42000:14;41993:58;42085:14;42080:2;42072:6;42068:15;42061:39;41876:231;:::o;42113:230::-;42253:34;42249:1;42241:6;42237:14;42230:58;42322:13;42317:2;42309:6;42305:15;42298:38;42113:230;:::o;42349:237::-;42489:34;42485:1;42477:6;42473:14;42466:58;42558:20;42553:2;42545:6;42541:15;42534:45;42349:237;:::o;42592:178::-;42732:30;42728:1;42720:6;42716:14;42709:54;42592:178;:::o;42776:223::-;42916:34;42912:1;42904:6;42900:14;42893:58;42985:6;42980:2;42972:6;42968:15;42961:31;42776:223;:::o;43005:175::-;43145:27;43141:1;43133:6;43129:14;43122:51;43005:175;:::o;43186:172::-;43326:24;43322:1;43314:6;43310:14;43303:48;43186:172;:::o;43364:231::-;43504:34;43500:1;43492:6;43488:14;43481:58;43573:14;43568:2;43560:6;43556:15;43549:39;43364:231;:::o;43601:243::-;43741:34;43737:1;43729:6;43725:14;43718:58;43810:26;43805:2;43797:6;43793:15;43786:51;43601:243;:::o;43850:229::-;43990:34;43986:1;43978:6;43974:14;43967:58;44059:12;44054:2;44046:6;44042:15;44035:37;43850:229;:::o;44085:228::-;44225:34;44221:1;44213:6;44209:14;44202:58;44294:11;44289:2;44281:6;44277:15;44270:36;44085:228;:::o;44319:233::-;44459:34;44455:1;44447:6;44443:14;44436:58;44528:16;44523:2;44515:6;44511:15;44504:41;44319:233;:::o;44558:::-;44698:34;44694:1;44686:6;44682:14;44675:58;44767:16;44762:2;44754:6;44750:15;44743:41;44558:233;:::o;44797:182::-;44937:34;44933:1;44925:6;44921:14;44914:58;44797:182;:::o;44985:236::-;45125:34;45121:1;45113:6;45109:14;45102:58;45194:19;45189:2;45181:6;45177:15;45170:44;44985:236;:::o;45227:231::-;45367:34;45363:1;45355:6;45351:14;45344:58;45436:14;45431:2;45423:6;45419:15;45412:39;45227:231;:::o;45464:228::-;45604:34;45600:1;45592:6;45588:14;45581:58;45673:11;45668:2;45660:6;45656:15;45649:36;45464:228;:::o;45698:234::-;45838:34;45834:1;45826:6;45822:14;45815:58;45907:17;45902:2;45894:6;45890:15;45883:42;45698:234;:::o;45938:181::-;46078:33;46074:1;46066:6;46062:14;46055:57;45938:181;:::o;46125:220::-;46265:34;46261:1;46253:6;46249:14;46242:58;46334:3;46329:2;46321:6;46317:15;46310:28;46125:220;:::o;46351:236::-;46491:34;46487:1;46479:6;46475:14;46468:58;46560:19;46555:2;46547:6;46543:15;46536:44;46351:236;:::o;46593:231::-;46733:34;46729:1;46721:6;46717:14;46710:58;46802:14;46797:2;46789:6;46785:15;46778:39;46593:231;:::o;46830:173::-;46970:25;46966:1;46958:6;46954:14;46947:49;46830:173;:::o;47009:235::-;47149:34;47145:1;47137:6;47133:14;47126:58;47218:18;47213:2;47205:6;47201:15;47194:43;47009:235;:::o;47250:167::-;47390:19;47386:1;47378:6;47374:14;47367:43;47250:167;:::o;47423:234::-;47563:34;47559:1;47551:6;47547:14;47540:58;47632:17;47627:2;47619:6;47615:15;47608:42;47423:234;:::o;47663:122::-;47736:24;47754:5;47736:24;:::i;:::-;47729:5;47726:35;47716:63;;47775:1;47772;47765:12;47716:63;47663:122;:::o;47791:116::-;47861:21;47876:5;47861:21;:::i;:::-;47854:5;47851:32;47841:60;;47897:1;47894;47887:12;47841:60;47791:116;:::o;47913:122::-;47986:24;48004:5;47986:24;:::i;:::-;47979:5;47976:35;47966:63;;48025:1;48022;48015:12;47966:63;47913:122;:::o;48041:120::-;48113:23;48130:5;48113:23;:::i;:::-;48106:5;48103:34;48093:62;;48151:1;48148;48141:12;48093:62;48041:120;:::o;48167:122::-;48240:24;48258:5;48240:24;:::i;:::-;48233:5;48230:35;48220:63;;48279:1;48276;48269:12;48220:63;48167:122;:::o

Swarm Source

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