ETH Price: $3,361.77 (-1.61%)
Gas: 8 Gwei

Token

Dreamverse - Land (LAND)
 

Overview

Max Total Supply

717 LAND

Holders

317

Market

Volume (24H)

N/A

Min Price (24H)

N/A

Max Price (24H)

N/A
Balance
1 LAND
0x0b1B80Fa4f13D193E65779ca2Bb6431A55B1B4Cf
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:
ERC721PresetMinterPauserAutoId

Compiler Version
v0.8.7+commit.e28d00a7

Optimization Enabled:
No with 200 runs

Other Settings:
default evmVersion, MIT license

Contract Source Code (Solidity Multiple files format)

File 12 of 22: ERC721PresetMinterPauserAutoId.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/presets/ERC721PresetMinterPauserAutoId.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./ERC721Enumerable.sol";
import "./ERC721Burnable.sol";
import "./ERC721Pausable.sol";
import "./AccessControlEnumerable.sol";
import "./Context.sol";
import "./Counters.sol";

/**
 *  @dev {ERC721} token, including:
 *
 *  - ability for holders to burn (destroy) their tokens
 *  - a minter role that allows for token minting (creation)
 *  - a pauser role that allows to stop all token transfers
 *  - token ID and URI autogeneration
 *
 * This contract uses {AccessControl} to lock permissioned functions using the
 * different roles - head to its documentation for details.
 *
 * The account that deploys the contract will be granted the minter and pauser
 * roles, as well as the default admin role, which will let it grant both minter
 * and pauser roles to other accounts.
 */
