Overview
TokenID
0
Total Transfers
-
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
# | Exchange | Pair | Price | 24H Volume | % Volume |
---|
Contract Name:
MintYourself
Compiler Version
v0.8.14+commit.80d49f37
Contract Source Code (Solidity)
/** *Submitted for verification at Etherscan.io on 2022-07-01 */ // File: @openzeppelin/contracts/utils/introspection/IERC165.sol // 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: @openzeppelin/contracts/utils/introspection/ERC165.sol // OpenZeppelin Contracts v4.4.0 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } } // File: @openzeppelin/contracts/utils/Strings.sol // 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); } } // File: @openzeppelin/contracts/utils/Context.sol // 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: @openzeppelin/contracts/security/Pausable.sol // OpenZeppelin Contracts (last updated v4.7.0) (security/Pausable.sol) pragma solidity ^0.8.0; /** * @dev Contract module which allows children to implement an emergency stop * mechanism that can be triggered by an authorized account. * * This module is used through inheritance. It will make available the * modifiers `whenNotPaused` and `whenPaused`, which can be applied to * the functions of your contract. Note that they will not be pausable by * simply including this module, only once the modifiers are put in place. */ abstract contract Pausable is Context { /** * @dev Emitted when the pause is triggered by `account`. */ event Paused(address account); /** * @dev Emitted when the pause is lifted by `account`. */ event Unpaused(address account); bool private _paused; /** * @dev Initializes the contract in unpaused state. */ constructor() { _paused = false; } /** * @dev Modifier to make a function callable only when the contract is not paused. * * Requirements: * * - The contract must not be paused. */ modifier whenNotPaused() { _requireNotPaused(); _; } /** * @dev Modifier to make a function callable only when the contract is paused. * * Requirements: * * - The contract must be paused. */ modifier whenPaused() { _requirePaused(); _; } /** * @dev Returns true if the contract is paused, and false otherwise. */ function paused() public view virtual returns (bool) { return _paused; } /** * @dev Throws if the contract is paused. */ function _requireNotPaused() internal view virtual { require(!paused(), "Pausable: paused"); } /** * @dev Throws if the contract is not paused. */ function _requirePaused() internal view virtual { require(paused(), "Pausable: not paused"); } /** * @dev Triggers stopped state. * * Requirements: * * - The contract must not be paused. */ function _pause() internal virtual whenNotPaused { _paused = true; emit Paused(_msgSender()); } /** * @dev Returns to normal state. * * Requirements: * * - The contract must be paused. */ function _unpause() internal virtual whenPaused { _paused = false; emit Unpaused(_msgSender()); } } // File: @openzeppelin/contracts/access/IAccessControl.sol // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; } // File: @openzeppelin/contracts/access/AccessControl.sol // OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol) pragma solidity ^0.8.0; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ``` * bytes32 public constant MY_ROLE = keccak256("MY_ROLE"); * ``` * * Roles can be used to represent a set of permissions. To restrict access to a * function call, use {hasRole}: * * ``` * function foo() public { * require(hasRole(MY_ROLE, msg.sender)); * ... * } * ``` * * Roles can be granted and revoked dynamically via the {grantRole} and * {revokeRole} functions. Each role has an associated admin role, and only * accounts that have a role's admin role can call {grantRole} and {revokeRole}. * * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means * that only accounts with this role will be able to grant or revoke other * roles. More complex role relationships can be created by using * {_setRoleAdmin}. * * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to * grant and revoke this role. Extra precautions should be taken to secure * accounts that have been granted it. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(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 virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/utils/Counters.sol // OpenZeppelin Contracts v4.4.1 (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: erc721a/contracts/IERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721A compliant contract. */ interface IERC721A { /** * The caller must own the token or be an approved operator. */ error ApprovalCallerNotOwnerNorApproved(); /** * The token does not exist. */ error ApprovalQueryForNonexistentToken(); /** * The caller cannot approve to their own address. */ error ApproveToCaller(); /** * Cannot query the balance for the zero address. */ error BalanceQueryForZeroAddress(); /** * Cannot mint to the zero address. */ error MintToZeroAddress(); /** * The quantity of tokens minted must be more than zero. */ error MintZeroQuantity(); /** * The token does not exist. */ error OwnerQueryForNonexistentToken(); /** * The caller must own the token or be an approved operator. */ error TransferCallerNotOwnerNorApproved(); /** * The token must be owned by `from`. */ error TransferFromIncorrectOwner(); /** * Cannot safely transfer to a contract that does not implement the ERC721Receiver interface. */ error TransferToNonERC721ReceiverImplementer(); /** * Cannot transfer to the zero address. */ error TransferToZeroAddress(); /** * The token does not exist. */ error URIQueryForNonexistentToken(); /** * The `quantity` minted with ERC2309 exceeds the safety limit. */ error MintERC2309QuantityExceedsLimit(); /** * The `extraData` cannot be set on an unintialized ownership slot. */ error OwnershipNotInitializedForExtraData(); struct TokenOwnership { // The address of the owner. address addr; // Keeps track of the start time of ownership with minimal overhead for tokenomics. uint64 startTimestamp; // Whether the token has been burned. bool burned; // Arbitrary data similar to `startTimestamp` that can be set through `_extraData`. uint24 extraData; } /** * @dev Returns the total amount of tokens stored by the contract. * * Burned tokens are calculated here, use `_totalMinted()` if you want to count just minted tokens. */ function totalSupply() external view returns (uint256); // ============================== // 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); // ============================== // IERC721 // ============================== /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must 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 Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); // ============================== // IERC721Metadata // ============================== /** * @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); // ============================== // IERC2309 // ============================== /** * @dev Emitted when tokens in `fromTokenId` to `toTokenId` (inclusive) is transferred from `from` to `to`, * as defined in the ERC2309 standard. See `_mintERC2309` for more details. */ event ConsecutiveTransfer(uint256 indexed fromTokenId, uint256 toTokenId, address indexed from, address indexed to); } // File: erc721a/contracts/extensions/IERC721AQueryable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev Interface of an ERC721AQueryable compliant contract. */ interface IERC721AQueryable is IERC721A { /** * Invalid query range (`start` >= `stop`). */ error InvalidQueryRange(); /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` */ function explicitOwnershipOf(uint256 tokenId) external view returns (TokenOwnership memory); /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view returns (TokenOwnership[] memory); /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view returns (uint256[] memory); /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view returns (uint256[] memory); } // File: erc721a/contracts/ERC721A.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @dev ERC721 token receiver interface. */ interface ERC721A__IERC721Receiver { function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, * including the Metadata extension. Built to optimize for lower gas during batch mints. * * Assumes serials are sequentially minted starting at `_startTokenId()` * (defaults to 0, e.g. 0, 1, 2, 3..). * * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply. * * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256). */ contract ERC721A is IERC721A { // Mask of an entry in packed address data. uint256 private constant BITMASK_ADDRESS_DATA_ENTRY = (1 << 64) - 1; // The bit position of `numberMinted` in packed address data. uint256 private constant BITPOS_NUMBER_MINTED = 64; // The bit position of `numberBurned` in packed address data. uint256 private constant BITPOS_NUMBER_BURNED = 128; // The bit position of `aux` in packed address data. uint256 private constant BITPOS_AUX = 192; // Mask of all 256 bits in packed address data except the 64 bits for `aux`. uint256 private constant BITMASK_AUX_COMPLEMENT = (1 << 192) - 1; // The bit position of `startTimestamp` in packed ownership. uint256 private constant BITPOS_START_TIMESTAMP = 160; // The bit mask of the `burned` bit in packed ownership. uint256 private constant BITMASK_BURNED = 1 << 224; // The bit position of the `nextInitialized` bit in packed ownership. uint256 private constant BITPOS_NEXT_INITIALIZED = 225; // The bit mask of the `nextInitialized` bit in packed ownership. uint256 private constant BITMASK_NEXT_INITIALIZED = 1 << 225; // The bit position of `extraData` in packed ownership. uint256 private constant BITPOS_EXTRA_DATA = 232; // Mask of all 256 bits in a packed ownership except the 24 bits for `extraData`. uint256 private constant BITMASK_EXTRA_DATA_COMPLEMENT = (1 << 232) - 1; // The mask of the lower 160 bits for addresses. uint256 private constant BITMASK_ADDRESS = (1 << 160) - 1; // The maximum `quantity` that can be minted with `_mintERC2309`. // This limit is to prevent overflows on the address data entries. // For a limit of 5000, a total of 3.689e15 calls to `_mintERC2309` // is required to cause an overflow, which is unrealistic. uint256 private constant MAX_MINT_ERC2309_QUANTITY_LIMIT = 5000; // The tokenId of the next token to be minted. uint256 private _currentIndex; // The number of tokens burned. uint256 private _burnCounter; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to ownership details // An empty struct value does not necessarily mean the token is unowned. // See `_packedOwnershipOf` implementation for details. // // Bits Layout: // - [0..159] `addr` // - [160..223] `startTimestamp` // - [224] `burned` // - [225] `nextInitialized` // - [232..255] `extraData` mapping(uint256 => uint256) private _packedOwnerships; // Mapping owner address to address data. // // Bits Layout: // - [0..63] `balance` // - [64..127] `numberMinted` // - [128..191] `numberBurned` // - [192..255] `aux` mapping(address => uint256) private _packedAddressData; // 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; constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; _currentIndex = _startTokenId(); } /** * @dev Returns the starting token ID. * To change the starting token ID, please override this function. */ function _startTokenId() internal view virtual returns (uint256) { return 0; } /** * @dev Returns the next token ID to be minted. */ function _nextTokenId() internal view returns (uint256) { return _currentIndex; } /** * @dev Returns the total number of tokens in existence. * Burned tokens will reduce the count. * To get the total number of tokens minted, please see `_totalMinted`. */ function totalSupply() public view override returns (uint256) { // Counter underflow is impossible as _burnCounter cannot be incremented // more than `_currentIndex - _startTokenId()` times. unchecked { return _currentIndex - _burnCounter - _startTokenId(); } } /** * @dev Returns the total amount of tokens minted in the contract. */ function _totalMinted() internal view returns (uint256) { // Counter underflow is impossible as _currentIndex does not decrement, // and it is initialized to `_startTokenId()` unchecked { return _currentIndex - _startTokenId(); } } /** * @dev Returns the total number of tokens burned. */ function _totalBurned() internal view returns (uint256) { return _burnCounter; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view override returns (uint256) { if (owner == address(0)) revert BalanceQueryForZeroAddress(); return _packedAddressData[owner] & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens minted by `owner`. */ function _numberMinted(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_MINTED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the number of tokens burned by or on behalf of `owner`. */ function _numberBurned(address owner) internal view returns (uint256) { return (_packedAddressData[owner] >> BITPOS_NUMBER_BURNED) & BITMASK_ADDRESS_DATA_ENTRY; } /** * Returns the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). */ function _getAux(address owner) internal view returns (uint64) { return uint64(_packedAddressData[owner] >> BITPOS_AUX); } /** * Sets the auxiliary data for `owner`. (e.g. number of whitelist mint slots used). * If there are multiple variables, please pack them into a uint64. */ function _setAux(address owner, uint64 aux) internal { uint256 packed = _packedAddressData[owner]; uint256 auxCasted; // Cast `aux` with assembly to avoid redundant masking. assembly { auxCasted := aux } packed = (packed & BITMASK_AUX_COMPLEMENT) | (auxCasted << BITPOS_AUX); _packedAddressData[owner] = packed; } /** * Returns the packed ownership data of `tokenId`. */ function _packedOwnershipOf(uint256 tokenId) private view returns (uint256) { uint256 curr = tokenId; unchecked { if (_startTokenId() <= curr) if (curr < _currentIndex) { uint256 packed = _packedOwnerships[curr]; // If not burned. if (packed & BITMASK_BURNED == 0) { // Invariant: // There will always be an ownership that has an address and is not burned // before an ownership that does not have an address and is not burned. // Hence, curr will not underflow. // // We can directly compare the packed value. // If the address is zero, packed is zero. while (packed == 0) { packed = _packedOwnerships[--curr]; } return packed; } } } revert OwnerQueryForNonexistentToken(); } /** * Returns the unpacked `TokenOwnership` struct from `packed`. */ function _unpackedOwnership(uint256 packed) private pure returns (TokenOwnership memory ownership) { ownership.addr = address(uint160(packed)); ownership.startTimestamp = uint64(packed >> BITPOS_START_TIMESTAMP); ownership.burned = packed & BITMASK_BURNED != 0; ownership.extraData = uint24(packed >> BITPOS_EXTRA_DATA); } /** * Returns the unpacked `TokenOwnership` struct at `index`. */ function _ownershipAt(uint256 index) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnerships[index]); } /** * @dev Initializes the ownership slot minted at `index` for efficiency purposes. */ function _initializeOwnershipAt(uint256 index) internal { if (_packedOwnerships[index] == 0) { _packedOwnerships[index] = _packedOwnershipOf(index); } } /** * Gas spent here starts off proportional to the maximum mint batch size. * It gradually moves to O(1) as tokens get transferred around in the collection over time. */ function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) { return _unpackedOwnership(_packedOwnershipOf(tokenId)); } /** * @dev Packs ownership data into a single uint256. */ function _packOwnershipData(address owner, uint256 flags) private view returns (uint256 result) { assembly { // Mask `owner` to the lower 160 bits, in case the upper bits somehow aren't clean. owner := and(owner, BITMASK_ADDRESS) // `owner | (block.timestamp << BITPOS_START_TIMESTAMP) | flags`. result := or(owner, or(shl(BITPOS_START_TIMESTAMP, timestamp()), flags)) } } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view override returns (address) { return address(uint160(_packedOwnershipOf(tokenId))); } /** * @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) { if (!_exists(tokenId)) revert URIQueryForNonexistentToken(); string memory baseURI = _baseURI(); return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, _toString(tokenId))) : ''; } /** * @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, it can be overridden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ''; } /** * @dev Returns the `nextInitialized` flag set if `quantity` equals 1. */ function _nextInitializedFlag(uint256 quantity) private pure returns (uint256 result) { // For branchless setting of the `nextInitialized` flag. assembly { // `(quantity == 1) << BITPOS_NEXT_INITIALIZED`. result := shl(BITPOS_NEXT_INITIALIZED, eq(quantity, 1)) } } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public override { address owner = ownerOf(tokenId); if (_msgSenderERC721A() != owner) if (!isApprovedForAll(owner, _msgSenderERC721A())) { revert ApprovalCallerNotOwnerNorApproved(); } _tokenApprovals[tokenId] = to; emit Approval(owner, to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view override returns (address) { if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken(); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { if (operator == _msgSenderERC721A()) revert ApproveToCaller(); _operatorApprovals[_msgSenderERC721A()][operator] = approved; emit ApprovalForAll(_msgSenderERC721A(), 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-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 { transferFrom(from, to, tokenId); if (to.code.length != 0) if (!_checkContractOnERC721Received(from, to, tokenId, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } /** * @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`), */ function _exists(uint256 tokenId) internal view returns (bool) { return _startTokenId() <= tokenId && tokenId < _currentIndex && // If within bounds, _packedOwnerships[tokenId] & BITMASK_BURNED == 0; // and not burned. } /** * @dev Equivalent to `_safeMint(to, quantity, '')`. */ function _safeMint(address to, uint256 quantity) internal { _safeMint(to, quantity, ''); } /** * @dev Safely mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - If `to` refers to a smart contract, it must implement * {IERC721Receiver-onERC721Received}, which is called for each safe transfer. * - `quantity` must be greater than 0. * * See {_mint}. * * Emits a {Transfer} event for each mint. */ function _safeMint( address to, uint256 quantity, bytes memory _data ) internal { _mint(to, quantity); unchecked { if (to.code.length != 0) { uint256 end = _currentIndex; uint256 index = end - quantity; do { if (!_checkContractOnERC721Received(address(0), to, index++, _data)) { revert TransferToNonERC721ReceiverImplementer(); } } while (index < end); // Reentrancy protection. if (_currentIndex != end) revert(); } } } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {Transfer} event for each mint. */ function _mint(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are incredibly unrealistic. // `balance` and `numberMinted` have a maximum limit of 2**64. // `tokenId` has a maximum limit of 2**256. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); uint256 tokenId = startTokenId; uint256 end = startTokenId + quantity; do { emit Transfer(address(0), to, tokenId++); } while (tokenId < end); _currentIndex = end; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Mints `quantity` tokens and transfers them to `to`. * * This function is intended for efficient minting only during contract creation. * * It emits only one {ConsecutiveTransfer} as defined in * [ERC2309](https://eips.ethereum.org/EIPS/eip-2309), * instead of a sequence of {Transfer} event(s). * * Calling this function outside of contract creation WILL make your contract * non-compliant with the ERC721 standard. * For full ERC721 compliance, substituting ERC721 {Transfer} event(s) with the ERC2309 * {ConsecutiveTransfer} event is only permissible during contract creation. * * Requirements: * * - `to` cannot be the zero address. * - `quantity` must be greater than 0. * * Emits a {ConsecutiveTransfer} event. */ function _mintERC2309(address to, uint256 quantity) internal { uint256 startTokenId = _currentIndex; if (to == address(0)) revert MintToZeroAddress(); if (quantity == 0) revert MintZeroQuantity(); if (quantity > MAX_MINT_ERC2309_QUANTITY_LIMIT) revert MintERC2309QuantityExceedsLimit(); _beforeTokenTransfers(address(0), to, startTokenId, quantity); // Overflows are unrealistic due to the above check for `quantity` to be below the limit. unchecked { // Updates: // - `balance += quantity`. // - `numberMinted += quantity`. // // We can directly add to the `balance` and `numberMinted`. _packedAddressData[to] += quantity * ((1 << BITPOS_NUMBER_MINTED) | 1); // Updates: // - `address` to the owner. // - `startTimestamp` to the timestamp of minting. // - `burned` to `false`. // - `nextInitialized` to `quantity == 1`. _packedOwnerships[startTokenId] = _packOwnershipData( to, _nextInitializedFlag(quantity) | _nextExtraData(address(0), to, 0) ); emit ConsecutiveTransfer(startTokenId, startTokenId + quantity - 1, address(0), to); _currentIndex = startTokenId + quantity; } _afterTokenTransfers(address(0), to, startTokenId, quantity); } /** * @dev Returns the storage slot and value for the approved address of `tokenId`. */ function _getApprovedAddress(uint256 tokenId) private view returns (uint256 approvedAddressSlot, address approvedAddress) { mapping(uint256 => address) storage tokenApprovalsPtr = _tokenApprovals; // The following is equivalent to `approvedAddress = _tokenApprovals[tokenId]`. assembly { // Compute the slot. mstore(0x00, tokenId) mstore(0x20, tokenApprovalsPtr.slot) approvedAddressSlot := keccak256(0x00, 0x40) // Load the slot's value from storage. approvedAddress := sload(approvedAddressSlot) } } /** * @dev Returns whether the `approvedAddress` is equals to `from` or `msgSender`. */ function _isOwnerOrApproved( address approvedAddress, address from, address msgSender ) private pure returns (bool result) { assembly { // Mask `from` to the lower 160 bits, in case the upper bits somehow aren't clean. from := and(from, BITMASK_ADDRESS) // Mask `msgSender` to the lower 160 bits, in case the upper bits somehow aren't clean. msgSender := and(msgSender, BITMASK_ADDRESS) // `msgSender == from || msgSender == approvedAddress`. result := or(eq(msgSender, from), eq(msgSender, approvedAddress)) } } /** * @dev Transfers `tokenId` from `from` to `to`. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); if (address(uint160(prevOwnershipPacked)) != from) revert TransferFromIncorrectOwner(); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); if (to == address(0)) revert TransferToZeroAddress(); _beforeTokenTransfers(from, to, tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256. unchecked { // We can directly increment and decrement the balances. --_packedAddressData[from]; // Updates: `balance -= 1`. ++_packedAddressData[to]; // Updates: `balance += 1`. // Updates: // - `address` to the next owner. // - `startTimestamp` to the timestamp of transfering. // - `burned` to `false`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( to, BITMASK_NEXT_INITIALIZED | _nextExtraData(from, to, prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, to, tokenId); _afterTokenTransfers(from, to, tokenId, 1); } /** * @dev Equivalent to `_burn(tokenId, false)`. */ function _burn(uint256 tokenId) internal virtual { _burn(tokenId, false); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId, bool approvalCheck) internal virtual { uint256 prevOwnershipPacked = _packedOwnershipOf(tokenId); address from = address(uint160(prevOwnershipPacked)); (uint256 approvedAddressSlot, address approvedAddress) = _getApprovedAddress(tokenId); if (approvalCheck) { // The nested ifs save around 20+ gas over a compound boolean condition. if (!_isOwnerOrApproved(approvedAddress, from, _msgSenderERC721A())) if (!isApprovedForAll(from, _msgSenderERC721A())) revert TransferCallerNotOwnerNorApproved(); } _beforeTokenTransfers(from, address(0), tokenId, 1); // Clear approvals from the previous owner. assembly { if approvedAddress { // This is equivalent to `delete _tokenApprovals[tokenId]`. sstore(approvedAddressSlot, 0) } } // Underflow of the sender's balance is impossible because we check for // ownership above and the recipient's balance can't realistically overflow. // Counter overflow is incredibly unrealistic as `tokenId` would have to be 2**256. unchecked { // Updates: // - `balance -= 1`. // - `numberBurned += 1`. // // We can directly decrement the balance, and increment the number burned. // This is equivalent to `packed -= 1; packed += 1 << BITPOS_NUMBER_BURNED;`. _packedAddressData[from] += (1 << BITPOS_NUMBER_BURNED) - 1; // Updates: // - `address` to the last owner. // - `startTimestamp` to the timestamp of burning. // - `burned` to `true`. // - `nextInitialized` to `true`. _packedOwnerships[tokenId] = _packOwnershipData( from, (BITMASK_BURNED | BITMASK_NEXT_INITIALIZED) | _nextExtraData(from, address(0), prevOwnershipPacked) ); // If the next slot may not have been initialized (i.e. `nextInitialized == false`) . if (prevOwnershipPacked & BITMASK_NEXT_INITIALIZED == 0) { uint256 nextTokenId = tokenId + 1; // If the next slot's address is zero and not burned (i.e. packed value is zero). if (_packedOwnerships[nextTokenId] == 0) { // If the next slot is within bounds. if (nextTokenId != _currentIndex) { // Initialize the next slot to maintain correctness for `ownerOf(tokenId + 1)`. _packedOwnerships[nextTokenId] = prevOwnershipPacked; } } } } emit Transfer(from, address(0), tokenId); _afterTokenTransfers(from, address(0), tokenId, 1); // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times. unchecked { _burnCounter++; } } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target 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 _checkContractOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { try ERC721A__IERC721Receiver(to).onERC721Received(_msgSenderERC721A(), from, tokenId, _data) returns ( bytes4 retval ) { return retval == ERC721A__IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert TransferToNonERC721ReceiverImplementer(); } else { assembly { revert(add(32, reason), mload(reason)) } } } } /** * @dev Directly sets the extra data for the ownership data `index`. */ function _setExtraDataAt(uint256 index, uint24 extraData) internal { uint256 packed = _packedOwnerships[index]; if (packed == 0) revert OwnershipNotInitializedForExtraData(); uint256 extraDataCasted; // Cast `extraData` with assembly to avoid redundant masking. assembly { extraDataCasted := extraData } packed = (packed & BITMASK_EXTRA_DATA_COMPLEMENT) | (extraDataCasted << BITPOS_EXTRA_DATA); _packedOwnerships[index] = packed; } /** * @dev Returns the next extra data for the packed ownership data. * The returned result is shifted into position. */ function _nextExtraData( address from, address to, uint256 prevOwnershipPacked ) private view returns (uint256) { uint24 extraData = uint24(prevOwnershipPacked >> BITPOS_EXTRA_DATA); return uint256(_extraData(from, to, extraData)) << BITPOS_EXTRA_DATA; } /** * @dev Called during each token transfer to set the 24bit `extraData` field. * Intended to be overridden by the cosumer contract. * * `previousExtraData` - the value of `extraData` before transfer. * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _extraData( address from, address to, uint24 previousExtraData ) internal view virtual returns (uint24) {} /** * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. * This includes minting. * And also called before burning one token. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * 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, `tokenId` will be burned by `from`. * - `from` and `to` are never both zero. */ function _beforeTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Hook that is called after a set of serially-ordered token ids have been transferred. * This includes minting. * And also called after one token has been burned. * * startTokenId - the first token id to be transferred * quantity - the amount to be transferred * * Calling conditions: * * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been * transferred to `to`. * - When `from` is zero, `tokenId` has been minted for `to`. * - When `to` is zero, `tokenId` has been burned by `from`. * - `from` and `to` are never both zero. */ function _afterTokenTransfers( address from, address to, uint256 startTokenId, uint256 quantity ) internal virtual {} /** * @dev Returns the message sender (defaults to `msg.sender`). * * If you are writing GSN compatible contracts, you need to override this function. */ function _msgSenderERC721A() internal view virtual returns (address) { return msg.sender; } /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function _toString(uint256 value) internal pure returns (string memory ptr) { assembly { // The maximum value of a uint256 contains 78 digits (1 byte per digit), // but we allocate 128 bytes to keep the free memory pointer 32-byte word aliged. // We will need 1 32-byte word to store the length, // and 3 32-byte words to store a maximum of 78 digits. Total: 32 + 3 * 32 = 128. ptr := add(mload(0x40), 128) // Update the free memory pointer to allocate. mstore(0x40, ptr) // Cache the end of the memory to calculate the length later. let end := ptr // We write the string from the rightmost digit to the leftmost digit. // The following is essentially a do-while loop that also handles the zero case. // Costs a bit more than early returning for the zero case, // but cheaper in terms of deployment and overall runtime costs. for { // Initialize and perform the first pass without check. let temp := value // Move the pointer 1 byte leftwards to point to an empty character slot. ptr := sub(ptr, 1) // Write the character to the pointer. 48 is the ASCII index of '0'. mstore8(ptr, add(48, mod(temp, 10))) temp := div(temp, 10) } temp { // Keep dividing `temp` until zero. temp := div(temp, 10) } { // Body of the for loop. ptr := sub(ptr, 1) mstore8(ptr, add(48, mod(temp, 10))) } let length := sub(end, ptr) // Move the pointer 32 bytes leftwards to make room for the length. ptr := sub(ptr, 32) // Store the length. mstore(ptr, length) } } } // File: erc721a/contracts/extensions/ERC721AQueryable.sol // ERC721A Contracts v4.1.0 // Creator: Chiru Labs pragma solidity ^0.8.4; /** * @title ERC721A Queryable * @dev ERC721A subclass with convenience query functions. */ abstract contract ERC721AQueryable is ERC721A, IERC721AQueryable { /** * @dev Returns the `TokenOwnership` struct at `tokenId` without reverting. * * If the `tokenId` is out of bounds: * - `addr` = `address(0)` * - `startTimestamp` = `0` * - `burned` = `false` * - `extraData` = `0` * * If the `tokenId` is burned: * - `addr` = `<Address of owner before token was burned>` * - `startTimestamp` = `<Timestamp when token was burned>` * - `burned = `true` * - `extraData` = `<Extra data when token was burned>` * * Otherwise: * - `addr` = `<Address of owner>` * - `startTimestamp` = `<Timestamp of start of ownership>` * - `burned = `false` * - `extraData` = `<Extra data at start of ownership>` */ function explicitOwnershipOf(uint256 tokenId) public view override returns (TokenOwnership memory) { TokenOwnership memory ownership; if (tokenId < _startTokenId() || tokenId >= _nextTokenId()) { return ownership; } ownership = _ownershipAt(tokenId); if (ownership.burned) { return ownership; } return _ownershipOf(tokenId); } /** * @dev Returns an array of `TokenOwnership` structs at `tokenIds` in order. * See {ERC721AQueryable-explicitOwnershipOf} */ function explicitOwnershipsOf(uint256[] memory tokenIds) external view override returns (TokenOwnership[] memory) { unchecked { uint256 tokenIdsLength = tokenIds.length; TokenOwnership[] memory ownerships = new TokenOwnership[](tokenIdsLength); for (uint256 i; i != tokenIdsLength; ++i) { ownerships[i] = explicitOwnershipOf(tokenIds[i]); } return ownerships; } } /** * @dev Returns an array of token IDs owned by `owner`, * in the range [`start`, `stop`) * (i.e. `start <= tokenId < stop`). * * This function allows for tokens to be queried if the collection * grows too big for a single call of {ERC721AQueryable-tokensOfOwner}. * * Requirements: * * - `start` < `stop` */ function tokensOfOwnerIn( address owner, uint256 start, uint256 stop ) external view override returns (uint256[] memory) { unchecked { if (start >= stop) revert InvalidQueryRange(); uint256 tokenIdsIdx; uint256 stopLimit = _nextTokenId(); // Set `start = max(start, _startTokenId())`. if (start < _startTokenId()) { start = _startTokenId(); } // Set `stop = min(stop, stopLimit)`. if (stop > stopLimit) { stop = stopLimit; } uint256 tokenIdsMaxLength = balanceOf(owner); // Set `tokenIdsMaxLength = min(balanceOf(owner), stop - start)`, // to cater for cases where `balanceOf(owner)` is too big. if (start < stop) { uint256 rangeLength = stop - start; if (rangeLength < tokenIdsMaxLength) { tokenIdsMaxLength = rangeLength; } } else { tokenIdsMaxLength = 0; } uint256[] memory tokenIds = new uint256[](tokenIdsMaxLength); if (tokenIdsMaxLength == 0) { return tokenIds; } // We need to call `explicitOwnershipOf(start)`, // because the slot at `start` may not be initialized. TokenOwnership memory ownership = explicitOwnershipOf(start); address currOwnershipAddr; // If the starting slot exists (i.e. not burned), initialize `currOwnershipAddr`. // `ownership.address` will not be zero, as `start` is clamped to the valid token ID range. if (!ownership.burned) { currOwnershipAddr = ownership.addr; } for (uint256 i = start; i != stop && tokenIdsIdx != tokenIdsMaxLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } // Downsize the array to fit. assembly { mstore(tokenIds, tokenIdsIdx) } return tokenIds; } } /** * @dev Returns an array of token IDs owned by `owner`. * * This function scans the ownership mapping and is O(totalSupply) in complexity. * It is meant to be called off-chain. * * See {ERC721AQueryable-tokensOfOwnerIn} for splitting the scan into * multiple smaller scans if the collection is large enough to cause * an out-of-gas error (10K pfp collections should be fine). */ function tokensOfOwner(address owner) external view override returns (uint256[] memory) { unchecked { uint256 tokenIdsIdx; address currOwnershipAddr; uint256 tokenIdsLength = balanceOf(owner); uint256[] memory tokenIds = new uint256[](tokenIdsLength); TokenOwnership memory ownership; for (uint256 i = _startTokenId(); tokenIdsIdx != tokenIdsLength; ++i) { ownership = _ownershipAt(i); if (ownership.burned) { continue; } if (ownership.addr != address(0)) { currOwnershipAddr = ownership.addr; } if (currOwnershipAddr == owner) { tokenIds[tokenIdsIdx++] = i; } } return tokenIds; } } } // File: contracts/MintYourself.sol pragma solidity ^0.8.14; contract MintYourself is ERC721A, ERC721AQueryable, AccessControl, Pausable { using Counters for Counters.Counter; event FeeUpdated(uint256 feeAmt); event PermissionConfigured(uint256 permId, uint256 cost); event UserPermissionAdded(address user, uint256 permId); struct UserStruct { uint256[] permissions; Counters.Counter permCount; } bytes32 public constant PAUSER_ROLE = keccak256("PAUSER_ROLE"); bytes32 public constant MINTER_ROLE = keccak256("MINTER_ROLE"); Counters.Counter private _tokenIdCounter; string public updatableBaseURI = "https://mintyourself.xyz/api/metadata/"; uint256 public feeAmt = 0; mapping(address => UserStruct) users; Counters.Counter private _permCounter; uint256[] public permissionCost; constructor() ERC721A("Mint Yourself", "MYS") { _grantRole(DEFAULT_ADMIN_ROLE, msg.sender); _grantRole(PAUSER_ROLE, msg.sender); _grantRole(MINTER_ROLE, msg.sender); _tokenIdCounter.increment(); // start @ 1 } function pause() public onlyRole(PAUSER_ROLE) { _pause(); } function unpause() public onlyRole(PAUSER_ROLE) { _unpause(); } function _baseURI() internal view override returns (string memory) { return updatableBaseURI; } function setBaseURI(string memory newBaseURI) public onlyRole(DEFAULT_ADMIN_ROLE) { updatableBaseURI = newBaseURI; } function supportsInterface(bytes4 interfaceId) public view virtual override(ERC721A, AccessControl, IERC721A) returns (bool) { // The interface IDs are constants representing the first 4 bytes of the XOR of // all function selectors in the interface. See: https://eips.ethereum.org/EIPS/eip-165 // e.g. `bytes4(i.functionA.selector ^ i.functionB.selector ^ ...)` return interfaceId == 0x01ffc9a7 || // ERC165 interface ID for ERC165. interfaceId == 0x80ac58cd || // ERC165 interface ID for ERC721. interfaceId == 0x5b5e139f; // ERC165 interface ID for ERC721Metadata. } function mintYourself(address to) public payable whenNotPaused { if (!hasRole(MINTER_ROLE, _msgSender())) { require(msg.value >= feeAmt, "Insufficiant funds"); } _mint(to, 1); } function setFee(uint256 newFee) public onlyRole(DEFAULT_ADMIN_ROLE) { feeAmt = newFee; emit FeeUpdated(newFee); } function configurePermissionCost(uint256 permId, uint256 cost) public onlyRole(DEFAULT_ADMIN_ROLE) { if(permId > _permCounter.current()){ permissionCost[permId] = cost; }else{ permissionCost.push(cost); _permCounter.increment(); } emit PermissionConfigured(permId, cost); } function hasPerm(address user, uint256 permId) public view virtual returns (bool) { require(permId <= _permCounter.current(), "Setting not configured"); UserStruct storage userStruct = users[user]; if(userStruct.permCount.current() < 1){ return false; } for(uint i = 0; i < userStruct.permCount.current() - 1; i++){ if(userStruct.permissions[i] == permId){ return true; } } return false; } function getUserPerms(address user) public view returns (uint256[] memory) { return users[user].permissions; } function grantSetting(address userAddress, uint256 permId) public payable { require(permissionCost[permId] > 0, "Setting not configured"); require(msg.value >= permissionCost[permId], "Transaction value too low"); require(!hasPerm(userAddress, permId), "User already has setting"); users[userAddress].permissions.push(permId); emit UserPermissionAdded(userAddress, permId); } function withdraw() public payable onlyRole(DEFAULT_ADMIN_ROLE) { // withdraw total balance on contract (bool os, ) = payable(_msgSender()).call{value: address(this).balance}(""); require(os); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"ApprovalCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"ApprovalQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"ApproveToCaller","type":"error"},{"inputs":[],"name":"BalanceQueryForZeroAddress","type":"error"},{"inputs":[],"name":"InvalidQueryRange","type":"error"},{"inputs":[],"name":"MintERC2309QuantityExceedsLimit","type":"error"},{"inputs":[],"name":"MintToZeroAddress","type":"error"},{"inputs":[],"name":"MintZeroQuantity","type":"error"},{"inputs":[],"name":"OwnerQueryForNonexistentToken","type":"error"},{"inputs":[],"name":"OwnershipNotInitializedForExtraData","type":"error"},{"inputs":[],"name":"TransferCallerNotOwnerNorApproved","type":"error"},{"inputs":[],"name":"TransferFromIncorrectOwner","type":"error"},{"inputs":[],"name":"TransferToNonERC721ReceiverImplementer","type":"error"},{"inputs":[],"name":"TransferToZeroAddress","type":"error"},{"inputs":[],"name":"URIQueryForNonexistentToken","type":"error"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"uint256","name":"fromTokenId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"toTokenId","type":"uint256"},{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"}],"name":"ConsecutiveTransfer","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"feeAmt","type":"uint256"}],"name":"FeeUpdated","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"account","type":"address"}],"name":"Paused","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"uint256","name":"permId","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"cost","type":"uint256"}],"name":"PermissionConfigured","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"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"address","name":"user","type":"address"},{"indexed":false,"internalType":"uint256","name":"permId","type":"uint256"}],"name":"UserPermissionAdded","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":"permId","type":"uint256"},{"internalType":"uint256","name":"cost","type":"uint256"}],"name":"configurePermissionCost","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"explicitOwnershipOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership","name":"","type":"tuple"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"}],"name":"explicitOwnershipsOf","outputs":[{"components":[{"internalType":"address","name":"addr","type":"address"},{"internalType":"uint64","name":"startTimestamp","type":"uint64"},{"internalType":"bool","name":"burned","type":"bool"},{"internalType":"uint24","name":"extraData","type":"uint24"}],"internalType":"struct IERC721A.TokenOwnership[]","name":"","type":"tuple[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"feeAmt","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"}],"name":"getUserPerms","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":"address","name":"userAddress","type":"address"},{"internalType":"uint256","name":"permId","type":"uint256"}],"name":"grantSetting","outputs":[],"stateMutability":"payable","type":"function"},{"inputs":[{"internalType":"address","name":"user","type":"address"},{"internalType":"uint256","name":"permId","type":"uint256"}],"name":"hasPerm","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","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":"mintYourself","outputs":[],"stateMutability":"payable","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":"uint256","name":"","type":"uint256"}],"name":"permissionCost","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"string","name":"newBaseURI","type":"string"}],"name":"setBaseURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"newFee","type":"uint256"}],"name":"setFee","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":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"tokensOfOwner","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"start","type":"uint256"},{"internalType":"uint256","name":"stop","type":"uint256"}],"name":"tokensOfOwnerIn","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"unpause","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"updatableBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"withdraw","outputs":[],"stateMutability":"payable","type":"function"}]
Contract Creation Code
60806040526040518060600160405280602681526020016200486260269139600b90805190602001906200003592919062000330565b506000600c553480156200004857600080fd5b506040518060400160405280600d81526020017f4d696e7420596f757273656c66000000000000000000000000000000000000008152506040518060400160405280600381526020017f4d595300000000000000000000000000000000000000000000000000000000008152508160029080519060200190620000cd92919062000330565b508060039080519060200190620000e692919062000330565b50620000f7620001b060201b60201c565b60008190555050506000600960006101000a81548160ff0219169083151502179055506200012f6000801b33620001b560201b60201c565b620001617f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a33620001b560201b60201c565b620001937f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a633620001b560201b60201c565b620001aa600a620002a760201b6200214a1760201c565b62000444565b600090565b620001c78282620002bd60201b60201c565b620002a35760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620002486200032860201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6001816000016000828254019250508190555050565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600033905090565b8280546200033e906200040f565b90600052602060002090601f016020900481019282620003625760008555620003ae565b82601f106200037d57805160ff1916838001178555620003ae565b82800160010185558215620003ae579182015b82811115620003ad57825182559160200191906001019062000390565b5b509050620003bd9190620003c1565b5090565b5b80821115620003dc576000816000905550600101620003c2565b5090565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b600060028204905060018216806200042857607f821691505b6020821081036200043e576200043d620003e0565b5b50919050565b61440e80620004546000396000f3fe60806040526004361061023b5760003560e01c80638164dcd51161012e578063b01d0bc5116100ab578063d547741f1161006f578063d547741f146108b1578063e63ab1e9146108da578063e985e9c514610905578063eebb618314610942578063ffd0835b1461096d5761023b565b8063b01d0bc5146107a6578063b88d4fde146107e3578063c23dc68f1461080c578063c87b56dd14610849578063d5391393146108865761023b565b806395d89b41116100f257806395d89b41146106bf57806399a2557a146106ea578063a075e9a214610727578063a217fddf14610752578063a22cb4651461077d5761023b565b80638164dcd5146105b45780638456cb59146105f15780638462151c146106085780639127c9501461064557806391d14854146106825761023b565b80633ccfd60b116101bc5780635bbb2177116101805780635bbb2177146104a95780635c975abb146104e65780636352211e1461051157806369fe0e2d1461054e57806370a08231146105775761023b565b80633ccfd60b1461041a5780633f4ba83a146104245780634212655d1461043b57806342842e0e1461045757806355f804b3146104805761023b565b806323b872dd1161020357806323b872dd14610339578063248a9ca3146103625780632f2ff15d1461039f578063329fc829146103c857806336568abe146103f15761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e557806318160ddd1461030e575b600080fd5b34801561024c57600080fd5b506102676004803603810190610262919061300b565b610989565b6040516102749190613053565b60405180910390f35b34801561028957600080fd5b50610292610a1b565b60405161029f9190613107565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca919061315f565b610aad565b6040516102dc91906131cd565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613214565b610b29565b005b34801561031a57600080fd5b50610323610c6a565b6040516103309190613263565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b919061327e565b610c81565b005b34801561036e57600080fd5b5061038960048036038101906103849190613307565b610fa3565b6040516103969190613343565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c1919061335e565b610fc3565b005b3480156103d457600080fd5b506103ef60048036038101906103ea919061339e565b610fe4565b005b3480156103fd57600080fd5b506104186004803603810190610413919061335e565b61109c565b005b61042261111f565b005b34801561043057600080fd5b506104396111ad565b005b610455600480360381019061045091906133de565b6111e2565b005b34801561046357600080fd5b5061047e6004803603810190610479919061327e565b611273565b005b34801561048c57600080fd5b506104a760048036038101906104a29190613540565b611293565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190613651565b6112bb565b6040516104dd91906137fd565b60405180910390f35b3480156104f257600080fd5b506104fb61137c565b6040516105089190613053565b60405180910390f35b34801561051d57600080fd5b506105386004803603810190610533919061315f565b611393565b60405161054591906131cd565b60405180910390f35b34801561055a57600080fd5b506105756004803603810190610570919061315f565b6113a5565b005b34801561058357600080fd5b5061059e600480360381019061059991906133de565b6113f4565b6040516105ab9190613263565b60405180910390f35b3480156105c057600080fd5b506105db60048036038101906105d6919061315f565b6114ac565b6040516105e89190613263565b60405180910390f35b3480156105fd57600080fd5b506106066114d0565b005b34801561061457600080fd5b5061062f600480360381019061062a91906133de565b611505565b60405161063c91906138dd565b60405180910390f35b34801561065157600080fd5b5061066c60048036038101906106679190613214565b611648565b6040516106799190613053565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a4919061335e565b61176b565b6040516106b69190613053565b60405180910390f35b3480156106cb57600080fd5b506106d46117d6565b6040516106e19190613107565b60405180910390f35b3480156106f657600080fd5b50610711600480360381019061070c91906138ff565b611868565b60405161071e91906138dd565b60405180910390f35b34801561073357600080fd5b5061073c611a74565b6040516107499190613263565b60405180910390f35b34801561075e57600080fd5b50610767611a7a565b6040516107749190613343565b60405180910390f35b34801561078957600080fd5b506107a4600480360381019061079f919061397e565b611a81565b005b3480156107b257600080fd5b506107cd60048036038101906107c891906133de565b611bf8565b6040516107da91906138dd565b60405180910390f35b3480156107ef57600080fd5b5061080a60048036038101906108059190613a5f565b611c92565b005b34801561081857600080fd5b50610833600480360381019061082e919061315f565b611d05565b6040516108409190613b37565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b919061315f565b611d6f565b60405161087d9190613107565b60405180910390f35b34801561089257600080fd5b5061089b611e0d565b6040516108a89190613343565b60405180910390f35b3480156108bd57600080fd5b506108d860048036038101906108d3919061335e565b611e31565b005b3480156108e657600080fd5b506108ef611e52565b6040516108fc9190613343565b60405180910390f35b34801561091157600080fd5b5061092c60048036038101906109279190613b52565b611e76565b6040516109399190613053565b60405180910390f35b34801561094e57600080fd5b50610957611f0a565b6040516109649190613107565b60405180910390f35b61098760048036038101906109829190613214565b611f98565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a145750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610a2a90613bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5690613bc1565b8015610aa35780601f10610a7857610100808354040283529160200191610aa3565b820191906000526020600020905b815481529060010190602001808311610a8657829003601f168201915b5050505050905090565b6000610ab882612160565b610aee576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3482611393565b90508073ffffffffffffffffffffffffffffffffffffffff16610b556121bf565b73ffffffffffffffffffffffffffffffffffffffff1614610bb857610b8181610b7c6121bf565b611e76565b610bb7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c746121c7565b6001546000540303905090565b6000610c8c826121cc565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cf3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cff84612298565b91509150610d158187610d106121bf565b6122ba565b610d6157610d2a86610d256121bf565b611e76565b610d60576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610dc7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dd486868660016122fe565b8015610ddf57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ead85610e89888887612304565b7c02000000000000000000000000000000000000000000000000000000001761232c565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f335760006001850190506000600460008381526020019081526020016000205403610f31576000548114610f30578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f9b8686866001612357565b505050505050565b600060086000838152602001908152602001600020600101549050919050565b610fcc82610fa3565b610fd58161235d565b610fdf8383612371565b505050565b6000801b610ff18161235d565b610ffb600e612452565b83111561102a5781600f848154811061101757611016613bf2565b5b906000526020600020018190555061105e565b600f82908060018154018082558091505060019003906000526020600020016000909190919091505561105d600e61214a565b5b7f9e626cc88d9ba1910b12cca89b211e71844262e6b946468d4428826882eca59b838360405161108f929190613c21565b60405180910390a1505050565b6110a4612460565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110890613cbc565b60405180910390fd5b61111b8282612468565b5050565b6000801b61112c8161235d565b6000611136612460565b73ffffffffffffffffffffffffffffffffffffffff164760405161115990613d0d565b60006040518083038185875af1925050503d8060008114611196576040519150601f19603f3d011682016040523d82523d6000602084013e61119b565b606091505b50509050806111a957600080fd5b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6111d78161235d565b6111df61254a565b50565b6111ea6125ad565b61121b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611216612460565b61176b565b61126557600c54341015611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125b90613d6e565b60405180910390fd5b5b6112708160016125f7565b50565b61128e83838360405180602001604052806000815250611c92565b505050565b6000801b6112a08161235d565b81600b90805190602001906112b6929190612ead565b505050565b606060008251905060008167ffffffffffffffff8111156112df576112de613415565b5b60405190808252806020026020018201604052801561131857816020015b611305612f33565b8152602001906001900390816112fd5790505b50905060005b8281146113715761134885828151811061133b5761133a613bf2565b5b6020026020010151611d05565b82828151811061135b5761135a613bf2565b5b602002602001018190525080600101905061131e565b508092505050919050565b6000600960009054906101000a900460ff16905090565b600061139e826121cc565b9050919050565b6000801b6113b28161235d565b81600c819055507f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c76826040516113e89190613263565b60405180910390a15050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361145b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600f81815481106114bc57600080fd5b906000526020600020016000915090505481565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6114fa8161235d565b6115026127c9565b50565b60606000806000611515856113f4565b905060008167ffffffffffffffff81111561153357611532613415565b5b6040519080825280602002602001820160405280156115615781602001602082028036833780820191505090505b50905061156c612f33565b60006115766121c7565b90505b83861461163a576115898161282c565b9150816040015161162f57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146115d457816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361162e578083878060010198508151811061162157611620613bf2565b5b6020026020010181815250505b5b806001019050611579565b508195505050505050919050565b6000611654600e612452565b821115611696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168d90613dda565b60405180910390fd5b6000600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060016116e782600101612452565b10156116f7576000915050611765565b60005b600161170883600101612452565b6117129190613e29565b81101561175e57838260000182815481106117305761172f613bf2565b5b90600052602060002001540361174b57600192505050611765565b808061175690613e5d565b9150506116fa565b5060009150505b92915050565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600380546117e590613bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461181190613bc1565b801561185e5780601f106118335761010080835404028352916020019161185e565b820191906000526020600020905b81548152906001019060200180831161184157829003601f168201915b5050505050905090565b60608183106118a3576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806118ae612857565b90506118b86121c7565b8510156118ca576118c76121c7565b94505b808411156118d6578093505b60006118e1876113f4565b9050848610156119045760008686039050818110156118fe578091505b50611909565b600090505b60008167ffffffffffffffff81111561192557611924613415565b5b6040519080825280602002602001820160405280156119535781602001602082028036833780820191505090505b5090506000820361196a5780945050505050611a6d565b600061197588611d05565b90506000816040015161198a57816000015190505b60008990505b8881141580156119a05750848714155b15611a5f576119ae8161282c565b92508260400151611a5457600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146119f957826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a535780848880600101995081518110611a4657611a45613bf2565b5b6020026020010181815250505b5b806001019050611990565b508583528296505050505050505b9392505050565b600c5481565b6000801b81565b611a896121bf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611aed576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611afa6121bf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ba76121bf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bec9190613053565b60405180910390a35050565b6060600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480602002602001604051908101604052809291908181526020018280548015611c8657602002820191906000526020600020905b815481526020019060010190808311611c72575b50505050509050919050565b611c9d848484610c81565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611cff57611cc884848484612860565b611cfe576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611d0d612f33565b611d15612f33565b611d1d6121c7565b831080611d315750611d2d612857565b8310155b15611d3f5780915050611d6a565b611d488361282c565b9050806040015115611d5d5780915050611d6a565b611d66836129b0565b9150505b919050565b6060611d7a82612160565b611db0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611dba6129d0565b90506000815103611dda5760405180602001604052806000815250611e05565b80611de484612a62565b604051602001611df5929190613ee1565b6040516020818303038152906040525b915050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611e3a82610fa3565b611e438161235d565b611e4d8383612468565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b8054611f1790613bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4390613bc1565b8015611f905780601f10611f6557610100808354040283529160200191611f90565b820191906000526020600020905b815481529060010190602001808311611f7357829003601f168201915b505050505081565b6000600f8281548110611fae57611fad613bf2565b5b906000526020600020015411611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090613dda565b60405180910390fd5b600f818154811061200d5761200c613bf2565b5b906000526020600020015434101561205a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205190613f51565b60405180910390fd5b6120648282611648565b156120a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209b90613fbd565b60405180910390fd5b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190806001815401808255809150506001900390600052602060002001600090919091909150557fde3436d0f600c03d4ae766facc2d71ebf4740c2a1c0af084bd21dded0e5c180d828260405161213e929190613fdd565b60405180910390a15050565b6001816000016000828254019250508190555050565b60008161216b6121c7565b1115801561217a575060005482105b80156121b8575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b600080829050806121db6121c7565b11612261576000548110156122605760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361225e575b6000810361225457600460008360019003935083815260200190815260200160002054905061222a565b8092505050612293565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861231b868684612abc565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61236e81612369612460565b612ac5565b50565b61237b828261176b565b61244e5760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506123f3612460565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600081600001549050919050565b600033905090565b612472828261176b565b156125465760006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124eb612460565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b612552612b62565b6000600960006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612596612460565b6040516125a391906131cd565b60405180910390a1565b6125b561137c565b156125f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ec90614052565b60405180910390fd5b565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612663576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820361269d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126aa60008483856122fe565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612721836127126000866000612304565b61271b85612bab565b1761232c565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612745578060008190555050506127c46000848385612357565b505050565b6127d16125ad565b6001600960006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612815612460565b60405161282291906131cd565b60405180910390a1565b612834612f33565b6128506004600084815260200190815260200160002054612bbb565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128866121bf565b8786866040518563ffffffff1660e01b81526004016128a894939291906140c7565b6020604051808303816000875af19250505080156128e457506040513d601f19601f820116820180604052508101906128e19190614128565b60015b61295d573d8060008114612914576040519150601f19603f3d011682016040523d82523d6000602084013e612919565b606091505b506000815103612955576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6129b8612f33565b6129c96129c4836121cc565b612bbb565b9050919050565b6060600b80546129df90613bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0b90613bc1565b8015612a585780601f10612a2d57610100808354040283529160200191612a58565b820191906000526020600020905b815481529060010190602001808311612a3b57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015612aa857600183039250600a81066030018353600a81049050612a88565b508181036020830392508083525050919050565b60009392505050565b612acf828261176b565b612b5e57612af48173ffffffffffffffffffffffffffffffffffffffff166014612c71565b612b028360001c6020612c71565b604051602001612b139291906141ed565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b559190613107565b60405180910390fd5b5050565b612b6a61137c565b612ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba090614273565b60405180910390fd5b565b60006001821460e11b9050919050565b612bc3612f33565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b606060006002836002612c849190614293565b612c8e91906142ed565b67ffffffffffffffff811115612ca757612ca6613415565b5b6040519080825280601f01601f191660200182016040528015612cd95781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612d1157612d10613bf2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612d7557612d74613bf2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612db59190614293565b612dbf91906142ed565b90505b6001811115612e5f577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612e0157612e00613bf2565b5b1a60f81b828281518110612e1857612e17613bf2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612e5890614343565b9050612dc2565b5060008414612ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9a906143b8565b60405180910390fd5b8091505092915050565b828054612eb990613bc1565b90600052602060002090601f016020900481019282612edb5760008555612f22565b82601f10612ef457805160ff1916838001178555612f22565b82800160010185558215612f22579182015b82811115612f21578251825591602001919060010190612f06565b5b509050612f2f9190612f82565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612f9b576000816000905550600101612f83565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612fe881612fb3565b8114612ff357600080fd5b50565b60008135905061300581612fdf565b92915050565b60006020828403121561302157613020612fa9565b5b600061302f84828501612ff6565b91505092915050565b60008115159050919050565b61304d81613038565b82525050565b60006020820190506130686000830184613044565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130a857808201518184015260208101905061308d565b838111156130b7576000848401525b50505050565b6000601f19601f8301169050919050565b60006130d98261306e565b6130e38185613079565b93506130f381856020860161308a565b6130fc816130bd565b840191505092915050565b6000602082019050818103600083015261312181846130ce565b905092915050565b6000819050919050565b61313c81613129565b811461314757600080fd5b50565b60008135905061315981613133565b92915050565b60006020828403121561317557613174612fa9565b5b60006131838482850161314a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131b78261318c565b9050919050565b6131c7816131ac565b82525050565b60006020820190506131e260008301846131be565b92915050565b6131f1816131ac565b81146131fc57600080fd5b50565b60008135905061320e816131e8565b92915050565b6000806040838503121561322b5761322a612fa9565b5b6000613239858286016131ff565b925050602061324a8582860161314a565b9150509250929050565b61325d81613129565b82525050565b60006020820190506132786000830184613254565b92915050565b60008060006060848603121561329757613296612fa9565b5b60006132a5868287016131ff565b93505060206132b6868287016131ff565b92505060406132c78682870161314a565b9150509250925092565b6000819050919050565b6132e4816132d1565b81146132ef57600080fd5b50565b600081359050613301816132db565b92915050565b60006020828403121561331d5761331c612fa9565b5b600061332b848285016132f2565b91505092915050565b61333d816132d1565b82525050565b60006020820190506133586000830184613334565b92915050565b6000806040838503121561337557613374612fa9565b5b6000613383858286016132f2565b9250506020613394858286016131ff565b9150509250929050565b600080604083850312156133b5576133b4612fa9565b5b60006133c38582860161314a565b92505060206133d48582860161314a565b9150509250929050565b6000602082840312156133f4576133f3612fa9565b5b6000613402848285016131ff565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61344d826130bd565b810181811067ffffffffffffffff8211171561346c5761346b613415565b5b80604052505050565b600061347f612f9f565b905061348b8282613444565b919050565b600067ffffffffffffffff8211156134ab576134aa613415565b5b6134b4826130bd565b9050602081019050919050565b82818337600083830152505050565b60006134e36134de84613490565b613475565b9050828152602081018484840111156134ff576134fe613410565b5b61350a8482856134c1565b509392505050565b600082601f8301126135275761352661340b565b5b81356135378482602086016134d0565b91505092915050565b60006020828403121561355657613555612fa9565b5b600082013567ffffffffffffffff81111561357457613573612fae565b5b61358084828501613512565b91505092915050565b600067ffffffffffffffff8211156135a4576135a3613415565b5b602082029050602081019050919050565b600080fd5b60006135cd6135c884613589565b613475565b905080838252602082019050602084028301858111156135f0576135ef6135b5565b5b835b818110156136195780613605888261314a565b8452602084019350506020810190506135f2565b5050509392505050565b600082601f8301126136385761363761340b565b5b81356136488482602086016135ba565b91505092915050565b60006020828403121561366757613666612fa9565b5b600082013567ffffffffffffffff81111561368557613684612fae565b5b61369184828501613623565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136cf816131ac565b82525050565b600067ffffffffffffffff82169050919050565b6136f2816136d5565b82525050565b61370181613038565b82525050565b600062ffffff82169050919050565b61371f81613707565b82525050565b60808201600082015161373b60008501826136c6565b50602082015161374e60208501826136e9565b50604082015161376160408501826136f8565b5060608201516137746060850182613716565b50505050565b60006137868383613725565b60808301905092915050565b6000602082019050919050565b60006137aa8261369a565b6137b481856136a5565b93506137bf836136b6565b8060005b838110156137f05781516137d7888261377a565b97506137e283613792565b9250506001810190506137c3565b5085935050505092915050565b60006020820190508181036000830152613817818461379f565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61385481613129565b82525050565b6000613866838361384b565b60208301905092915050565b6000602082019050919050565b600061388a8261381f565b613894818561382a565b935061389f8361383b565b8060005b838110156138d05781516138b7888261385a565b97506138c283613872565b9250506001810190506138a3565b5085935050505092915050565b600060208201905081810360008301526138f7818461387f565b905092915050565b60008060006060848603121561391857613917612fa9565b5b6000613926868287016131ff565b93505060206139378682870161314a565b92505060406139488682870161314a565b9150509250925092565b61395b81613038565b811461396657600080fd5b50565b60008135905061397881613952565b92915050565b6000806040838503121561399557613994612fa9565b5b60006139a3858286016131ff565b92505060206139b485828601613969565b9150509250929050565b600067ffffffffffffffff8211156139d9576139d8613415565b5b6139e2826130bd565b9050602081019050919050565b6000613a026139fd846139be565b613475565b905082815260208101848484011115613a1e57613a1d613410565b5b613a298482856134c1565b509392505050565b600082601f830112613a4657613a4561340b565b5b8135613a568482602086016139ef565b91505092915050565b60008060008060808587031215613a7957613a78612fa9565b5b6000613a87878288016131ff565b9450506020613a98878288016131ff565b9350506040613aa98782880161314a565b925050606085013567ffffffffffffffff811115613aca57613ac9612fae565b5b613ad687828801613a31565b91505092959194509250565b608082016000820151613af860008501826136c6565b506020820151613b0b60208501826136e9565b506040820151613b1e60408501826136f8565b506060820151613b316060850182613716565b50505050565b6000608082019050613b4c6000830184613ae2565b92915050565b60008060408385031215613b6957613b68612fa9565b5b6000613b77858286016131ff565b9250506020613b88858286016131ff565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613bd957607f821691505b602082108103613bec57613beb613b92565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000604082019050613c366000830185613254565b613c436020830184613254565b9392505050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613ca6602f83613079565b9150613cb182613c4a565b604082019050919050565b60006020820190508181036000830152613cd581613c99565b9050919050565b600081905092915050565b50565b6000613cf7600083613cdc565b9150613d0282613ce7565b600082019050919050565b6000613d1882613cea565b9150819050919050565b7f496e73756666696369616e742066756e64730000000000000000000000000000600082015250565b6000613d58601283613079565b9150613d6382613d22565b602082019050919050565b60006020820190508181036000830152613d8781613d4b565b9050919050565b7f53657474696e67206e6f7420636f6e6669677572656400000000000000000000600082015250565b6000613dc4601683613079565b9150613dcf82613d8e565b602082019050919050565b60006020820190508181036000830152613df381613db7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e3482613129565b9150613e3f83613129565b925082821015613e5257613e51613dfa565b5b828203905092915050565b6000613e6882613129565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e9a57613e99613dfa565b5b600182019050919050565b600081905092915050565b6000613ebb8261306e565b613ec58185613ea5565b9350613ed581856020860161308a565b80840191505092915050565b6000613eed8285613eb0565b9150613ef98284613eb0565b91508190509392505050565b7f5472616e73616374696f6e2076616c756520746f6f206c6f7700000000000000600082015250565b6000613f3b601983613079565b9150613f4682613f05565b602082019050919050565b60006020820190508181036000830152613f6a81613f2e565b9050919050565b7f5573657220616c7265616479206861732073657474696e670000000000000000600082015250565b6000613fa7601883613079565b9150613fb282613f71565b602082019050919050565b60006020820190508181036000830152613fd681613f9a565b9050919050565b6000604082019050613ff260008301856131be565b613fff6020830184613254565b9392505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061403c601083613079565b915061404782614006565b602082019050919050565b6000602082019050818103600083015261406b8161402f565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061409982614072565b6140a3818561407d565b93506140b381856020860161308a565b6140bc816130bd565b840191505092915050565b60006080820190506140dc60008301876131be565b6140e960208301866131be565b6140f66040830185613254565b8181036060830152614108818461408e565b905095945050505050565b60008151905061412281612fdf565b92915050565b60006020828403121561413e5761413d612fa9565b5b600061414c84828501614113565b91505092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061418b601783613ea5565b915061419682614155565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006141d7601183613ea5565b91506141e2826141a1565b601182019050919050565b60006141f88261417e565b91506142048285613eb0565b915061420f826141ca565b915061421b8284613eb0565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600061425d601483613079565b915061426882614227565b602082019050919050565b6000602082019050818103600083015261428c81614250565b9050919050565b600061429e82613129565b91506142a983613129565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142e2576142e1613dfa565b5b828202905092915050565b60006142f882613129565b915061430383613129565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561433857614337613dfa565b5b828201905092915050565b600061434e82613129565b91506000820361436157614360613dfa565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006143a2602083613079565b91506143ad8261436c565b602082019050919050565b600060208201905081810360008301526143d181614395565b905091905056fea2646970667358221220b54410cc965beb03f200dcaba29b217396a217d68474d0ed3e80b11fe1d4405d64736f6c634300080e003368747470733a2f2f6d696e74796f757273656c662e78797a2f6170692f6d657461646174612f
Deployed Bytecode
0x60806040526004361061023b5760003560e01c80638164dcd51161012e578063b01d0bc5116100ab578063d547741f1161006f578063d547741f146108b1578063e63ab1e9146108da578063e985e9c514610905578063eebb618314610942578063ffd0835b1461096d5761023b565b8063b01d0bc5146107a6578063b88d4fde146107e3578063c23dc68f1461080c578063c87b56dd14610849578063d5391393146108865761023b565b806395d89b41116100f257806395d89b41146106bf57806399a2557a146106ea578063a075e9a214610727578063a217fddf14610752578063a22cb4651461077d5761023b565b80638164dcd5146105b45780638456cb59146105f15780638462151c146106085780639127c9501461064557806391d14854146106825761023b565b80633ccfd60b116101bc5780635bbb2177116101805780635bbb2177146104a95780635c975abb146104e65780636352211e1461051157806369fe0e2d1461054e57806370a08231146105775761023b565b80633ccfd60b1461041a5780633f4ba83a146104245780634212655d1461043b57806342842e0e1461045757806355f804b3146104805761023b565b806323b872dd1161020357806323b872dd14610339578063248a9ca3146103625780632f2ff15d1461039f578063329fc829146103c857806336568abe146103f15761023b565b806301ffc9a71461024057806306fdde031461027d578063081812fc146102a8578063095ea7b3146102e557806318160ddd1461030e575b600080fd5b34801561024c57600080fd5b506102676004803603810190610262919061300b565b610989565b6040516102749190613053565b60405180910390f35b34801561028957600080fd5b50610292610a1b565b60405161029f9190613107565b60405180910390f35b3480156102b457600080fd5b506102cf60048036038101906102ca919061315f565b610aad565b6040516102dc91906131cd565b60405180910390f35b3480156102f157600080fd5b5061030c60048036038101906103079190613214565b610b29565b005b34801561031a57600080fd5b50610323610c6a565b6040516103309190613263565b60405180910390f35b34801561034557600080fd5b50610360600480360381019061035b919061327e565b610c81565b005b34801561036e57600080fd5b5061038960048036038101906103849190613307565b610fa3565b6040516103969190613343565b60405180910390f35b3480156103ab57600080fd5b506103c660048036038101906103c1919061335e565b610fc3565b005b3480156103d457600080fd5b506103ef60048036038101906103ea919061339e565b610fe4565b005b3480156103fd57600080fd5b506104186004803603810190610413919061335e565b61109c565b005b61042261111f565b005b34801561043057600080fd5b506104396111ad565b005b610455600480360381019061045091906133de565b6111e2565b005b34801561046357600080fd5b5061047e6004803603810190610479919061327e565b611273565b005b34801561048c57600080fd5b506104a760048036038101906104a29190613540565b611293565b005b3480156104b557600080fd5b506104d060048036038101906104cb9190613651565b6112bb565b6040516104dd91906137fd565b60405180910390f35b3480156104f257600080fd5b506104fb61137c565b6040516105089190613053565b60405180910390f35b34801561051d57600080fd5b506105386004803603810190610533919061315f565b611393565b60405161054591906131cd565b60405180910390f35b34801561055a57600080fd5b506105756004803603810190610570919061315f565b6113a5565b005b34801561058357600080fd5b5061059e600480360381019061059991906133de565b6113f4565b6040516105ab9190613263565b60405180910390f35b3480156105c057600080fd5b506105db60048036038101906105d6919061315f565b6114ac565b6040516105e89190613263565b60405180910390f35b3480156105fd57600080fd5b506106066114d0565b005b34801561061457600080fd5b5061062f600480360381019061062a91906133de565b611505565b60405161063c91906138dd565b60405180910390f35b34801561065157600080fd5b5061066c60048036038101906106679190613214565b611648565b6040516106799190613053565b60405180910390f35b34801561068e57600080fd5b506106a960048036038101906106a4919061335e565b61176b565b6040516106b69190613053565b60405180910390f35b3480156106cb57600080fd5b506106d46117d6565b6040516106e19190613107565b60405180910390f35b3480156106f657600080fd5b50610711600480360381019061070c91906138ff565b611868565b60405161071e91906138dd565b60405180910390f35b34801561073357600080fd5b5061073c611a74565b6040516107499190613263565b60405180910390f35b34801561075e57600080fd5b50610767611a7a565b6040516107749190613343565b60405180910390f35b34801561078957600080fd5b506107a4600480360381019061079f919061397e565b611a81565b005b3480156107b257600080fd5b506107cd60048036038101906107c891906133de565b611bf8565b6040516107da91906138dd565b60405180910390f35b3480156107ef57600080fd5b5061080a60048036038101906108059190613a5f565b611c92565b005b34801561081857600080fd5b50610833600480360381019061082e919061315f565b611d05565b6040516108409190613b37565b60405180910390f35b34801561085557600080fd5b50610870600480360381019061086b919061315f565b611d6f565b60405161087d9190613107565b60405180910390f35b34801561089257600080fd5b5061089b611e0d565b6040516108a89190613343565b60405180910390f35b3480156108bd57600080fd5b506108d860048036038101906108d3919061335e565b611e31565b005b3480156108e657600080fd5b506108ef611e52565b6040516108fc9190613343565b60405180910390f35b34801561091157600080fd5b5061092c60048036038101906109279190613b52565b611e76565b6040516109399190613053565b60405180910390f35b34801561094e57600080fd5b50610957611f0a565b6040516109649190613107565b60405180910390f35b61098760048036038101906109829190613214565b611f98565b005b60006301ffc9a760e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614806109e457506380ac58cd60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80610a145750635b5e139f60e01b827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b9050919050565b606060028054610a2a90613bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054610a5690613bc1565b8015610aa35780601f10610a7857610100808354040283529160200191610aa3565b820191906000526020600020905b815481529060010190602001808311610a8657829003601f168201915b5050505050905090565b6000610ab882612160565b610aee576040517fcf4700e400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6006600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b6000610b3482611393565b90508073ffffffffffffffffffffffffffffffffffffffff16610b556121bf565b73ffffffffffffffffffffffffffffffffffffffff1614610bb857610b8181610b7c6121bf565b611e76565b610bb7576040517fcfb3b94200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b826006600084815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550818373ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a4505050565b6000610c746121c7565b6001546000540303905090565b6000610c8c826121cc565b90508373ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610cf3576040517fa114810000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b600080610cff84612298565b91509150610d158187610d106121bf565b6122ba565b610d6157610d2a86610d256121bf565b611e76565b610d60576040517f59c896be00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b600073ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff1603610dc7576040517fea553b3400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b610dd486868660016122fe565b8015610ddf57600082555b600560008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600081546001900391905081905550600560008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000815460010191905081905550610ead85610e89888887612304565b7c02000000000000000000000000000000000000000000000000000000001761232c565b600460008681526020019081526020016000208190555060007c0200000000000000000000000000000000000000000000000000000000841603610f335760006001850190506000600460008381526020019081526020016000205403610f31576000548114610f30578360046000838152602001908152602001600020819055505b5b505b838573ffffffffffffffffffffffffffffffffffffffff168773ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4610f9b8686866001612357565b505050505050565b600060086000838152602001908152602001600020600101549050919050565b610fcc82610fa3565b610fd58161235d565b610fdf8383612371565b505050565b6000801b610ff18161235d565b610ffb600e612452565b83111561102a5781600f848154811061101757611016613bf2565b5b906000526020600020018190555061105e565b600f82908060018154018082558091505060019003906000526020600020016000909190919091505561105d600e61214a565b5b7f9e626cc88d9ba1910b12cca89b211e71844262e6b946468d4428826882eca59b838360405161108f929190613c21565b60405180910390a1505050565b6110a4612460565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614611111576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161110890613cbc565b60405180910390fd5b61111b8282612468565b5050565b6000801b61112c8161235d565b6000611136612460565b73ffffffffffffffffffffffffffffffffffffffff164760405161115990613d0d565b60006040518083038185875af1925050503d8060008114611196576040519150601f19603f3d011682016040523d82523d6000602084013e61119b565b606091505b50509050806111a957600080fd5b5050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6111d78161235d565b6111df61254a565b50565b6111ea6125ad565b61121b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6611216612460565b61176b565b61126557600c54341015611264576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161125b90613d6e565b60405180910390fd5b5b6112708160016125f7565b50565b61128e83838360405180602001604052806000815250611c92565b505050565b6000801b6112a08161235d565b81600b90805190602001906112b6929190612ead565b505050565b606060008251905060008167ffffffffffffffff8111156112df576112de613415565b5b60405190808252806020026020018201604052801561131857816020015b611305612f33565b8152602001906001900390816112fd5790505b50905060005b8281146113715761134885828151811061133b5761133a613bf2565b5b6020026020010151611d05565b82828151811061135b5761135a613bf2565b5b602002602001018190525080600101905061131e565b508092505050919050565b6000600960009054906101000a900460ff16905090565b600061139e826121cc565b9050919050565b6000801b6113b28161235d565b81600c819055507f8c4d35e54a3f2ef1134138fd8ea3daee6a3c89e10d2665996babdf70261e2c76826040516113e89190613263565b60405180910390a15050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff160361145b576040517f8f4eb60400000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b67ffffffffffffffff600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002054169050919050565b600f81815481106114bc57600080fd5b906000526020600020016000915090505481565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a6114fa8161235d565b6115026127c9565b50565b60606000806000611515856113f4565b905060008167ffffffffffffffff81111561153357611532613415565b5b6040519080825280602002602001820160405280156115615781602001602082028036833780820191505090505b50905061156c612f33565b60006115766121c7565b90505b83861461163a576115898161282c565b9150816040015161162f57600073ffffffffffffffffffffffffffffffffffffffff16826000015173ffffffffffffffffffffffffffffffffffffffff16146115d457816000015194505b8773ffffffffffffffffffffffffffffffffffffffff168573ffffffffffffffffffffffffffffffffffffffff160361162e578083878060010198508151811061162157611620613bf2565b5b6020026020010181815250505b5b806001019050611579565b508195505050505050919050565b6000611654600e612452565b821115611696576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161168d90613dda565b60405180910390fd5b6000600d60008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020905060016116e782600101612452565b10156116f7576000915050611765565b60005b600161170883600101612452565b6117129190613e29565b81101561175e57838260000182815481106117305761172f613bf2565b5b90600052602060002001540361174b57600192505050611765565b808061175690613e5d565b9150506116fa565b5060009150505b92915050565b60006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600380546117e590613bc1565b80601f016020809104026020016040519081016040528092919081815260200182805461181190613bc1565b801561185e5780601f106118335761010080835404028352916020019161185e565b820191906000526020600020905b81548152906001019060200180831161184157829003601f168201915b5050505050905090565b60608183106118a3576040517f32c1995a00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000806118ae612857565b90506118b86121c7565b8510156118ca576118c76121c7565b94505b808411156118d6578093505b60006118e1876113f4565b9050848610156119045760008686039050818110156118fe578091505b50611909565b600090505b60008167ffffffffffffffff81111561192557611924613415565b5b6040519080825280602002602001820160405280156119535781602001602082028036833780820191505090505b5090506000820361196a5780945050505050611a6d565b600061197588611d05565b90506000816040015161198a57816000015190505b60008990505b8881141580156119a05750848714155b15611a5f576119ae8161282c565b92508260400151611a5457600073ffffffffffffffffffffffffffffffffffffffff16836000015173ffffffffffffffffffffffffffffffffffffffff16146119f957826000015191505b8a73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611a535780848880600101995081518110611a4657611a45613bf2565b5b6020026020010181815250505b5b806001019050611990565b508583528296505050505050505b9392505050565b600c5481565b6000801b81565b611a896121bf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1603611aed576040517fb06307db00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b8060076000611afa6121bf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff16611ba76121bf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c3183604051611bec9190613053565b60405180910390a35050565b6060600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600001805480602002602001604051908101604052809291908181526020018280548015611c8657602002820191906000526020600020905b815481526020019060010190808311611c72575b50505050509050919050565b611c9d848484610c81565b60008373ffffffffffffffffffffffffffffffffffffffff163b14611cff57611cc884848484612860565b611cfe576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b5b50505050565b611d0d612f33565b611d15612f33565b611d1d6121c7565b831080611d315750611d2d612857565b8310155b15611d3f5780915050611d6a565b611d488361282c565b9050806040015115611d5d5780915050611d6a565b611d66836129b0565b9150505b919050565b6060611d7a82612160565b611db0576040517fa14c4b5000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000611dba6129d0565b90506000815103611dda5760405180602001604052806000815250611e05565b80611de484612a62565b604051602001611df5929190613ee1565b6040516020818303038152906040525b915050919050565b7f9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a681565b611e3a82610fa3565b611e438161235d565b611e4d8383612468565b505050565b7f65d7a28e3265b37a6474929f336521b332c1681b933f6cb9f3376673440d862a81565b6000600760008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600b8054611f1790613bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054611f4390613bc1565b8015611f905780601f10611f6557610100808354040283529160200191611f90565b820191906000526020600020905b815481529060010190602001808311611f7357829003601f168201915b505050505081565b6000600f8281548110611fae57611fad613bf2565b5b906000526020600020015411611ff9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611ff090613dda565b60405180910390fd5b600f818154811061200d5761200c613bf2565b5b906000526020600020015434101561205a576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161205190613f51565b60405180910390fd5b6120648282611648565b156120a4576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161209b90613fbd565b60405180910390fd5b600d60008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000018190806001815401808255809150506001900390600052602060002001600090919091909150557fde3436d0f600c03d4ae766facc2d71ebf4740c2a1c0af084bd21dded0e5c180d828260405161213e929190613fdd565b60405180910390a15050565b6001816000016000828254019250508190555050565b60008161216b6121c7565b1115801561217a575060005482105b80156121b8575060007c0100000000000000000000000000000000000000000000000000000000600460008581526020019081526020016000205416145b9050919050565b600033905090565b600090565b600080829050806121db6121c7565b11612261576000548110156122605760006004600083815260200190815260200160002054905060007c010000000000000000000000000000000000000000000000000000000082160361225e575b6000810361225457600460008360019003935083815260200190815260200160002054905061222a565b8092505050612293565b505b5b6040517fdf2d9b4200000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b919050565b6000806000600690508360005280602052604060002092508254915050915091565b600073ffffffffffffffffffffffffffffffffffffffff8316925073ffffffffffffffffffffffffffffffffffffffff821691508382148383141790509392505050565b50505050565b60008060e883901c905060e861231b868684612abc565b62ffffff16901b9150509392505050565b600073ffffffffffffffffffffffffffffffffffffffff83169250814260a01b178317905092915050565b50505050565b61236e81612369612460565b612ac5565b50565b61237b828261176b565b61244e5760016008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506123f3612460565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b600081600001549050919050565b600033905090565b612472828261176b565b156125465760006008600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506124eb612460565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b612552612b62565b6000600960006101000a81548160ff0219169083151502179055507f5db9ee0a495bf2e6ff9c91a7834c1ba4fdd244a5e8aa4e537bd38aeae4b073aa612596612460565b6040516125a391906131cd565b60405180910390a1565b6125b561137c565b156125f5576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ec90614052565b60405180910390fd5b565b600080549050600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1603612663576040517f2e07630000000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6000820361269d576040517fb562e8dd00000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b6126aa60008483856122fe565b600160406001901b178202600560008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282540192505081905550612721836127126000866000612304565b61271b85612bab565b1761232c565b60046000838152602001908152602001600020819055506000819050600083830190505b818060010192508573ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4808210612745578060008190555050506127c46000848385612357565b505050565b6127d16125ad565b6001600960006101000a81548160ff0219169083151502179055507f62e78cea01bee320cd4e420270b5ea74000d11b0c9f74754ebdbfc544b05a258612815612460565b60405161282291906131cd565b60405180910390a1565b612834612f33565b6128506004600084815260200190815260200160002054612bbb565b9050919050565b60008054905090565b60008373ffffffffffffffffffffffffffffffffffffffff1663150b7a026128866121bf565b8786866040518563ffffffff1660e01b81526004016128a894939291906140c7565b6020604051808303816000875af19250505080156128e457506040513d601f19601f820116820180604052508101906128e19190614128565b60015b61295d573d8060008114612914576040519150601f19603f3d011682016040523d82523d6000602084013e612919565b606091505b506000815103612955576040517fd1a57ed600000000000000000000000000000000000000000000000000000000815260040160405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050949350505050565b6129b8612f33565b6129c96129c4836121cc565b612bbb565b9050919050565b6060600b80546129df90613bc1565b80601f0160208091040260200160405190810160405280929190818152602001828054612a0b90613bc1565b8015612a585780601f10612a2d57610100808354040283529160200191612a58565b820191906000526020600020905b815481529060010190602001808311612a3b57829003601f168201915b5050505050905090565b60606080604051019050806040528082600183039250600a81066030018353600a810490505b8015612aa857600183039250600a81066030018353600a81049050612a88565b508181036020830392508083525050919050565b60009392505050565b612acf828261176b565b612b5e57612af48173ffffffffffffffffffffffffffffffffffffffff166014612c71565b612b028360001c6020612c71565b604051602001612b139291906141ed565b6040516020818303038152906040526040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612b559190613107565b60405180910390fd5b5050565b612b6a61137c565b612ba9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612ba090614273565b60405180910390fd5b565b60006001821460e11b9050919050565b612bc3612f33565b81816000019073ffffffffffffffffffffffffffffffffffffffff16908173ffffffffffffffffffffffffffffffffffffffff168152505060a082901c816020019067ffffffffffffffff16908167ffffffffffffffff168152505060007c01000000000000000000000000000000000000000000000000000000008316141581604001901515908115158152505060e882901c816060019062ffffff16908162ffffff1681525050919050565b606060006002836002612c849190614293565b612c8e91906142ed565b67ffffffffffffffff811115612ca757612ca6613415565b5b6040519080825280601f01601f191660200182016040528015612cd95781602001600182028036833780820191505090505b5090507f300000000000000000000000000000000000000000000000000000000000000081600081518110612d1157612d10613bf2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612d7557612d74613bf2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a90535060006001846002612db59190614293565b612dbf91906142ed565b90505b6001811115612e5f577f3031323334353637383961626364656600000000000000000000000000000000600f861660108110612e0157612e00613bf2565b5b1a60f81b828281518110612e1857612e17613bf2565b5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612e5890614343565b9050612dc2565b5060008414612ea3576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612e9a906143b8565b60405180910390fd5b8091505092915050565b828054612eb990613bc1565b90600052602060002090601f016020900481019282612edb5760008555612f22565b82601f10612ef457805160ff1916838001178555612f22565b82800160010185558215612f22579182015b82811115612f21578251825591602001919060010190612f06565b5b509050612f2f9190612f82565b5090565b6040518060800160405280600073ffffffffffffffffffffffffffffffffffffffff168152602001600067ffffffffffffffff168152602001600015158152602001600062ffffff1681525090565b5b80821115612f9b576000816000905550600101612f83565b5090565b6000604051905090565b600080fd5b600080fd5b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b612fe881612fb3565b8114612ff357600080fd5b50565b60008135905061300581612fdf565b92915050565b60006020828403121561302157613020612fa9565b5b600061302f84828501612ff6565b91505092915050565b60008115159050919050565b61304d81613038565b82525050565b60006020820190506130686000830184613044565b92915050565b600081519050919050565b600082825260208201905092915050565b60005b838110156130a857808201518184015260208101905061308d565b838111156130b7576000848401525b50505050565b6000601f19601f8301169050919050565b60006130d98261306e565b6130e38185613079565b93506130f381856020860161308a565b6130fc816130bd565b840191505092915050565b6000602082019050818103600083015261312181846130ce565b905092915050565b6000819050919050565b61313c81613129565b811461314757600080fd5b50565b60008135905061315981613133565b92915050565b60006020828403121561317557613174612fa9565b5b60006131838482850161314a565b91505092915050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b60006131b78261318c565b9050919050565b6131c7816131ac565b82525050565b60006020820190506131e260008301846131be565b92915050565b6131f1816131ac565b81146131fc57600080fd5b50565b60008135905061320e816131e8565b92915050565b6000806040838503121561322b5761322a612fa9565b5b6000613239858286016131ff565b925050602061324a8582860161314a565b9150509250929050565b61325d81613129565b82525050565b60006020820190506132786000830184613254565b92915050565b60008060006060848603121561329757613296612fa9565b5b60006132a5868287016131ff565b93505060206132b6868287016131ff565b92505060406132c78682870161314a565b9150509250925092565b6000819050919050565b6132e4816132d1565b81146132ef57600080fd5b50565b600081359050613301816132db565b92915050565b60006020828403121561331d5761331c612fa9565b5b600061332b848285016132f2565b91505092915050565b61333d816132d1565b82525050565b60006020820190506133586000830184613334565b92915050565b6000806040838503121561337557613374612fa9565b5b6000613383858286016132f2565b9250506020613394858286016131ff565b9150509250929050565b600080604083850312156133b5576133b4612fa9565b5b60006133c38582860161314a565b92505060206133d48582860161314a565b9150509250929050565b6000602082840312156133f4576133f3612fa9565b5b6000613402848285016131ff565b91505092915050565b600080fd5b600080fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b61344d826130bd565b810181811067ffffffffffffffff8211171561346c5761346b613415565b5b80604052505050565b600061347f612f9f565b905061348b8282613444565b919050565b600067ffffffffffffffff8211156134ab576134aa613415565b5b6134b4826130bd565b9050602081019050919050565b82818337600083830152505050565b60006134e36134de84613490565b613475565b9050828152602081018484840111156134ff576134fe613410565b5b61350a8482856134c1565b509392505050565b600082601f8301126135275761352661340b565b5b81356135378482602086016134d0565b91505092915050565b60006020828403121561355657613555612fa9565b5b600082013567ffffffffffffffff81111561357457613573612fae565b5b61358084828501613512565b91505092915050565b600067ffffffffffffffff8211156135a4576135a3613415565b5b602082029050602081019050919050565b600080fd5b60006135cd6135c884613589565b613475565b905080838252602082019050602084028301858111156135f0576135ef6135b5565b5b835b818110156136195780613605888261314a565b8452602084019350506020810190506135f2565b5050509392505050565b600082601f8301126136385761363761340b565b5b81356136488482602086016135ba565b91505092915050565b60006020828403121561366757613666612fa9565b5b600082013567ffffffffffffffff81111561368557613684612fae565b5b61369184828501613623565b91505092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b6136cf816131ac565b82525050565b600067ffffffffffffffff82169050919050565b6136f2816136d5565b82525050565b61370181613038565b82525050565b600062ffffff82169050919050565b61371f81613707565b82525050565b60808201600082015161373b60008501826136c6565b50602082015161374e60208501826136e9565b50604082015161376160408501826136f8565b5060608201516137746060850182613716565b50505050565b60006137868383613725565b60808301905092915050565b6000602082019050919050565b60006137aa8261369a565b6137b481856136a5565b93506137bf836136b6565b8060005b838110156137f05781516137d7888261377a565b97506137e283613792565b9250506001810190506137c3565b5085935050505092915050565b60006020820190508181036000830152613817818461379f565b905092915050565b600081519050919050565b600082825260208201905092915050565b6000819050602082019050919050565b61385481613129565b82525050565b6000613866838361384b565b60208301905092915050565b6000602082019050919050565b600061388a8261381f565b613894818561382a565b935061389f8361383b565b8060005b838110156138d05781516138b7888261385a565b97506138c283613872565b9250506001810190506138a3565b5085935050505092915050565b600060208201905081810360008301526138f7818461387f565b905092915050565b60008060006060848603121561391857613917612fa9565b5b6000613926868287016131ff565b93505060206139378682870161314a565b92505060406139488682870161314a565b9150509250925092565b61395b81613038565b811461396657600080fd5b50565b60008135905061397881613952565b92915050565b6000806040838503121561399557613994612fa9565b5b60006139a3858286016131ff565b92505060206139b485828601613969565b9150509250929050565b600067ffffffffffffffff8211156139d9576139d8613415565b5b6139e2826130bd565b9050602081019050919050565b6000613a026139fd846139be565b613475565b905082815260208101848484011115613a1e57613a1d613410565b5b613a298482856134c1565b509392505050565b600082601f830112613a4657613a4561340b565b5b8135613a568482602086016139ef565b91505092915050565b60008060008060808587031215613a7957613a78612fa9565b5b6000613a87878288016131ff565b9450506020613a98878288016131ff565b9350506040613aa98782880161314a565b925050606085013567ffffffffffffffff811115613aca57613ac9612fae565b5b613ad687828801613a31565b91505092959194509250565b608082016000820151613af860008501826136c6565b506020820151613b0b60208501826136e9565b506040820151613b1e60408501826136f8565b506060820151613b316060850182613716565b50505050565b6000608082019050613b4c6000830184613ae2565b92915050565b60008060408385031215613b6957613b68612fa9565b5b6000613b77858286016131ff565b9250506020613b88858286016131ff565b9150509250929050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b60006002820490506001821680613bd957607f821691505b602082108103613bec57613beb613b92565b5b50919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6000604082019050613c366000830185613254565b613c436020830184613254565b9392505050565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b6000613ca6602f83613079565b9150613cb182613c4a565b604082019050919050565b60006020820190508181036000830152613cd581613c99565b9050919050565b600081905092915050565b50565b6000613cf7600083613cdc565b9150613d0282613ce7565b600082019050919050565b6000613d1882613cea565b9150819050919050565b7f496e73756666696369616e742066756e64730000000000000000000000000000600082015250565b6000613d58601283613079565b9150613d6382613d22565b602082019050919050565b60006020820190508181036000830152613d8781613d4b565b9050919050565b7f53657474696e67206e6f7420636f6e6669677572656400000000000000000000600082015250565b6000613dc4601683613079565b9150613dcf82613d8e565b602082019050919050565b60006020820190508181036000830152613df381613db7565b9050919050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b6000613e3482613129565b9150613e3f83613129565b925082821015613e5257613e51613dfa565b5b828203905092915050565b6000613e6882613129565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8203613e9a57613e99613dfa565b5b600182019050919050565b600081905092915050565b6000613ebb8261306e565b613ec58185613ea5565b9350613ed581856020860161308a565b80840191505092915050565b6000613eed8285613eb0565b9150613ef98284613eb0565b91508190509392505050565b7f5472616e73616374696f6e2076616c756520746f6f206c6f7700000000000000600082015250565b6000613f3b601983613079565b9150613f4682613f05565b602082019050919050565b60006020820190508181036000830152613f6a81613f2e565b9050919050565b7f5573657220616c7265616479206861732073657474696e670000000000000000600082015250565b6000613fa7601883613079565b9150613fb282613f71565b602082019050919050565b60006020820190508181036000830152613fd681613f9a565b9050919050565b6000604082019050613ff260008301856131be565b613fff6020830184613254565b9392505050565b7f5061757361626c653a2070617573656400000000000000000000000000000000600082015250565b600061403c601083613079565b915061404782614006565b602082019050919050565b6000602082019050818103600083015261406b8161402f565b9050919050565b600081519050919050565b600082825260208201905092915050565b600061409982614072565b6140a3818561407d565b93506140b381856020860161308a565b6140bc816130bd565b840191505092915050565b60006080820190506140dc60008301876131be565b6140e960208301866131be565b6140f66040830185613254565b8181036060830152614108818461408e565b905095945050505050565b60008151905061412281612fdf565b92915050565b60006020828403121561413e5761413d612fa9565b5b600061414c84828501614113565b91505092915050565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b600061418b601783613ea5565b915061419682614155565b601782019050919050565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b60006141d7601183613ea5565b91506141e2826141a1565b601182019050919050565b60006141f88261417e565b91506142048285613eb0565b915061420f826141ca565b915061421b8284613eb0565b91508190509392505050565b7f5061757361626c653a206e6f7420706175736564000000000000000000000000600082015250565b600061425d601483613079565b915061426882614227565b602082019050919050565b6000602082019050818103600083015261428c81614250565b9050919050565b600061429e82613129565b91506142a983613129565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156142e2576142e1613dfa565b5b828202905092915050565b60006142f882613129565b915061430383613129565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561433857614337613dfa565b5b828201905092915050565b600061434e82613129565b91506000820361436157614360613dfa565b5b600182039050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b60006143a2602083613079565b91506143ad8261436c565b602082019050919050565b600060208201905081810360008301526143d181614395565b905091905056fea2646970667358221220b54410cc965beb03f200dcaba29b217396a217d68474d0ed3e80b11fe1d4405d64736f6c634300080e0033
Deployed Bytecode Sourcemap
73991:4206:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75490:649;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43038:100;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44984:204;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;44532:386;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;36445:315;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54249:2800;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;15072:131;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15513:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;76521:353;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;16657:218;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77968:226;;;:::i;:::-;;75150:77;;;;;;;;;;;;;:::i;:::-;;76147:222;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45874:185;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75352:130;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;69201:468;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;6636:86;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;42827:144;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76377:136;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;38070:224;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74771:31;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;75069:73;;;;;;;;;;;;;:::i;:::-;;73013:892;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;76882:513;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;13532:147;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43207:104;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;70059:2505;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74652:25;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;12637:49;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45260:308;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;77403:124;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;46130:399;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;68622:420;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;43382:318;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74456:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;15953:149;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;74387:62;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45639:164;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;74572:73;;;;;;;;;;;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;77535:425;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;75490:649;75609:4;75924:10;75909:25;;:11;:25;;;;:102;;;;76001:10;75986:25;;:11;:25;;;;75909:102;:179;;;;76078:10;76063:25;;:11;:25;;;;75909:179;75889:199;;75490:649;;;:::o;43038:100::-;43092:13;43125:5;43118:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43038:100;:::o;44984:204::-;45052:7;45077:16;45085:7;45077;:16::i;:::-;45072:64;;45102:34;;;;;;;;;;;;;;45072:64;45156:15;:24;45172:7;45156:24;;;;;;;;;;;;;;;;;;;;;45149:31;;44984:204;;;:::o;44532:386::-;44605:13;44621:16;44629:7;44621;:16::i;:::-;44605:32;;44677:5;44654:28;;:19;:17;:19::i;:::-;:28;;;44650:175;;44702:44;44719:5;44726:19;:17;:19::i;:::-;44702:16;:44::i;:::-;44697:128;;44774:35;;;;;;;;;;;;;;44697:128;44650:175;44864:2;44837:15;:24;44853:7;44837:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;44902:7;44898:2;44882:28;;44891:5;44882:28;;;;;;;;;;;;44594:324;44532:386;;:::o;36445:315::-;36498:7;36726:15;:13;:15::i;:::-;36711:12;;36695:13;;:28;:46;36688:53;;36445:315;:::o;54249:2800::-;54383:27;54413;54432:7;54413:18;:27::i;:::-;54383:57;;54498:4;54457:45;;54473:19;54457:45;;;54453:86;;54511:28;;;;;;;;;;;;;;54453:86;54553:27;54582:23;54609:28;54629:7;54609:19;:28::i;:::-;54552:85;;;;54737:62;54756:15;54773:4;54779:19;:17;:19::i;:::-;54737:18;:62::i;:::-;54732:174;;54819:43;54836:4;54842:19;:17;:19::i;:::-;54819:16;:43::i;:::-;54814:92;;54871:35;;;;;;;;;;;;;;54814:92;54732:174;54937:1;54923:16;;:2;:16;;;54919:52;;54948:23;;;;;;;;;;;;;;54919:52;54984:43;55006:4;55012:2;55016:7;55025:1;54984:21;:43::i;:::-;55120:15;55117:160;;;55260:1;55239:19;55232:30;55117:160;55655:18;:24;55674:4;55655:24;;;;;;;;;;;;;;;;55653:26;;;;;;;;;;;;55724:18;:22;55743:2;55724:22;;;;;;;;;;;;;;;;55722:24;;;;;;;;;;;56046:145;56083:2;56131:45;56146:4;56152:2;56156:19;56131:14;:45::i;:::-;33673:8;56104:72;56046:18;:145::i;:::-;56017:17;:26;56035:7;56017:26;;;;;;;;;;;:174;;;;56361:1;33673:8;56311:19;:46;:51;56307:626;;56383:19;56415:1;56405:7;:11;56383:33;;56572:1;56538:17;:30;56556:11;56538:30;;;;;;;;;;;;:35;56534:384;;56676:13;;56661:11;:28;56657:242;;56856:19;56823:17;:30;56841:11;56823:30;;;;;;;;;;;:52;;;;56657:242;56534:384;56364:569;56307:626;56980:7;56976:2;56961:27;;56970:4;56961:27;;;;;;;;;;;;56999:42;57020:4;57026:2;57030:7;57039:1;56999:20;:42::i;:::-;54372:2677;;;54249:2800;;;:::o;15072:131::-;15146:7;15173:6;:12;15180:4;15173:12;;;;;;;;;;;:22;;;15166:29;;15072:131;;;:::o;15513:147::-;15596:18;15609:4;15596:12;:18::i;:::-;13128:16;13139:4;13128:10;:16::i;:::-;15627:25:::1;15638:4;15644:7;15627:10;:25::i;:::-;15513:147:::0;;;:::o;76521:353::-;12682:4;76600:18;;13128:16;13139:4;13128:10;:16::i;:::-;76643:22:::1;:12;:20;:22::i;:::-;76634:6;:31;76631:186;;;76706:4;76681:14;76696:6;76681:22;;;;;;;;:::i;:::-;;;;;;;;;:29;;;;76631:186;;;76741:14;76761:4;76741:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;76781:24;:12;:22;:24::i;:::-;76631:186;76832:34;76853:6;76861:4;76832:34;;;;;;;:::i;:::-;;;;;;;;76521:353:::0;;;:::o;16657:218::-;16764:12;:10;:12::i;:::-;16753:23;;:7;:23;;;16745:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;16841:26;16853:4;16859:7;16841:11;:26::i;:::-;16657:218;;:::o;77968:226::-;12682:4;78012:18;;13128:16;13139:4;13128:10;:16::i;:::-;78091:7:::1;78112:12;:10;:12::i;:::-;78104:26;;78138:21;78104:60;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;78090:74;;;78183:2;78175:11;;;::::0;::::1;;78032:162;77968:226:::0;:::o;75150:77::-;74425:24;13128:16;13139:4;13128:10;:16::i;:::-;75209:10:::1;:8;:10::i;:::-;75150:77:::0;:::o;76147:222::-;6241:19;:17;:19::i;:::-;76226:34:::1;74494:24;76247:12;:10;:12::i;:::-;76226:7;:34::i;:::-;76221:118;;76298:6;;76285:9;:19;;76277:50;;;;;;;;;;;;:::i;:::-;;;;;;;;;76221:118;76349:12;76355:2;76359:1;76349:5;:12::i;:::-;76147:222:::0;:::o;45874:185::-;46012:39;46029:4;46035:2;46039:7;46012:39;;;;;;;;;;;;:16;:39::i;:::-;45874:185;;;:::o;75352:130::-;12682:4;75414:18;;13128:16;13139:4;13128:10;:16::i;:::-;75464:10:::1;75445:16;:29;;;;;;;;;;;;:::i;:::-;;75352:130:::0;;:::o;69201:468::-;69290:23;69351:22;69376:8;:15;69351:40;;69406:34;69464:14;69443:36;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;69406:73;;69499:9;69494:125;69515:14;69510:1;:19;69494:125;;69571:32;69591:8;69600:1;69591:11;;;;;;;;:::i;:::-;;;;;;;;69571:19;:32::i;:::-;69555:10;69566:1;69555:13;;;;;;;;:::i;:::-;;;;;;;:48;;;;69531:3;;;;;69494:125;;;;69640:10;69633:17;;;;69201:468;;;:::o;6636:86::-;6683:4;6707:7;;;;;;;;;;;6700:14;;6636:86;:::o;42827:144::-;42891:7;42934:27;42953:7;42934:18;:27::i;:::-;42911:52;;42827:144;;;:::o;76377:136::-;12682:4;76425:18;;13128:16;13139:4;13128:10;:16::i;:::-;76465:6:::1;76456;:15;;;;76487:18;76498:6;76487:18;;;;;;:::i;:::-;;;;;;;;76377:136:::0;;:::o;38070:224::-;38134:7;38175:1;38158:19;;:5;:19;;;38154:60;;38186:28;;;;;;;;;;;;;;38154:60;32625:13;38232:18;:25;38251:5;38232:25;;;;;;;;;;;;;;;;:54;38225:61;;38070:224;;;:::o;74771:31::-;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;75069:73::-;74425:24;13128:16;13139:4;13128:10;:16::i;:::-;75126:8:::1;:6;:8::i;:::-;75069:73:::0;:::o;73013:892::-;73083:16;73137:19;73171:25;73211:22;73236:16;73246:5;73236:9;:16::i;:::-;73211:41;;73267:25;73309:14;73295:29;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;73267:57;;73339:31;;:::i;:::-;73390:9;73402:15;:13;:15::i;:::-;73390:27;;73385:472;73434:14;73419:11;:29;73385:472;;73486:15;73499:1;73486:12;:15::i;:::-;73474:27;;73524:9;:16;;;73565:8;73520:73;73641:1;73615:28;;:9;:14;;;:28;;;73611:111;;73688:9;:14;;;73668:34;;73611:111;73765:5;73744:26;;:17;:26;;;73740:102;;73821:1;73795:8;73804:13;;;;;;73795:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;73740:102;73385:472;73450:3;;;;;73385:472;;;;73878:8;73871:15;;;;;;;73013:892;;;:::o;76882:513::-;76958:4;76993:22;:12;:20;:22::i;:::-;76983:6;:32;;76975:67;;;;;;;;;;;;:::i;:::-;;;;;;;;;77053:29;77085:5;:11;77091:4;77085:11;;;;;;;;;;;;;;;77053:43;;77143:1;77110:30;:10;:20;;:28;:30::i;:::-;:34;77107:77;;;77167:5;77160:12;;;;;77107:77;77198:6;77194:171;77247:1;77214:30;:10;:20;;:28;:30::i;:::-;:34;;;;:::i;:::-;77210:1;:38;77194:171;;;77301:6;77272:10;:22;;77295:1;77272:25;;;;;;;;:::i;:::-;;;;;;;;;;:35;77269:85;;77334:4;77327:11;;;;;;77269:85;77250:3;;;;;:::i;:::-;;;;77194:171;;;;77382:5;77375:12;;;76882:513;;;;;:::o;13532:147::-;13618:4;13642:6;:12;13649:4;13642:12;;;;;;;;;;;:20;;:29;13663:7;13642:29;;;;;;;;;;;;;;;;;;;;;;;;;13635:36;;13532:147;;;;:::o;43207:104::-;43263:13;43296:7;43289:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;43207:104;:::o;70059:2505::-;70194:16;70261:4;70252:5;:13;70248:45;;70274:19;;;;;;;;;;;;;;70248:45;70308:19;70342:17;70362:14;:12;:14::i;:::-;70342:34;;70462:15;:13;:15::i;:::-;70454:5;:23;70450:87;;;70506:15;:13;:15::i;:::-;70498:23;;70450:87;70613:9;70606:4;:16;70602:73;;;70650:9;70643:16;;70602:73;70689:25;70717:16;70727:5;70717:9;:16::i;:::-;70689:44;;70911:4;70903:5;:12;70899:278;;;70936:19;70965:5;70958:4;:12;70936:34;;71007:17;70993:11;:31;70989:111;;;71069:11;71049:31;;70989:111;70917:198;70899:278;;;71160:1;71140:21;;70899:278;71191:25;71233:17;71219:32;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;71191:60;;71291:1;71270:17;:22;71266:78;;71320:8;71313:15;;;;;;;;71266:78;71488:31;71522:26;71542:5;71522:19;:26::i;:::-;71488:60;;71563:25;71808:9;:16;;;71803:92;;71865:9;:14;;;71845:34;;71803:92;71914:9;71926:5;71914:17;;71909:478;71938:4;71933:1;:9;;:45;;;;;71961:17;71946:11;:32;;71933:45;71909:478;;;72016:15;72029:1;72016:12;:15::i;:::-;72004:27;;72054:9;:16;;;72095:8;72050:73;72171:1;72145:28;;:9;:14;;;:28;;;72141:111;;72218:9;:14;;;72198:34;;72141:111;72295:5;72274:26;;:17;:26;;;72270:102;;72351:1;72325:8;72334:13;;;;;;72325:23;;;;;;;;:::i;:::-;;;;;;;:27;;;;;72270:102;71909:478;71980:3;;;;;71909:478;;;;72489:11;72479:8;72472:29;72537:8;72530:15;;;;;;;;70059:2505;;;;;;:::o;74652:25::-;;;;:::o;12637:49::-;12682:4;12637:49;;;:::o;45260:308::-;45371:19;:17;:19::i;:::-;45359:31;;:8;:31;;;45355:61;;45399:17;;;;;;;;;;;;;;45355:61;45481:8;45429:18;:39;45448:19;:17;:19::i;:::-;45429:39;;;;;;;;;;;;;;;:49;45469:8;45429:49;;;;;;;;;;;;;;;;:60;;;;;;;;;;;;;;;;;;45541:8;45505:55;;45520:19;:17;:19::i;:::-;45505:55;;;45551:8;45505:55;;;;;;:::i;:::-;;;;;;;;45260:308;;:::o;77403:124::-;77460:16;77496:5;:11;77502:4;77496:11;;;;;;;;;;;;;;;:23;;77489:30;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77403:124;;;:::o;46130:399::-;46297:31;46310:4;46316:2;46320:7;46297:12;:31::i;:::-;46361:1;46343:2;:14;;;:19;46339:183;;46382:56;46413:4;46419:2;46423:7;46432:5;46382:30;:56::i;:::-;46377:145;;46466:40;;;;;;;;;;;;;;46377:145;46339:183;46130:399;;;;:::o;68622:420::-;68698:21;;:::i;:::-;68732:31;;:::i;:::-;68788:15;:13;:15::i;:::-;68778:7;:25;:54;;;;68818:14;:12;:14::i;:::-;68807:7;:25;;68778:54;68774:103;;;68856:9;68849:16;;;;;68774:103;68899:21;68912:7;68899:12;:21::i;:::-;68887:33;;68935:9;:16;;;68931:65;;;68975:9;68968:16;;;;;68931:65;69013:21;69026:7;69013:12;:21::i;:::-;69006:28;;;68622:420;;;;:::o;43382:318::-;43455:13;43486:16;43494:7;43486;:16::i;:::-;43481:59;;43511:29;;;;;;;;;;;;;;43481:59;43553:21;43577:10;:8;:10::i;:::-;43553:34;;43630:1;43611:7;43605:21;:26;:87;;;;;;;;;;;;;;;;;43658:7;43667:18;43677:7;43667:9;:18::i;:::-;43641:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;43605:87;43598:94;;;43382:318;;;:::o;74456:62::-;74494:24;74456:62;:::o;15953:149::-;16037:18;16050:4;16037:12;:18::i;:::-;13128:16;13139:4;13128:10;:16::i;:::-;16068:26:::1;16080:4;16086:7;16068:11;:26::i;:::-;15953:149:::0;;;:::o;74387:62::-;74425:24;74387:62;:::o;45639:164::-;45736:4;45760:18;:25;45779:5;45760:25;;;;;;;;;;;;;;;:35;45786:8;45760:35;;;;;;;;;;;;;;;;;;;;;;;;;45753:42;;45639:164;;;;:::o;74572:73::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;77535:425::-;77653:1;77628:14;77643:6;77628:22;;;;;;;;:::i;:::-;;;;;;;;;;:26;77620:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;77713:14;77728:6;77713:22;;;;;;;;:::i;:::-;;;;;;;;;;77700:9;:35;;77692:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;77785:28;77793:11;77806:6;77785:7;:28::i;:::-;77784:29;77776:66;;;;;;;;;;;;:::i;:::-;;;;;;;;;77853:5;:18;77859:11;77853:18;;;;;;;;;;;;;;;:30;;77889:6;77853:43;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;77912:40;77932:11;77945:6;77912:40;;;;;;;:::i;:::-;;;;;;;;77535:425;;:::o;19912:127::-;20019:1;20001:7;:14;;;:19;;;;;;;;;;;19912:127;:::o;46784:273::-;46841:4;46897:7;46878:15;:13;:15::i;:::-;:26;;:66;;;;;46931:13;;46921:7;:23;46878:66;:152;;;;;47029:1;33395:8;46982:17;:26;47000:7;46982:26;;;;;;;;;;;;:43;:48;46878:152;46858:172;;46784:273;;;:::o;65345:105::-;65405:7;65432:10;65425:17;;65345:105;:::o;35969:92::-;36025:7;35969:92;:::o;39744:1129::-;39811:7;39831:12;39846:7;39831:22;;39914:4;39895:15;:13;:15::i;:::-;:23;39891:915;;39948:13;;39941:4;:20;39937:869;;;39986:14;40003:17;:23;40021:4;40003:23;;;;;;;;;;;;39986:40;;40119:1;33395:8;40092:6;:23;:28;40088:699;;40611:113;40628:1;40618:6;:11;40611:113;;40671:17;:25;40689:6;;;;;;;40671:25;;;;;;;;;;;;40662:34;;40611:113;;;40757:6;40750:13;;;;;;40088:699;39963:843;39937:869;39891:915;40834:31;;;;;;;;;;;;;;39744:1129;;;;:::o;52585:652::-;52680:27;52709:23;52750:53;52806:15;52750:71;;52992:7;52986:4;52979:21;53027:22;53021:4;53014:36;53103:4;53097;53087:21;53064:44;;53199:19;53193:26;53174:45;;52930:300;52585:652;;;:::o;53350:645::-;53492:11;53654:15;53648:4;53644:26;53636:34;;53813:15;53802:9;53798:31;53785:44;;53960:15;53949:9;53946:30;53939:4;53928:9;53925:19;53922:55;53912:65;;53350:645;;;;;:::o;64178:159::-;;;;;:::o;62490:309::-;62625:7;62645:16;33796:3;62671:19;:40;;62645:67;;33796:3;62738:31;62749:4;62755:2;62759:9;62738:10;:31::i;:::-;62730:40;;:61;;62723:68;;;62490:309;;;;;:::o;42318:447::-;42398:14;42566:15;42559:5;42555:27;42546:36;;42740:5;42726:11;42702:22;42698:40;42695:51;42688:5;42685:62;42675:72;;42318:447;;;;:::o;64996:158::-;;;;;:::o;13983:105::-;14050:30;14061:4;14067:12;:10;:12::i;:::-;14050:10;:30::i;:::-;13983:105;:::o;18254:238::-;18338:22;18346:4;18352:7;18338;:22::i;:::-;18333:152;;18409:4;18377:6;:12;18384:4;18377:12;;;;;;;;;;;:20;;:29;18398:7;18377:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;18460:12;:10;:12::i;:::-;18433:40;;18451:7;18433:40;;18445:4;18433:40;;;;;;;;;;18333:152;18254:238;;:::o;19790:114::-;19855:7;19882;:14;;;19875:21;;19790:114;;;:::o;4749:98::-;4802:7;4829:10;4822:17;;4749:98;:::o;18672:239::-;18756:22;18764:4;18770:7;18756;:22::i;:::-;18752:152;;;18827:5;18795:6;:12;18802:4;18795:12;;;;;;;;;;;:20;;:29;18816:7;18795:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;18879:12;:10;:12::i;:::-;18852:40;;18870:7;18852:40;;18864:4;18852:40;;;;;;;;;;18752:152;18672:239;;:::o;7491:120::-;6500:16;:14;:16::i;:::-;7560:5:::1;7550:7;;:15;;;;;;;;;;;;;;;;;;7581:22;7590:12;:10;:12::i;:::-;7581:22;;;;;;:::i;:::-;;;;;;;;7491:120::o:0;6795:108::-;6866:8;:6;:8::i;:::-;6865:9;6857:38;;;;;;;;;;;;:::i;:::-;;;;;;;;;6795:108::o;48615:1529::-;48680:20;48703:13;;48680:36;;48745:1;48731:16;;:2;:16;;;48727:48;;48756:19;;;;;;;;;;;;;;48727:48;48802:1;48790:8;:13;48786:44;;48812:18;;;;;;;;;;;;;;48786:44;48843:61;48873:1;48877:2;48881:12;48895:8;48843:21;:61::i;:::-;49386:1;32762:2;49357:1;:25;;49356:31;49344:8;:44;49318:18;:22;49337:2;49318:22;;;;;;;;;;;;;;;;:70;;;;;;;;;;;49665:139;49702:2;49756:33;49779:1;49783:2;49787:1;49756:14;:33::i;:::-;49723:30;49744:8;49723:20;:30::i;:::-;:66;49665:18;:139::i;:::-;49631:17;:31;49649:12;49631:31;;;;;;;;;;;:173;;;;49821:15;49839:12;49821:30;;49866:11;49895:8;49880:12;:23;49866:37;;49918:101;49970:9;;;;;;49966:2;49945:35;;49962:1;49945:35;;;;;;;;;;;;50014:3;50004:7;:13;49918:101;;50051:3;50035:13;:19;;;;49092:974;;50076:60;50105:1;50109:2;50113:12;50127:8;50076:20;:60::i;:::-;48669:1475;48615:1529;;:::o;7232:118::-;6241:19;:17;:19::i;:::-;7302:4:::1;7292:7;;:14;;;;;;;;;;;;;;;;;;7322:20;7329:12;:10;:12::i;:::-;7322:20;;;;;;:::i;:::-;;;;;;;;7232:118::o:0;41421:153::-;41481:21;;:::i;:::-;41522:44;41541:17;:24;41559:5;41541:24;;;;;;;;;;;;41522:18;:44::i;:::-;41515:51;;41421:153;;;:::o;36140:95::-;36187:7;36214:13;;36207:20;;36140:95;:::o;61000:716::-;61163:4;61209:2;61184:45;;;61230:19;:17;:19::i;:::-;61251:4;61257:7;61266:5;61184:88;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;61180:529;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;61484:1;61467:6;:13;:18;61463:235;;61513:40;;;;;;;;;;;;;;61463:235;61656:6;61650:13;61641:6;61637:2;61633:15;61626:38;61180:529;61353:54;;;61343:64;;;:6;:64;;;;61336:71;;;61000:716;;;;;;:::o;42077:158::-;42139:21;;:::i;:::-;42180:47;42199:27;42218:7;42199:18;:27::i;:::-;42180:18;:47::i;:::-;42173:54;;42077:158;;;:::o;75235:109::-;75287:13;75320:16;75313:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;75235:109;:::o;65556:1960::-;65613:17;66032:3;66025:4;66019:11;66015:21;66008:28;;66123:3;66117:4;66110:17;66229:3;66685:5;66815:1;66810:3;66806:11;66799:18;;66952:2;66946:4;66942:13;66938:2;66934:22;66929:3;66921:36;66993:2;66987:4;66983:13;66975:21;;66577:697;67012:4;66577:697;;;67203:1;67198:3;67194:11;67187:18;;67254:2;67248:4;67244:13;67240:2;67236:22;67231:3;67223:36;67107:2;67101:4;67097:13;67089:21;;66577:697;;;66581:430;67313:3;67308;67304:13;67428:2;67423:3;67419:12;67412:19;;67491:6;67486:3;67479:19;65652:1857;;65556:1960;;;:::o;63375:147::-;63512:6;63375:147;;;;;:::o;14378:505::-;14467:22;14475:4;14481:7;14467;:22::i;:::-;14462:414;;14655:41;14683:7;14655:41;;14693:2;14655:19;:41::i;:::-;14769:38;14797:4;14789:13;;14804:2;14769:19;:38::i;:::-;14560:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;14506:358;;;;;;;;;;;:::i;:::-;;;;;;;;14462:414;14378:505;;:::o;6980:108::-;7047:8;:6;:8::i;:::-;7039:41;;;;;;;;;;;;:::i;:::-;;;;;;;;;6980:108::o;44148:322::-;44218:14;44449:1;44439:8;44436:15;44411:23;44407:45;44397:55;;44148:322;;;:::o;40967:363::-;41033:31;;:::i;:::-;41110:6;41077:9;:14;;:41;;;;;;;;;;;33279:3;41163:6;:32;;41129:9;:24;;:67;;;;;;;;;;;41253:1;33395:8;41226:6;:23;:28;;41207:9;:16;;:47;;;;;;;;;;;33796:3;41294:6;:27;;41265:9;:19;;:57;;;;;;;;;;;40967:363;;;:::o;3612:451::-;3687:13;3713:19;3758:1;3749:6;3745:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;3735:25;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;3713:47;;3771:15;:6;3778:1;3771:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;3797;:6;3804:1;3797:9;;;;;;;;:::i;:::-;;;;;:15;;;;;;;;;;;3828:9;3853:1;3844:6;3840:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;3828:26;;3823:135;3860:1;3856;:5;3823:135;;;3895:12;3916:3;3908:5;:11;3895:25;;;;;;;:::i;:::-;;;;;3883:6;3890:1;3883:9;;;;;;;;:::i;:::-;;;;;:37;;;;;;;;;;;3945:1;3935:11;;;;;3863:3;;;;:::i;:::-;;;3823:135;;;;3985:1;3976:5;:10;3968:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;4048:6;4034:21;;;3612:451;;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:75:1:-;40:6;73:2;67:9;57:19;;7:75;:::o;88:117::-;197:1;194;187:12;211:117;320:1;317;310:12;334:149;370:7;410:66;403:5;399:78;388:89;;334:149;;;:::o;489:120::-;561:23;578:5;561:23;:::i;:::-;554:5;551:34;541:62;;599:1;596;589:12;541:62;489:120;:::o;615:137::-;660:5;698:6;685:20;676:29;;714:32;740:5;714:32;:::i;:::-;615:137;;;;:::o;758:327::-;816:6;865:2;853:9;844:7;840:23;836:32;833:119;;;871:79;;:::i;:::-;833:119;991:1;1016:52;1060:7;1051:6;1040:9;1036:22;1016:52;:::i;:::-;1006:62;;962:116;758:327;;;;:::o;1091:90::-;1125:7;1168:5;1161:13;1154:21;1143:32;;1091:90;;;:::o;1187:109::-;1268:21;1283:5;1268:21;:::i;:::-;1263:3;1256:34;1187:109;;:::o;1302:210::-;1389:4;1427:2;1416:9;1412:18;1404:26;;1440:65;1502:1;1491:9;1487:17;1478:6;1440:65;:::i;:::-;1302:210;;;;:::o;1518:99::-;1570:6;1604:5;1598:12;1588:22;;1518:99;;;:::o;1623:169::-;1707:11;1741:6;1736:3;1729:19;1781:4;1776:3;1772:14;1757:29;;1623:169;;;;:::o;1798:307::-;1866:1;1876:113;1890:6;1887:1;1884:13;1876:113;;;1975:1;1970:3;1966:11;1960:18;1956:1;1951:3;1947:11;1940:39;1912:2;1909:1;1905:10;1900:15;;1876:113;;;2007:6;2004:1;2001:13;1998:101;;;2087:1;2078:6;2073:3;2069:16;2062:27;1998:101;1847:258;1798:307;;;:::o;2111:102::-;2152:6;2203:2;2199:7;2194:2;2187:5;2183:14;2179:28;2169:38;;2111:102;;;:::o;2219:364::-;2307:3;2335:39;2368:5;2335:39;:::i;:::-;2390:71;2454:6;2449:3;2390:71;:::i;:::-;2383:78;;2470:52;2515:6;2510:3;2503:4;2496:5;2492:16;2470:52;:::i;:::-;2547:29;2569:6;2547:29;:::i;:::-;2542:3;2538:39;2531:46;;2311:272;2219:364;;;;:::o;2589:313::-;2702:4;2740:2;2729:9;2725:18;2717:26;;2789:9;2783:4;2779:20;2775:1;2764:9;2760:17;2753:47;2817:78;2890:4;2881:6;2817:78;:::i;:::-;2809:86;;2589:313;;;;:::o;2908:77::-;2945:7;2974:5;2963:16;;2908:77;;;:::o;2991:122::-;3064:24;3082:5;3064:24;:::i;:::-;3057:5;3054:35;3044:63;;3103:1;3100;3093:12;3044:63;2991:122;:::o;3119:139::-;3165:5;3203:6;3190:20;3181:29;;3219:33;3246:5;3219:33;:::i;:::-;3119:139;;;;:::o;3264:329::-;3323:6;3372:2;3360:9;3351:7;3347:23;3343:32;3340:119;;;3378:79;;:::i;:::-;3340:119;3498:1;3523:53;3568:7;3559:6;3548:9;3544:22;3523:53;:::i;:::-;3513:63;;3469:117;3264:329;;;;:::o;3599:126::-;3636:7;3676:42;3669:5;3665:54;3654:65;;3599:126;;;:::o;3731:96::-;3768:7;3797:24;3815:5;3797:24;:::i;:::-;3786:35;;3731:96;;;:::o;3833:118::-;3920:24;3938:5;3920:24;:::i;:::-;3915:3;3908:37;3833:118;;:::o;3957:222::-;4050:4;4088:2;4077:9;4073:18;4065:26;;4101:71;4169:1;4158:9;4154:17;4145:6;4101:71;:::i;:::-;3957:222;;;;:::o;4185:122::-;4258:24;4276:5;4258:24;:::i;:::-;4251:5;4248:35;4238:63;;4297:1;4294;4287:12;4238:63;4185:122;:::o;4313:139::-;4359:5;4397:6;4384:20;4375:29;;4413:33;4440:5;4413:33;:::i;:::-;4313:139;;;;:::o;4458:474::-;4526:6;4534;4583:2;4571:9;4562:7;4558:23;4554:32;4551:119;;;4589:79;;:::i;:::-;4551:119;4709:1;4734:53;4779:7;4770:6;4759:9;4755:22;4734:53;:::i;:::-;4724:63;;4680:117;4836:2;4862:53;4907:7;4898:6;4887:9;4883:22;4862:53;:::i;:::-;4852:63;;4807:118;4458:474;;;;;:::o;4938:118::-;5025:24;5043:5;5025:24;:::i;:::-;5020:3;5013:37;4938:118;;:::o;5062:222::-;5155:4;5193:2;5182:9;5178:18;5170:26;;5206:71;5274:1;5263:9;5259:17;5250:6;5206:71;:::i;:::-;5062:222;;;;:::o;5290:619::-;5367:6;5375;5383;5432:2;5420:9;5411:7;5407:23;5403:32;5400:119;;;5438:79;;:::i;:::-;5400:119;5558:1;5583:53;5628:7;5619:6;5608:9;5604:22;5583:53;:::i;:::-;5573:63;;5529:117;5685:2;5711:53;5756:7;5747:6;5736:9;5732:22;5711:53;:::i;:::-;5701:63;;5656:118;5813:2;5839:53;5884:7;5875:6;5864:9;5860:22;5839:53;:::i;:::-;5829:63;;5784:118;5290:619;;;;;:::o;5915:77::-;5952:7;5981:5;5970:16;;5915:77;;;:::o;5998:122::-;6071:24;6089:5;6071:24;:::i;:::-;6064:5;6061:35;6051:63;;6110:1;6107;6100:12;6051:63;5998:122;:::o;6126:139::-;6172:5;6210:6;6197:20;6188:29;;6226:33;6253:5;6226:33;:::i;:::-;6126:139;;;;:::o;6271:329::-;6330:6;6379:2;6367:9;6358:7;6354:23;6350:32;6347:119;;;6385:79;;:::i;:::-;6347:119;6505:1;6530:53;6575:7;6566:6;6555:9;6551:22;6530:53;:::i;:::-;6520:63;;6476:117;6271:329;;;;:::o;6606:118::-;6693:24;6711:5;6693:24;:::i;:::-;6688:3;6681:37;6606:118;;:::o;6730:222::-;6823:4;6861:2;6850:9;6846:18;6838:26;;6874:71;6942:1;6931:9;6927:17;6918:6;6874:71;:::i;:::-;6730:222;;;;:::o;6958:474::-;7026:6;7034;7083:2;7071:9;7062:7;7058:23;7054:32;7051:119;;;7089:79;;:::i;:::-;7051:119;7209:1;7234:53;7279:7;7270:6;7259:9;7255:22;7234:53;:::i;:::-;7224:63;;7180:117;7336:2;7362:53;7407:7;7398:6;7387:9;7383:22;7362:53;:::i;:::-;7352:63;;7307:118;6958:474;;;;;:::o;7438:::-;7506:6;7514;7563:2;7551:9;7542:7;7538:23;7534:32;7531:119;;;7569:79;;:::i;:::-;7531:119;7689:1;7714:53;7759:7;7750:6;7739:9;7735:22;7714:53;:::i;:::-;7704:63;;7660:117;7816:2;7842:53;7887:7;7878:6;7867:9;7863:22;7842:53;:::i;:::-;7832:63;;7787:118;7438:474;;;;;:::o;7918:329::-;7977:6;8026:2;8014:9;8005:7;8001:23;7997:32;7994:119;;;8032:79;;:::i;:::-;7994:119;8152:1;8177:53;8222:7;8213:6;8202:9;8198:22;8177:53;:::i;:::-;8167:63;;8123:117;7918:329;;;;:::o;8253:117::-;8362:1;8359;8352:12;8376:117;8485:1;8482;8475:12;8499:180;8547:77;8544:1;8537:88;8644:4;8641:1;8634:15;8668:4;8665:1;8658:15;8685:281;8768:27;8790:4;8768:27;:::i;:::-;8760:6;8756:40;8898:6;8886:10;8883:22;8862:18;8850:10;8847:34;8844:62;8841:88;;;8909:18;;:::i;:::-;8841:88;8949:10;8945:2;8938:22;8728:238;8685:281;;:::o;8972:129::-;9006:6;9033:20;;:::i;:::-;9023:30;;9062:33;9090:4;9082:6;9062:33;:::i;:::-;8972:129;;;:::o;9107:308::-;9169:4;9259:18;9251:6;9248:30;9245:56;;;9281:18;;:::i;:::-;9245:56;9319:29;9341:6;9319:29;:::i;:::-;9311:37;;9403:4;9397;9393:15;9385:23;;9107:308;;;:::o;9421:154::-;9505:6;9500:3;9495;9482:30;9567:1;9558:6;9553:3;9549:16;9542:27;9421:154;;;:::o;9581:412::-;9659:5;9684:66;9700:49;9742:6;9700:49;:::i;:::-;9684:66;:::i;:::-;9675:75;;9773:6;9766:5;9759:21;9811:4;9804:5;9800:16;9849:3;9840:6;9835:3;9831:16;9828:25;9825:112;;;9856:79;;:::i;:::-;9825:112;9946:41;9980:6;9975:3;9970;9946:41;:::i;:::-;9665:328;9581:412;;;;;:::o;10013:340::-;10069:5;10118:3;10111:4;10103:6;10099:17;10095:27;10085:122;;10126:79;;:::i;:::-;10085:122;10243:6;10230:20;10268:79;10343:3;10335:6;10328:4;10320:6;10316:17;10268:79;:::i;:::-;10259:88;;10075:278;10013:340;;;;:::o;10359:509::-;10428:6;10477:2;10465:9;10456:7;10452:23;10448:32;10445:119;;;10483:79;;:::i;:::-;10445:119;10631:1;10620:9;10616:17;10603:31;10661:18;10653:6;10650:30;10647:117;;;10683:79;;:::i;:::-;10647:117;10788:63;10843:7;10834:6;10823:9;10819:22;10788:63;:::i;:::-;10778:73;;10574:287;10359:509;;;;:::o;10874:311::-;10951:4;11041:18;11033:6;11030:30;11027:56;;;11063:18;;:::i;:::-;11027:56;11113:4;11105:6;11101:17;11093:25;;11173:4;11167;11163:15;11155:23;;10874:311;;;:::o;11191:117::-;11300:1;11297;11290:12;11331:710;11427:5;11452:81;11468:64;11525:6;11468:64;:::i;:::-;11452:81;:::i;:::-;11443:90;;11553:5;11582:6;11575:5;11568:21;11616:4;11609:5;11605:16;11598:23;;11669:4;11661:6;11657:17;11649:6;11645:30;11698:3;11690:6;11687:15;11684:122;;;11717:79;;:::i;:::-;11684:122;11832:6;11815:220;11849:6;11844:3;11841:15;11815:220;;;11924:3;11953:37;11986:3;11974:10;11953:37;:::i;:::-;11948:3;11941:50;12020:4;12015:3;12011:14;12004:21;;11891:144;11875:4;11870:3;11866:14;11859:21;;11815:220;;;11819:21;11433:608;;11331:710;;;;;:::o;12064:370::-;12135:5;12184:3;12177:4;12169:6;12165:17;12161:27;12151:122;;12192:79;;:::i;:::-;12151:122;12309:6;12296:20;12334:94;12424:3;12416:6;12409:4;12401:6;12397:17;12334:94;:::i;:::-;12325:103;;12141:293;12064:370;;;;:::o;12440:539::-;12524:6;12573:2;12561:9;12552:7;12548:23;12544:32;12541:119;;;12579:79;;:::i;:::-;12541:119;12727:1;12716:9;12712:17;12699:31;12757:18;12749:6;12746:30;12743:117;;;12779:79;;:::i;:::-;12743:117;12884:78;12954:7;12945:6;12934:9;12930:22;12884:78;:::i;:::-;12874:88;;12670:302;12440:539;;;;:::o;12985:145::-;13083:6;13117:5;13111:12;13101:22;;12985:145;;;:::o;13136:215::-;13266:11;13300:6;13295:3;13288:19;13340:4;13335:3;13331:14;13316:29;;13136:215;;;;:::o;13357:163::-;13455:4;13478:3;13470:11;;13508:4;13503:3;13499:14;13491:22;;13357:163;;;:::o;13526:108::-;13603:24;13621:5;13603:24;:::i;:::-;13598:3;13591:37;13526:108;;:::o;13640:101::-;13676:7;13716:18;13709:5;13705:30;13694:41;;13640:101;;;:::o;13747:105::-;13822:23;13839:5;13822:23;:::i;:::-;13817:3;13810:36;13747:105;;:::o;13858:99::-;13929:21;13944:5;13929:21;:::i;:::-;13924:3;13917:34;13858:99;;:::o;13963:91::-;13999:7;14039:8;14032:5;14028:20;14017:31;;13963:91;;;:::o;14060:105::-;14135:23;14152:5;14135:23;:::i;:::-;14130:3;14123:36;14060:105;;:::o;14243:864::-;14392:4;14387:3;14383:14;14479:4;14472:5;14468:16;14462:23;14498:63;14555:4;14550:3;14546:14;14532:12;14498:63;:::i;:::-;14407:164;14663:4;14656:5;14652:16;14646:23;14682:61;14737:4;14732:3;14728:14;14714:12;14682:61;:::i;:::-;14581:172;14837:4;14830:5;14826:16;14820:23;14856:57;14907:4;14902:3;14898:14;14884:12;14856:57;:::i;:::-;14763:160;15010:4;15003:5;14999:16;14993:23;15029:61;15084:4;15079:3;15075:14;15061:12;15029:61;:::i;:::-;14933:167;14361:746;14243:864;;:::o;15113:303::-;15244:10;15265:108;15369:3;15361:6;15265:108;:::i;:::-;15405:4;15400:3;15396:14;15382:28;;15113:303;;;;:::o;15422:144::-;15523:4;15555;15550:3;15546:14;15538:22;;15422:144;;;:::o;15648:980::-;15829:3;15858:85;15937:5;15858:85;:::i;:::-;15959:117;16069:6;16064:3;15959:117;:::i;:::-;15952:124;;16100:87;16181:5;16100:87;:::i;:::-;16210:7;16241:1;16226:377;16251:6;16248:1;16245:13;16226:377;;;16327:6;16321:13;16354:125;16475:3;16460:13;16354:125;:::i;:::-;16347:132;;16502:91;16586:6;16502:91;:::i;:::-;16492:101;;16286:317;16273:1;16270;16266:9;16261:14;;16226:377;;;16230:14;16619:3;16612:10;;15834:794;;;15648:980;;;;:::o;16634:497::-;16839:4;16877:2;16866:9;16862:18;16854:26;;16926:9;16920:4;16916:20;16912:1;16901:9;16897:17;16890:47;16954:170;17119:4;17110:6;16954:170;:::i;:::-;16946:178;;16634:497;;;;:::o;17137:114::-;17204:6;17238:5;17232:12;17222:22;;17137:114;;;:::o;17257:184::-;17356:11;17390:6;17385:3;17378:19;17430:4;17425:3;17421:14;17406:29;;17257:184;;;;:::o;17447:132::-;17514:4;17537:3;17529:11;;17567:4;17562:3;17558:14;17550:22;;17447:132;;;:::o;17585:108::-;17662:24;17680:5;17662:24;:::i;:::-;17657:3;17650:37;17585:108;;:::o;17699:179::-;17768:10;17789:46;17831:3;17823:6;17789:46;:::i;:::-;17867:4;17862:3;17858:14;17844:28;;17699:179;;;;:::o;17884:113::-;17954:4;17986;17981:3;17977:14;17969:22;;17884:113;;;:::o;18033:732::-;18152:3;18181:54;18229:5;18181:54;:::i;:::-;18251:86;18330:6;18325:3;18251:86;:::i;:::-;18244:93;;18361:56;18411:5;18361:56;:::i;:::-;18440:7;18471:1;18456:284;18481:6;18478:1;18475:13;18456:284;;;18557:6;18551:13;18584:63;18643:3;18628:13;18584:63;:::i;:::-;18577:70;;18670:60;18723:6;18670:60;:::i;:::-;18660:70;;18516:224;18503:1;18500;18496:9;18491:14;;18456:284;;;18460:14;18756:3;18749:10;;18157:608;;;18033:732;;;;:::o;18771:373::-;18914:4;18952:2;18941:9;18937:18;18929:26;;19001:9;18995:4;18991:20;18987:1;18976:9;18972:17;18965:47;19029:108;19132:4;19123:6;19029:108;:::i;:::-;19021:116;;18771:373;;;;:::o;19150:619::-;19227:6;19235;19243;19292:2;19280:9;19271:7;19267:23;19263:32;19260:119;;;19298:79;;:::i;:::-;19260:119;19418:1;19443:53;19488:7;19479:6;19468:9;19464:22;19443:53;:::i;:::-;19433:63;;19389:117;19545:2;19571:53;19616:7;19607:6;19596:9;19592:22;19571:53;:::i;:::-;19561:63;;19516:118;19673:2;19699:53;19744:7;19735:6;19724:9;19720:22;19699:53;:::i;:::-;19689:63;;19644:118;19150:619;;;;;:::o;19775:116::-;19845:21;19860:5;19845:21;:::i;:::-;19838:5;19835:32;19825:60;;19881:1;19878;19871:12;19825:60;19775:116;:::o;19897:133::-;19940:5;19978:6;19965:20;19956:29;;19994:30;20018:5;19994:30;:::i;:::-;19897:133;;;;:::o;20036:468::-;20101:6;20109;20158:2;20146:9;20137:7;20133:23;20129:32;20126:119;;;20164:79;;:::i;:::-;20126:119;20284:1;20309:53;20354:7;20345:6;20334:9;20330:22;20309:53;:::i;:::-;20299:63;;20255:117;20411:2;20437:50;20479:7;20470:6;20459:9;20455:22;20437:50;:::i;:::-;20427:60;;20382:115;20036:468;;;;;:::o;20510:307::-;20571:4;20661:18;20653:6;20650:30;20647:56;;;20683:18;;:::i;:::-;20647:56;20721:29;20743:6;20721:29;:::i;:::-;20713:37;;20805:4;20799;20795:15;20787:23;;20510:307;;;:::o;20823:410::-;20900:5;20925:65;20941:48;20982:6;20941:48;:::i;:::-;20925:65;:::i;:::-;20916:74;;21013:6;21006:5;20999:21;21051:4;21044:5;21040:16;21089:3;21080:6;21075:3;21071:16;21068:25;21065:112;;;21096:79;;:::i;:::-;21065:112;21186:41;21220:6;21215:3;21210;21186:41;:::i;:::-;20906:327;20823:410;;;;;:::o;21252:338::-;21307:5;21356:3;21349:4;21341:6;21337:17;21333:27;21323:122;;21364:79;;:::i;:::-;21323:122;21481:6;21468:20;21506:78;21580:3;21572:6;21565:4;21557:6;21553:17;21506:78;:::i;:::-;21497:87;;21313:277;21252:338;;;;:::o;21596:943::-;21691:6;21699;21707;21715;21764:3;21752:9;21743:7;21739:23;21735:33;21732:120;;;21771:79;;:::i;:::-;21732:120;21891:1;21916:53;21961:7;21952:6;21941:9;21937:22;21916:53;:::i;:::-;21906:63;;21862:117;22018:2;22044:53;22089:7;22080:6;22069:9;22065:22;22044:53;:::i;:::-;22034:63;;21989:118;22146:2;22172:53;22217:7;22208:6;22197:9;22193:22;22172:53;:::i;:::-;22162:63;;22117:118;22302:2;22291:9;22287:18;22274:32;22333:18;22325:6;22322:30;22319:117;;;22355:79;;:::i;:::-;22319:117;22460:62;22514:7;22505:6;22494:9;22490:22;22460:62;:::i;:::-;22450:72;;22245:287;21596:943;;;;;;;:::o;22617:874::-;22776:4;22771:3;22767:14;22863:4;22856:5;22852:16;22846:23;22882:63;22939:4;22934:3;22930:14;22916:12;22882:63;:::i;:::-;22791:164;23047:4;23040:5;23036:16;23030:23;23066:61;23121:4;23116:3;23112:14;23098:12;23066:61;:::i;:::-;22965:172;23221:4;23214:5;23210:16;23204:23;23240:57;23291:4;23286:3;23282:14;23268:12;23240:57;:::i;:::-;23147:160;23394:4;23387:5;23383:16;23377:23;23413:61;23468:4;23463:3;23459:14;23445:12;23413:61;:::i;:::-;23317:167;22745:746;22617:874;;:::o;23497:347::-;23652:4;23690:3;23679:9;23675:19;23667:27;;23704:133;23834:1;23823:9;23819:17;23810:6;23704:133;:::i;:::-;23497:347;;;;:::o;23850:474::-;23918:6;23926;23975:2;23963:9;23954:7;23950:23;23946:32;23943:119;;;23981:79;;:::i;:::-;23943:119;24101:1;24126:53;24171:7;24162:6;24151:9;24147:22;24126:53;:::i;:::-;24116:63;;24072:117;24228:2;24254:53;24299:7;24290:6;24279:9;24275:22;24254:53;:::i;:::-;24244:63;;24199:118;23850:474;;;;;:::o;24330:180::-;24378:77;24375:1;24368:88;24475:4;24472:1;24465:15;24499:4;24496:1;24489:15;24516:320;24560:6;24597:1;24591:4;24587:12;24577:22;;24644:1;24638:4;24634:12;24665:18;24655:81;;24721:4;24713:6;24709:17;24699:27;;24655:81;24783:2;24775:6;24772:14;24752:18;24749:38;24746:84;;24802:18;;:::i;:::-;24746:84;24567:269;24516:320;;;:::o;24842:180::-;24890:77;24887:1;24880:88;24987:4;24984:1;24977:15;25011:4;25008:1;25001:15;25028:332;25149:4;25187:2;25176:9;25172:18;25164:26;;25200:71;25268:1;25257:9;25253:17;25244:6;25200:71;:::i;:::-;25281:72;25349:2;25338:9;25334:18;25325:6;25281:72;:::i;:::-;25028:332;;;;;:::o;25366:234::-;25506:34;25502:1;25494:6;25490:14;25483:58;25575:17;25570:2;25562:6;25558:15;25551:42;25366:234;:::o;25606:366::-;25748:3;25769:67;25833:2;25828:3;25769:67;:::i;:::-;25762:74;;25845:93;25934:3;25845:93;:::i;:::-;25963:2;25958:3;25954:12;25947:19;;25606:366;;;:::o;25978:419::-;26144:4;26182:2;26171:9;26167:18;26159:26;;26231:9;26225:4;26221:20;26217:1;26206:9;26202:17;26195:47;26259:131;26385:4;26259:131;:::i;:::-;26251:139;;25978:419;;;:::o;26403:147::-;26504:11;26541:3;26526:18;;26403:147;;;;:::o;26556:114::-;;:::o;26676:398::-;26835:3;26856:83;26937:1;26932:3;26856:83;:::i;:::-;26849:90;;26948:93;27037:3;26948:93;:::i;:::-;27066:1;27061:3;27057:11;27050:18;;26676:398;;;:::o;27080:379::-;27264:3;27286:147;27429:3;27286:147;:::i;:::-;27279:154;;27450:3;27443:10;;27080:379;;;:::o;27465:168::-;27605:20;27601:1;27593:6;27589:14;27582:44;27465:168;:::o;27639:366::-;27781:3;27802:67;27866:2;27861:3;27802:67;:::i;:::-;27795:74;;27878:93;27967:3;27878:93;:::i;:::-;27996:2;27991:3;27987:12;27980:19;;27639:366;;;:::o;28011:419::-;28177:4;28215:2;28204:9;28200:18;28192:26;;28264:9;28258:4;28254:20;28250:1;28239:9;28235:17;28228:47;28292:131;28418:4;28292:131;:::i;:::-;28284:139;;28011:419;;;:::o;28436:172::-;28576:24;28572:1;28564:6;28560:14;28553:48;28436:172;:::o;28614:366::-;28756:3;28777:67;28841:2;28836:3;28777:67;:::i;:::-;28770:74;;28853:93;28942:3;28853:93;:::i;:::-;28971:2;28966:3;28962:12;28955:19;;28614:366;;;:::o;28986:419::-;29152:4;29190:2;29179:9;29175:18;29167:26;;29239:9;29233:4;29229:20;29225:1;29214:9;29210:17;29203:47;29267:131;29393:4;29267:131;:::i;:::-;29259:139;;28986:419;;;:::o;29411:180::-;29459:77;29456:1;29449:88;29556:4;29553:1;29546:15;29580:4;29577:1;29570:15;29597:191;29637:4;29657:20;29675:1;29657:20;:::i;:::-;29652:25;;29691:20;29709:1;29691:20;:::i;:::-;29686:25;;29730:1;29727;29724:8;29721:34;;;29735:18;;:::i;:::-;29721:34;29780:1;29777;29773:9;29765:17;;29597:191;;;;:::o;29794:233::-;29833:3;29856:24;29874:5;29856:24;:::i;:::-;29847:33;;29902:66;29895:5;29892:77;29889:103;;29972:18;;:::i;:::-;29889:103;30019:1;30012:5;30008:13;30001:20;;29794:233;;;:::o;30033:148::-;30135:11;30172:3;30157:18;;30033:148;;;;:::o;30187:377::-;30293:3;30321:39;30354:5;30321:39;:::i;:::-;30376:89;30458:6;30453:3;30376:89;:::i;:::-;30369:96;;30474:52;30519:6;30514:3;30507:4;30500:5;30496:16;30474:52;:::i;:::-;30551:6;30546:3;30542:16;30535:23;;30297:267;30187:377;;;;:::o;30570:435::-;30750:3;30772:95;30863:3;30854:6;30772:95;:::i;:::-;30765:102;;30884:95;30975:3;30966:6;30884:95;:::i;:::-;30877:102;;30996:3;30989:10;;30570:435;;;;;:::o;31011:175::-;31151:27;31147:1;31139:6;31135:14;31128:51;31011:175;:::o;31192:366::-;31334:3;31355:67;31419:2;31414:3;31355:67;:::i;:::-;31348:74;;31431:93;31520:3;31431:93;:::i;:::-;31549:2;31544:3;31540:12;31533:19;;31192:366;;;:::o;31564:419::-;31730:4;31768:2;31757:9;31753:18;31745:26;;31817:9;31811:4;31807:20;31803:1;31792:9;31788:17;31781:47;31845:131;31971:4;31845:131;:::i;:::-;31837:139;;31564:419;;;:::o;31989:174::-;32129:26;32125:1;32117:6;32113:14;32106:50;31989:174;:::o;32169:366::-;32311:3;32332:67;32396:2;32391:3;32332:67;:::i;:::-;32325:74;;32408:93;32497:3;32408:93;:::i;:::-;32526:2;32521:3;32517:12;32510:19;;32169:366;;;:::o;32541:419::-;32707:4;32745:2;32734:9;32730:18;32722:26;;32794:9;32788:4;32784:20;32780:1;32769:9;32765:17;32758:47;32822:131;32948:4;32822:131;:::i;:::-;32814:139;;32541:419;;;:::o;32966:332::-;33087:4;33125:2;33114:9;33110:18;33102:26;;33138:71;33206:1;33195:9;33191:17;33182:6;33138:71;:::i;:::-;33219:72;33287:2;33276:9;33272:18;33263:6;33219:72;:::i;:::-;32966:332;;;;;:::o;33304:166::-;33444:18;33440:1;33432:6;33428:14;33421:42;33304:166;:::o;33476:366::-;33618:3;33639:67;33703:2;33698:3;33639:67;:::i;:::-;33632:74;;33715:93;33804:3;33715:93;:::i;:::-;33833:2;33828:3;33824:12;33817:19;;33476:366;;;:::o;33848:419::-;34014:4;34052:2;34041:9;34037:18;34029:26;;34101:9;34095:4;34091:20;34087:1;34076:9;34072:17;34065:47;34129:131;34255:4;34129:131;:::i;:::-;34121:139;;33848:419;;;:::o;34273:98::-;34324:6;34358:5;34352:12;34342:22;;34273:98;;;:::o;34377:168::-;34460:11;34494:6;34489:3;34482:19;34534:4;34529:3;34525:14;34510:29;;34377:168;;;;:::o;34551:360::-;34637:3;34665:38;34697:5;34665:38;:::i;:::-;34719:70;34782:6;34777:3;34719:70;:::i;:::-;34712:77;;34798:52;34843:6;34838:3;34831:4;34824:5;34820:16;34798:52;:::i;:::-;34875:29;34897:6;34875:29;:::i;:::-;34870:3;34866:39;34859:46;;34641:270;34551:360;;;;:::o;34917:640::-;35112:4;35150:3;35139:9;35135:19;35127:27;;35164:71;35232:1;35221:9;35217:17;35208:6;35164:71;:::i;:::-;35245:72;35313:2;35302:9;35298:18;35289:6;35245:72;:::i;:::-;35327;35395:2;35384:9;35380:18;35371:6;35327:72;:::i;:::-;35446:9;35440:4;35436:20;35431:2;35420:9;35416:18;35409:48;35474:76;35545:4;35536:6;35474:76;:::i;:::-;35466:84;;34917:640;;;;;;;:::o;35563:141::-;35619:5;35650:6;35644:13;35635:22;;35666:32;35692:5;35666:32;:::i;:::-;35563:141;;;;:::o;35710:349::-;35779:6;35828:2;35816:9;35807:7;35803:23;35799:32;35796:119;;;35834:79;;:::i;:::-;35796:119;35954:1;35979:63;36034:7;36025:6;36014:9;36010:22;35979:63;:::i;:::-;35969:73;;35925:127;35710:349;;;;:::o;36065:173::-;36205:25;36201:1;36193:6;36189:14;36182:49;36065:173;:::o;36244:402::-;36404:3;36425:85;36507:2;36502:3;36425:85;:::i;:::-;36418:92;;36519:93;36608:3;36519:93;:::i;:::-;36637:2;36632:3;36628:12;36621:19;;36244:402;;;:::o;36652:167::-;36792:19;36788:1;36780:6;36776:14;36769:43;36652:167;:::o;36825:402::-;36985:3;37006:85;37088:2;37083:3;37006:85;:::i;:::-;36999:92;;37100:93;37189:3;37100:93;:::i;:::-;37218:2;37213:3;37209:12;37202:19;;36825:402;;;:::o;37233:967::-;37615:3;37637:148;37781:3;37637:148;:::i;:::-;37630:155;;37802:95;37893:3;37884:6;37802:95;:::i;:::-;37795:102;;37914:148;38058:3;37914:148;:::i;:::-;37907:155;;38079:95;38170:3;38161:6;38079:95;:::i;:::-;38072:102;;38191:3;38184:10;;37233:967;;;;;:::o;38206:170::-;38346:22;38342:1;38334:6;38330:14;38323:46;38206:170;:::o;38382:366::-;38524:3;38545:67;38609:2;38604:3;38545:67;:::i;:::-;38538:74;;38621:93;38710:3;38621:93;:::i;:::-;38739:2;38734:3;38730:12;38723:19;;38382:366;;;:::o;38754:419::-;38920:4;38958:2;38947:9;38943:18;38935:26;;39007:9;39001:4;38997:20;38993:1;38982:9;38978:17;38971:47;39035:131;39161:4;39035:131;:::i;:::-;39027:139;;38754:419;;;:::o;39179:348::-;39219:7;39242:20;39260:1;39242:20;:::i;:::-;39237:25;;39276:20;39294:1;39276:20;:::i;:::-;39271:25;;39464:1;39396:66;39392:74;39389:1;39386:81;39381:1;39374:9;39367:17;39363:105;39360:131;;;39471:18;;:::i;:::-;39360:131;39519:1;39516;39512:9;39501:20;;39179:348;;;;:::o;39533:305::-;39573:3;39592:20;39610:1;39592:20;:::i;:::-;39587:25;;39626:20;39644:1;39626:20;:::i;:::-;39621:25;;39780:1;39712:66;39708:74;39705:1;39702:81;39699:107;;;39786:18;;:::i;:::-;39699:107;39830:1;39827;39823:9;39816:16;;39533:305;;;;:::o;39844:171::-;39883:3;39906:24;39924:5;39906:24;:::i;:::-;39897:33;;39952:4;39945:5;39942:15;39939:41;;39960:18;;:::i;:::-;39939:41;40007:1;40000:5;39996:13;39989:20;;39844:171;;;:::o;40021:182::-;40161:34;40157:1;40149:6;40145:14;40138:58;40021:182;:::o;40209:366::-;40351:3;40372:67;40436:2;40431:3;40372:67;:::i;:::-;40365:74;;40448:93;40537:3;40448:93;:::i;:::-;40566:2;40561:3;40557:12;40550:19;;40209:366;;;:::o;40581:419::-;40747:4;40785:2;40774:9;40770:18;40762:26;;40834:9;40828:4;40824:20;40820:1;40809:9;40805:17;40798:47;40862:131;40988:4;40862:131;:::i;:::-;40854:139;;40581:419;;;:::o
Swarm Source
ipfs://b54410cc965beb03f200dcaba29b217396a217d68474d0ed3e80b11fe1d4405d
Loading...
Loading
Loading...
Loading
[ 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.