contract ERC721PresetMinterPauserAutoId is
    Context,
    AccessControlEnumerable,
    ERC721Enumerable,
    ERC721Burnable,
    ERC721Pausable
{
    using Counters for Counters.Counter;

    bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE");
    bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE");

    Counters.Counter private _tokenIdTracker;

    string private _baseTokenURI;

    /**
     * @dev Grants `DEFAULT_ADMIN_ROLE`, `MINTER_ROLE` and `PAUSER_ROLE` to the
     * account that deploys the contract.
     *
     * Token URIs will be autogenerated based on `baseURI` and their token IDs.
     * See {ERC721-tokenURI}.
     */
    constructor(
        string memory name,
        string memory symbol,
        string memory baseTokenURI
    ) ERC721(name, symbol) {
        _baseTokenURI = baseTokenURI;

        _setupRole(DEFAULT_ADMIN_ROLE, _msgSender());

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

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

    /**
     * @dev Creates a new token for `to`. Its token ID will be automatically
     * assigned (and available on the emitted {IERC721-Transfer} event), and the token
     * URI autogenerated based on the base URI passed at construction.
     *
     * See {ERC721-_mint}.
     *
     * Requirements:
     *
     * - the caller must have the `MINTER_ROLE`.
     */
    uint32 public total_area = 210180;

    function mint(address to) public virtual returns(uint256){
        require(hasRole(MINTER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have minter role to mint");
        require(total_area > 0, "Insufficient remaining saleable area");

        // We cannot just use balanceOf to create the new tokenId because tokens
        // can be burned (destroyed), so we need a separate counter.
        _tokenIdTracker.increment();
        uint256 tokenId = _tokenIdTracker.current();
        _mint(to, tokenId);
        return tokenId;
    }

    function sold(uint32 area) public {
        require(hasRole(DEFAULT_ADMIN_ROLE, _msgSender()), "require admin role");
        require(total_area >= area, "Insufficient remaining saleable area");
        total_area -= area;
    }




    /**
     * @dev Pauses all token transfers.
     *
     * See {ERC721Pausable} and {Pausable-_pause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function pause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to pause");
        _pause();
    }

    /**
     * @dev Unpauses all token transfers.
     *
     * See {ERC721Pausable} and {Pausable-_unpause}.
     *
     * Requirements:
     *
     * - the caller must have the `PAUSER_ROLE`.
     */
    function unpause() public virtual {
        require(hasRole(PAUSER_ROLE, _msgSender()), "ERC721PresetMinterPauserAutoId: must have pauser role to unpause");
        _unpause();
    }

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

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

File 1 of 22: AccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/AccessControl.sol)

pragma solidity ^0.8.0;

import "./IAccessControl.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @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 revoked `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}.
     * ====
     *
     * NOTE: This function is deprecated in favor of {_grantRole}.
     */
    function _setupRole(bytes32 role, address account) internal virtual {
        _grantRole(role, account);
    }

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

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

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

File 2 of 22: AccessControlEnumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/AccessControlEnumerable.sol)

pragma solidity ^0.8.0;

import "./IAccessControlEnumerable.sol";
import "./AccessControl.sol";
import "./EnumerableSet.sol";

/**
 * @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) internal virtual override {
        super._grantRole(role, account);
        _roleMembers[role].add(account);
    }

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

File 3 of 22: Address.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 4 of 22: Context.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 5 of 22: Counters.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 6 of 22: EnumerableSet.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 7 of 22: ERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 8 of 22: ERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/ERC721.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";
import "./IERC721Receiver.sol";
import "./IERC721Metadata.sol";
import "./Address.sol";
import "./Context.sol";
import "./Strings.sol";
import "./ERC165.sol";

/**
 * @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 {
        _setApprovalForAll(_msgSender(), operator, approved);
    }

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

    /**
     * @dev See {IERC721-transferFrom}.
     */
    function transferFrom(
        address from,
        address to,
        uint256 tokenId
    ) public virtual override {
        //solhint-disable-next-line max-line-length
        require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: 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 Approve `operator` to operate on all of `owner` tokens
     *
     * Emits a {ApprovalForAll} event.
     */
    function _setApprovalForAll(
        address owner,
        address operator,
        bool approved
    ) internal virtual {
        require(owner != operator, "ERC721: approve to caller");
        _operatorApprovals[owner][operator] = approved;
        emit ApprovalForAll(owner, operator, approved);
    }

    /**
     * @dev 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 9 of 22: ERC721Burnable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Burnable.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Context.sol";

/**
 * @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 10 of 22: ERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./IERC721Enumerable.sol";

/**
 * @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 11 of 22: ERC721Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721Pausable.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";
import "./Pausable.sol";

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

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

File 13 of 22: ERC721URIStorage.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/ERC721URIStorage.sol)

pragma solidity ^0.8.0;

import "./ERC721.sol";

/**
 * @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 14 of 22: IAccessControl.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 15 of 22: IAccessControlEnumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (access/IAccessControlEnumerable.sol)

pragma solidity ^0.8.0;

import "./IAccessControl.sol";

/**
 * @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 16 of 22: IERC165.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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 17 of 22: IERC721.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721.sol)

pragma solidity ^0.8.0;

import "./IERC165.sol";

/**
 * @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 18 of 22: IERC721Enumerable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Enumerable.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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 19 of 22: IERC721Metadata.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/extensions/IERC721Metadata.sol)

pragma solidity ^0.8.0;

import "./IERC721.sol";

/**
 * @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 20 of 22: IERC721Receiver.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (token/ERC721/IERC721Receiver.sol)

pragma solidity ^0.8.0;

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

File 21 of 22: Pausable.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (security/Pausable.sol)

pragma solidity ^0.8.0;

import "./Context.sol";

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

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

    bool private _paused;

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

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

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

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

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

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

File 22 of 22: Strings.sol
// SPDX-License-Identifier: MIT
// OpenZeppelin Contracts v4.4.0 (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);
    }
}

Contract Security Audit

Contract ABI

[{"inputs":[{"internalType":"string","name":"name","type":"string"},{"internalType":"string","name":"symbol","type":"string"},{"internalType":"string","name":"baseTokenURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Unpaused","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"MINTER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"PAUSER_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"}],"name":"mint","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":[],"name":"pause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"paused","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"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":"uint32","name":"area","type":"uint32"}],"name":"sold","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":[],"name":"total_area","outputs":[{"internalType":"uint32","name":"","type":"uint32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"}]

608060405262033504600f60006101000a81548163ffffffff021916908363ffffffff1602179055503480156200003557600080fd5b50604051620052ed380380620052ed83398181016040528101906200005b919062000538565b82828160029080519060200190620000759291906200040a565b5080600390805190602001906200008e9291906200040a565b5050506000600c60006101000a81548160ff02191690831515021790555080600e9080519060200190620000c49291906200040a565b50620000e96000801b620000dd6200017460201b60201c565b6200017c60201b60201c565b6200012a7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a66200011e6200017460201b60201c565b6200017c60201b60201c565b6200016b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6200015f6200017460201b60201c565b6200017c60201b60201c565b50505062000775565b600033905090565b6200018e82826200019260201b60201c565b5050565b620001a98282620001da60201b6200138a1760201c565b620001d58160016000858152602001908152602001600020620002cb60201b6200146a1790919060201c565b505050565b620001ec82826200030360201b60201c565b620002c757600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506200026c6200017460201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000620002fb836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6200036d60201b60201c565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6000620003818383620003e760201b60201c565b620003dc578260000182908060018154018082558091505060019003906000526020600020016000909190919091505582600001805490508360010160008481526020019081526020016000208190555060019050620003e1565b600090505b92915050565b600080836001016000848152602001908152602001600020541415905092915050565b828054620004189062000686565b90600052602060002090601f0160209004810192826200043c576000855562000488565b82601f106200045757805160ff191683800117855562000488565b8280016001018555821562000488579182015b82811115620004875782518255916020019190600101906200046a565b5b5090506200049791906200049b565b5090565b5b80821115620004b65760008160009055506001016200049c565b5090565b6000620004d1620004cb846200061a565b620005f1565b905082815260208101848484011115620004f057620004ef62000755565b5b620004fd84828562000650565b509392505050565b600082601f8301126200051d576200051c62000750565b5b81516200052f848260208601620004ba565b91505092915050565b6000806000606084860312156200055457620005536200075f565b5b600084015167ffffffffffffffff8111156200057557620005746200075a565b5b620005838682870162000505565b935050602084015167ffffffffffffffff811115620005a757620005a66200075a565b5b620005b58682870162000505565b925050604084015167ffffffffffffffff811115620005d957620005d86200075a565b5b620005e78682870162000505565b9150509250925092565b6000620005fd62000610565b90506200060b8282620006bc565b919050565b6000604051905090565b600067ffffffffffffffff82111562000638576200063762000721565b5b620006438262000764565b9050602081019050919050565b60005b838110156200067057808201518184015260208101905062000653565b8381111562000680576000848401525b50505050565b600060028204905060018216806200069f57607f821691505b60208210811415620006b657620006b5620006f2565b5b50919050565b620006c78262000764565b810181811067ffffffffffffffff82111715620006e957620006e862000721565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b614b6880620007856000396000f3fe608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636a6278421161011a578063a22cb465116100ad578063d53913931161007c578063d5391393146105e8578063d547741f14610606578063e63ab1e914610622578063e985e9c514610640578063f44cc3e114610670576101fb565b8063a22cb46514610550578063b88d4fde1461056c578063c87b56dd14610588578063ca15c873146105b8576101fb565b80639010d07c116100e95780639010d07c146104b457806391d14854146104e457806395d89b4114610514578063a217fddf14610532576101fb565b80636a6278421461042c57806370a082311461045c5780637de74efe1461048c5780638456cb59146104aa576101fb565b80632f745c591161019257806342966c681161016157806342966c68146103925780634f6ccce7146103ae5780635c975abb146103de5780636352211e146103fc576101fb565b80632f745c591461032057806336568abe146103505780633f4ba83a1461036c57806342842e0e14610376576101fb565b806318160ddd116101ce57806318160ddd1461029a57806323b872dd146102b8578063248a9ca3146102d45780632f2ff15d14610304576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a600480360381019061021591906133c7565b61068c565b6040516102279190613a25565b60405180910390f35b61023861069e565b6040516102459190613a5b565b60405180910390f35b61026860048036038101906102639190613421565b610730565b60405161027591906139be565b60405180910390f35b610298600480360381019061029391906132da565b6107b5565b005b6102a26108cd565b6040516102af9190613ddd565b60405180910390f35b6102d260048036038101906102cd91906131c4565b6108da565b005b6102ee60048036038101906102e9919061331a565b61093a565b6040516102fb9190613a40565b60405180910390f35b61031e60048036038101906103199190613347565b610959565b005b61033a600480360381019061033591906132da565b610982565b6040516103479190613ddd565b60405180910390f35b61036a60048036038101906103659190613347565b610a27565b005b610374610aaa565b005b610390600480360381019061038b91906131c4565b610b24565b005b6103ac60048036038101906103a79190613421565b610b44565b005b6103c860048036038101906103c39190613421565b610ba0565b6040516103d59190613ddd565b60405180910390f35b6103e6610c11565b6040516103f39190613a25565b60405180910390f35b61041660048036038101906104119190613421565b610c28565b60405161042391906139be565b60405180910390f35b61044660048036038101906104419190613157565b610cda565b6040516104539190613ddd565b60405180910390f35b61047660048036038101906104719190613157565b610dd2565b6040516104839190613ddd565b60405180910390f35b610494610e8a565b6040516104a19190613df8565b60405180910390f35b6104b2610ea0565b005b6104ce60048036038101906104c99190613387565b610f1a565b6040516104db91906139be565b60405180910390f35b6104fe60048036038101906104f99190613347565b610f49565b60405161050b9190613a25565b60405180910390f35b61051c610fb3565b6040516105299190613a5b565b60405180910390f35b61053a611045565b6040516105479190613a40565b60405180910390f35b61056a6004803603810190610565919061329a565b61104c565b005b61058660048036038101906105819190613217565b611062565b005b6105a2600480360381019061059d9190613421565b6110c4565b6040516105af9190613a5b565b60405180910390f35b6105d260048036038101906105cd919061331a565b61116b565b6040516105df9190613ddd565b60405180910390f35b6105f061118f565b6040516105fd9190613a40565b60405180910390f35b610620600480360381019061061b9190613347565b6111b3565b005b61062a6111dc565b6040516106379190613a40565b60405180910390f35b61065a60048036038101906106559190613184565b611200565b6040516106679190613a25565b60405180910390f35b61068a6004803603810190610685919061344e565b611294565b005b60006106978261149a565b9050919050565b6060600280546106ad906140ef565b80601f01602080910402602001604051908101604052809291908181526020018280546106d9906140ef565b80156107265780601f106106fb57610100808354040283529160200191610726565b820191906000526020600020905b81548152906001019060200180831161070957829003601f168201915b5050505050905090565b600061073b82611514565b61077a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077190613c7d565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107c082610c28565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082890613cfd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610850611580565b73ffffffffffffffffffffffffffffffffffffffff16148061087f575061087e81610879611580565b611200565b5b6108be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b590613bfd565b60405180910390fd5b6108c88383611588565b505050565b6000600a80549050905090565b6108eb6108e5611580565b82611641565b61092a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092190613d1d565b60405180910390fd5b61093583838361171f565b505050565b6000806000838152602001908152602001600020600101549050919050565b6109628261093a565b6109738161096e611580565b61197b565b61097d8383611a18565b505050565b600061098d83610dd2565b82106109ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c590613add565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a2f611580565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9390613dbd565b60405180910390fd5b610aa68282611a4c565b5050565b610adb7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ad6611580565b610f49565b610b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1190613d9d565b60405180910390fd5b610b22611a80565b565b610b3f83838360405180602001604052806000815250611062565b505050565b610b55610b4f611580565b82611641565b610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b90613d7d565b60405180910390fd5b610b9d81611b22565b50565b6000610baa6108cd565b8210610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be290613d3d565b60405180910390fd5b600a8281548110610bff57610bfe614288565b5b90600052602060002001549050919050565b6000600c60009054906101000a900460ff16905090565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890613c3d565b60405180910390fd5b80915050919050565b6000610d0d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610d08611580565b610f49565b610d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4390613d5d565b60405180910390fd5b6000600f60009054906101000a900463ffffffff1663ffffffff1611610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90613cdd565b60405180910390fd5b610db1600d611c33565b6000610dbd600d611c49565b9050610dc98382611c57565b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a90613c1d565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f60009054906101000a900463ffffffff1681565b610ed17f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ecc611580565b610f49565b610f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0790613b3d565b60405180910390fd5b610f18611e25565b565b6000610f418260016000868152602001908152602001600020611ec890919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060038054610fc2906140ef565b80601f0160208091040260200160405190810160405280929190818152602001828054610fee906140ef565b801561103b5780601f106110105761010080835404028352916020019161103b565b820191906000526020600020905b81548152906001019060200180831161101e57829003601f168201915b5050505050905090565b6000801b81565b61105e611057611580565b8383611ee2565b5050565b61107361106d611580565b83611641565b6110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a990613d1d565b60405180910390fd5b6110be8484848461204f565b50505050565b60606110cf82611514565b61110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110590613cbd565b60405180910390fd5b60006111186120ab565b905060008151116111385760405180602001604052806000815250611163565b806111428461213d565b604051602001611153929190613960565b6040516020818303038152906040525b915050919050565b60006111886001600084815260200190815260200160002061229e565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6111bc8261093a565b6111cd816111c8611580565b61197b565b6111d78383611a4c565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112a86000801b6112a3611580565b610f49565b6112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112de90613bbd565b60405180910390fd5b8063ffffffff16600f60009054906101000a900463ffffffff1663ffffffff161015611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90613cdd565b60405180910390fd5b80600f60008282829054906101000a900463ffffffff166113699190613fc1565b92506101000a81548163ffffffff021916908363ffffffff16021790555050565b6113948282610f49565b61146657600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061140b611580565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611492836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6122b3565b905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061150d575061150c82612323565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115fb83610c28565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061164c82611514565b61168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168290613b9d565b60405180910390fd5b600061169683610c28565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061170557508373ffffffffffffffffffffffffffffffffffffffff166116ed84610730565b73ffffffffffffffffffffffffffffffffffffffff16145b8061171657506117158185611200565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661173f82610c28565b73ffffffffffffffffffffffffffffffffffffffff1614611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c90613c9d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc90613b5d565b60405180910390fd5b611810838383612405565b61181b600082611588565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461186b9190613f8d565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118c29190613eac565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6119858282610f49565b611a14576119aa8173ffffffffffffffffffffffffffffffffffffffff166014612415565b6119b88360001c6020612415565b6040516020016119c9929190613984565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0b9190613a5b565b60405180910390fd5b5050565b611a22828261138a565b611a47816001600085815260200190815260200160002061146a90919063ffffffff16565b505050565b611a568282612651565b611a7b816001600085815260200190815260200160002061273290919063ffffffff16565b505050565b611a88610c11565b611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe90613abd565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611b0b611580565b604051611b1891906139be565b60405180910390a1565b6000611b2d82610c28565b9050611b3b81600084612405565b611b46600083611588565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b969190613f8d565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90613c5d565b60405180910390fd5b611cd081611514565b15611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0790613b1d565b60405180910390fd5b611d1c60008383612405565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d6c9190613eac565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611e2d610c11565b15611e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6490613bdd565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611eb1611580565b604051611ebe91906139be565b60405180910390a1565b6000611ed78360000183612762565b60001c905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4890613b7d565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120429190613a25565b60405180910390a3505050565b61205a84848461171f565b6120668484848461278d565b6120a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209c90613afd565b60405180910390fd5b50505050565b6060600e80546120ba906140ef565b80601f01602080910402602001604051908101604052809291908181526020018280546120e6906140ef565b80156121335780601f1061210857610100808354040283529160200191612133565b820191906000526020600020905b81548152906001019060200180831161211657829003601f168201915b5050505050905090565b60606000821415612185576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612299565b600082905060005b600082146121b75780806121a090614152565b915050600a826121b09190613f02565b915061218d565b60008167ffffffffffffffff8111156121d3576121d26142b7565b5b6040519080825280601f01601f1916602001820160405280156122055781602001600182028036833780820191505090505b5090505b600085146122925760018261221e9190613f8d565b9150600a8561222d919061419b565b60306122399190613eac565b60f81b81838151811061224f5761224e614288565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561228b9190613f02565b9450612209565b8093505050505b919050565b60006122ac82600001612924565b9050919050565b60006122bf8383612935565b61231857826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061231d565b600090505b92915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123ee57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123fe57506123fd82612958565b5b9050919050565b6124108383836129d2565b505050565b6060600060028360026124289190613f33565b6124329190613eac565b67ffffffffffffffff81111561244b5761244a6142b7565b5b6040519080825280601f01601f19166020018201604052801561247d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106124b5576124b4614288565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061251957612518614288565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026125599190613f33565b6125639190613eac565b90505b6001811115612603577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106125a5576125a4614288565b5b1a60f81b8282815181106125bc576125bb614288565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806125fc906140c5565b9050612566565b5060008414612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263e90613a7d565b60405180910390fd5b8091505092915050565b61265b8282610f49565b1561272e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506126d3611580565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600061275a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612a2a565b905092915050565b600082600001828154811061277a57612779614288565b5b9060005260206000200154905092915050565b60006127ae8473ffffffffffffffffffffffffffffffffffffffff16612b3e565b15612917578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127d7611580565b8786866040518563ffffffff1660e01b81526004016127f994939291906139d9565b602060405180830381600087803b15801561281357600080fd5b505af192505050801561284457506040513d601f19601f8201168201806040525081019061284191906133f4565b60015b6128c7573d8060008114612874576040519150601f19603f3d011682016040523d82523d6000602084013e612879565b606091505b506000815114156128bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b690613afd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061291c565b600190505b949350505050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129cb57506129ca82612b51565b5b9050919050565b6129dd838383612bcb565b6129e5610c11565b15612a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1c90613a9d565b60405180910390fd5b505050565b60008083600101600084815260200190815260200160002054905060008114612b32576000600182612a5c9190613f8d565b9050600060018660000180549050612a749190613f8d565b9050818114612ae3576000866000018281548110612a9557612a94614288565b5b9060005260206000200154905080876000018481548110612ab957612ab8614288565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612af757612af6614259565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612b38565b60009150505b92915050565b600080823b905060008111915050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bc45750612bc382612cdf565b5b9050919050565b612bd6838383612d49565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c1957612c1481612d4e565b612c58565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c5757612c568382612d97565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c9b57612c9681612f04565b612cda565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612cd957612cd88282612fd5565b5b5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612da484610dd2565b612dae9190613f8d565b9050600060096000848152602001908152602001600020549050818114612e93576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612f189190613f8d565b90506000600b60008481526020019081526020016000205490506000600a8381548110612f4857612f47614288565b5b9060005260206000200154905080600a8381548110612f6a57612f69614288565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480612fb957612fb8614259565b5b6001900381819060005260206000200160009055905550505050565b6000612fe083610dd2565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b600061306761306284613e38565b613e13565b905082815260208101848484011115613083576130826142eb565b5b61308e848285614083565b509392505050565b6000813590506130a581614aa8565b92915050565b6000813590506130ba81614abf565b92915050565b6000813590506130cf81614ad6565b92915050565b6000813590506130e481614aed565b92915050565b6000815190506130f981614aed565b92915050565b600082601f830112613114576131136142e6565b5b8135613124848260208601613054565b91505092915050565b60008135905061313c81614b04565b92915050565b60008135905061315181614b1b565b92915050565b60006020828403121561316d5761316c6142f5565b5b600061317b84828501613096565b91505092915050565b6000806040838503121561319b5761319a6142f5565b5b60006131a985828601613096565b92505060206131ba85828601613096565b9150509250929050565b6000806000606084860312156131dd576131dc6142f5565b5b60006131eb86828701613096565b93505060206131fc86828701613096565b925050604061320d8682870161312d565b9150509250925092565b60008060008060808587031215613231576132306142f5565b5b600061323f87828801613096565b945050602061325087828801613096565b93505060406132618782880161312d565b925050606085013567ffffffffffffffff811115613282576132816142f0565b5b61328e878288016130ff565b91505092959194509250565b600080604083850312156132b1576132b06142f5565b5b60006132bf85828601613096565b92505060206132d0858286016130ab565b9150509250929050565b600080604083850312156132f1576132f06142f5565b5b60006132ff85828601613096565b92505060206133108582860161312d565b9150509250929050565b6000602082840312156133305761332f6142f5565b5b600061333e848285016130c0565b91505092915050565b6000806040838503121561335e5761335d6142f5565b5b600061336c858286016130c0565b925050602061337d85828601613096565b9150509250929050565b6000806040838503121561339e5761339d6142f5565b5b60006133ac858286016130c0565b92505060206133bd8582860161312d565b9150509250929050565b6000602082840312156133dd576133dc6142f5565b5b60006133eb848285016130d5565b91505092915050565b60006020828403121561340a576134096142f5565b5b6000613418848285016130ea565b91505092915050565b600060208284031215613437576134366142f5565b5b60006134458482850161312d565b91505092915050565b600060208284031215613464576134636142f5565b5b600061347284828501613142565b91505092915050565b61348481613ff5565b82525050565b61349381614007565b82525050565b6134a281614013565b82525050565b60006134b382613e69565b6134bd8185613e7f565b93506134cd818560208601614092565b6134d6816142fa565b840191505092915050565b60006134ec82613e74565b6134f68185613e90565b9350613506818560208601614092565b61350f816142fa565b840191505092915050565b600061352582613e74565b61352f8185613ea1565b935061353f818560208601614092565b80840191505092915050565b6000613558602083613e90565b91506135638261430b565b602082019050919050565b600061357b602b83613e90565b915061358682614334565b604082019050919050565b600061359e601483613e90565b91506135a982614383565b602082019050919050565b60006135c1602b83613e90565b91506135cc826143ac565b604082019050919050565b60006135e4603283613e90565b91506135ef826143fb565b604082019050919050565b6000613607601c83613e90565b91506136128261444a565b602082019050919050565b600061362a603e83613e90565b915061363582614473565b604082019050919050565b600061364d602483613e90565b9150613658826144c2565b604082019050919050565b6000613670601983613e90565b915061367b82614511565b602082019050919050565b6000613693602c83613e90565b915061369e8261453a565b604082019050919050565b60006136b6601283613e90565b91506136c182614589565b602082019050919050565b60006136d9601083613e90565b91506136e4826145b2565b602082019050919050565b60006136fc603883613e90565b9150613707826145db565b604082019050919050565b600061371f602a83613e90565b915061372a8261462a565b604082019050919050565b6000613742602983613e90565b915061374d82614679565b604082019050919050565b6000613765602083613e90565b9150613770826146c8565b602082019050919050565b6000613788602c83613e90565b9150613793826146f1565b604082019050919050565b60006137ab602983613e90565b91506137b682614740565b604082019050919050565b60006137ce602f83613e90565b91506137d98261478f565b604082019050919050565b60006137f1602483613e90565b91506137fc826147de565b604082019050919050565b6000613814602183613e90565b915061381f8261482d565b604082019050919050565b6000613837603183613e90565b91506138428261487c565b604082019050919050565b600061385a602c83613e90565b9150613865826148cb565b604082019050919050565b600061387d601783613ea1565b91506138888261491a565b601782019050919050565b60006138a0603d83613e90565b91506138ab82614943565b604082019050919050565b60006138c3603083613e90565b91506138ce82614992565b604082019050919050565b60006138e6604083613e90565b91506138f1826149e1565b604082019050919050565b6000613909601183613ea1565b915061391482614a30565b601182019050919050565b600061392c602f83613e90565b915061393782614a59565b604082019050919050565b61394b81614069565b82525050565b61395a81614073565b82525050565b600061396c828561351a565b9150613978828461351a565b91508190509392505050565b600061398f82613870565b915061399b828561351a565b91506139a6826138fc565b91506139b2828461351a565b91508190509392505050565b60006020820190506139d3600083018461347b565b92915050565b60006080820190506139ee600083018761347b565b6139fb602083018661347b565b613a086040830185613942565b8181036060830152613a1a81846134a8565b905095945050505050565b6000602082019050613a3a600083018461348a565b92915050565b6000602082019050613a556000830184613499565b92915050565b60006020820190508181036000830152613a7581846134e1565b905092915050565b60006020820190508181036000830152613a968161354b565b9050919050565b60006020820190508181036000830152613ab68161356e565b9050919050565b60006020820190508181036000830152613ad681613591565b9050919050565b60006020820190508181036000830152613af6816135b4565b9050919050565b60006020820190508181036000830152613b16816135d7565b9050919050565b60006020820190508181036000830152613b36816135fa565b9050919050565b60006020820190508181036000830152613b568161361d565b9050919050565b60006020820190508181036000830152613b7681613640565b9050919050565b60006020820190508181036000830152613b9681613663565b9050919050565b60006020820190508181036000830152613bb681613686565b9050919050565b60006020820190508181036000830152613bd6816136a9565b9050919050565b60006020820190508181036000830152613bf6816136cc565b9050919050565b60006020820190508181036000830152613c16816136ef565b9050919050565b60006020820190508181036000830152613c3681613712565b9050919050565b60006020820190508181036000830152613c5681613735565b9050919050565b60006020820190508181036000830152613c7681613758565b9050919050565b60006020820190508181036000830152613c968161377b565b9050919050565b60006020820190508181036000830152613cb68161379e565b9050919050565b60006020820190508181036000830152613cd6816137c1565b9050919050565b60006020820190508181036000830152613cf6816137e4565b9050919050565b60006020820190508181036000830152613d1681613807565b9050919050565b60006020820190508181036000830152613d368161382a565b9050919050565b60006020820190508181036000830152613d568161384d565b9050919050565b60006020820190508181036000830152613d7681613893565b9050919050565b60006020820190508181036000830152613d96816138b6565b9050919050565b60006020820190508181036000830152613db6816138d9565b9050919050565b60006020820190508181036000830152613dd68161391f565b9050919050565b6000602082019050613df26000830184613942565b92915050565b6000602082019050613e0d6000830184613951565b92915050565b6000613e1d613e2e565b9050613e298282614121565b919050565b6000604051905090565b600067ffffffffffffffff821115613e5357613e526142b7565b5b613e5c826142fa565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613eb782614069565b9150613ec283614069565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ef757613ef66141cc565b5b828201905092915050565b6000613f0d82614069565b9150613f1883614069565b925082613f2857613f276141fb565b5b828204905092915050565b6000613f3e82614069565b9150613f4983614069565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f8257613f816141cc565b5b828202905092915050565b6000613f9882614069565b9150613fa383614069565b925082821015613fb657613fb56141cc565b5b828203905092915050565b6000613fcc82614073565b9150613fd783614073565b925082821015613fea57613fe96141cc565b5b828203905092915050565b600061400082614049565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b838110156140b0578082015181840152602081019050614095565b838111156140bf576000848401525b50505050565b60006140d082614069565b915060008214156140e4576140e36141cc565b5b600182039050919050565b6000600282049050600182168061410757607f821691505b6020821081141561411b5761411a61422a565b5b50919050565b61412a826142fa565b810181811067ffffffffffffffff82111715614149576141486142b7565b5b80604052505050565b600061415d82614069565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141905761418f6141cc565b5b600182019050919050565b60006141a682614069565b91506141b183614069565b9250826141c1576141c06141fb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d75737420686176652070617573657220726f6c6520746f2070617573650000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f726571756972652061646d696e20726f6c650000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f496e73756666696369656e742072656d61696e696e672073616c6561626c652060008201527f6172656100000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d7573742068617665206d696e74657220726f6c6520746f206d696e74000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d75737420686176652070617573657220726f6c6520746f20756e7061757365602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b614ab181613ff5565b8114614abc57600080fd5b50565b614ac881614007565b8114614ad357600080fd5b50565b614adf81614013565b8114614aea57600080fd5b50565b614af68161401d565b8114614b0157600080fd5b50565b614b0d81614069565b8114614b1857600080fd5b50565b614b2481614073565b8114614b2f57600080fd5b5056fea26469706673582212203f8166f3682c7e0bf73e3bdbf8c904941357879bd1acc5a7e50d32f5c890c7c564736f6c63430008070033000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000011447265616d7665727365202d204c616e6400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044c414e4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004568747470733a2f2f73332e61702d6e6f727468656173742d322e616d617a6f6e6177732e636f6d2f6e66742e647265616d76657273652e70726f2f6c616e642f6a736f6e2f000000000000000000000000000000000000000000000000000000

Deployed Bytecode

0x608060405234801561001057600080fd5b50600436106101fb5760003560e01c80636a6278421161011a578063a22cb465116100ad578063d53913931161007c578063d5391393146105e8578063d547741f14610606578063e63ab1e914610622578063e985e9c514610640578063f44cc3e114610670576101fb565b8063a22cb46514610550578063b88d4fde1461056c578063c87b56dd14610588578063ca15c873146105b8576101fb565b80639010d07c116100e95780639010d07c146104b457806391d14854146104e457806395d89b4114610514578063a217fddf14610532576101fb565b80636a6278421461042c57806370a082311461045c5780637de74efe1461048c5780638456cb59146104aa576101fb565b80632f745c591161019257806342966c681161016157806342966c68146103925780634f6ccce7146103ae5780635c975abb146103de5780636352211e146103fc576101fb565b80632f745c591461032057806336568abe146103505780633f4ba83a1461036c57806342842e0e14610376576101fb565b806318160ddd116101ce57806318160ddd1461029a57806323b872dd146102b8578063248a9ca3146102d45780632f2ff15d14610304576101fb565b806301ffc9a71461020057806306fdde0314610230578063081812fc1461024e578063095ea7b31461027e575b600080fd5b61021a600480360381019061021591906133c7565b61068c565b6040516102279190613a25565b60405180910390f35b61023861069e565b6040516102459190613a5b565b60405180910390f35b61026860048036038101906102639190613421565b610730565b60405161027591906139be565b60405180910390f35b610298600480360381019061029391906132da565b6107b5565b005b6102a26108cd565b6040516102af9190613ddd565b60405180910390f35b6102d260048036038101906102cd91906131c4565b6108da565b005b6102ee60048036038101906102e9919061331a565b61093a565b6040516102fb9190613a40565b60405180910390f35b61031e60048036038101906103199190613347565b610959565b005b61033a600480360381019061033591906132da565b610982565b6040516103479190613ddd565b60405180910390f35b61036a60048036038101906103659190613347565b610a27565b005b610374610aaa565b005b610390600480360381019061038b91906131c4565b610b24565b005b6103ac60048036038101906103a79190613421565b610b44565b005b6103c860048036038101906103c39190613421565b610ba0565b6040516103d59190613ddd565b60405180910390f35b6103e6610c11565b6040516103f39190613a25565b60405180910390f35b61041660048036038101906104119190613421565b610c28565b60405161042391906139be565b60405180910390f35b61044660048036038101906104419190613157565b610cda565b6040516104539190613ddd565b60405180910390f35b61047660048036038101906104719190613157565b610dd2565b6040516104839190613ddd565b60405180910390f35b610494610e8a565b6040516104a19190613df8565b60405180910390f35b6104b2610ea0565b005b6104ce60048036038101906104c99190613387565b610f1a565b6040516104db91906139be565b60405180910390f35b6104fe60048036038101906104f99190613347565b610f49565b60405161050b9190613a25565b60405180910390f35b61051c610fb3565b6040516105299190613a5b565b60405180910390f35b61053a611045565b6040516105479190613a40565b60405180910390f35b61056a6004803603810190610565919061329a565b61104c565b005b61058660048036038101906105819190613217565b611062565b005b6105a2600480360381019061059d9190613421565b6110c4565b6040516105af9190613a5b565b60405180910390f35b6105d260048036038101906105cd919061331a565b61116b565b6040516105df9190613ddd565b60405180910390f35b6105f061118f565b6040516105fd9190613a40565b60405180910390f35b610620600480360381019061061b9190613347565b6111b3565b005b61062a6111dc565b6040516106379190613a40565b60405180910390f35b61065a60048036038101906106559190613184565b611200565b6040516106679190613a25565b60405180910390f35b61068a6004803603810190610685919061344e565b611294565b005b60006106978261149a565b9050919050565b6060600280546106ad906140ef565b80601f01602080910402602001604051908101604052809291908181526020018280546106d9906140ef565b80156107265780601f106106fb57610100808354040283529160200191610726565b820191906000526020600020905b81548152906001019060200180831161070957829003601f168201915b5050505050905090565b600061073b82611514565b61077a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161077190613c7d565b60405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b60006107c082610c28565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610831576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161082890613cfd565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610850611580565b73ffffffffffffffffffffffffffffffffffffffff16148061087f575061087e81610879611580565b611200565b5b6108be576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016108b590613bfd565b60405180910390fd5b6108c88383611588565b505050565b6000600a80549050905090565b6108eb6108e5611580565b82611641565b61092a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161092190613d1d565b60405180910390fd5b61093583838361171f565b505050565b6000806000838152602001908152602001600020600101549050919050565b6109628261093a565b6109738161096e611580565b61197b565b61097d8383611a18565b505050565b600061098d83610dd2565b82106109ce576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016109c590613add565b60405180910390fd5b600860008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610a2f611580565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610a9c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a9390613dbd565b60405180910390fd5b610aa68282611a4c565b5050565b610adb7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ad6611580565b610f49565b610b1a576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b1190613d9d565b60405180910390fd5b610b22611a80565b565b610b3f83838360405180602001604052806000815250611062565b505050565b610b55610b4f611580565b82611641565b610b94576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b8b90613d7d565b60405180910390fd5b610b9d81611b22565b50565b6000610baa6108cd565b8210610beb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610be290613d3d565b60405180910390fd5b600a8281548110610bff57610bfe614288565b5b90600052602060002001549050919050565b6000600c60009054906101000a900460ff16905090565b6000806004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415610cd1576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610cc890613c3d565b60405180910390fd5b80915050919050565b6000610d0d7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6610d08611580565b610f49565b610d4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d4390613d5d565b60405180910390fd5b6000600f60009054906101000a900463ffffffff1663ffffffff1611610da7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610d9e90613cdd565b60405180910390fd5b610db1600d611c33565b6000610dbd600d611c49565b9050610dc98382611c57565b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415610e43576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610e3a90613c1d565b60405180910390fd5b600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b600f60009054906101000a900463ffffffff1681565b610ed17f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a610ecc611580565b610f49565b610f10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610f0790613b3d565b60405180910390fd5b610f18611e25565b565b6000610f418260016000868152602001908152602001600020611ec890919063ffffffff16565b905092915050565b600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b606060038054610fc2906140ef565b80601f0160208091040260200160405190810160405280929190818152602001828054610fee906140ef565b801561103b5780601f106110105761010080835404028352916020019161103b565b820191906000526020600020905b81548152906001019060200180831161101e57829003601f168201915b5050505050905090565b6000801b81565b61105e611057611580565b8383611ee2565b5050565b61107361106d611580565b83611641565b6110b2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016110a990613d1d565b60405180910390fd5b6110be8484848461204f565b50505050565b60606110cf82611514565b61110e576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110590613cbd565b60405180910390fd5b60006111186120ab565b905060008151116111385760405180602001604052806000815250611163565b806111428461213d565b604051602001611153929190613960565b6040516020818303038152906040525b915050919050565b60006111886001600084815260200190815260200160002061229e565b9050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b6111bc8261093a565b6111cd816111c8611580565b61197b565b6111d78383611a4c565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6112a86000801b6112a3611580565b610f49565b6112e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016112de90613bbd565b60405180910390fd5b8063ffffffff16600f60009054906101000a900463ffffffff1663ffffffff161015611348576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161133f90613cdd565b60405180910390fd5b80600f60008282829054906101000a900463ffffffff166113699190613fc1565b92506101000a81548163ffffffff021916908363ffffffff16021790555050565b6113948282610f49565b61146657600160008084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff02191690831515021790555061140b611580565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000611492836000018373ffffffffffffffffffffffffffffffffffffffff1660001b6122b3565b905092915050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061150d575061150c82612323565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166004600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816006600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff166115fb83610c28565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b600061164c82611514565b61168b576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168290613b9d565b60405180910390fd5b600061169683610c28565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff16148061170557508373ffffffffffffffffffffffffffffffffffffffff166116ed84610730565b73ffffffffffffffffffffffffffffffffffffffff16145b8061171657506117158185611200565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff1661173f82610c28565b73ffffffffffffffffffffffffffffffffffffffff1614611795576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161178c90613c9d565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611805576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016117fc90613b5d565b60405180910390fd5b611810838383612405565b61181b600082611588565b6001600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600082825461186b9190613f8d565b925050819055506001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546118c29190613eac565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b6119858282610f49565b611a14576119aa8173ffffffffffffffffffffffffffffffffffffffff166014612415565b6119b88360001c6020612415565b6040516020016119c9929190613984565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611a0b9190613a5b565b60405180910390fd5b5050565b611a22828261138a565b611a47816001600085815260200190815260200160002061146a90919063ffffffff16565b505050565b611a568282612651565b611a7b816001600085815260200190815260200160002061273290919063ffffffff16565b505050565b611a88610c11565b611ac7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611abe90613abd565b60405180910390fd5b6000600c60006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa611b0b611580565b604051611b1891906139be565b60405180910390a1565b6000611b2d82610c28565b9050611b3b81600084612405565b611b46600083611588565b6001600560008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611b969190613f8d565b925050819055506004600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b6001816000016000828254019250508190555050565b600081600001549050919050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611cc7576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cbe90613c5d565b60405180910390fd5b611cd081611514565b15611d10576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611d0790613b1d565b60405180910390fd5b611d1c60008383612405565b6001600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611d6c9190613eac565b92505081905550816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b611e2d610c11565b15611e6d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e6490613bdd565b60405180910390fd5b6001600c60006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258611eb1611580565b604051611ebe91906139be565b60405180910390a1565b6000611ed78360000183612762565b60001c905092915050565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415611f51576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611f4890613b7d565b60405180910390fd5b80600760008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31836040516120429190613a25565b60405180910390a3505050565b61205a84848461171f565b6120668484848461278d565b6120a5576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209c90613afd565b60405180910390fd5b50505050565b6060600e80546120ba906140ef565b80601f01602080910402602001604051908101604052809291908181526020018280546120e6906140ef565b80156121335780601f1061210857610100808354040283529160200191612133565b820191906000526020600020905b81548152906001019060200180831161211657829003601f168201915b5050505050905090565b60606000821415612185576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050612299565b600082905060005b600082146121b75780806121a090614152565b915050600a826121b09190613f02565b915061218d565b60008167ffffffffffffffff8111156121d3576121d26142b7565b5b6040519080825280601f01601f1916602001820160405280156122055781602001600182028036833780820191505090505b5090505b600085146122925760018261221e9190613f8d565b9150600a8561222d919061419b565b60306122399190613eac565b60f81b81838151811061224f5761224e614288565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a8561228b9190613f02565b9450612209565b8093505050505b919050565b60006122ac82600001612924565b9050919050565b60006122bf8383612935565b61231857826000018290806001815401808255809150506001900390600052602060002001600090919091909150558260000180549050836001016000848152602001908152602001600020819055506001905061231d565b600090505b92915050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806123ee57507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b806123fe57506123fd82612958565b5b9050919050565b6124108383836129d2565b505050565b6060600060028360026124289190613f33565b6124329190613eac565b67ffffffffffffffff81111561244b5761244a6142b7565b5b6040519080825280601f01601f19166020018201604052801561247d5781602001600182028036833780820191505090505b5090507f3000000000000000000000000000000000000000000000000000000000000000816000815181106124b5576124b4614288565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f78000000000000000000000000000000000000000000000000000000000000008160018151811061251957612518614288565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600060018460026125599190613f33565b6125639190613eac565b90505b6001811115612603577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106125a5576125a4614288565b5b1a60f81b8282815181106125bc576125bb614288565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c9450806125fc906140c5565b9050612566565b5060008414612647576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161263e90613a7d565b60405180910390fd5b8091505092915050565b61265b8282610f49565b1561272e57600080600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506126d3611580565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600061275a836000018373ffffffffffffffffffffffffffffffffffffffff1660001b612a2a565b905092915050565b600082600001828154811061277a57612779614288565b5b9060005260206000200154905092915050565b60006127ae8473ffffffffffffffffffffffffffffffffffffffff16612b3e565b15612917578373ffffffffffffffffffffffffffffffffffffffff1663150b7a026127d7611580565b8786866040518563ffffffff1660e01b81526004016127f994939291906139d9565b602060405180830381600087803b15801561281357600080fd5b505af192505050801561284457506040513d601f19601f8201168201806040525081019061284191906133f4565b60015b6128c7573d8060008114612874576040519150601f19603f3d011682016040523d82523d6000602084013e612879565b606091505b506000815114156128bf576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016128b690613afd565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161491505061291c565b600190505b949350505050565b600081600001805490509050919050565b600080836001016000848152602001908152602001600020541415905092915050565b60007f5a05180f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806129cb57506129ca82612b51565b5b9050919050565b6129dd838383612bcb565b6129e5610c11565b15612a25576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a1c90613a9d565b60405180910390fd5b505050565b60008083600101600084815260200190815260200160002054905060008114612b32576000600182612a5c9190613f8d565b9050600060018660000180549050612a749190613f8d565b9050818114612ae3576000866000018281548110612a9557612a94614288565b5b9060005260206000200154905080876000018481548110612ab957612ab8614288565b5b90600052602060002001819055508387600101600083815260200190815260200160002081905550505b85600001805480612af757612af6614259565b5b600190038181906000526020600020016000905590558560010160008681526020019081526020016000206000905560019350505050612b38565b60009150505b92915050565b600080823b905060008111915050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480612bc45750612bc382612cdf565b5b9050919050565b612bd6838383612d49565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612c1957612c1481612d4e565b612c58565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612c5757612c568382612d97565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612c9b57612c9681612f04565b612cda565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612cd957612cd88282612fd5565b5b5b505050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b505050565b600a80549050600b600083815260200190815260200160002081905550600a81908060018154018082558091505060019003906000526020600020016000909190919091505550565b60006001612da484610dd2565b612dae9190613f8d565b9050600060096000848152602001908152602001600020549050818114612e93576000600860008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600860008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816009600083815260200190815260200160002081905550505b6009600084815260200190815260200160002060009055600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b60006001600a80549050612f189190613f8d565b90506000600b60008481526020019081526020016000205490506000600a8381548110612f4857612f47614288565b5b9060005260206000200154905080600a8381548110612f6a57612f69614288565b5b906000526020600020018190555081600b600083815260200190815260200160002081905550600b600085815260200190815260200160002060009055600a805480612fb957612fb8614259565b5b6001900381819060005260206000200160009055905550505050565b6000612fe083610dd2565b905081600860008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806009600084815260200190815260200160002081905550505050565b600061306761306284613e38565b613e13565b905082815260208101848484011115613083576130826142eb565b5b61308e848285614083565b509392505050565b6000813590506130a581614aa8565b92915050565b6000813590506130ba81614abf565b92915050565b6000813590506130cf81614ad6565b92915050565b6000813590506130e481614aed565b92915050565b6000815190506130f981614aed565b92915050565b600082601f830112613114576131136142e6565b5b8135613124848260208601613054565b91505092915050565b60008135905061313c81614b04565b92915050565b60008135905061315181614b1b565b92915050565b60006020828403121561316d5761316c6142f5565b5b600061317b84828501613096565b91505092915050565b6000806040838503121561319b5761319a6142f5565b5b60006131a985828601613096565b92505060206131ba85828601613096565b9150509250929050565b6000806000606084860312156131dd576131dc6142f5565b5b60006131eb86828701613096565b93505060206131fc86828701613096565b925050604061320d8682870161312d565b9150509250925092565b60008060008060808587031215613231576132306142f5565b5b600061323f87828801613096565b945050602061325087828801613096565b93505060406132618782880161312d565b925050606085013567ffffffffffffffff811115613282576132816142f0565b5b61328e878288016130ff565b91505092959194509250565b600080604083850312156132b1576132b06142f5565b5b60006132bf85828601613096565b92505060206132d0858286016130ab565b9150509250929050565b600080604083850312156132f1576132f06142f5565b5b60006132ff85828601613096565b92505060206133108582860161312d565b9150509250929050565b6000602082840312156133305761332f6142f5565b5b600061333e848285016130c0565b91505092915050565b6000806040838503121561335e5761335d6142f5565b5b600061336c858286016130c0565b925050602061337d85828601613096565b9150509250929050565b6000806040838503121561339e5761339d6142f5565b5b60006133ac858286016130c0565b92505060206133bd8582860161312d565b9150509250929050565b6000602082840312156133dd576133dc6142f5565b5b60006133eb848285016130d5565b91505092915050565b60006020828403121561340a576134096142f5565b5b6000613418848285016130ea565b91505092915050565b600060208284031215613437576134366142f5565b5b60006134458482850161312d565b91505092915050565b600060208284031215613464576134636142f5565b5b600061347284828501613142565b91505092915050565b61348481613ff5565b82525050565b61349381614007565b82525050565b6134a281614013565b82525050565b60006134b382613e69565b6134bd8185613e7f565b93506134cd818560208601614092565b6134d6816142fa565b840191505092915050565b60006134ec82613e74565b6134f68185613e90565b9350613506818560208601614092565b61350f816142fa565b840191505092915050565b600061352582613e74565b61352f8185613ea1565b935061353f818560208601614092565b80840191505092915050565b6000613558602083613e90565b91506135638261430b565b602082019050919050565b600061357b602b83613e90565b915061358682614334565b604082019050919050565b600061359e601483613e90565b91506135a982614383565b602082019050919050565b60006135c1602b83613e90565b91506135cc826143ac565b604082019050919050565b60006135e4603283613e90565b91506135ef826143fb565b604082019050919050565b6000613607601c83613e90565b91506136128261444a565b602082019050919050565b600061362a603e83613e90565b915061363582614473565b604082019050919050565b600061364d602483613e90565b9150613658826144c2565b604082019050919050565b6000613670601983613e90565b915061367b82614511565b602082019050919050565b6000613693602c83613e90565b915061369e8261453a565b604082019050919050565b60006136b6601283613e90565b91506136c182614589565b602082019050919050565b60006136d9601083613e90565b91506136e4826145b2565b602082019050919050565b60006136fc603883613e90565b9150613707826145db565b604082019050919050565b600061371f602a83613e90565b915061372a8261462a565b604082019050919050565b6000613742602983613e90565b915061374d82614679565b604082019050919050565b6000613765602083613e90565b9150613770826146c8565b602082019050919050565b6000613788602c83613e90565b9150613793826146f1565b604082019050919050565b60006137ab602983613e90565b91506137b682614740565b604082019050919050565b60006137ce602f83613e90565b91506137d98261478f565b604082019050919050565b60006137f1602483613e90565b91506137fc826147de565b604082019050919050565b6000613814602183613e90565b915061381f8261482d565b604082019050919050565b6000613837603183613e90565b91506138428261487c565b604082019050919050565b600061385a602c83613e90565b9150613865826148cb565b604082019050919050565b600061387d601783613ea1565b91506138888261491a565b601782019050919050565b60006138a0603d83613e90565b91506138ab82614943565b604082019050919050565b60006138c3603083613e90565b91506138ce82614992565b604082019050919050565b60006138e6604083613e90565b91506138f1826149e1565b604082019050919050565b6000613909601183613ea1565b915061391482614a30565b601182019050919050565b600061392c602f83613e90565b915061393782614a59565b604082019050919050565b61394b81614069565b82525050565b61395a81614073565b82525050565b600061396c828561351a565b9150613978828461351a565b91508190509392505050565b600061398f82613870565b915061399b828561351a565b91506139a6826138fc565b91506139b2828461351a565b91508190509392505050565b60006020820190506139d3600083018461347b565b92915050565b60006080820190506139ee600083018761347b565b6139fb602083018661347b565b613a086040830185613942565b8181036060830152613a1a81846134a8565b905095945050505050565b6000602082019050613a3a600083018461348a565b92915050565b6000602082019050613a556000830184613499565b92915050565b60006020820190508181036000830152613a7581846134e1565b905092915050565b60006020820190508181036000830152613a968161354b565b9050919050565b60006020820190508181036000830152613ab68161356e565b9050919050565b60006020820190508181036000830152613ad681613591565b9050919050565b60006020820190508181036000830152613af6816135b4565b9050919050565b60006020820190508181036000830152613b16816135d7565b9050919050565b60006020820190508181036000830152613b36816135fa565b9050919050565b60006020820190508181036000830152613b568161361d565b9050919050565b60006020820190508181036000830152613b7681613640565b9050919050565b60006020820190508181036000830152613b9681613663565b9050919050565b60006020820190508181036000830152613bb681613686565b9050919050565b60006020820190508181036000830152613bd6816136a9565b9050919050565b60006020820190508181036000830152613bf6816136cc565b9050919050565b60006020820190508181036000830152613c16816136ef565b9050919050565b60006020820190508181036000830152613c3681613712565b9050919050565b60006020820190508181036000830152613c5681613735565b9050919050565b60006020820190508181036000830152613c7681613758565b9050919050565b60006020820190508181036000830152613c968161377b565b9050919050565b60006020820190508181036000830152613cb68161379e565b9050919050565b60006020820190508181036000830152613cd6816137c1565b9050919050565b60006020820190508181036000830152613cf6816137e4565b9050919050565b60006020820190508181036000830152613d1681613807565b9050919050565b60006020820190508181036000830152613d368161382a565b9050919050565b60006020820190508181036000830152613d568161384d565b9050919050565b60006020820190508181036000830152613d7681613893565b9050919050565b60006020820190508181036000830152613d96816138b6565b9050919050565b60006020820190508181036000830152613db6816138d9565b9050919050565b60006020820190508181036000830152613dd68161391f565b9050919050565b6000602082019050613df26000830184613942565b92915050565b6000602082019050613e0d6000830184613951565b92915050565b6000613e1d613e2e565b9050613e298282614121565b919050565b6000604051905090565b600067ffffffffffffffff821115613e5357613e526142b7565b5b613e5c826142fa565b9050602081019050919050565b600081519050919050565b600081519050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b6000613eb782614069565b9150613ec283614069565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff03821115613ef757613ef66141cc565b5b828201905092915050565b6000613f0d82614069565b9150613f1883614069565b925082613f2857613f276141fb565b5b828204905092915050565b6000613f3e82614069565b9150613f4983614069565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0483118215151615613f8257613f816141cc565b5b828202905092915050565b6000613f9882614069565b9150613fa383614069565b925082821015613fb657613fb56141cc565b5b828203905092915050565b6000613fcc82614073565b9150613fd783614073565b925082821015613fea57613fe96141cc565b5b828203905092915050565b600061400082614049565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b600063ffffffff82169050919050565b82818337600083830152505050565b60005b838110156140b0578082015181840152602081019050614095565b838111156140bf576000848401525b50505050565b60006140d082614069565b915060008214156140e4576140e36141cc565b5b600182039050919050565b6000600282049050600182168061410757607f821691505b6020821081141561411b5761411a61422a565b5b50919050565b61412a826142fa565b810181811067ffffffffffffffff82111715614149576141486142b7565b5b80604052505050565b600061415d82614069565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156141905761418f6141cc565b5b600182019050919050565b60006141a682614069565b91506141b183614069565b9250826141c1576141c06141fb565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b600080fd5b600080fd5b600080fd5b600080fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f4552433732315061757361626c653a20746f6b656e207472616e73666572207760008201527f68696c6520706175736564000000000000000000000000000000000000000000602082015250565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d75737420686176652070617573657220726f6c6520746f2070617573650000602082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f726571756972652061646d696e20726f6c650000000000000000000000000000600082015250565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f496e73756666696369656e742072656d61696e696e672073616c6561626c652060008201527f6172656100000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d7573742068617665206d696e74657220726f6c6520746f206d696e74000000602082015250565b7f4552433732314275726e61626c653a2063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656400000000000000000000000000000000602082015250565b7f4552433732315072657365744d696e7465725061757365724175746f49643a2060008201527f6d75737420686176652070617573657220726f6c6520746f20756e7061757365602082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b614ab181613ff5565b8114614abc57600080fd5b50565b614ac881614007565b8114614ad357600080fd5b50565b614adf81614013565b8114614aea57600080fd5b50565b614af68161401d565b8114614b0157600080fd5b50565b614b0d81614069565b8114614b1857600080fd5b50565b614b2481614073565b8114614b2f57600080fd5b5056fea26469706673582212203f8166f3682c7e0bf73e3bdbf8c904941357879bd1acc5a7e50d32f5c890c7c564736f6c63430008070033

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

000000000000000000000000000000000000000000000000000000000000006000000000000000000000000000000000000000000000000000000000000000a000000000000000000000000000000000000000000000000000000000000000e00000000000000000000000000000000000000000000000000000000000000011447265616d7665727365202d204c616e6400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000044c414e4400000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004568747470733a2f2f73332e61702d6e6f727468656173742d322e616d617a6f6e6177732e636f6d2f6e66742e647265616d76657273652e70726f2f6c616e642f6a736f6e2f000000000000000000000000000000000000000000000000000000

-----Decoded View---------------
Arg [0] : name (string): Dreamverse - Land
Arg [1] : symbol (string): LAND
Arg [2] : baseTokenURI (string): https://s3.ap-northeast-2.amazonaws.com/nft.dreamverse.pro/land/json/

-----Encoded View---------------
11 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000060
Arg [1] : 00000000000000000000000000000000000000000000000000000000000000a0
Arg [2] : 00000000000000000000000000000000000000000000000000000000000000e0
Arg [3] : 0000000000000000000000000000000000000000000000000000000000000011
Arg [4] : 447265616d7665727365202d204c616e64000000000000000000000000000000
Arg [5] : 0000000000000000000000000000000000000000000000000000000000000004
Arg [6] : 4c414e4400000000000000000000000000000000000000000000000000000000
Arg [7] : 0000000000000000000000000000000000000000000000000000000000000045
Arg [8] : 68747470733a2f2f73332e61702d6e6f727468656173742d322e616d617a6f6e
Arg [9] : 6177732e636f6d2f6e66742e647265616d76657273652e70726f2f6c616e642f
Arg [10] : 6a736f6e2f000000000000000000000000000000000000000000000000000000


Deployed Bytecode Sourcemap

964:3638:10:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;4354:246;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2408:98:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3919:217;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3457:401;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1614:111:8;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4646:330:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3942:121:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4313:145;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1290:253:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;5330:214:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;3866:182:10;;;:::i;:::-;;5042:179:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;515:241:7;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1797:230:8;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1091:84:20;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2111:235:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2493:548:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1849:205:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2453:33:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3482:176;;;:::i;:::-;;1401:143:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2859:137:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;2570:102:6;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1977:49:0;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4203:153:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;5287:320;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;2738:329;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1712:132:1;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;1158:62:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4692:147:0;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;1226:62:10;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;4422:162:6;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;3047:228:10;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;4354:246;4530:4;4557:36;4581:11;4557:23;:36::i;:::-;4550:43;;4354:246;;;:::o;2408:98:6:-;2462:13;2494:5;2487:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2408:98;:::o;3919:217::-;3995:7;4022:16;4030:7;4022;:16::i;:::-;4014:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;4105:15;:24;4121:7;4105:24;;;;;;;;;;;;;;;;;;;;;4098:31;;3919:217;;;:::o;3457:401::-;3537:13;3553:23;3568:7;3553:14;:23::i;:::-;3537:39;;3600:5;3594:11;;:2;:11;;;;3586:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;3691:5;3675:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;3700:37;3717:5;3724:12;:10;:12::i;:::-;3700:16;:37::i;:::-;3675:62;3654:165;;;;;;;;;;;;:::i;:::-;;;;;;;;;3830:21;3839:2;3843:7;3830:8;:21::i;:::-;3527:331;3457:401;;:::o;1614:111:8:-;1675:7;1701:10;:17;;;;1694:24;;1614:111;:::o;4646:330:6:-;4835:41;4854:12;:10;:12::i;:::-;4868:7;4835:18;:41::i;:::-;4827:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;4941:28;4951:4;4957:2;4961:7;4941:9;:28::i;:::-;4646:330;;;:::o;3942:121:0:-;4008:7;4034:6;:12;4041:4;4034:12;;;;;;;;;;;:22;;;4027:29;;3942:121;;;:::o;4313:145::-;4396:18;4409:4;4396:12;:18::i;:::-;2455:30;2466:4;2472:12;:10;:12::i;:::-;2455:10;:30::i;:::-;4426:25:::1;4437:4;4443:7;4426:10;:25::i;:::-;4313:145:::0;;;:::o;1290:253:8:-;1387:7;1422:23;1439:5;1422:16;:23::i;:::-;1414:5;:31;1406:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;1510:12;:19;1523:5;1510:19;;;;;;;;;;;;;;;:26;1530:5;1510:26;;;;;;;;;;;;1503:33;;1290:253;;;;:::o;5330:214:0:-;5436:12;:10;:12::i;:::-;5425:23;;:7;:23;;;5417:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;5511:26;5523:4;5529:7;5511:11;:26::i;:::-;5330:214;;:::o;3866:182:10:-;3918:34;1264:24;3939:12;:10;:12::i;:::-;3918:7;:34::i;:::-;3910:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;4031:10;:8;:10::i;:::-;3866:182::o;5042:179:6:-;5175:39;5192:4;5198:2;5202:7;5175:39;;;;;;;;;;;;:16;:39::i;:::-;5042:179;;;:::o;515:241:7:-;631:41;650:12;:10;:12::i;:::-;664:7;631:18;:41::i;:::-;623:102;;;;;;;;;;;;:::i;:::-;;;;;;;;;735:14;741:7;735:5;:14::i;:::-;515:241;:::o;1797:230:8:-;1872:7;1907:30;:28;:30::i;:::-;1899:5;:38;1891:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;2003:10;2014:5;2003:17;;;;;;;;:::i;:::-;;;;;;;;;;1996:24;;1797:230;;;:::o;1091:84:20:-;1138:4;1161:7;;;;;;;;;;;1154:14;;1091:84;:::o;2111:235:6:-;2183:7;2202:13;2218:7;:16;2226:7;2218:16;;;;;;;;;;;;;;;;;;;;;2202:32;;2269:1;2252:19;;:5;:19;;;;2244:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;2334:5;2327:12;;;2111:235;;;:::o;2493:548:10:-;2542:7;2568:34;1196:24;2589:12;:10;:12::i;:::-;2568:7;:34::i;:::-;2560:108;;;;;;;;;;;;:::i;:::-;;;;;;;;;2699:1;2686:10;;;;;;;;;;;:14;;;2678:63;;;;;;;;;;;;:::i;:::-;;;;;;;;;2902:27;:15;:25;:27::i;:::-;2939:15;2957:25;:15;:23;:25::i;:::-;2939:43;;2992:18;2998:2;3002:7;2992:5;:18::i;:::-;3027:7;3020:14;;;2493:548;;;:::o;1849:205:6:-;1921:7;1965:1;1948:19;;:5;:19;;;;1940:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;2031:9;:16;2041:5;2031:16;;;;;;;;;;;;;;;;2024:23;;1849:205;;;:::o;2453:33:10:-;;;;;;;;;;;;;:::o;3482:176::-;3532:34;1264:24;3553:12;:10;:12::i;:::-;3532:7;:34::i;:::-;3524:109;;;;;;;;;;;;:::i;:::-;;;;;;;;;3643:8;:6;:8::i;:::-;3482:176::o;1401:143:1:-;1483:7;1509:28;1531:5;1509:12;:18;1522:4;1509:18;;;;;;;;;;;:21;;:28;;;;:::i;:::-;1502:35;;1401:143;;;;:::o;2859:137:0:-;2937:4;2960:6;:12;2967:4;2960:12;;;;;;;;;;;:20;;:29;2981:7;2960:29;;;;;;;;;;;;;;;;;;;;;;;;;2953:36;;2859:137;;;;:::o;2570:102:6:-;2626:13;2658:7;2651:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;2570:102;:::o;1977:49:0:-;2022:4;1977:49;;;:::o;4203:153:6:-;4297:52;4316:12;:10;:12::i;:::-;4330:8;4340;4297:18;:52::i;:::-;4203:153;;:::o;5287:320::-;5456:41;5475:12;:10;:12::i;:::-;5489:7;5456:18;:41::i;:::-;5448:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;5561:39;5575:4;5581:2;5585:7;5594:5;5561:13;:39::i;:::-;5287:320;;;;:::o;2738:329::-;2811:13;2844:16;2852:7;2844;:16::i;:::-;2836:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;2923:21;2947:10;:8;:10::i;:::-;2923:34;;2998:1;2980:7;2974:21;:25;:86;;;;;;;;;;;;;;;;;3026:7;3035:18;:7;:16;:18::i;:::-;3009:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;2974:86;2967:93;;;2738:329;;;:::o;1712:132:1:-;1784:7;1810:27;:12;:18;1823:4;1810:18;;;;;;;;;;;:25;:27::i;:::-;1803:34;;1712:132;;;:::o;1158:62:10:-;1196:24;1158:62;:::o;4692:147:0:-;4776:18;4789:4;4776:12;:18::i;:::-;2455:30;2466:4;2472:12;:10;:12::i;:::-;2455:10;:30::i;:::-;4806:26:::1;4818:4;4824:7;4806:11;:26::i;:::-;4692:147:::0;;;:::o;1226:62:10:-;1264:24;1226:62;:::o;4422:162:6:-;4519:4;4542:18;:25;4561:5;4542:25;;;;;;;;;;;;;;;:35;4568:8;4542:35;;;;;;;;;;;;;;;;;;;;;;;;;4535:42;;4422:162;;;;:::o;3047:228:10:-;3099:41;2022:4:0;3107:18:10;;3127:12;:10;:12::i;:::-;3099:7;:41::i;:::-;3091:72;;;;;;;;;;;;:::i;:::-;;;;;;;;;3195:4;3181:18;;:10;;;;;;;;;;;:18;;;;3173:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;3264:4;3250:10;;:18;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;3047:228;:::o;6787:233:0:-;6870:22;6878:4;6884:7;6870;:22::i;:::-;6865:149;;6940:4;6908:6;:12;6915:4;6908:12;;;;;;;;;;;:20;;:29;6929:7;6908:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;6990:12;:10;:12::i;:::-;6963:40;;6981:7;6963:40;;6975:4;6963:40;;;;;;;;;;6865:149;6787:233;;:::o;7612:150:12:-;7682:4;7705:50;7710:3;:10;;7746:5;7730:23;;7722:32;;7705:4;:50::i;:::-;7698:57;;7612:150;;;;:::o;989:222:8:-;1091:4;1129:35;1114:50;;;:11;:50;;;;:90;;;;1168:36;1192:11;1168:23;:36::i;:::-;1114:90;1107:97;;989:222;;;:::o;7079:125:6:-;7144:4;7195:1;7167:30;;:7;:16;7175:7;7167:16;;;;;;;;;;;;;;;;;;;;;:30;;;;7160:37;;7079:125;;;:::o;640:96:3:-;693:7;719:10;712:17;;640:96;:::o;10930:171:6:-;11031:2;11004:15;:24;11020:7;11004:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;11086:7;11082:2;11048:46;;11057:23;11072:7;11057:14;:23::i;:::-;11048:46;;;;;;;;;;;;10930:171;;:::o;7362:344::-;7455:4;7479:16;7487:7;7479;:16::i;:::-;7471:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;7554:13;7570:23;7585:7;7570:14;:23::i;:::-;7554:39;;7622:5;7611:16;;:7;:16;;;:51;;;;7655:7;7631:31;;:20;7643:7;7631:11;:20::i;:::-;:31;;;7611:51;:87;;;;7666:32;7683:5;7690:7;7666:16;:32::i;:::-;7611:87;7603:96;;;7362:344;;;;:::o;10259:560::-;10413:4;10386:31;;:23;10401:7;10386:14;:23::i;:::-;:31;;;10378:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;10495:1;10481:16;;:2;:16;;;;10473:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;10549:39;10570:4;10576:2;10580:7;10549:20;:39::i;:::-;10650:29;10667:1;10671:7;10650:8;:29::i;:::-;10709:1;10690:9;:15;10700:4;10690:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;10737:1;10720:9;:13;10730:2;10720:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;10767:2;10748:7;:16;10756:7;10748:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;10804:7;10800:2;10785:27;;10794:4;10785:27;;;;;;;;;;;;10259:560;;;:::o;3277:484:0:-;3357:22;3365:4;3371:7;3357;:22::i;:::-;3352:403;;3540:41;3568:7;3540:41;;3578:2;3540:19;:41::i;:::-;3652:38;3680:4;3672:13;;3687:2;3652:19;:38::i;:::-;3447:265;;;;;;;;;:::i;:::-;;;;;;;;;;;;;3395:349;;;;;;;;;;;:::i;:::-;;;;;;;;3352:403;3277:484;;:::o;1932:166:1:-;2019:31;2036:4;2042:7;2019:16;:31::i;:::-;2060;2083:7;2060:12;:18;2073:4;2060:18;;;;;;;;;;;:22;;:31;;;;:::i;:::-;;1932:166;;:::o;2187:171::-;2275:32;2293:4;2299:7;2275:17;:32::i;:::-;2317:34;2343:7;2317:12;:18;2330:4;2317:18;;;;;;;;;;;:25;;:34;;;;:::i;:::-;;2187:171;;:::o;2103:117:20:-;1670:8;:6;:8::i;:::-;1662:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;2171:5:::1;2161:7;;:15;;;;;;;;;;;;;;;;;;2191:22;2200:12;:10;:12::i;:::-;2191:22;;;;;;:::i;:::-;;;;;;;;2103:117::o:0;9587:348:6:-;9646:13;9662:23;9677:7;9662:14;:23::i;:::-;9646:39;;9696:48;9717:5;9732:1;9736:7;9696:20;:48::i;:::-;9782:29;9799:1;9803:7;9782:8;:29::i;:::-;9842:1;9822:9;:16;9832:5;9822:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;9860:7;:16;9868:7;9860:16;;;;;;;;;;;;9853:23;;;;;;;;;;;9920:7;9916:1;9892:36;;9901:5;9892:36;;;;;;;;;;;;9636:299;9587:348;:::o;945:123:4:-;1050:1;1032:7;:14;;;:19;;;;;;;;;;;945:123;:::o;827:112::-;892:7;918;:14;;;911:21;;827:112;;;:::o;8998:372:6:-;9091:1;9077:16;;:2;:16;;;;9069:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;9149:16;9157:7;9149;:16::i;:::-;9148:17;9140:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;9209:45;9238:1;9242:2;9246:7;9209:20;:45::i;:::-;9282:1;9265:9;:13;9275:2;9265:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;9312:2;9293:7;:16;9301:7;9293:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;9355:7;9351:2;9330:33;;9347:1;9330:33;;;;;;;;;;;;8998:372;;:::o;1856:115:20:-;1405:8;:6;:8::i;:::-;1404:9;1396:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;1925:4:::1;1915:7;;:14;;;;;;;;;;;;;;;;;;1944:20;1951:12;:10;:12::i;:::-;1944:20;;;;;;:::i;:::-;;;;;;;;1856:115::o:0;8870:156:12:-;8944:7;8994:22;8998:3;:10;;9010:5;8994:3;:22::i;:::-;8986:31;;8963:56;;8870:156;;;;:::o;11236:307:6:-;11386:8;11377:17;;:5;:17;;;;11369:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;11472:8;11434:18;:25;11453:5;11434:25;;;;;;;;;;;;;;;:35;11460:8;11434:35;;;;;;;;;;;;;;;;:46;;;;;;;;;;;;;;;;;;11517:8;11495:41;;11510:5;11495:41;;;11527:8;11495:41;;;;;;:::i;:::-;;;;;;;;11236:307;;;:::o;6469:::-;6620:28;6630:4;6636:2;6640:7;6620:9;:28::i;:::-;6666:48;6689:4;6695:2;6699:7;6708:5;6666:22;:48::i;:::-;6658:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;6469:307;;;;:::o;1966:112:10:-;2026:13;2058;2051:20;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1966:112;:::o;328:703:21:-;384:13;610:1;601:5;:10;597:51;;;627:10;;;;;;;;;;;;;;;;;;;;;597:51;657:12;672:5;657:20;;687:14;711:75;726:1;718:4;:9;711:75;;743:8;;;;;:::i;:::-;;;;773:2;765:10;;;;;:::i;:::-;;;711:75;;;795:19;827:6;817:17;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;795:39;;844:150;860:1;851:5;:10;844:150;;887:1;877:11;;;;;:::i;:::-;;;953:2;945:5;:10;;;;:::i;:::-;932:2;:24;;;;:::i;:::-;919:39;;902:6;909;902:14;;;;;;;;:::i;:::-;;;;;:56;;;;;;;;;;;981:2;972:11;;;;;:::i;:::-;;;844:150;;;1017:6;1003:21;;;;;328:703;;;;:::o;8413:115:12:-;8476:7;8502:19;8510:3;:10;;8502:7;:19::i;:::-;8495:26;;8413:115;;;:::o;1697:404::-;1760:4;1781:21;1791:3;1796:5;1781:9;:21::i;:::-;1776:319;;1818:3;:11;;1835:5;1818:23;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1998:3;:11;;:18;;;;1976:3;:12;;:19;1989:5;1976:19;;;;;;;;;;;:40;;;;2037:4;2030:11;;;;1776:319;2079:5;2072:12;;1697:404;;;;;:::o;1490:300:6:-;1592:4;1642:25;1627:40;;;:11;:40;;;;:104;;;;1698:33;1683:48;;;:11;:48;;;;1627:104;:156;;;;1747:36;1771:11;1747:23;:36::i;:::-;1627:156;1608:175;;1490:300;;;:::o;4054:233:10:-;4235:45;4262:4;4268:2;4272:7;4235:26;:45::i;:::-;4054:233;;;:::o;1588:441:21:-;1663:13;1688:19;1733:1;1724:6;1720:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1710:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;1688:47;;1745:15;:6;1752:1;1745:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1770;:6;1777:1;1770:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;1800:9;1825:1;1816:6;1812:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;1800:26;;1795:132;1832:1;1828;:5;1795:132;;;1866:12;1887:3;1879:5;:11;1866:25;;;;;;;:::i;:::-;;;;;1854:6;1861:1;1854:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;1915:1;1905:11;;;;;1835:3;;;;:::i;:::-;;;1795:132;;;;1953:1;1944:5;:10;1936:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;2015:6;2001:21;;;1588:441;;;;:::o;7145:234:0:-;7228:22;7236:4;7242:7;7228;:22::i;:::-;7224:149;;;7298:5;7266:6;:12;7273:4;7266:12;;;;;;;;;;;:20;;:29;7287:7;7266:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;7349:12;:10;:12::i;:::-;7322:40;;7340:7;7322:40;;7334:4;7322:40;;;;;;;;;;7224:149;7145:234;;:::o;7930:156:12:-;8003:4;8026:53;8034:3;:10;;8070:5;8054:23;;8046:32;;8026:7;:53::i;:::-;8019:60;;7930:156;;;;:::o;4395:118::-;4462:7;4488:3;:11;;4500:5;4488:18;;;;;;;;:::i;:::-;;;;;;;;;;4481:25;;4395:118;;;;:::o;12096:778:6:-;12246:4;12266:15;:2;:13;;;:15::i;:::-;12262:606;;;12317:2;12301:36;;;12338:12;:10;:12::i;:::-;12352:4;12358:7;12367:5;12301:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;12297:519;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;12557:1;12540:6;:13;:18;12536:266;;;12582:60;;;;;;;;;;:::i;:::-;;;;;;;;12536:266;12754:6;12748:13;12739:6;12735:2;12731:15;12724:38;12297:519;12433:41;;;12423:51;;;:6;:51;;;;12416:58;;;;;12262:606;12853:4;12846:11;;12096:778;;;;;;;:::o;3946:107:12:-;4002:7;4028:3;:11;;:18;;;;4021:25;;3946:107;;;:::o;3738:127::-;3811:4;3857:1;3834:3;:12;;:19;3847:5;3834:19;;;;;;;;;;;;:24;;3827:31;;3738:127;;;;:::o;604:212:1:-;689:4;727:42;712:57;;;:11;:57;;;;:97;;;;773:36;797:11;773:23;:36::i;:::-;712:97;705:104;;604:212;;;:::o;655:267:9:-;794:45;821:4;827:2;831:7;794:26;:45::i;:::-;859:8;:6;:8::i;:::-;858:9;850:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;655:267;;;:::o;2269:1388:12:-;2335:4;2451:18;2472:3;:12;;:19;2485:5;2472:19;;;;;;;;;;;;2451:40;;2520:1;2506:10;:15;2502:1149;;2875:21;2912:1;2899:10;:14;;;;:::i;:::-;2875:38;;2927:17;2968:1;2947:3;:11;;:18;;;;:22;;;;:::i;:::-;2927:42;;3001:13;2988:9;:26;2984:398;;3034:17;3054:3;:11;;3066:9;3054:22;;;;;;;;:::i;:::-;;;;;;;;;;3034:42;;3205:9;3176:3;:11;;3188:13;3176:26;;;;;;;;:::i;:::-;;;;;;;;;:38;;;;3314:10;3288:3;:12;;:23;3301:9;3288:23;;;;;;;;;;;:36;;;;3016:366;2984:398;3460:3;:11;;:17;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;3552:3;:12;;:19;3565:5;3552:19;;;;;;;;;;;3545:26;;;3593:4;3586:11;;;;;;;2502:1149;3635:5;3628:12;;;2269:1388;;;;;:::o;771:377:2:-;831:4;1034:12;1099:7;1087:20;1079:28;;1140:1;1133:4;:8;1126:15;;;771:377;;;:::o;2570:202:0:-;2655:4;2693:32;2678:47;;;:11;:47;;;;:87;;;;2729:36;2753:11;2729:23;:36::i;:::-;2678:87;2671:94;;2570:202;;;:::o;2623:572:8:-;2762:45;2789:4;2795:2;2799:7;2762:26;:45::i;:::-;2838:1;2822:18;;:4;:18;;;2818:183;;;2856:40;2888:7;2856:31;:40::i;:::-;2818:183;;;2925:2;2917:10;;:4;:10;;;2913:88;;2943:47;2976:4;2982:7;2943:32;:47::i;:::-;2913:88;2818:183;3028:1;3014:16;;:2;:16;;;3010:179;;;3046:45;3083:7;3046:36;:45::i;:::-;3010:179;;;3118:4;3112:10;;:2;:10;;;3108:81;;3138:40;3166:2;3170:7;3138:27;:40::i;:::-;3108:81;3010:179;2623:572;;;:::o;829:155:5:-;914:4;952:25;937:40;;;:11;:40;;;;930:47;;829:155;;;:::o;13430:122:6:-;;;;:::o;3901:161:8:-;4004:10;:17;;;;3977:15;:24;3993:7;3977:24;;;;;;;;;;;:44;;;;4031:10;4047:7;4031:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3901:161;:::o;4679:970::-;4941:22;4991:1;4966:22;4983:4;4966:16;:22::i;:::-;:26;;;;:::i;:::-;4941:51;;5002:18;5023:17;:26;5041:7;5023:26;;;;;;;;;;;;5002:47;;5167:14;5153:10;:28;5149:323;;5197:19;5219:12;:18;5232:4;5219:18;;;;;;;;;;;;;;;:34;5238:14;5219:34;;;;;;;;;;;;5197:56;;5301:11;5268:12;:18;5281:4;5268:18;;;;;;;;;;;;;;;:30;5287:10;5268:30;;;;;;;;;;;:44;;;;5417:10;5384:17;:30;5402:11;5384:30;;;;;;;;;;;:43;;;;5183:289;5149:323;5565:17;:26;5583:7;5565:26;;;;;;;;;;;5558:33;;;5608:12;:18;5621:4;5608:18;;;;;;;;;;;;;;;:34;5627:14;5608:34;;;;;;;;;;;5601:41;;;4760:889;;4679:970;;:::o;5937:1061::-;6186:22;6231:1;6211:10;:17;;;;:21;;;;:::i;:::-;6186:46;;6242:18;6263:15;:24;6279:7;6263:24;;;;;;;;;;;;6242:45;;6609:19;6631:10;6642:14;6631:26;;;;;;;;:::i;:::-;;;;;;;;;;6609:48;;6693:11;6668:10;6679;6668:22;;;;;;;;:::i;:::-;;;;;;;;;:36;;;;6803:10;6772:15;:28;6788:11;6772:28;;;;;;;;;;;:41;;;;6941:15;:24;6957:7;6941:24;;;;;;;;;;;6934:31;;;6975:10;:16;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;6008:990;;;5937:1061;:::o;3489:217::-;3573:14;3590:20;3607:2;3590:16;:20::i;:::-;3573:37;;3647:7;3620:12;:16;3633:2;3620:16;;;;;;;;;;;;;;;:24;3637:6;3620:24;;;;;;;;;;;:34;;;;3693:6;3664:17;:26;3682:7;3664:26;;;;;;;;;;;:35;;;;3563:143;3489:217;;:::o;7:410:22:-;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:139::-;469:5;507:6;494:20;485:29;;523:33;550:5;523:33;:::i;:::-;423:139;;;;:::o;568:133::-;611:5;649:6;636:20;627:29;;665:30;689:5;665:30;:::i;:::-;568:133;;;;:::o;707:139::-;753:5;791:6;778:20;769:29;;807:33;834:5;807:33;:::i;:::-;707:139;;;;:::o;852:137::-;897:5;935:6;922:20;913:29;;951:32;977:5;951:32;:::i;:::-;852:137;;;;:::o;995:141::-;1051:5;1082:6;1076:13;1067:22;;1098:32;1124:5;1098:32;:::i;:::-;995:141;;;;:::o;1155:338::-;1210:5;1259:3;1252:4;1244:6;1240:17;1236:27;1226:122;;1267:79;;:::i;:::-;1226:122;1384:6;1371:20;1409:78;1483:3;1475:6;1468:4;1460:6;1456:17;1409:78;:::i;:::-;1400:87;;1216:277;1155:338;;;;:::o;1499:139::-;1545:5;1583:6;1570:20;1561:29;;1599:33;1626:5;1599:33;:::i;:::-;1499:139;;;;:::o;1644:137::-;1689:5;1727:6;1714:20;1705:29;;1743:32;1769:5;1743:32;:::i;:::-;1644:137;;;;:::o;1787:329::-;1846:6;1895:2;1883:9;1874:7;1870:23;1866:32;1863:119;;;1901:79;;:::i;:::-;1863:119;2021:1;2046:53;2091:7;2082:6;2071:9;2067:22;2046:53;:::i;:::-;2036:63;;1992:117;1787:329;;;;:::o;2122:474::-;2190:6;2198;2247:2;2235:9;2226:7;2222:23;2218:32;2215:119;;;2253:79;;:::i;:::-;2215:119;2373:1;2398:53;2443:7;2434:6;2423:9;2419:22;2398:53;:::i;:::-;2388:63;;2344:117;2500:2;2526:53;2571:7;2562:6;2551:9;2547:22;2526:53;:::i;:::-;2516:63;;2471:118;2122:474;;;;;:::o;2602:619::-;2679:6;2687;2695;2744:2;2732:9;2723:7;2719:23;2715:32;2712:119;;;2750:79;;:::i;:::-;2712:119;2870:1;2895:53;2940:7;2931:6;2920:9;2916:22;2895:53;:::i;:::-;2885:63;;2841:117;2997:2;3023:53;3068:7;3059:6;3048:9;3044:22;3023:53;:::i;:::-;3013:63;;2968:118;3125:2;3151:53;3196:7;3187:6;3176:9;3172:22;3151:53;:::i;:::-;3141:63;;3096:118;2602:619;;;;;:::o;3227:943::-;3322:6;3330;3338;3346;3395:3;3383:9;3374:7;3370:23;3366:33;3363:120;;;3402:79;;:::i;:::-;3363:120;3522:1;3547:53;3592:7;3583:6;3572:9;3568:22;3547:53;:::i;:::-;3537:63;;3493:117;3649:2;3675:53;3720:7;3711:6;3700:9;3696:22;3675:53;:::i;:::-;3665:63;;3620:118;3777:2;3803:53;3848:7;3839:6;3828:9;3824:22;3803:53;:::i;:::-;3793:63;;3748:118;3933:2;3922:9;3918:18;3905:32;3964:18;3956:6;3953:30;3950:117;;;3986:79;;:::i;:::-;3950:117;4091:62;4145:7;4136:6;4125:9;4121:22;4091:62;:::i;:::-;4081:72;;3876:287;3227:943;;;;;;;:::o;4176:468::-;4241:6;4249;4298:2;4286:9;4277:7;4273:23;4269:32;4266:119;;;4304:79;;:::i;:::-;4266:119;4424:1;4449:53;4494:7;4485:6;4474:9;4470:22;4449:53;:::i;:::-;4439:63;;4395:117;4551:2;4577:50;4619:7;4610:6;4599:9;4595:22;4577:50;:::i;:::-;4567:60;;4522:115;4176:468;;;;;:::o;4650:474::-;4718:6;4726;4775:2;4763:9;4754:7;4750:23;4746:32;4743:119;;;4781:79;;:::i;:::-;4743:119;4901:1;4926:53;4971:7;4962:6;4951:9;4947:22;4926:53;:::i;:::-;4916:63;;4872:117;5028:2;5054:53;5099:7;5090:6;5079:9;5075:22;5054:53;:::i;:::-;5044:63;;4999:118;4650:474;;;;;:::o;5130:329::-;5189:6;5238:2;5226:9;5217:7;5213:23;5209:32;5206:119;;;5244:79;;:::i;:::-;5206:119;5364:1;5389:53;5434:7;5425:6;5414:9;5410:22;5389:53;:::i;:::-;5379:63;;5335:117;5130:329;;;;:::o;5465:474::-;5533:6;5541;5590:2;5578:9;5569:7;5565:23;5561:32;5558:119;;;5596:79;;:::i;:::-;5558:119;5716:1;5741:53;5786:7;5777:6;5766:9;5762:22;5741:53;:::i;:::-;5731:63;;5687:117;5843:2;5869:53;5914:7;5905:6;5894:9;5890:22;5869:53;:::i;:::-;5859:63;;5814:118;5465:474;;;;;:::o;5945:::-;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:327::-;6483:6;6532:2;6520:9;6511:7;6507:23;6503:32;6500:119;;;6538:79;;:::i;:::-;6500:119;6658:1;6683:52;6727:7;6718:6;6707:9;6703:22;6683:52;:::i;:::-;6673:62;;6629:116;6425:327;;;;:::o;6758:349::-;6827:6;6876:2;6864:9;6855:7;6851:23;6847:32;6844:119;;;6882:79;;:::i;:::-;6844:119;7002:1;7027:63;7082:7;7073:6;7062:9;7058:22;7027:63;:::i;:::-;7017:73;;6973:127;6758:349;;;;:::o;7113:329::-;7172:6;7221:2;7209:9;7200:7;7196:23;7192:32;7189:119;;;7227:79;;:::i;:::-;7189:119;7347:1;7372:53;7417:7;7408:6;7397:9;7393:22;7372:53;:::i;:::-;7362:63;;7318:117;7113:329;;;;:::o;7448:327::-;7506:6;7555:2;7543:9;7534:7;7530:23;7526:32;7523:119;;;7561:79;;:::i;:::-;7523:119;7681:1;7706:52;7750:7;7741:6;7730:9;7726:22;7706:52;:::i;:::-;7696:62;;7652:116;7448:327;;;;:::o;7781:118::-;7868:24;7886:5;7868:24;:::i;:::-;7863:3;7856:37;7781:118;;:::o;7905:109::-;7986:21;8001:5;7986:21;:::i;:::-;7981:3;7974:34;7905:109;;:::o;8020:118::-;8107:24;8125:5;8107:24;:::i;:::-;8102:3;8095:37;8020:118;;:::o;8144:360::-;8230:3;8258:38;8290:5;8258:38;:::i;:::-;8312:70;8375:6;8370:3;8312:70;:::i;:::-;8305:77;;8391:52;8436:6;8431:3;8424:4;8417:5;8413:16;8391:52;:::i;:::-;8468:29;8490:6;8468:29;:::i;:::-;8463:3;8459:39;8452:46;;8234:270;8144:360;;;;:::o;8510:364::-;8598:3;8626:39;8659:5;8626:39;:::i;:::-;8681:71;8745:6;8740:3;8681:71;:::i;:::-;8674:78;;8761:52;8806:6;8801:3;8794:4;8787:5;8783:16;8761:52;:::i;:::-;8838:29;8860:6;8838:29;:::i;:::-;8833:3;8829:39;8822:46;;8602:272;8510:364;;;;:::o;8880:377::-;8986:3;9014:39;9047:5;9014:39;:::i;:::-;9069:89;9151:6;9146:3;9069:89;:::i;:::-;9062:96;;9167:52;9212:6;9207:3;9200:4;9193:5;9189:16;9167:52;:::i;:::-;9244:6;9239:3;9235:16;9228:23;;8990:267;8880:377;;;;:::o;9263:366::-;9405:3;9426:67;9490:2;9485:3;9426:67;:::i;:::-;9419:74;;9502:93;9591:3;9502:93;:::i;:::-;9620:2;9615:3;9611:12;9604:19;;9263:366;;;:::o;9635:::-;9777:3;9798:67;9862:2;9857:3;9798:67;:::i;:::-;9791:74;;9874:93;9963:3;9874:93;:::i;:::-;9992:2;9987:3;9983:12;9976:19;;9635:366;;;:::o;10007:::-;10149:3;10170:67;10234:2;10229:3;10170:67;:::i;:::-;10163:74;;10246:93;10335:3;10246:93;:::i;:::-;10364:2;10359:3;10355:12;10348:19;;10007:366;;;:::o;10379:::-;10521:3;10542:67;10606:2;10601:3;10542:67;:::i;:::-;10535:74;;10618:93;10707:3;10618:93;:::i;:::-;10736:2;10731:3;10727:12;10720:19;;10379:366;;;:::o;10751:::-;10893:3;10914:67;10978:2;10973:3;10914:67;:::i;:::-;10907:74;;10990:93;11079:3;10990:93;:::i;:::-;11108:2;11103:3;11099:12;11092:19;;10751:366;;;:::o;11123:::-;11265:3;11286:67;11350:2;11345:3;11286:67;:::i;:::-;11279:74;;11362:93;11451:3;11362:93;:::i;:::-;11480:2;11475:3;11471:12;11464:19;;11123:366;;;:::o;11495:::-;11637:3;11658:67;11722:2;11717:3;11658:67;:::i;:::-;11651:74;;11734:93;11823:3;11734:93;:::i;:::-;11852:2;11847:3;11843:12;11836:19;;11495:366;;;:::o;11867:::-;12009:3;12030:67;12094:2;12089:3;12030:67;:::i;:::-;12023:74;;12106:93;12195:3;12106:93;:::i;:::-;12224:2;12219:3;12215:12;12208:19;;11867:366;;;:::o;12239:::-;12381:3;12402:67;12466:2;12461:3;12402:67;:::i;:::-;12395:74;;12478:93;12567:3;12478:93;:::i;:::-;12596:2;12591:3;12587:12;12580:19;;12239:366;;;:::o;12611:::-;12753:3;12774:67;12838:2;12833:3;12774:67;:::i;:::-;12767:74;;12850:93;12939:3;12850:93;:::i;:::-;12968:2;12963:3;12959:12;12952:19;;12611:366;;;:::o;12983:::-;13125:3;13146:67;13210:2;13205:3;13146:67;:::i;:::-;13139:74;;13222:93;13311:3;13222:93;:::i;:::-;13340:2;13335:3;13331:12;13324:19;;12983:366;;;:::o;13355:::-;13497:3;13518:67;13582:2;13577:3;13518:67;:::i;:::-;13511:74;;13594:93;13683:3;13594:93;:::i;:::-;13712:2;13707:3;13703:12;13696:19;;13355:366;;;:::o;13727:::-;13869:3;13890:67;13954:2;13949:3;13890:67;:::i;:::-;13883:74;;13966:93;14055:3;13966:93;:::i;:::-;14084:2;14079:3;14075:12;14068:19;;13727:366;;;:::o;14099:::-;14241:3;14262:67;14326:2;14321:3;14262:67;:::i;:::-;14255:74;;14338:93;14427:3;14338:93;:::i;:::-;14456:2;14451:3;14447:12;14440:19;;14099:366;;;:::o;14471:::-;14613:3;14634:67;14698:2;14693:3;14634:67;:::i;:::-;14627:74;;14710:93;14799:3;14710:93;:::i;:::-;14828:2;14823:3;14819:12;14812:19;;14471:366;;;:::o;14843:::-;14985:3;15006:67;15070:2;15065:3;15006:67;:::i;:::-;14999:74;;15082:93;15171:3;15082:93;:::i;:::-;15200:2;15195:3;15191:12;15184:19;;14843:366;;;:::o;15215:::-;15357:3;15378:67;15442:2;15437:3;15378:67;:::i;:::-;15371:74;;15454:93;15543:3;15454:93;:::i;:::-;15572:2;15567:3;15563:12;15556:19;;15215:366;;;:::o;15587:::-;15729:3;15750:67;15814:2;15809:3;15750:67;:::i;:::-;15743:74;;15826:93;15915:3;15826:93;:::i;:::-;15944:2;15939:3;15935:12;15928:19;;15587:366;;;:::o;15959:::-;16101:3;16122:67;16186:2;16181:3;16122:67;:::i;:::-;16115:74;;16198:93;16287:3;16198:93;:::i;:::-;16316:2;16311:3;16307:12;16300:19;;15959:366;;;:::o;16331:::-;16473:3;16494:67;16558:2;16553:3;16494:67;:::i;:::-;16487:74;;16570:93;16659:3;16570:93;:::i;:::-;16688:2;16683:3;16679:12;16672:19;;16331:366;;;:::o;16703:::-;16845:3;16866:67;16930:2;16925:3;16866:67;:::i;:::-;16859:74;;16942:93;17031:3;16942:93;:::i;:::-;17060:2;17055:3;17051:12;17044:19;;16703:366;;;:::o;17075:::-;17217:3;17238:67;17302:2;17297:3;17238:67;:::i;:::-;17231:74;;17314:93;17403:3;17314:93;:::i;:::-;17432:2;17427:3;17423:12;17416:19;;17075:366;;;:::o;17447:::-;17589:3;17610:67;17674:2;17669:3;17610:67;:::i;:::-;17603:74;;17686:93;17775:3;17686:93;:::i;:::-;17804:2;17799:3;17795:12;17788:19;;17447:366;;;:::o;17819:402::-;17979:3;18000:85;18082:2;18077:3;18000:85;:::i;:::-;17993:92;;18094:93;18183:3;18094:93;:::i;:::-;18212:2;18207:3;18203:12;18196:19;;17819:402;;;:::o;18227:366::-;18369:3;18390:67;18454:2;18449:3;18390:67;:::i;:::-;18383:74;;18466:93;18555:3;18466:93;:::i;:::-;18584:2;18579:3;18575:12;18568:19;;18227:366;;;:::o;18599:::-;18741:3;18762:67;18826:2;18821:3;18762:67;:::i;:::-;18755:74;;18838:93;18927:3;18838:93;:::i;:::-;18956:2;18951:3;18947:12;18940:19;;18599:366;;;:::o;18971:::-;19113:3;19134:67;19198:2;19193:3;19134:67;:::i;:::-;19127:74;;19210:93;19299:3;19210:93;:::i;:::-;19328:2;19323:3;19319:12;19312:19;;18971:366;;;:::o;19343:402::-;19503:3;19524:85;19606:2;19601:3;19524:85;:::i;:::-;19517:92;;19618:93;19707:3;19618:93;:::i;:::-;19736:2;19731:3;19727:12;19720:19;;19343:402;;;:::o;19751:366::-;19893:3;19914:67;19978:2;19973:3;19914:67;:::i;:::-;19907:74;;19990:93;20079:3;19990:93;:::i;:::-;20108:2;20103:3;20099:12;20092:19;;19751:366;;;:::o;20123:118::-;20210:24;20228:5;20210:24;:::i;:::-;20205:3;20198:37;20123:118;;:::o;20247:115::-;20332:23;20349:5;20332:23;:::i;:::-;20327:3;20320:36;20247:115;;:::o;20368:435::-;20548:3;20570:95;20661:3;20652:6;20570:95;:::i;:::-;20563:102;;20682:95;20773:3;20764:6;20682:95;:::i;:::-;20675:102;;20794:3;20787:10;;20368:435;;;;;:::o;20809:967::-;21191:3;21213:148;21357:3;21213:148;:::i;:::-;21206:155;;21378:95;21469:3;21460:6;21378:95;:::i;:::-;21371:102;;21490:148;21634:3;21490:148;:::i;:::-;21483:155;;21655:95;21746:3;21737:6;21655:95;:::i;:::-;21648:102;;21767:3;21760:10;;20809:967;;;;;:::o;21782:222::-;21875:4;21913:2;21902:9;21898:18;21890:26;;21926:71;21994:1;21983:9;21979:17;21970:6;21926:71;:::i;:::-;21782:222;;;;:::o;22010:640::-;22205:4;22243:3;22232:9;22228:19;22220:27;;22257:71;22325:1;22314:9;22310:17;22301:6;22257:71;:::i;:::-;22338:72;22406:2;22395:9;22391:18;22382:6;22338:72;:::i;:::-;22420;22488:2;22477:9;22473:18;22464:6;22420:72;:::i;:::-;22539:9;22533:4;22529:20;22524:2;22513:9;22509:18;22502:48;22567:76;22638:4;22629:6;22567:76;:::i;:::-;22559:84;;22010:640;;;;;;;:::o;22656:210::-;22743:4;22781:2;22770:9;22766:18;22758:26;;22794:65;22856:1;22845:9;22841:17;22832:6;22794:65;:::i;:::-;22656:210;;;;:::o;22872:222::-;22965:4;23003:2;22992:9;22988:18;22980:26;;23016:71;23084:1;23073:9;23069:17;23060:6;23016:71;:::i;:::-;22872:222;;;;:::o;23100:313::-;23213:4;23251:2;23240:9;23236:18;23228:26;;23300:9;23294:4;23290:20;23286:1;23275:9;23271:17;23264:47;23328:78;23401:4;23392:6;23328:78;:::i;:::-;23320:86;;23100:313;;;;:::o;23419:419::-;23585:4;23623:2;23612:9;23608:18;23600:26;;23672:9;23666:4;23662:20;23658:1;23647:9;23643:17;23636:47;23700:131;23826:4;23700:131;:::i;:::-;23692:139;;23419:419;;;:::o;23844:::-;24010:4;24048:2;24037:9;24033:18;24025:26;;24097:9;24091:4;24087:20;24083:1;24072:9;24068:17;24061:47;24125:131;24251:4;24125:131;:::i;:::-;24117:139;;23844:419;;;:::o;24269:::-;24435:4;24473:2;24462:9;24458:18;24450:26;;24522:9;24516:4;24512:20;24508:1;24497:9;24493:17;24486:47;24550:131;24676:4;24550:131;:::i;:::-;24542:139;;24269:419;;;:::o;24694:::-;24860:4;24898:2;24887:9;24883:18;24875:26;;24947:9;24941:4;24937:20;24933:1;24922:9;24918:17;24911:47;24975:131;25101:4;24975:131;:::i;:::-;24967:139;;24694:419;;;:::o;25119:::-;25285:4;25323:2;25312:9;25308:18;25300:26;;25372:9;25366:4;25362:20;25358:1;25347:9;25343:17;25336:47;25400:131;25526:4;25400:131;:::i;:::-;25392:139;;25119:419;;;:::o;25544:::-;25710:4;25748:2;25737:9;25733:18;25725:26;;25797:9;25791:4;25787:20;25783:1;25772:9;25768:17;25761:47;25825:131;25951:4;25825:131;:::i;:::-;25817:139;;25544:419;;;:::o;25969:::-;26135:4;26173:2;26162:9;26158:18;26150:26;;26222:9;26216:4;26212:20;26208:1;26197:9;26193:17;26186:47;26250:131;26376:4;26250:131;:::i;:::-;26242:139;;25969:419;;;:::o;26394:::-;26560:4;26598:2;26587:9;26583:18;26575:26;;26647:9;26641:4;26637:20;26633:1;26622:9;26618:17;26611:47;26675:131;26801:4;26675:131;:::i;:::-;26667:139;;26394:419;;;:::o;26819:::-;26985:4;27023:2;27012:9;27008:18;27000:26;;27072:9;27066:4;27062:20;27058:1;27047:9;27043:17;27036:47;27100:131;27226:4;27100:131;:::i;:::-;27092:139;;26819:419;;;:::o;27244:::-;27410:4;27448:2;27437:9;27433:18;27425:26;;27497:9;27491:4;27487:20;27483:1;27472:9;27468:17;27461:47;27525:131;27651:4;27525:131;:::i;:::-;27517:139;;27244:419;;;:::o;27669:::-;27835:4;27873:2;27862:9;27858:18;27850:26;;27922:9;27916:4;27912:20;27908:1;27897:9;27893:17;27886:47;27950:131;28076:4;27950:131;:::i;:::-;27942:139;;27669:419;;;:::o;28094:::-;28260:4;28298:2;28287:9;28283:18;28275:26;;28347:9;28341:4;28337:20;28333:1;28322:9;28318:17;28311:47;28375:131;28501:4;28375:131;:::i;:::-;28367:139;;28094:419;;;:::o;28519:::-;28685:4;28723:2;28712:9;28708:18;28700:26;;28772:9;28766:4;28762:20;28758:1;28747:9;28743:17;28736:47;28800:131;28926:4;28800:131;:::i;:::-;28792:139;;28519:419;;;:::o;28944:::-;29110:4;29148:2;29137:9;29133:18;29125:26;;29197:9;29191:4;29187:20;29183:1;29172:9;29168:17;29161:47;29225:131;29351:4;29225:131;:::i;:::-;29217:139;;28944:419;;;:::o;29369:::-;29535:4;29573:2;29562:9;29558:18;29550:26;;29622:9;29616:4;29612:20;29608:1;29597:9;29593:17;29586:47;29650:131;29776:4;29650:131;:::i;:::-;29642:139;;29369:419;;;:::o;29794:::-;29960:4;29998:2;29987:9;29983:18;29975:26;;30047:9;30041:4;30037:20;30033:1;30022:9;30018:17;30011:47;30075:131;30201:4;30075:131;:::i;:::-;30067:139;;29794:419;;;:::o;30219:::-;30385:4;30423:2;30412:9;30408:18;30400:26;;30472:9;30466:4;30462:20;30458:1;30447:9;30443:17;30436:47;30500:131;30626:4;30500:131;:::i;:::-;30492:139;;30219:419;;;:::o;30644:::-;30810:4;30848:2;30837:9;30833:18;30825:26;;30897:9;30891:4;30887:20;30883:1;30872:9;30868:17;30861:47;30925:131;31051:4;30925:131;:::i;:::-;30917:139;;30644:419;;;:::o;31069:::-;31235:4;31273:2;31262:9;31258:18;31250:26;;31322:9;31316:4;31312:20;31308:1;31297:9;31293:17;31286:47;31350:131;31476:4;31350:131;:::i;:::-;31342:139;;31069:419;;;:::o;31494:::-;31660:4;31698:2;31687:9;31683:18;31675:26;;31747:9;31741:4;31737:20;31733:1;31722:9;31718:17;31711:47;31775:131;31901:4;31775:131;:::i;:::-;31767:139;;31494:419;;;:::o;31919:::-;32085:4;32123:2;32112:9;32108:18;32100:26;;32172:9;32166:4;32162:20;32158:1;32147:9;32143:17;32136:47;32200:131;32326:4;32200:131;:::i;:::-;32192:139;;31919:419;;;:::o;32344:::-;32510:4;32548:2;32537:9;32533:18;32525:26;;32597:9;32591:4;32587:20;32583:1;32572:9;32568:17;32561:47;32625:131;32751:4;32625:131;:::i;:::-;32617:139;;32344:419;;;:::o;32769:::-;32935:4;32973:2;32962:9;32958:18;32950:26;;33022:9;33016:4;33012:20;33008:1;32997:9;32993:17;32986:47;33050:131;33176:4;33050:131;:::i;:::-;33042:139;;32769:419;;;:::o;33194:::-;33360:4;33398:2;33387:9;33383:18;33375:26;;33447:9;33441:4;33437:20;33433:1;33422:9;33418:17;33411:47;33475:131;33601:4;33475:131;:::i;:::-;33467:139;;33194:419;;;:::o;33619:::-;33785:4;33823:2;33812:9;33808:18;33800:26;;33872:9;33866:4;33862:20;33858:1;33847:9;33843:17;33836:47;33900:131;34026:4;33900:131;:::i;:::-;33892:139;;33619:419;;;:::o;34044:::-;34210:4;34248:2;34237:9;34233:18;34225:26;;34297:9;34291:4;34287:20;34283:1;34272:9;34268:17;34261:47;34325:131;34451:4;34325:131;:::i;:::-;34317:139;;34044:419;;;:::o;34469:::-;34635:4;34673:2;34662:9;34658:18;34650:26;;34722:9;34716:4;34712:20;34708:1;34697:9;34693:17;34686:47;34750:131;34876:4;34750:131;:::i;:::-;34742:139;;34469:419;;;:::o;34894:222::-;34987:4;35025:2;35014:9;35010:18;35002:26;;35038:71;35106:1;35095:9;35091:17;35082:6;35038:71;:::i;:::-;34894:222;;;;:::o;35122:218::-;35213:4;35251:2;35240:9;35236:18;35228:26;;35264:69;35330:1;35319:9;35315:17;35306:6;35264:69;:::i;:::-;35122:218;;;;:::o;35346:129::-;35380:6;35407:20;;:::i;:::-;35397:30;;35436:33;35464:4;35456:6;35436:33;:::i;:::-;35346:129;;;:::o;35481:75::-;35514:6;35547:2;35541:9;35531:19;;35481:75;:::o;35562:307::-;35623:4;35713:18;35705:6;35702:30;35699:56;;;35735:18;;:::i;:::-;35699:56;35773:29;35795:6;35773:29;:::i;:::-;35765:37;;35857:4;35851;35847:15;35839:23;;35562:307;;;:::o;35875:98::-;35926:6;35960:5;35954:12;35944:22;;35875:98;;;:::o;35979:99::-;36031:6;36065:5;36059:12;36049:22;;35979:99;;;:::o;36084:168::-;36167:11;36201:6;36196:3;36189:19;36241:4;36236:3;36232:14;36217:29;;36084:168;;;;:::o;36258:169::-;36342:11;36376:6;36371:3;36364:19;36416:4;36411:3;36407:14;36392:29;;36258:169;;;;:::o;36433:148::-;36535:11;36572:3;36557:18;;36433:148;;;;:::o;36587:305::-;36627:3;36646:20;36664:1;36646:20;:::i;:::-;36641:25;;36680:20;36698:1;36680:20;:::i;:::-;36675:25;;36834:1;36766:66;36762:74;36759:1;36756:81;36753:107;;;36840:18;;:::i;:::-;36753:107;36884:1;36881;36877:9;36870:16;;36587:305;;;;:::o;36898:185::-;36938:1;36955:20;36973:1;36955:20;:::i;:::-;36950:25;;36989:20;37007:1;36989:20;:::i;:::-;36984:25;;37028:1;37018:35;;37033:18;;:::i;:::-;37018:35;37075:1;37072;37068:9;37063:14;;36898:185;;;;:::o;37089:348::-;37129:7;37152:20;37170:1;37152:20;:::i;:::-;37147:25;;37186:20;37204:1;37186:20;:::i;:::-;37181:25;;37374:1;37306:66;37302:74;37299:1;37296:81;37291:1;37284:9;37277:17;37273:105;37270:131;;;37381:18;;:::i;:::-;37270:131;37429:1;37426;37422:9;37411:20;;37089:348;;;;:::o;37443:191::-;37483:4;37503:20;37521:1;37503:20;:::i;:::-;37498:25;;37537:20;37555:1;37537:20;:::i;:::-;37532:25;;37576:1;37573;37570:8;37567:34;;;37581:18;;:::i;:::-;37567:34;37626:1;37623;37619:9;37611:17;;37443:191;;;;:::o;37640:188::-;37679:4;37699:19;37716:1;37699:19;:::i;:::-;37694:24;;37732:19;37749:1;37732:19;:::i;:::-;37727:24;;37770:1;37767;37764:8;37761:34;;;37775:18;;:::i;:::-;37761:34;37820:1;37817;37813:9;37805:17;;37640:188;;;;:::o;37834:96::-;37871:7;37900:24;37918:5;37900:24;:::i;:::-;37889:35;;37834:96;;;:::o;37936:90::-;37970:7;38013:5;38006:13;37999:21;37988:32;;37936:90;;;:::o;38032:77::-;38069:7;38098:5;38087:16;;38032:77;;;:::o;38115:149::-;38151:7;38191:66;38184:5;38180:78;38169:89;;38115:149;;;:::o;38270:126::-;38307:7;38347:42;38340:5;38336:54;38325:65;;38270:126;;;:::o;38402:77::-;38439:7;38468:5;38457:16;;38402:77;;;:::o;38485:93::-;38521:7;38561:10;38554:5;38550:22;38539:33;;38485:93;;;:::o;38584:154::-;38668:6;38663:3;38658;38645:30;38730:1;38721:6;38716:3;38712:16;38705:27;38584:154;;;:::o;38744:307::-;38812:1;38822:113;38836:6;38833:1;38830:13;38822:113;;;38921:1;38916:3;38912:11;38906:18;38902:1;38897:3;38893:11;38886:39;38858:2;38855:1;38851:10;38846:15;;38822:113;;;38953:6;38950:1;38947:13;38944:101;;;39033:1;39024:6;39019:3;39015:16;39008:27;38944:101;38793:258;38744:307;;;:::o;39057:171::-;39096:3;39119:24;39137:5;39119:24;:::i;:::-;39110:33;;39165:4;39158:5;39155:15;39152:41;;;39173:18;;:::i;:::-;39152:41;39220:1;39213:5;39209:13;39202:20;;39057:171;;;:::o;39234:320::-;39278:6;39315:1;39309:4;39305:12;39295:22;;39362:1;39356:4;39352:12;39383:18;39373:81;;39439:4;39431:6;39427:17;39417:27;;39373:81;39501:2;39493:6;39490:14;39470:18;39467:38;39464:84;;;39520:18;;:::i;:::-;39464:84;39285:269;39234:320;;;:::o;39560:281::-;39643:27;39665:4;39643:27;:::i;:::-;39635:6;39631:40;39773:6;39761:10;39758:22;39737:18;39725:10;39722:34;39719:62;39716:88;;;39784:18;;:::i;:::-;39716:88;39824:10;39820:2;39813:22;39603:238;39560:281;;:::o;39847:233::-;39886:3;39909:24;39927:5;39909:24;:::i;:::-;39900:33;;39955:66;39948:5;39945:77;39942:103;;;40025:18;;:::i;:::-;39942:103;40072:1;40065:5;40061:13;40054:20;;39847:233;;;:::o;40086:176::-;40118:1;40135:20;40153:1;40135:20;:::i;:::-;40130:25;;40169:20;40187:1;40169:20;:::i;:::-;40164:25;;40208:1;40198:35;;40213:18;;:::i;:::-;40198:35;40254:1;40251;40247:9;40242:14;;40086:176;;;;:::o;40268:180::-;40316:77;40313:1;40306:88;40413:4;40410:1;40403:15;40437:4;40434:1;40427:15;40454:180;40502:77;40499:1;40492:88;40599:4;40596:1;40589:15;40623:4;40620:1;40613:15;40640:180;40688:77;40685:1;40678:88;40785:4;40782:1;40775:15;40809:4;40806:1;40799:15;40826:180;40874:77;40871:1;40864:88;40971:4;40968:1;40961:15;40995:4;40992:1;40985:15;41012:180;41060:77;41057:1;41050:88;41157:4;41154:1;41147:15;41181:4;41178:1;41171:15;41198:180;41246:77;41243:1;41236:88;41343:4;41340:1;41333:15;41367:4;41364:1;41357:15;41384:117;41493:1;41490;41483:12;41507:117;41616:1;41613;41606:12;41630:117;41739:1;41736;41729:12;41753:117;41862:1;41859;41852:12;41876:102;41917:6;41968:2;41964:7;41959:2;41952:5;41948:14;41944:28;41934:38;;41876:102;;;:::o;41984:182::-;42124:34;42120:1;42112:6;42108:14;42101:58;41984:182;:::o;42172:230::-;42312:34;42308:1;42300:6;42296:14;42289:58;42381:13;42376:2;42368:6;42364:15;42357:38;42172:230;:::o;42408:170::-;42548:22;42544:1;42536:6;42532:14;42525:46;42408:170;:::o;42584:230::-;42724:34;42720:1;42712:6;42708:14;42701:58;42793:13;42788:2;42780:6;42776:15;42769:38;42584:230;:::o;42820:237::-;42960:34;42956:1;42948:6;42944:14;42937:58;43029:20;43024:2;43016:6;43012:15;43005:45;42820:237;:::o;43063:178::-;43203:30;43199:1;43191:6;43187:14;43180:54;43063:178;:::o;43247:249::-;43387:34;43383:1;43375:6;43371:14;43364:58;43456:32;43451:2;43443:6;43439:15;43432:57;43247:249;:::o;43502:223::-;43642:34;43638:1;43630:6;43626:14;43619:58;43711:6;43706:2;43698:6;43694:15;43687:31;43502:223;:::o;43731:175::-;43871:27;43867:1;43859:6;43855:14;43848:51;43731:175;:::o;43912:231::-;44052:34;44048:1;44040:6;44036:14;44029:58;44121:14;44116:2;44108:6;44104:15;44097:39;43912:231;:::o;44149:168::-;44289:20;44285:1;44277:6;44273:14;44266:44;44149:168;:::o;44323:166::-;44463:18;44459:1;44451:6;44447:14;44440:42;44323:166;:::o;44495:243::-;44635:34;44631:1;44623:6;44619:14;44612:58;44704:26;44699:2;44691:6;44687:15;44680:51;44495:243;:::o;44744:229::-;44884:34;44880:1;44872:6;44868:14;44861:58;44953:12;44948:2;44940:6;44936:15;44929:37;44744:229;:::o;44979:228::-;45119:34;45115:1;45107:6;45103:14;45096:58;45188:11;45183:2;45175:6;45171:15;45164:36;44979:228;:::o;45213:182::-;45353:34;45349:1;45341:6;45337:14;45330:58;45213:182;:::o;45401:231::-;45541:34;45537:1;45529:6;45525:14;45518:58;45610:14;45605:2;45597:6;45593:15;45586:39;45401:231;:::o;45638:228::-;45778:34;45774:1;45766:6;45762:14;45755:58;45847:11;45842:2;45834:6;45830:15;45823:36;45638:228;:::o;45872:234::-;46012:34;46008:1;46000:6;45996:14;45989:58;46081:17;46076:2;46068:6;46064:15;46057:42;45872:234;:::o;46112:223::-;46252:34;46248:1;46240:6;46236:14;46229:58;46321:6;46316:2;46308:6;46304:15;46297:31;46112:223;:::o;46341:220::-;46481:34;46477:1;46469:6;46465:14;46458:58;46550:3;46545:2;46537:6;46533:15;46526:28;46341:220;:::o;46567:236::-;46707:34;46703:1;46695:6;46691:14;46684:58;46776:19;46771:2;46763:6;46759:15;46752:44;46567:236;:::o;46809:231::-;46949:34;46945:1;46937:6;46933:14;46926:58;47018:14;47013:2;47005:6;47001:15;46994:39;46809:231;:::o;47046:173::-;47186:25;47182:1;47174:6;47170:14;47163:49;47046:173;:::o;47225:248::-;47365:34;47361:1;47353:6;47349:14;47342:58;47434:31;47429:2;47421:6;47417:15;47410:56;47225:248;:::o;47479:235::-;47619:34;47615:1;47607:6;47603:14;47596:58;47688:18;47683:2;47675:6;47671:15;47664:43;47479:235;:::o;47720:251::-;47860:34;47856:1;47848:6;47844:14;47837:58;47929:34;47924:2;47916:6;47912:15;47905:59;47720:251;:::o;47977:167::-;48117:19;48113:1;48105:6;48101:14;48094:43;47977:167;:::o;48150:234::-;48290:34;48286:1;48278:6;48274:14;48267:58;48359:17;48354:2;48346:6;48342:15;48335:42;48150:234;:::o;48390:122::-;48463:24;48481:5;48463:24;:::i;:::-;48456:5;48453:35;48443:63;;48502:1;48499;48492:12;48443:63;48390:122;:::o;48518:116::-;48588:21;48603:5;48588:21;:::i;:::-;48581:5;48578:32;48568:60;;48624:1;48621;48614:12;48568:60;48518:116;:::o;48640:122::-;48713:24;48731:5;48713:24;:::i;:::-;48706:5;48703:35;48693:63;;48752:1;48749;48742:12;48693:63;48640:122;:::o;48768:120::-;48840:23;48857:5;48840:23;:::i;:::-;48833:5;48830:34;48820:62;;48878:1;48875;48868:12;48820:62;48768:120;:::o;48894:122::-;48967:24;48985:5;48967:24;:::i;:::-;48960:5;48957:35;48947:63;;49006:1;49003;48996:12;48947:63;48894:122;:::o;49022:120::-;49094:23;49111:5;49094:23;:::i;:::-;49087:5;49084:34;49074:62;;49132:1;49129;49122:12;49074:62;49022:120;:::o

Swarm Source

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