ERC-721
Overview
Max Total Supply
30,893 MARSNFT
Holders
27,273
Market
Fully Diluted Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Balance
0 MARSNFTLoading...
Loading
Loading...
Loading
Loading...
Loading
Contract Name:
MarsNFT
Compiler Version
v0.8.4+commit.c7e474f2
Contract Source Code (Solidity)
/** *Submitted for verification at ftmscan.com on 2021-06-17 */ // File: @openzeppelin/contracts/utils/Context.sol pragma solidity ^0.8.0; /* * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { this; // silence state mutability warning without generating bytecode - see https://github.com/ethereum/solidity/issues/2691 return msg.data; } } // File: @openzeppelin/contracts/utils/Counters.sol pragma solidity ^0.8.0; /** * @title Counters * @author Matt Condon (@shrugs) * @dev Provides counters that can only be incremented, decremented or reset. This can be used e.g. to track the number * of elements in a mapping, issuing ERC721 ids, or counting request ids. * * Include with `using Counters for Counters.Counter;` */ library Counters { struct Counter { // This variable should never be directly accessed by users of the library: interactions must be restricted to // the library's function. As of Solidity v0.5.2, this cannot be enforced, though there is a proposal to add // this feature: see https://github.com/ethereum/solidity/issues/4637 uint256 _value; // default: 0 } function current(Counter storage counter) internal view returns (uint256) { return counter._value; } function increment(Counter storage counter) internal { unchecked { counter._value += 1; } } function decrement(Counter storage counter) internal { uint256 value = counter._value; require(value > 0, "Counter: decrement overflow"); unchecked { counter._value = value - 1; } } function reset(Counter storage counter) internal { counter._value = 0; } } // File: @openzeppelin/contracts/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/token/ERC721/IERC721.sol pragma solidity ^0.8.0; /** * @dev Required interface of an ERC721 compliant contract. */ interface IERC721 is IERC165 { /** * @dev Emitted when `tokenId` token is transferred from `from` to `to`. */ event Transfer(address indexed from, address indexed to, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token. */ event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId); /** * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets. */ event ApprovalForAll(address indexed owner, address indexed operator, bool approved); /** * @dev Returns the number of tokens in ``owner``'s account. */ function balanceOf(address owner) external view returns (uint256 balance); /** * @dev Returns the owner of the `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function ownerOf(uint256 tokenId) external view returns (address owner); /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Transfers `tokenId` token from `from` to `to`. * * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * * Emits a {Transfer} event. */ function transferFrom( address from, address to, uint256 tokenId ) external; /** * @dev Gives permission to `to` to transfer `tokenId` token to another account. * The approval is cleared when the token is transferred. * * Only a single account can be approved at a time, so approving the zero address clears previous approvals. * * Requirements: * * - The caller must own the token or be an approved operator. * - `tokenId` must exist. * * Emits an {Approval} event. */ function approve(address to, uint256 tokenId) external; /** * @dev Returns the account approved for `tokenId` token. * * Requirements: * * - `tokenId` must exist. */ function getApproved(uint256 tokenId) external view returns (address operator); /** * @dev Approve or remove `operator` as an operator for the caller. * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller. * * Requirements: * * - The `operator` cannot be the caller. * * Emits an {ApprovalForAll} event. */ function setApprovalForAll(address operator, bool _approved) external; /** * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`. * * See {setApprovalForAll} */ function isApprovedForAll(address owner, address operator) external view returns (bool); /** * @dev Safely transfers `tokenId` token from `from` to `to`. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes calldata data ) external; } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional metadata extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Metadata is IERC721 { /** * @dev Returns the token collection name. */ function name() external view returns (string memory); /** * @dev Returns the token collection symbol. */ function symbol() external view returns (string memory); /** * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token. */ function tokenURI(uint256 tokenId) external view returns (string memory); } // File: @openzeppelin/contracts/token/ERC721/extensions/IERC721Enumerable.sol pragma solidity ^0.8.0; /** * @title ERC-721 Non-Fungible Token Standard, optional enumeration extension * @dev See https://eips.ethereum.org/EIPS/eip-721 */ interface IERC721Enumerable is IERC721 { /** * @dev Returns the total amount of tokens stored by the contract. */ function totalSupply() external view returns (uint256); /** * @dev Returns a token ID owned by `owner` at a given `index` of its token list. * Use along with {balanceOf} to enumerate all of ``owner``'s tokens. */ function tokenOfOwnerByIndex(address owner, uint256 index) external view returns (uint256 tokenId); /** * @dev Returns a token ID at a given `index` of all the tokens stored by the contract. * Use along with {totalSupply} to enumerate all tokens. */ function tokenByIndex(uint256 index) external view returns (uint256); } // File: @openzeppelin/contracts/token/ERC721/IERC721Receiver.sol pragma solidity ^0.8.0; /** * @title ERC721 token receiver interface * @dev Interface for any contract that wants to support safeTransfers * from ERC721 asset contracts. */ interface IERC721Receiver { /** * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom} * by `operator` from `from`, this function is called. * * It must return its Solidity selector to confirm the token transfer. * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted. * * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`. */ function onERC721Received( address operator, address from, uint256 tokenId, bytes calldata data ) external returns (bytes4); } // File: @openzeppelin/contracts/utils/introspection/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/Address.sol pragma solidity ^0.8.0; /** * @dev Collection of functions related to the address type */ library Address { /** * @dev Returns true if `account` is a contract. * * [IMPORTANT] * ==== * It is unsafe to assume that an address for which this function returns * false is an externally-owned account (EOA) and not a contract. * * Among others, `isContract` will return false for the following * types of addresses: * * - an externally-owned account * - a contract in construction * - an address where a contract will be created * - an address where a contract lived, but was destroyed * ==== */ function isContract(address account) internal view returns (bool) { // This method relies on extcodesize, which returns 0 for contracts in // construction, since the code is only stored at the end of the // constructor execution. uint256 size; assembly { size := extcodesize(account) } return size > 0; } /** * @dev Replacement for Solidity's `transfer`: sends `amount` wei to * `recipient`, forwarding all available gas and reverting on errors. * * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost * of certain opcodes, possibly making contracts go over the 2300 gas limit * imposed by `transfer`, making them unable to receive funds via * `transfer`. {sendValue} removes this limitation. * * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more]. * * IMPORTANT: because control is transferred to `recipient`, care must be * taken to not create reentrancy vulnerabilities. Consider using * {ReentrancyGuard} or the * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern]. */ function sendValue(address payable recipient, uint256 amount) internal { require(address(this).balance >= amount, "Address: insufficient balance"); (bool success, ) = recipient.call{value: amount}(""); require(success, "Address: unable to send value, recipient may have reverted"); } /** * @dev Performs a Solidity function call using a low level `call`. A * plain`call` is an unsafe replacement for a function call: use this * function instead. * * If `target` reverts with a revert reason, it is bubbled up by this * function (like regular Solidity function calls). * * Returns the raw returned data. To convert to the expected return value, * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`]. * * Requirements: * * - `target` must be a contract. * - calling `target` with `data` must not revert. * * _Available since v3.1._ */ function functionCall(address target, bytes memory data) internal returns (bytes memory) { return functionCall(target, data, "Address: low-level call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with * `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { return functionCallWithValue(target, data, 0, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but also transferring `value` wei to `target`. * * Requirements: * * - the calling contract must have an ETH balance of at least `value`. * - the called Solidity function must be `payable`. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value ) internal returns (bytes memory) { return functionCallWithValue(target, data, value, "Address: low-level call with value failed"); } /** * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but * with `errorMessage` as a fallback revert reason when `target` reverts. * * _Available since v3.1._ */ function functionCallWithValue( address target, bytes memory data, uint256 value, string memory errorMessage ) internal returns (bytes memory) { require(address(this).balance >= value, "Address: insufficient balance for call"); require(isContract(target), "Address: call to non-contract"); (bool success, bytes memory returndata) = target.call{value: value}(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) { return functionStaticCall(target, data, "Address: low-level static call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a static call. * * _Available since v3.3._ */ function functionStaticCall( address target, bytes memory data, string memory errorMessage ) internal view returns (bytes memory) { require(isContract(target), "Address: static call to non-contract"); (bool success, bytes memory returndata) = target.staticcall(data); return _verifyCallResult(success, returndata, errorMessage); } /** * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) { return functionDelegateCall(target, data, "Address: low-level delegate call failed"); } /** * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`], * but performing a delegate call. * * _Available since v3.4._ */ function functionDelegateCall( address target, bytes memory data, string memory errorMessage ) internal returns (bytes memory) { require(isContract(target), "Address: delegate call to non-contract"); (bool success, bytes memory returndata) = target.delegatecall(data); return _verifyCallResult(success, returndata, errorMessage); } function _verifyCallResult( bool success, bytes memory returndata, string memory errorMessage ) private pure returns (bytes memory) { if (success) { return returndata; } else { // Look for revert reason and bubble it up if present if (returndata.length > 0) { // The easiest way to bubble the revert reason is using memory via assembly assembly { let returndata_size := mload(returndata) revert(add(32, returndata), returndata_size) } } else { revert(errorMessage); } } } } // File: @openzeppelin/contracts/utils/Strings.sol pragma solidity ^0.8.0; /** * @dev String operations. */ library Strings { bytes16 private constant _ALPHABET = "0123456789abcdef"; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { // Inspired by OraclizeAPI's implementation - MIT licence // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol if (value == 0) { return "0"; } uint256 temp = value; uint256 digits; while (temp != 0) { digits++; temp /= 10; } bytes memory buffer = new bytes(digits); while (value != 0) { digits -= 1; buffer[digits] = bytes1(uint8(48 + uint256(value % 10))); value /= 10; } return string(buffer); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { if (value == 0) { return "0x00"; } uint256 temp = value; uint256 length = 0; while (temp != 0) { length++; temp >>= 8; } return toHexString(value, length); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length. */ function toHexString(uint256 value, uint256 length) internal pure returns (string memory) { bytes memory buffer = new bytes(2 * length + 2); buffer[0] = "0"; buffer[1] = "x"; for (uint256 i = 2 * length + 1; i > 1; --i) { buffer[i] = _ALPHABET[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } } // File: @openzeppelin/contracts/access/AccessControl.sol pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { function hasRole(bytes32 role, address account) external view returns (bool); function getRoleAdmin(bytes32 role) external view returns (bytes32); function grantRole(bytes32 role, address account) external; function revokeRole(bytes32 role, address account) external; function renounceRole(bytes32 role, address account) external; } /** * @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 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 {_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 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]{20}) is missing role (0x[0-9a-f]{32})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role, _msgSender()); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{20}) is missing role (0x[0-9a-f]{32})$/ */ function _checkRole(bytes32 role, address account) internal view { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(uint160(account), 20), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { emit RoleAdminChanged(role, getRoleAdmin(role), adminRole); _roles[role].adminRole = adminRole; } function _grantRole(bytes32 role, address account) private { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } function _revokeRole(bytes32 role, address account) private { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } } // File: @openzeppelin/contracts/token/ERC721/ERC721.sol pragma solidity ^0.8.0; /** * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including * the Metadata extension, but not including the Enumerable extension, which is available separately as * {ERC721Enumerable}. */ contract ERC721 is Context, ERC165, IERC721, IERC721Metadata { using Address for address; using Strings for uint256; // Token name string private _name; // Token symbol string private _symbol; // Mapping from token ID to owner address mapping(uint256 => address) private _owners; // Mapping owner address to token count mapping(address => uint256) private _balances; // Mapping from token ID to approved address mapping(uint256 => address) private _tokenApprovals; // Mapping from owner to operator approvals mapping(address => mapping(address => bool)) private _operatorApprovals; /** * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection. */ constructor(string memory name_, string memory symbol_) { _name = name_; _symbol = symbol_; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) { return interfaceId == type(IERC721).interfaceId || interfaceId == type(IERC721Metadata).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721-balanceOf}. */ function balanceOf(address owner) public view virtual override returns (uint256) { require(owner != address(0), "ERC721: balance query for the zero address"); return _balances[owner]; } /** * @dev See {IERC721-ownerOf}. */ function ownerOf(uint256 tokenId) public view virtual override returns (address) { address owner = _owners[tokenId]; require(owner != address(0), "ERC721: owner query for nonexistent token"); return owner; } /** * @dev See {IERC721Metadata-name}. */ function name() public view virtual override returns (string memory) { return _name; } /** * @dev See {IERC721Metadata-symbol}. */ function symbol() public view virtual override returns (string memory) { return _symbol; } /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721Metadata: URI query for nonexistent token"); string memory baseURI = _baseURI(); return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : ""; } /** * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each * token will be the concatenation of the `baseURI` and the `tokenId`. Empty * by default, can be overriden in child contracts. */ function _baseURI() internal view virtual returns (string memory) { return ""; } /** * @dev See {IERC721-approve}. */ function approve(address to, uint256 tokenId) public virtual override { address owner = ERC721.ownerOf(tokenId); require(to != owner, "ERC721: approval to current owner"); require( _msgSender() == owner || isApprovedForAll(owner, _msgSender()), "ERC721: approve caller is not owner nor approved for all" ); _approve(to, tokenId); } /** * @dev See {IERC721-getApproved}. */ function getApproved(uint256 tokenId) public view virtual override returns (address) { require(_exists(tokenId), "ERC721: approved query for nonexistent token"); return _tokenApprovals[tokenId]; } /** * @dev See {IERC721-setApprovalForAll}. */ function setApprovalForAll(address operator, bool approved) public virtual override { require(operator != _msgSender(), "ERC721: approve to caller"); _operatorApprovals[_msgSender()][operator] = approved; emit ApprovalForAll(_msgSender(), operator, approved); } /** * @dev See {IERC721-isApprovedForAll}. */ function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) { return _operatorApprovals[owner][operator]; } /** * @dev See {IERC721-transferFrom}. */ function transferFrom( address from, address to, uint256 tokenId ) public virtual override { //solhint-disable-next-line max-line-length require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _transfer(from, to, tokenId); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId ) public virtual override { safeTransferFrom(from, to, tokenId, ""); } /** * @dev See {IERC721-safeTransferFrom}. */ function safeTransferFrom( address from, address to, uint256 tokenId, bytes memory _data ) public virtual override { require(_isApprovedOrOwner(_msgSender(), tokenId), "ERC721: transfer caller is not owner nor approved"); _safeTransfer(from, to, tokenId, _data); } /** * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients * are aware of the ERC721 protocol to prevent tokens from being forever locked. * * `_data` is additional data, it has no specified format and it is sent in call to `to`. * * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g. * implement alternative mechanisms to perform token transfer, such as signature-based. * * Requirements: * * - `from` cannot be the zero address. * - `to` cannot be the zero address. * - `tokenId` token must exist and be owned by `from`. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeTransfer( address from, address to, uint256 tokenId, bytes memory _data ) internal virtual { _transfer(from, to, tokenId); require(_checkOnERC721Received(from, to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer"); } /** * @dev Returns whether `tokenId` exists. * * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}. * * Tokens start existing when they are minted (`_mint`), * and stop existing when they are burned (`_burn`). */ function _exists(uint256 tokenId) internal view virtual returns (bool) { return _owners[tokenId] != address(0); } /** * @dev Returns whether `spender` is allowed to manage `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) { require(_exists(tokenId), "ERC721: operator query for nonexistent token"); address owner = ERC721.ownerOf(tokenId); return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender)); } /** * @dev Safely mints `tokenId` and transfers it to `to`. * * Requirements: * * - `tokenId` must not exist. * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer. * * Emits a {Transfer} event. */ function _safeMint(address to, uint256 tokenId) internal virtual { _safeMint(to, tokenId, ""); } /** * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is * forwarded in {IERC721Receiver-onERC721Received} to contract recipients. */ function _safeMint( address to, uint256 tokenId, bytes memory _data ) internal virtual { _mint(to, tokenId); require( _checkOnERC721Received(address(0), to, tokenId, _data), "ERC721: transfer to non ERC721Receiver implementer" ); } /** * @dev Mints `tokenId` and transfers it to `to`. * * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible * * Requirements: * * - `tokenId` must not exist. * - `to` cannot be the zero address. * * Emits a {Transfer} event. */ function _mint(address to, uint256 tokenId) internal virtual { require(to != address(0), "ERC721: mint to the zero address"); require(!_exists(tokenId), "ERC721: token already minted"); _beforeTokenTransfer(address(0), to, tokenId); _balances[to] += 1; _owners[tokenId] = to; emit Transfer(address(0), to, tokenId); } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual { address owner = ERC721.ownerOf(tokenId); _beforeTokenTransfer(owner, address(0), tokenId); // Clear approvals _approve(address(0), tokenId); _balances[owner] -= 1; delete _owners[tokenId]; emit Transfer(owner, address(0), tokenId); } /** * @dev Transfers `tokenId` from `from` to `to`. * As opposed to {transferFrom}, this imposes no restrictions on msg.sender. * * Requirements: * * - `to` cannot be the zero address. * - `tokenId` token must be owned by `from`. * * Emits a {Transfer} event. */ function _transfer( address from, address to, uint256 tokenId ) internal virtual { require(ERC721.ownerOf(tokenId) == from, "ERC721: transfer of token that is not own"); require(to != address(0), "ERC721: transfer to the zero address"); _beforeTokenTransfer(from, to, tokenId); // Clear approvals from the previous owner _approve(address(0), tokenId); _balances[from] -= 1; _balances[to] += 1; _owners[tokenId] = to; emit Transfer(from, to, tokenId); } /** * @dev Approve `to` to operate on `tokenId` * * Emits a {Approval} event. */ function _approve(address to, uint256 tokenId) internal virtual { _tokenApprovals[tokenId] = to; emit Approval(ERC721.ownerOf(tokenId), to, tokenId); } /** * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address. * The call is not executed if the target address is not a contract. * * @param from address representing the previous owner of the given token ID * @param to target address that will receive the tokens * @param tokenId uint256 ID of the token to be transferred * @param _data bytes optional data to send along with the call * @return bool whether the call correctly returned the expected magic value */ function _checkOnERC721Received( address from, address to, uint256 tokenId, bytes memory _data ) private returns (bool) { if (to.isContract()) { try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) { return retval == IERC721Receiver(to).onERC721Received.selector; } catch (bytes memory reason) { if (reason.length == 0) { revert("ERC721: transfer to non ERC721Receiver implementer"); } else { assembly { revert(add(32, reason), mload(reason)) } } } } else { return true; } } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` and `to` are never both zero. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual {} } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721Enumerable.sol pragma solidity ^0.8.0; /** * @dev This implements an optional extension of {ERC721} defined in the EIP that adds * enumerability of all the token ids in the contract as well as all token ids owned by each * account. */ abstract contract ERC721Enumerable is ERC721, IERC721Enumerable { // Mapping from owner to list of owned token IDs mapping(address => mapping(uint256 => uint256)) private _ownedTokens; // Mapping from token ID to index of the owner tokens list mapping(uint256 => uint256) private _ownedTokensIndex; // Array with all token ids, used for enumeration uint256[] private _allTokens; // Mapping from token id to position in the allTokens array mapping(uint256 => uint256) private _allTokensIndex; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC721) returns (bool) { return interfaceId == type(IERC721Enumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev See {IERC721Enumerable-tokenOfOwnerByIndex}. */ function tokenOfOwnerByIndex(address owner, uint256 index) public view virtual override returns (uint256) { require(index < ERC721.balanceOf(owner), "ERC721Enumerable: owner index out of bounds"); return _ownedTokens[owner][index]; } /** * @dev See {IERC721Enumerable-totalSupply}. */ function totalSupply() public view virtual override returns (uint256) { return _allTokens.length; } /** * @dev See {IERC721Enumerable-tokenByIndex}. */ function tokenByIndex(uint256 index) public view virtual override returns (uint256) { require(index < ERC721Enumerable.totalSupply(), "ERC721Enumerable: global index out of bounds"); return _allTokens[index]; } /** * @dev Hook that is called before any token transfer. This includes minting * and burning. * * Calling conditions: * * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be * transferred to `to`. * - When `from` is zero, `tokenId` will be minted for `to`. * - When `to` is zero, ``from``'s `tokenId` will be burned. * - `from` cannot be the zero address. * - `to` cannot be the zero address. * * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks]. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal virtual override { super._beforeTokenTransfer(from, to, tokenId); if (from == address(0)) { _addTokenToAllTokensEnumeration(tokenId); } else if (from != to) { _removeTokenFromOwnerEnumeration(from, tokenId); } if (to == address(0)) { _removeTokenFromAllTokensEnumeration(tokenId); } else if (to != from) { _addTokenToOwnerEnumeration(to, tokenId); } } /** * @dev Private function to add a token to this extension's ownership-tracking data structures. * @param to address representing the new owner of the given token ID * @param tokenId uint256 ID of the token to be added to the tokens list of the given address */ function _addTokenToOwnerEnumeration(address to, uint256 tokenId) private { uint256 length = ERC721.balanceOf(to); _ownedTokens[to][length] = tokenId; _ownedTokensIndex[tokenId] = length; } /** * @dev Private function to add a token to this extension's token tracking data structures. * @param tokenId uint256 ID of the token to be added to the tokens list */ function _addTokenToAllTokensEnumeration(uint256 tokenId) private { _allTokensIndex[tokenId] = _allTokens.length; _allTokens.push(tokenId); } /** * @dev Private function to remove a token from this extension's ownership-tracking data structures. Note that * while the token is not assigned a new owner, the `_ownedTokensIndex` mapping is _not_ updated: this allows for * gas optimizations e.g. when performing a transfer operation (avoiding double writes). * This has O(1) time complexity, but alters the order of the _ownedTokens array. * @param from address representing the previous owner of the given token ID * @param tokenId uint256 ID of the token to be removed from the tokens list of the given address */ function _removeTokenFromOwnerEnumeration(address from, uint256 tokenId) private { // To prevent a gap in from's tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = ERC721.balanceOf(from) - 1; uint256 tokenIndex = _ownedTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary if (tokenIndex != lastTokenIndex) { uint256 lastTokenId = _ownedTokens[from][lastTokenIndex]; _ownedTokens[from][tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _ownedTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index } // This also deletes the contents at the last position of the array delete _ownedTokensIndex[tokenId]; delete _ownedTokens[from][lastTokenIndex]; } /** * @dev Private function to remove a token from this extension's token tracking data structures. * This has O(1) time complexity, but alters the order of the _allTokens array. * @param tokenId uint256 ID of the token to be removed from the tokens list */ function _removeTokenFromAllTokensEnumeration(uint256 tokenId) private { // To prevent a gap in the tokens array, we store the last token in the index of the token to delete, and // then delete the last slot (swap and pop). uint256 lastTokenIndex = _allTokens.length - 1; uint256 tokenIndex = _allTokensIndex[tokenId]; // When the token to delete is the last token, the swap operation is unnecessary. However, since this occurs so // rarely (when the last minted token is burnt) that we still do the swap here to avoid the gas cost of adding // an 'if' statement (like in _removeTokenFromOwnerEnumeration) uint256 lastTokenId = _allTokens[lastTokenIndex]; _allTokens[tokenIndex] = lastTokenId; // Move the last token to the slot of the to-delete token _allTokensIndex[lastTokenId] = tokenIndex; // Update the moved token's index // This also deletes the contents at the last position of the array delete _allTokensIndex[tokenId]; _allTokens.pop(); } } // File: @openzeppelin/contracts/token/ERC721/extensions/ERC721URIStorage.sol pragma solidity ^0.8.0; /** * @dev ERC721 token with storage based token URI management. */ abstract contract ERC721URIStorage is ERC721 { using Strings for uint256; // Optional mapping for token URIs mapping(uint256 => string) private _tokenURIs; /** * @dev See {IERC721Metadata-tokenURI}. */ function tokenURI(uint256 tokenId) public view virtual override returns (string memory) { require(_exists(tokenId), "ERC721URIStorage: URI query for nonexistent token"); string memory _tokenURI = _tokenURIs[tokenId]; string memory base = _baseURI(); // If there is no base URI, return the token URI. if (bytes(base).length == 0) { return _tokenURI; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(_tokenURI).length > 0) { return string(abi.encodePacked(base, _tokenURI)); } return super.tokenURI(tokenId); } /** * @dev Sets `_tokenURI` as the tokenURI of `tokenId`. * * Requirements: * * - `tokenId` must exist. */ function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual { require(_exists(tokenId), "ERC721URIStorage: URI set of nonexistent token"); _tokenURIs[tokenId] = _tokenURI; } /** * @dev Destroys `tokenId`. * The approval is cleared when the token is burned. * * Requirements: * * - `tokenId` must exist. * * Emits a {Transfer} event. */ function _burn(uint256 tokenId) internal virtual override { super._burn(tokenId); if (bytes(_tokenURIs[tokenId]).length != 0) { delete _tokenURIs[tokenId]; } } } // File: contracts/TestNFT.sol pragma solidity ^0.8.0; contract MarsNFT is ERC721, ERC721Enumerable, ERC721URIStorage, AccessControl { using Counters for Counters.Counter; // Map the number of tokens per NFTId mapping(uint256 => uint256) public nftCount; // Map the number of tokens burnt per NFTId mapping(uint256 => uint256) public nftBurnCount; // Used for generating the tokenId of new NFT minted Counters.Counter private _nextTokenId; // Used for generating the NFTId of new NFT created Counters.Counter private _nextNFTId; // Map from tokenId to NFTId mapping(uint256 => uint256) private _tokenIdToNFTId; // Map from nftId to tokenURI mapping(uint256 => string) private _nftIdToURI; string private _internalBaseURI; bytes32 public constant ADMIN_ROLE = keccak256('ADMIN_ROLE'); constructor(string memory _bURI) ERC721("MARS NFT", "MARSNFT") { _internalBaseURI = _bURI; _setupRole(DEFAULT_ADMIN_ROLE, _msgSender()); } function _baseURI() internal view virtual override returns (string memory) { return _internalBaseURI; } function getBaseURI() external view returns (string memory) { return _internalBaseURI; } /** * @dev Get NFTId for a specific tokenId. */ function getNFTId(uint256 tokenId) external view returns (uint256) { return _tokenIdToNFTId[tokenId]; } /** * @dev Get tokenURI by NFTId. */ function getTokenURIByNFTId(uint256 nftId) external view returns (string memory) { string memory uri = _nftIdToURI[nftId]; return uri; } /** * @dev Get the number of unique NFTs. */ function getNFTIdCount() external view returns (uint256) { uint256 count = _nextNFTId.current(); return count; } /** * @dev Get all token URIs. */ function getAllTokenURIs() external view returns (string[] memory) { uint256 count = _nextNFTId.current(); string[] memory uris = new string[](count); string memory base = _baseURI(); for (uint256 i = 0; i < count; ++i) { string memory uri = _nftIdToURI[i]; // If there is no base URI, return the token URI. if (bytes(base).length == 0) { uris[i] = uri; } // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked). if (bytes(uri).length > 0) { uris[i] = string(abi.encodePacked(base, uri)); } } return uris; } /** * @dev Get all tokenURIs for an owner. */ function getAllTokenURIsByAddress(address owner) external view returns (string[] memory) { uint256 count = ERC721.balanceOf(owner); string[] memory uris = new string[](count); for (uint256 i = 0; i < count; i++) { uint256 tokenId = tokenOfOwnerByIndex(owner, i); uris[i] = tokenURI(tokenId); } return uris; } /** * @dev Get all tokenIds for an owner. */ function getAllTokenIdsByAddress(address owner) external view returns (uint256[] memory) { uint256 count = ERC721.balanceOf(owner); uint256[] memory tids = new uint256[](count); for (uint256 i = 0; i < count; i++) { tids[i] = tokenOfOwnerByIndex(owner, i); } return tids; } /** * @dev Create NFTs. Associate NFTId with tokenURI. */ function createNFT(string calldata uri) external onlyRole(ADMIN_ROLE) returns (uint256) { require(bytes(uri).length > 0, "tokenURI can not be empty"); uint256 newNFTId = _nextNFTId.current(); _nextNFTId.increment(); _nftIdToURI[newNFTId] = uri; return newNFTId; } /** * @dev Mint NFTs. Only the owner can call it. */ function mint( address to, uint256 nftId ) external onlyRole(ADMIN_ROLE) returns (uint256) { string memory uri = _nftIdToURI[nftId]; require(bytes(uri).length > 0, "nonexistent NFTId"); uint256 newTokenId = _nextTokenId.current(); _nextTokenId.increment(); _tokenIdToNFTId[newTokenId] = nftId; nftCount[nftId] += 1; _mint(to, newTokenId); _setTokenURI(newTokenId, uri); return newTokenId; } /** * @dev Burn a NFT token. Callable by owner only. */ function burn(uint256 tokenId) external onlyRole(ADMIN_ROLE) { uint256 nftIdBurnt = _tokenIdToNFTId[tokenId]; nftCount[nftIdBurnt] -= 1; nftBurnCount[nftIdBurnt] += 1; _burn(tokenId); } /** * @dev Overrides. */ function _beforeTokenTransfer( address from, address to, uint256 tokenId ) internal override (ERC721, ERC721Enumerable) { ERC721Enumerable._beforeTokenTransfer(from, to, tokenId); } /** * @dev Overrides. */ function _burn(uint256 tokenId) internal override (ERC721, ERC721URIStorage) { ERC721URIStorage._burn(tokenId); } /** * @dev Overrides. */ function supportsInterface(bytes4 interfaceId) public view override(ERC721, ERC721Enumerable, AccessControl) returns (bool) { return ERC721Enumerable.supportsInterface(interfaceId) || AccessControl.supportsInterface(interfaceId); } /** * @dev Overrides. */ function tokenURI(uint256 tokenId) public view override(ERC721, ERC721URIStorage) returns (string memory) { return ERC721URIStorage.tokenURI(tokenId); } }
Contract Security Audit
- No Contract Security Audit Submitted- Submit Audit Here
[{"inputs":[{"internalType":"string","name":"_bURI","type":"string"}],"stateMutability":"nonpayable","type":"constructor"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"approved","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Approval","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"owner","type":"address"},{"indexed":true,"internalType":"address","name":"operator","type":"address"},{"indexed":false,"internalType":"bool","name":"approved","type":"bool"}],"name":"ApprovalForAll","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"previousAdminRole","type":"bytes32"},{"indexed":true,"internalType":"bytes32","name":"newAdminRole","type":"bytes32"}],"name":"RoleAdminChanged","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleGranted","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"bytes32","name":"role","type":"bytes32"},{"indexed":true,"internalType":"address","name":"account","type":"address"},{"indexed":true,"internalType":"address","name":"sender","type":"address"}],"name":"RoleRevoked","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"from","type":"address"},{"indexed":true,"internalType":"address","name":"to","type":"address"},{"indexed":true,"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"Transfer","type":"event"},{"inputs":[],"name":"ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"approve","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"uri","type":"string"}],"name":"createNFT","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getAllTokenIdsByAddress","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getAllTokenURIs","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"}],"name":"getAllTokenURIsByAddress","outputs":[{"internalType":"string[]","name":"","type":"string[]"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getApproved","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getBaseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"getNFTId","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"getNFTIdCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"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":"uint256","name":"nftId","type":"uint256"}],"name":"getTokenURIByNFTId","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"address","name":"operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"nftId","type":"uint256"}],"name":"mint","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftBurnCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"nftCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"ownerOf","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"renounceRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"revokeRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"operator","type":"address"},{"internalType":"bool","name":"approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes4","name":"interfaceId","type":"bytes4"}],"name":"supportsInterface","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"symbol","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"tokenOfOwnerByIndex","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"tokenURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"from","type":"address"},{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"}],"name":"transferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"}]
Contract Creation Code
60806040523480156200001157600080fd5b5060405162005537380380620055378339818101604052810190620000379190620003b8565b6040518060400160405280600881526020017f4d415253204e46540000000000000000000000000000000000000000000000008152506040518060400160405280600781526020017f4d4152534e4654000000000000000000000000000000000000000000000000008152508160009080519060200190620000bb92919062000296565b508060019080519060200190620000d492919062000296565b5050508060129080519060200190620000ef92919062000296565b50620001146000801b620001086200011b60201b60201c565b6200012360201b60201c565b506200056d565b600033905090565b6200013582826200013960201b60201c565b5050565b6200014b82826200022b60201b60201c565b62000227576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff021916908315150217905550620001cc6200011b60201b60201c565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b828054620002a49062000492565b90600052602060002090601f016020900481019282620002c8576000855562000314565b82601f10620002e357805160ff191683800117855562000314565b8280016001018555821562000314579182015b8281111562000313578251825591602001919060010190620002f6565b5b50905062000323919062000327565b5090565b5b808211156200034257600081600090555060010162000328565b5090565b60006200035d620003578462000426565b620003fd565b9050828152602081018484840111156200037657600080fd5b620003838482856200045c565b509392505050565b600082601f8301126200039d57600080fd5b8151620003af84826020860162000346565b91505092915050565b600060208284031215620003cb57600080fd5b600082015167ffffffffffffffff811115620003e657600080fd5b620003f4848285016200038b565b91505092915050565b6000620004096200041c565b9050620004178282620004c8565b919050565b6000604051905090565b600067ffffffffffffffff8211156200044457620004436200052d565b5b6200044f826200055c565b9050602081019050919050565b60005b838110156200047c5780820151818401526020810190506200045f565b838111156200048c576000848401525b50505050565b60006002820490506001821680620004ab57607f821691505b60208210811415620004c257620004c1620004fe565b5b50919050565b620004d3826200055c565b810181811067ffffffffffffffff82111715620004f557620004f46200052d565b5b80604052505050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b614fba806200057d6000396000f3fe608060405234801561001057600080fd5b50600436106102115760003560e01c80634f6ccce71161012557806395d89b41116100ad578063c87b56dd1161007c578063c87b56dd14610686578063d547741f146106b6578063da2ed03e146106d2578063e985e9c514610702578063eb34080d1461073257610211565b806395d89b4114610612578063a217fddf14610630578063a22cb4651461064e578063b88d4fde1461066a57610211565b806375b238fc116100f457806375b238fc146105585780637dd066db14610576578063805a0cef1461059457806389fde7af146105c457806391d14854146105e257610211565b80634f6ccce7146104aa5780636352211e146104da57806370a082311461050a578063714c53981461053a57610211565b806323b872dd116101a85780632f745c59116101775780632f745c59146103f657806336568abe1461042657806340c10f191461044257806342842e0e1461047257806342966c681461048e57610211565b806323b872dd1461035e578063248a9ca31461037a57806327b4e77d146103aa5780632f2ff15d146103da57610211565b8063089c9140116101e4578063089c9140146102c4578063095ea7b3146102f4578063121f6a3a1461031057806318160ddd1461034057610211565b806301ffc9a714610216578063023f15321461024657806306fdde0314610276578063081812fc14610294575b600080fd5b610230600480360381019061022b91906139aa565b610762565b60405161023d91906140e1565b60405180910390f35b610260600480360381019061025b9190613a41565b610784565b60405161026d91906143f9565b60405180910390f35b61027e61079c565b60405161028b9190614117565b60405180910390f35b6102ae60048036038101906102a99190613a41565b61082e565b6040516102bb9190614036565b60405180910390f35b6102de60048036038101906102d9919061379e565b6108b3565b6040516102eb919061409d565b60405180910390f35b61030e60048036038101906103099190613909565b6109bf565b005b61032a60048036038101906103259190613a41565b610ad7565b60405161033791906143f9565b60405180910390f35b610348610aef565b60405161035591906143f9565b60405180910390f35b61037860048036038101906103739190613803565b610afc565b005b610394600480360381019061038f9190613945565b610b5c565b6040516103a191906140fc565b60405180910390f35b6103c460048036038101906103bf919061379e565b610b7c565b6040516103d191906140bf565b60405180910390f35b6103f460048036038101906103ef919061396e565b610c76565b005b610410600480360381019061040b9190613909565b610c9f565b60405161041d91906143f9565b60405180910390f35b610440600480360381019061043b919061396e565b610d44565b005b61045c60048036038101906104579190613909565b610dc7565b60405161046991906143f9565b60405180910390f35b61048c60048036038101906104879190613803565b610f5a565b005b6104a860048036038101906104a39190613a41565b610f7a565b005b6104c460048036038101906104bf9190613a41565b611028565b6040516104d191906143f9565b60405180910390f35b6104f460048036038101906104ef9190613a41565b6110bf565b6040516105019190614036565b60405180910390f35b610524600480360381019061051f919061379e565b611171565b60405161053191906143f9565b60405180910390f35b610542611229565b60405161054f9190614117565b60405180910390f35b6105606112bb565b60405161056d91906140fc565b60405180910390f35b61057e6112df565b60405161058b91906143f9565b60405180910390f35b6105ae60048036038101906105a99190613a41565b6112f5565b6040516105bb9190614117565b60405180910390f35b6105cc6113a0565b6040516105d9919061409d565b60405180910390f35b6105fc60048036038101906105f7919061396e565b6115bc565b60405161060991906140e1565b60405180910390f35b61061a611627565b6040516106279190614117565b60405180910390f35b6106386116b9565b60405161064591906140fc565b60405180910390f35b610668600480360381019061066391906138cd565b6116c0565b005b610684600480360381019061067f9190613852565b611841565b005b6106a0600480360381019061069b9190613a41565b6118a3565b6040516106ad9190614117565b60405180910390f35b6106d060048036038101906106cb919061396e565b6118b5565b005b6106ec60048036038101906106e791906139fc565b6118de565b6040516106f991906143f9565b60405180910390f35b61071c600480360381019061071791906137c7565b61199e565b60405161072991906140e1565b60405180910390f35b61074c60048036038101906107479190613a41565b611a32565b60405161075991906143f9565b60405180910390f35b600061076d82611a4f565b8061077d575061077c82611ac9565b5b9050919050565b600c6020528060005260406000206000915090505481565b6060600080546107ab9061472f565b80601f01602080910402602001604051908101604052809291908181526020018280546107d79061472f565b80156108245780601f106107f957610100808354040283529160200191610824565b820191906000526020600020905b81548152906001019060200180831161080757829003601f168201915b5050505050905090565b600061083982611b43565b610878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086f90614319565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b606060006108c083611171565b905060008167ffffffffffffffff811115610904577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561093757816020015b60608152602001906001900390816109225790505b50905060005b828110156109b45760006109518683610c9f565b905061095c816118a3565b838381518110610995577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101819052505080806109ac90614792565b91505061093d565b508092505050919050565b60006109ca826110bf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290614379565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a5a611baf565b73ffffffffffffffffffffffffffffffffffffffff161480610a895750610a8881610a83611baf565b61199e565b5b610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf90614219565b60405180910390fd5b610ad28383611bb7565b505050565b600d6020528060005260406000206000915090505481565b6000600880549050905090565b610b0d610b07611baf565b82611c70565b610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4390614399565b60405180910390fd5b610b57838383611d4e565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b60606000610b8983611171565b905060008167ffffffffffffffff811115610bcd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610bfb5781602001602082028036833780820191505090505b50905060005b82811015610c6b57610c138582610c9f565b828281518110610c4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610c6390614792565b915050610c01565b508092505050919050565b610c7f82610b5c565b610c9081610c8b611baf565b611faa565b610c9a8383612047565b505050565b6000610caa83611171565b8210610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce290614159565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d4c611baf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db0906143d9565b60405180910390fd5b610dc38282612128565b5050565b60007fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610dfb81610df6611baf565b611faa565b6000601160008581526020019081526020016000208054610e1b9061472f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e479061472f565b8015610e945780601f10610e6957610100808354040283529160200191610e94565b820191906000526020600020905b815481529060010190602001808311610e7757829003601f168201915b505050505090506000815111610edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed690614299565b60405180910390fd5b6000610eeb600e61220a565b9050610ef7600e612218565b8460106000838152602001908152602001600020819055506001600c60008781526020019081526020016000206000828254610f339190614530565b92505081905550610f44868261222e565b610f4e81836123fc565b80935050505092915050565b610f7583838360405180602001604052806000815250611841565b505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610fac81610fa7611baf565b611faa565b6000601060008481526020019081526020016000205490506001600c60008381526020019081526020016000206000828254610fe89190614611565b925050819055506001600d600083815260200190815260200160002060008282546110139190614530565b9250508190555061102383612470565b505050565b6000611032610aef565b8210611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a906143b9565b60405180910390fd5b600882815481106110ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90614259565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990614239565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060601280546112389061472f565b80601f01602080910402602001604051908101604052809291908181526020018280546112649061472f565b80156112b15780601f10611286576101008083540402835291602001916112b1565b820191906000526020600020905b81548152906001019060200180831161129457829003601f168201915b5050505050905090565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6000806112ec600f61220a565b90508091505090565b606060006011600084815260200190815260200160002080546113179061472f565b80601f01602080910402602001604051908101604052809291908181526020018280546113439061472f565b80156113905780601f1061136557610100808354040283529160200191611390565b820191906000526020600020905b81548152906001019060200180831161137357829003601f168201915b5050505050905080915050919050565b606060006113ae600f61220a565b905060008167ffffffffffffffff8111156113f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561142557816020015b60608152602001906001900390816114105790505b509050600061143261247c565b905060005b838110156115b257600060116000838152602001908152602001600020805461145f9061472f565b80601f016020809104026020016040519081016040528092919081815260200182805461148b9061472f565b80156114d85780601f106114ad576101008083540402835291602001916114d8565b820191906000526020600020905b8154815290600101906020018083116114bb57829003601f168201915b5050505050905060008351141561152f5780848381518110611523577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101819052505b6000815111156115a057828160405160200161154c929190613fd8565b604051602081830303815290604052848381518110611594577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101819052505b50806115ab90614792565b9050611437565b5081935050505090565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600180546116369061472f565b80601f01602080910402602001604051908101604052809291908181526020018280546116629061472f565b80156116af5780601f10611684576101008083540402835291602001916116af565b820191906000526020600020905b81548152906001019060200180831161169257829003601f168201915b5050505050905090565b6000801b81565b6116c8611baf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172d906141d9565b60405180910390fd5b8060056000611743611baf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117f0611baf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161183591906140e1565b60405180910390a35050565b61185261184c611baf565b83611c70565b611891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188890614399565b60405180910390fd5b61189d8484848461250e565b50505050565b60606118ae8261256a565b9050919050565b6118be82610b5c565b6118cf816118ca611baf565b611faa565b6118d98383612128565b505050565b60007fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756119128161190d611baf565b611faa565b60008484905011611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f906142b9565b60405180910390fd5b6000611964600f61220a565b9050611970600f612218565b8484601160008481526020019081526020016000209190611992929190613505565b50809250505092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600060106000838152602001908152602001600020549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ac25750611ac1826126bc565b5b9050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b3c5750611b3b82611a4f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c2a836110bf565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c7b82611b43565b611cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb1906141f9565b60405180910390fd5b6000611cc5836110bf565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d3457508373ffffffffffffffffffffffffffffffffffffffff16611d1c8461082e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d455750611d44818561199e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d6e826110bf565b73ffffffffffffffffffffffffffffffffffffffff1614611dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbb90614339565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b906141b9565b60405180910390fd5b611e3f83838361279e565b611e4a600082611bb7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e9a9190614611565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ef19190614530565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611fb482826115bc565b61204357611fd98173ffffffffffffffffffffffffffffffffffffffff1660146127ae565b611fe78360001c60206127ae565b604051602001611ff8929190613ffc565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a9190614117565b60405180910390fd5b5050565b61205182826115bc565b612124576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506120c9611baf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61213282826115bc565b15612206576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506121ab611baf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600081600001549050919050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561229e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612295906142d9565b60405180910390fd5b6122a781611b43565b156122e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122de90614199565b60405180910390fd5b6122f36000838361279e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123439190614530565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61240582611b43565b612444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243b90614279565b60405180910390fd5b80600a6000848152602001908152602001600020908051906020019061246b92919061358b565b505050565b61247981612aa8565b50565b60606012805461248b9061472f565b80601f01602080910402602001604051908101604052809291908181526020018280546124b79061472f565b80156125045780601f106124d957610100808354040283529160200191612504565b820191906000526020600020905b8154815290600101906020018083116124e757829003601f168201915b5050505050905090565b612519848484611d4e565b61252584848484612afb565b612564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255b90614179565b60405180910390fd5b50505050565b606061257582611b43565b6125b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ab906142f9565b60405180910390fd5b6000600a600084815260200190815260200160002080546125d49061472f565b80601f01602080910402602001604051908101604052809291908181526020018280546126009061472f565b801561264d5780601f106126225761010080835404028352916020019161264d565b820191906000526020600020905b81548152906001019060200180831161263057829003601f168201915b50505050509050600061265e61247c565b90506000815114156126745781925050506126b7565b6000825111156126a9578082604051602001612691929190613fd8565b604051602081830303815290604052925050506126b7565b6126b284612c92565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061278757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612797575061279682612d39565b5b9050919050565b6127a9838383612da3565b505050565b6060600060028360026127c191906145b7565b6127cb9190614530565b67ffffffffffffffff81111561280a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561283c5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061289a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612924577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261296491906145b7565b61296e9190614530565b90505b6001811115612a5a577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106129d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110612a13577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612a5390614705565b9050612971565b5060008414612a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9590614139565b60405180910390fd5b8091505092915050565b612ab181612eb7565b6000600a60008381526020019081526020016000208054612ad19061472f565b905014612af857600a60008281526020019081526020016000206000612af79190613611565b5b50565b6000612b1c8473ffffffffffffffffffffffffffffffffffffffff16612fc8565b15612c85578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b45611baf565b8786866040518563ffffffff1660e01b8152600401612b679493929190614051565b602060405180830381600087803b158015612b8157600080fd5b505af1925050508015612bb257506040513d601f19601f82011682018060405250810190612baf91906139d3565b60015b612c35573d8060008114612be2576040519150601f19603f3d011682016040523d82523d6000602084013e612be7565b606091505b50600081511415612c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2490614179565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c8a565b600190505b949350505050565b6060612c9d82611b43565b612cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd390614359565b60405180910390fd5b6000612ce661247c565b90506000815111612d065760405180602001604052806000815250612d31565b80612d1084612fdb565b604051602001612d21929190613fd8565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612dae838383613188565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612df157612dec8161318d565b612e30565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e2f57612e2e83826131d6565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e7357612e6e81613343565b612eb2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612eb157612eb08282613486565b5b5b505050565b6000612ec2826110bf565b9050612ed08160008461279e565b612edb600083611bb7565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f2b9190614611565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415613023576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613183565b600082905060005b6000821461305557808061303e90614792565b915050600a8261304e9190614586565b915061302b565b60008167ffffffffffffffff811115613097577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130c95781602001600182028036833780820191505090505b5090505b6000851461317c576001826130e29190614611565b9150600a856130f191906147db565b60306130fd9190614530565b60f81b818381518110613139577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131759190614586565b94506130cd565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131e384611171565b6131ed9190614611565b90506000600760008481526020019081526020016000205490508181146132d2576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133579190614611565b90506000600960008481526020019081526020016000205490506000600883815481106133ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106133f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061346a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061349183611171565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546135119061472f565b90600052602060002090601f016020900481019282613533576000855561357a565b82601f1061354c57803560ff191683800117855561357a565b8280016001018555821561357a579182015b8281111561357957823582559160200191906001019061355e565b5b5090506135879190613651565b5090565b8280546135979061472f565b90600052602060002090601f0160209004810192826135b95760008555613600565b82601f106135d257805160ff1916838001178555613600565b82800160010185558215613600579182015b828111156135ff5782518255916020019190600101906135e4565b5b50905061360d9190613651565b5090565b50805461361d9061472f565b6000825580601f1061362f575061364e565b601f01602090049060005260206000209081019061364d9190613651565b5b50565b5b8082111561366a576000816000905550600101613652565b5090565b600061368161367c84614439565b614414565b90508281526020810184848401111561369957600080fd5b6136a48482856146c3565b509392505050565b6000813590506136bb81614f11565b92915050565b6000813590506136d081614f28565b92915050565b6000813590506136e581614f3f565b92915050565b6000813590506136fa81614f56565b92915050565b60008151905061370f81614f56565b92915050565b600082601f83011261372657600080fd5b813561373684826020860161366e565b91505092915050565b60008083601f84011261375157600080fd5b8235905067ffffffffffffffff81111561376a57600080fd5b60208301915083600182028301111561378257600080fd5b9250929050565b60008135905061379881614f6d565b92915050565b6000602082840312156137b057600080fd5b60006137be848285016136ac565b91505092915050565b600080604083850312156137da57600080fd5b60006137e8858286016136ac565b92505060206137f9858286016136ac565b9150509250929050565b60008060006060848603121561381857600080fd5b6000613826868287016136ac565b9350506020613837868287016136ac565b925050604061384886828701613789565b9150509250925092565b6000806000806080858703121561386857600080fd5b6000613876878288016136ac565b9450506020613887878288016136ac565b935050604061389887828801613789565b925050606085013567ffffffffffffffff8111156138b557600080fd5b6138c187828801613715565b91505092959194509250565b600080604083850312156138e057600080fd5b60006138ee858286016136ac565b92505060206138ff858286016136c1565b9150509250929050565b6000806040838503121561391c57600080fd5b600061392a858286016136ac565b925050602061393b85828601613789565b9150509250929050565b60006020828403121561395757600080fd5b6000613965848285016136d6565b91505092915050565b6000806040838503121561398157600080fd5b600061398f858286016136d6565b92505060206139a0858286016136ac565b9150509250929050565b6000602082840312156139bc57600080fd5b60006139ca848285016136eb565b91505092915050565b6000602082840312156139e557600080fd5b60006139f384828501613700565b91505092915050565b60008060208385031215613a0f57600080fd5b600083013567ffffffffffffffff811115613a2957600080fd5b613a358582860161373f565b92509250509250929050565b600060208284031215613a5357600080fd5b6000613a6184828501613789565b91505092915050565b6000613a768383613bcf565b905092915050565b6000613a8a8383613fba565b60208301905092915050565b613a9f81614645565b82525050565b6000613ab08261448a565b613aba81856144d0565b935083602082028501613acc8561446a565b8060005b85811015613b085784840389528151613ae98582613a6a565b9450613af4836144b6565b925060208a01995050600181019050613ad0565b50829750879550505050505092915050565b6000613b2582614495565b613b2f81856144e1565b9350613b3a8361447a565b8060005b83811015613b6b578151613b528882613a7e565b9750613b5d836144c3565b925050600181019050613b3e565b5085935050505092915050565b613b8181614657565b82525050565b613b9081614663565b82525050565b6000613ba1826144a0565b613bab81856144f2565b9350613bbb8185602086016146d2565b613bc4816148c8565b840191505092915050565b6000613bda826144ab565b613be48185614503565b9350613bf48185602086016146d2565b613bfd816148c8565b840191505092915050565b6000613c13826144ab565b613c1d8185614514565b9350613c2d8185602086016146d2565b613c36816148c8565b840191505092915050565b6000613c4c826144ab565b613c568185614525565b9350613c668185602086016146d2565b80840191505092915050565b6000613c7f602083614514565b9150613c8a826148d9565b602082019050919050565b6000613ca2602b83614514565b9150613cad82614902565b604082019050919050565b6000613cc5603283614514565b9150613cd082614951565b604082019050919050565b6000613ce8601c83614514565b9150613cf3826149a0565b602082019050919050565b6000613d0b602483614514565b9150613d16826149c9565b604082019050919050565b6000613d2e601983614514565b9150613d3982614a18565b602082019050919050565b6000613d51602c83614514565b9150613d5c82614a41565b604082019050919050565b6000613d74603883614514565b9150613d7f82614a90565b604082019050919050565b6000613d97602a83614514565b9150613da282614adf565b604082019050919050565b6000613dba602983614514565b9150613dc582614b2e565b604082019050919050565b6000613ddd602e83614514565b9150613de882614b7d565b604082019050919050565b6000613e00601183614514565b9150613e0b82614bcc565b602082019050919050565b6000613e23601983614514565b9150613e2e82614bf5565b602082019050919050565b6000613e46602083614514565b9150613e5182614c1e565b602082019050919050565b6000613e69603183614514565b9150613e7482614c47565b604082019050919050565b6000613e8c602c83614514565b9150613e9782614c96565b604082019050919050565b6000613eaf602983614514565b9150613eba82614ce5565b604082019050919050565b6000613ed2602f83614514565b9150613edd82614d34565b604082019050919050565b6000613ef5602183614514565b9150613f0082614d83565b604082019050919050565b6000613f18603183614514565b9150613f2382614dd2565b604082019050919050565b6000613f3b602c83614514565b9150613f4682614e21565b604082019050919050565b6000613f5e601783614525565b9150613f6982614e70565b601782019050919050565b6000613f81601183614525565b9150613f8c82614e99565b601182019050919050565b6000613fa4602f83614514565b9150613faf82614ec2565b604082019050919050565b613fc3816146b9565b82525050565b613fd2816146b9565b82525050565b6000613fe48285613c41565b9150613ff08284613c41565b91508190509392505050565b600061400782613f51565b91506140138285613c41565b915061401e82613f74565b915061402a8284613c41565b91508190509392505050565b600060208201905061404b6000830184613a96565b92915050565b60006080820190506140666000830187613a96565b6140736020830186613a96565b6140806040830185613fc9565b81810360608301526140928184613b96565b905095945050505050565b600060208201905081810360008301526140b78184613aa5565b905092915050565b600060208201905081810360008301526140d98184613b1a565b905092915050565b60006020820190506140f66000830184613b78565b92915050565b60006020820190506141116000830184613b87565b92915050565b600060208201905081810360008301526141318184613c08565b905092915050565b6000602082019050818103600083015261415281613c72565b9050919050565b6000602082019050818103600083015261417281613c95565b9050919050565b6000602082019050818103600083015261419281613cb8565b9050919050565b600060208201905081810360008301526141b281613cdb565b9050919050565b600060208201905081810360008301526141d281613cfe565b9050919050565b600060208201905081810360008301526141f281613d21565b9050919050565b6000602082019050818103600083015261421281613d44565b9050919050565b6000602082019050818103600083015261423281613d67565b9050919050565b6000602082019050818103600083015261425281613d8a565b9050919050565b6000602082019050818103600083015261427281613dad565b9050919050565b6000602082019050818103600083015261429281613dd0565b9050919050565b600060208201905081810360008301526142b281613df3565b9050919050565b600060208201905081810360008301526142d281613e16565b9050919050565b600060208201905081810360008301526142f281613e39565b9050919050565b6000602082019050818103600083015261431281613e5c565b9050919050565b6000602082019050818103600083015261433281613e7f565b9050919050565b6000602082019050818103600083015261435281613ea2565b9050919050565b6000602082019050818103600083015261437281613ec5565b9050919050565b6000602082019050818103600083015261439281613ee8565b9050919050565b600060208201905081810360008301526143b281613f0b565b9050919050565b600060208201905081810360008301526143d281613f2e565b9050919050565b600060208201905081810360008301526143f281613f97565b9050919050565b600060208201905061440e6000830184613fc9565b92915050565b600061441e61442f565b905061442a8282614761565b919050565b6000604051905090565b600067ffffffffffffffff82111561445457614453614899565b5b61445d826148c8565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061453b826146b9565b9150614546836146b9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561457b5761457a61480c565b5b828201905092915050565b6000614591826146b9565b915061459c836146b9565b9250826145ac576145ab61483b565b5b828204905092915050565b60006145c2826146b9565b91506145cd836146b9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146065761460561480c565b5b828202905092915050565b600061461c826146b9565b9150614627836146b9565b92508282101561463a5761463961480c565b5b828203905092915050565b600061465082614699565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156146f05780820151818401526020810190506146d5565b838111156146ff576000848401525b50505050565b6000614710826146b9565b915060008214156147245761472361480c565b5b600182039050919050565b6000600282049050600182168061474757607f821691505b6020821081141561475b5761475a61486a565b5b50919050565b61476a826148c8565b810181811067ffffffffffffffff8211171561478957614788614899565b5b80604052505050565b600061479d826146b9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147d0576147cf61480c565b5b600182019050919050565b60006147e6826146b9565b91506147f1836146b9565b9250826148015761480061483b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f6e6f6e6578697374656e74204e46544964000000000000000000000000000000600082015250565b7f746f6b656e5552492063616e206e6f7420626520656d70747900000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b614f1a81614645565b8114614f2557600080fd5b50565b614f3181614657565b8114614f3c57600080fd5b50565b614f4881614663565b8114614f5357600080fd5b50565b614f5f8161466d565b8114614f6a57600080fd5b50565b614f76816146b9565b8114614f8157600080fd5b5056fea264697066735822122050febd0f3d7876f0610d054a0822005fec6cd12125285236884b3d2702579d9064736f6c6343000804003300000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x608060405234801561001057600080fd5b50600436106102115760003560e01c80634f6ccce71161012557806395d89b41116100ad578063c87b56dd1161007c578063c87b56dd14610686578063d547741f146106b6578063da2ed03e146106d2578063e985e9c514610702578063eb34080d1461073257610211565b806395d89b4114610612578063a217fddf14610630578063a22cb4651461064e578063b88d4fde1461066a57610211565b806375b238fc116100f457806375b238fc146105585780637dd066db14610576578063805a0cef1461059457806389fde7af146105c457806391d14854146105e257610211565b80634f6ccce7146104aa5780636352211e146104da57806370a082311461050a578063714c53981461053a57610211565b806323b872dd116101a85780632f745c59116101775780632f745c59146103f657806336568abe1461042657806340c10f191461044257806342842e0e1461047257806342966c681461048e57610211565b806323b872dd1461035e578063248a9ca31461037a57806327b4e77d146103aa5780632f2ff15d146103da57610211565b8063089c9140116101e4578063089c9140146102c4578063095ea7b3146102f4578063121f6a3a1461031057806318160ddd1461034057610211565b806301ffc9a714610216578063023f15321461024657806306fdde0314610276578063081812fc14610294575b600080fd5b610230600480360381019061022b91906139aa565b610762565b60405161023d91906140e1565b60405180910390f35b610260600480360381019061025b9190613a41565b610784565b60405161026d91906143f9565b60405180910390f35b61027e61079c565b60405161028b9190614117565b60405180910390f35b6102ae60048036038101906102a99190613a41565b61082e565b6040516102bb9190614036565b60405180910390f35b6102de60048036038101906102d9919061379e565b6108b3565b6040516102eb919061409d565b60405180910390f35b61030e60048036038101906103099190613909565b6109bf565b005b61032a60048036038101906103259190613a41565b610ad7565b60405161033791906143f9565b60405180910390f35b610348610aef565b60405161035591906143f9565b60405180910390f35b61037860048036038101906103739190613803565b610afc565b005b610394600480360381019061038f9190613945565b610b5c565b6040516103a191906140fc565b60405180910390f35b6103c460048036038101906103bf919061379e565b610b7c565b6040516103d191906140bf565b60405180910390f35b6103f460048036038101906103ef919061396e565b610c76565b005b610410600480360381019061040b9190613909565b610c9f565b60405161041d91906143f9565b60405180910390f35b610440600480360381019061043b919061396e565b610d44565b005b61045c60048036038101906104579190613909565b610dc7565b60405161046991906143f9565b60405180910390f35b61048c60048036038101906104879190613803565b610f5a565b005b6104a860048036038101906104a39190613a41565b610f7a565b005b6104c460048036038101906104bf9190613a41565b611028565b6040516104d191906143f9565b60405180910390f35b6104f460048036038101906104ef9190613a41565b6110bf565b6040516105019190614036565b60405180910390f35b610524600480360381019061051f919061379e565b611171565b60405161053191906143f9565b60405180910390f35b610542611229565b60405161054f9190614117565b60405180910390f35b6105606112bb565b60405161056d91906140fc565b60405180910390f35b61057e6112df565b60405161058b91906143f9565b60405180910390f35b6105ae60048036038101906105a99190613a41565b6112f5565b6040516105bb9190614117565b60405180910390f35b6105cc6113a0565b6040516105d9919061409d565b60405180910390f35b6105fc60048036038101906105f7919061396e565b6115bc565b60405161060991906140e1565b60405180910390f35b61061a611627565b6040516106279190614117565b60405180910390f35b6106386116b9565b60405161064591906140fc565b60405180910390f35b610668600480360381019061066391906138cd565b6116c0565b005b610684600480360381019061067f9190613852565b611841565b005b6106a0600480360381019061069b9190613a41565b6118a3565b6040516106ad9190614117565b60405180910390f35b6106d060048036038101906106cb919061396e565b6118b5565b005b6106ec60048036038101906106e791906139fc565b6118de565b6040516106f991906143f9565b60405180910390f35b61071c600480360381019061071791906137c7565b61199e565b60405161072991906140e1565b60405180910390f35b61074c60048036038101906107479190613a41565b611a32565b60405161075991906143f9565b60405180910390f35b600061076d82611a4f565b8061077d575061077c82611ac9565b5b9050919050565b600c6020528060005260406000206000915090505481565b6060600080546107ab9061472f565b80601f01602080910402602001604051908101604052809291908181526020018280546107d79061472f565b80156108245780601f106107f957610100808354040283529160200191610824565b820191906000526020600020905b81548152906001019060200180831161080757829003601f168201915b5050505050905090565b600061083982611b43565b610878576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161086f90614319565b60405180910390fd5b6004600083815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050919050565b606060006108c083611171565b905060008167ffffffffffffffff811115610904577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561093757816020015b60608152602001906001900390816109225790505b50905060005b828110156109b45760006109518683610c9f565b905061095c816118a3565b838381518110610995577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101819052505080806109ac90614792565b91505061093d565b508092505050919050565b60006109ca826110bf565b90508073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415610a3b576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610a3290614379565b60405180910390fd5b8073ffffffffffffffffffffffffffffffffffffffff16610a5a611baf565b73ffffffffffffffffffffffffffffffffffffffff161480610a895750610a8881610a83611baf565b61199e565b5b610ac8576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610abf90614219565b60405180910390fd5b610ad28383611bb7565b505050565b600d6020528060005260406000206000915090505481565b6000600880549050905090565b610b0d610b07611baf565b82611c70565b610b4c576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610b4390614399565b60405180910390fd5b610b57838383611d4e565b505050565b6000600b6000838152602001908152602001600020600101549050919050565b60606000610b8983611171565b905060008167ffffffffffffffff811115610bcd577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b604051908082528060200260200182016040528015610bfb5781602001602082028036833780820191505090505b50905060005b82811015610c6b57610c138582610c9f565b828281518110610c4c577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b6020026020010181815250508080610c6390614792565b915050610c01565b508092505050919050565b610c7f82610b5c565b610c9081610c8b611baf565b611faa565b610c9a8383612047565b505050565b6000610caa83611171565b8210610ceb576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ce290614159565b60405180910390fd5b600660008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002054905092915050565b610d4c611baf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff1614610db9576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610db0906143d9565b60405180910390fd5b610dc38282612128565b5050565b60007fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610dfb81610df6611baf565b611faa565b6000601160008581526020019081526020016000208054610e1b9061472f565b80601f0160208091040260200160405190810160405280929190818152602001828054610e479061472f565b8015610e945780601f10610e6957610100808354040283529160200191610e94565b820191906000526020600020905b815481529060010190602001808311610e7757829003601f168201915b505050505090506000815111610edf576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401610ed690614299565b60405180910390fd5b6000610eeb600e61220a565b9050610ef7600e612218565b8460106000838152602001908152602001600020819055506001600c60008781526020019081526020016000206000828254610f339190614530565b92505081905550610f44868261222e565b610f4e81836123fc565b80935050505092915050565b610f7583838360405180602001604052806000815250611841565b505050565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775610fac81610fa7611baf565b611faa565b6000601060008481526020019081526020016000205490506001600c60008381526020019081526020016000206000828254610fe89190614611565b925050819055506001600d600083815260200190815260200160002060008282546110139190614530565b9250508190555061102383612470565b505050565b6000611032610aef565b8210611073576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161106a906143b9565b60405180910390fd5b600882815481106110ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001549050919050565b6000806002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff169050600073ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff161415611168576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161115f90614259565b60405180910390fd5b80915050919050565b60008073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614156111e2576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016111d990614239565b60405180910390fd5b600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020549050919050565b6060601280546112389061472f565b80601f01602080910402602001604051908101604052809291908181526020018280546112649061472f565b80156112b15780601f10611286576101008083540402835291602001916112b1565b820191906000526020600020905b81548152906001019060200180831161129457829003601f168201915b5050505050905090565b7fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c2177581565b6000806112ec600f61220a565b90508091505090565b606060006011600084815260200190815260200160002080546113179061472f565b80601f01602080910402602001604051908101604052809291908181526020018280546113439061472f565b80156113905780601f1061136557610100808354040283529160200191611390565b820191906000526020600020905b81548152906001019060200180831161137357829003601f168201915b5050505050905080915050919050565b606060006113ae600f61220a565b905060008167ffffffffffffffff8111156113f2577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b60405190808252806020026020018201604052801561142557816020015b60608152602001906001900390816114105790505b509050600061143261247c565b905060005b838110156115b257600060116000838152602001908152602001600020805461145f9061472f565b80601f016020809104026020016040519081016040528092919081815260200182805461148b9061472f565b80156114d85780601f106114ad576101008083540402835291602001916114d8565b820191906000526020600020905b8154815290600101906020018083116114bb57829003601f168201915b5050505050905060008351141561152f5780848381518110611523577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101819052505b6000815111156115a057828160405160200161154c929190613fd8565b604051602081830303815290604052848381518110611594577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200260200101819052505b50806115ab90614792565b9050611437565b5081935050505090565b6000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b6060600180546116369061472f565b80601f01602080910402602001604051908101604052809291908181526020018280546116629061472f565b80156116af5780601f10611684576101008083540402835291602001916116af565b820191906000526020600020905b81548152906001019060200180831161169257829003601f168201915b5050505050905090565b6000801b81565b6116c8611baf565b73ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611736576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161172d906141d9565b60405180910390fd5b8060056000611743611baf565b73ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055508173ffffffffffffffffffffffffffffffffffffffff166117f0611baf565b73ffffffffffffffffffffffffffffffffffffffff167f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c318360405161183591906140e1565b60405180910390a35050565b61185261184c611baf565b83611c70565b611891576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161188890614399565b60405180910390fd5b61189d8484848461250e565b50505050565b60606118ae8261256a565b9050919050565b6118be82610b5c565b6118cf816118ca611baf565b611faa565b6118d98383612128565b505050565b60007fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c217756119128161190d611baf565b611faa565b60008484905011611958576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161194f906142b9565b60405180910390fd5b6000611964600f61220a565b9050611970600f612218565b8484601160008481526020019081526020016000209190611992929190613505565b50809250505092915050565b6000600560008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060009054906101000a900460ff16905092915050565b600060106000838152602001908152602001600020549050919050565b60007f780e9d63000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611ac25750611ac1826126bc565b5b9050919050565b60007f7965db0b000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff19161480611b3c5750611b3b82611a4f565b5b9050919050565b60008073ffffffffffffffffffffffffffffffffffffffff166002600084815260200190815260200160002060009054906101000a900473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1614159050919050565b600033905090565b816004600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16611c2a836110bf565b73ffffffffffffffffffffffffffffffffffffffff167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000611c7b82611b43565b611cba576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611cb1906141f9565b60405180910390fd5b6000611cc5836110bf565b90508073ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff161480611d3457508373ffffffffffffffffffffffffffffffffffffffff16611d1c8461082e565b73ffffffffffffffffffffffffffffffffffffffff16145b80611d455750611d44818561199e565b5b91505092915050565b8273ffffffffffffffffffffffffffffffffffffffff16611d6e826110bf565b73ffffffffffffffffffffffffffffffffffffffff1614611dc4576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611dbb90614339565b60405180910390fd5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415611e34576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401611e2b906141b9565b60405180910390fd5b611e3f83838361279e565b611e4a600082611bb7565b6001600360008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611e9a9190614611565b925050819055506001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254611ef19190614530565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff168473ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a4505050565b611fb482826115bc565b61204357611fd98173ffffffffffffffffffffffffffffffffffffffff1660146127ae565b611fe78360001c60206127ae565b604051602001611ff8929190613ffc565b6040516020818303038152906040526040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161203a9190614117565b60405180910390fd5b5050565b61205182826115bc565b612124576001600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506120c9611baf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b61213282826115bc565b15612206576000600b600084815260200190815260200160002060000160008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060006101000a81548160ff0219169083151502179055506121ab611baf565b73ffffffffffffffffffffffffffffffffffffffff168173ffffffffffffffffffffffffffffffffffffffff16837ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b60405160405180910390a45b5050565b600081600001549050919050565b6001816000016000828254019250508190555050565b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff16141561229e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612295906142d9565b60405180910390fd5b6122a781611b43565b156122e7576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016122de90614199565b60405180910390fd5b6122f36000838361279e565b6001600360008473ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008282546123439190614530565b92505081905550816002600083815260200190815260200160002060006101000a81548173ffffffffffffffffffffffffffffffffffffffff021916908373ffffffffffffffffffffffffffffffffffffffff160217905550808273ffffffffffffffffffffffffffffffffffffffff16600073ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b61240582611b43565b612444576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161243b90614279565b60405180910390fd5b80600a6000848152602001908152602001600020908051906020019061246b92919061358b565b505050565b61247981612aa8565b50565b60606012805461248b9061472f565b80601f01602080910402602001604051908101604052809291908181526020018280546124b79061472f565b80156125045780601f106124d957610100808354040283529160200191612504565b820191906000526020600020905b8154815290600101906020018083116124e757829003601f168201915b5050505050905090565b612519848484611d4e565b61252584848484612afb565b612564576040517f08c379a000000000000000000000000000000000000000000000000000000000815260040161255b90614179565b60405180910390fd5b50505050565b606061257582611b43565b6125b4576040517f08c379a00000000000000000000000000000000000000000000000000000000081526004016125ab906142f9565b60405180910390fd5b6000600a600084815260200190815260200160002080546125d49061472f565b80601f01602080910402602001604051908101604052809291908181526020018280546126009061472f565b801561264d5780601f106126225761010080835404028352916020019161264d565b820191906000526020600020905b81548152906001019060200180831161263057829003601f168201915b50505050509050600061265e61247c565b90506000815114156126745781925050506126b7565b6000825111156126a9578082604051602001612691929190613fd8565b604051602081830303815290604052925050506126b7565b6126b284612c92565b925050505b919050565b60007f80ac58cd000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916148061278757507f5b5e139f000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916145b80612797575061279682612d39565b5b9050919050565b6127a9838383612da3565b505050565b6060600060028360026127c191906145b7565b6127cb9190614530565b67ffffffffffffffff81111561280a577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f19166020018201604052801561283c5781602001600182028036833780820191505090505b5090507f30000000000000000000000000000000000000000000000000000000000000008160008151811061289a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053507f780000000000000000000000000000000000000000000000000000000000000081600181518110612924577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a9053506000600184600261296491906145b7565b61296e9190614530565b90505b6001811115612a5a577f3031323334353637383961626364656600000000000000000000000000000000600f8616601081106129d6577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b1a60f81b828281518110612a13577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600485901c945080612a5390614705565b9050612971565b5060008414612a9e576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612a9590614139565b60405180910390fd5b8091505092915050565b612ab181612eb7565b6000600a60008381526020019081526020016000208054612ad19061472f565b905014612af857600a60008281526020019081526020016000206000612af79190613611565b5b50565b6000612b1c8473ffffffffffffffffffffffffffffffffffffffff16612fc8565b15612c85578373ffffffffffffffffffffffffffffffffffffffff1663150b7a02612b45611baf565b8786866040518563ffffffff1660e01b8152600401612b679493929190614051565b602060405180830381600087803b158015612b8157600080fd5b505af1925050508015612bb257506040513d601f19601f82011682018060405250810190612baf91906139d3565b60015b612c35573d8060008114612be2576040519150601f19603f3d011682016040523d82523d6000602084013e612be7565b606091505b50600081511415612c2d576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612c2490614179565b60405180910390fd5b805181602001fd5b63150b7a0260e01b7bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916817bffffffffffffffffffffffffffffffffffffffffffffffffffffffff191614915050612c8a565b600190505b949350505050565b6060612c9d82611b43565b612cdc576040517f08c379a0000000000000000000000000000000000000000000000000000000008152600401612cd390614359565b60405180910390fd5b6000612ce661247c565b90506000815111612d065760405180602001604052806000815250612d31565b80612d1084612fdb565b604051602001612d21929190613fd8565b6040516020818303038152906040525b915050919050565b60007f01ffc9a7000000000000000000000000000000000000000000000000000000007bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916827bffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916149050919050565b612dae838383613188565b600073ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff161415612df157612dec8161318d565b612e30565b8173ffffffffffffffffffffffffffffffffffffffff168373ffffffffffffffffffffffffffffffffffffffff1614612e2f57612e2e83826131d6565b5b5b600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff161415612e7357612e6e81613343565b612eb2565b8273ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff1614612eb157612eb08282613486565b5b5b505050565b6000612ec2826110bf565b9050612ed08160008461279e565b612edb600083611bb7565b6001600360008373ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff1681526020019081526020016000206000828254612f2b9190614611565b925050819055506002600083815260200190815260200160002060006101000a81549073ffffffffffffffffffffffffffffffffffffffff021916905581600073ffffffffffffffffffffffffffffffffffffffff168273ffffffffffffffffffffffffffffffffffffffff167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a45050565b600080823b905060008111915050919050565b60606000821415613023576040518060400160405280600181526020017f30000000000000000000000000000000000000000000000000000000000000008152509050613183565b600082905060005b6000821461305557808061303e90614792565b915050600a8261304e9190614586565b915061302b565b60008167ffffffffffffffff811115613097577f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6040519080825280601f01601f1916602001820160405280156130c95781602001600182028036833780820191505090505b5090505b6000851461317c576001826130e29190614611565b9150600a856130f191906147db565b60306130fd9190614530565b60f81b818381518110613139577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b60200101907effffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff1916908160001a905350600a856131759190614586565b94506130cd565b8093505050505b919050565b505050565b6008805490506009600083815260200190815260200160002081905550600881908060018154018082558091505060019003906000526020600020016000909190919091505550565b600060016131e384611171565b6131ed9190614611565b90506000600760008481526020019081526020016000205490508181146132d2576000600660008673ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002054905080600660008773ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600084815260200190815260200160002081905550816007600083815260200190815260200160002081905550505b6007600084815260200190815260200160002060009055600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff16815260200190815260200160002060008381526020019081526020016000206000905550505050565b600060016008805490506133579190614611565b90506000600960008481526020019081526020016000205490506000600883815481106133ad577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b9060005260206000200154905080600883815481106133f5577f4e487b7100000000000000000000000000000000000000000000000000000000600052603260045260246000fd5b90600052602060002001819055508160096000838152602001908152602001600020819055506009600085815260200190815260200160002060009055600880548061346a577f4e487b7100000000000000000000000000000000000000000000000000000000600052603160045260246000fd5b6001900381819060005260206000200160009055905550505050565b600061349183611171565b905081600660008573ffffffffffffffffffffffffffffffffffffffff1673ffffffffffffffffffffffffffffffffffffffff168152602001908152602001600020600083815260200190815260200160002081905550806007600084815260200190815260200160002081905550505050565b8280546135119061472f565b90600052602060002090601f016020900481019282613533576000855561357a565b82601f1061354c57803560ff191683800117855561357a565b8280016001018555821561357a579182015b8281111561357957823582559160200191906001019061355e565b5b5090506135879190613651565b5090565b8280546135979061472f565b90600052602060002090601f0160209004810192826135b95760008555613600565b82601f106135d257805160ff1916838001178555613600565b82800160010185558215613600579182015b828111156135ff5782518255916020019190600101906135e4565b5b50905061360d9190613651565b5090565b50805461361d9061472f565b6000825580601f1061362f575061364e565b601f01602090049060005260206000209081019061364d9190613651565b5b50565b5b8082111561366a576000816000905550600101613652565b5090565b600061368161367c84614439565b614414565b90508281526020810184848401111561369957600080fd5b6136a48482856146c3565b509392505050565b6000813590506136bb81614f11565b92915050565b6000813590506136d081614f28565b92915050565b6000813590506136e581614f3f565b92915050565b6000813590506136fa81614f56565b92915050565b60008151905061370f81614f56565b92915050565b600082601f83011261372657600080fd5b813561373684826020860161366e565b91505092915050565b60008083601f84011261375157600080fd5b8235905067ffffffffffffffff81111561376a57600080fd5b60208301915083600182028301111561378257600080fd5b9250929050565b60008135905061379881614f6d565b92915050565b6000602082840312156137b057600080fd5b60006137be848285016136ac565b91505092915050565b600080604083850312156137da57600080fd5b60006137e8858286016136ac565b92505060206137f9858286016136ac565b9150509250929050565b60008060006060848603121561381857600080fd5b6000613826868287016136ac565b9350506020613837868287016136ac565b925050604061384886828701613789565b9150509250925092565b6000806000806080858703121561386857600080fd5b6000613876878288016136ac565b9450506020613887878288016136ac565b935050604061389887828801613789565b925050606085013567ffffffffffffffff8111156138b557600080fd5b6138c187828801613715565b91505092959194509250565b600080604083850312156138e057600080fd5b60006138ee858286016136ac565b92505060206138ff858286016136c1565b9150509250929050565b6000806040838503121561391c57600080fd5b600061392a858286016136ac565b925050602061393b85828601613789565b9150509250929050565b60006020828403121561395757600080fd5b6000613965848285016136d6565b91505092915050565b6000806040838503121561398157600080fd5b600061398f858286016136d6565b92505060206139a0858286016136ac565b9150509250929050565b6000602082840312156139bc57600080fd5b60006139ca848285016136eb565b91505092915050565b6000602082840312156139e557600080fd5b60006139f384828501613700565b91505092915050565b60008060208385031215613a0f57600080fd5b600083013567ffffffffffffffff811115613a2957600080fd5b613a358582860161373f565b92509250509250929050565b600060208284031215613a5357600080fd5b6000613a6184828501613789565b91505092915050565b6000613a768383613bcf565b905092915050565b6000613a8a8383613fba565b60208301905092915050565b613a9f81614645565b82525050565b6000613ab08261448a565b613aba81856144d0565b935083602082028501613acc8561446a565b8060005b85811015613b085784840389528151613ae98582613a6a565b9450613af4836144b6565b925060208a01995050600181019050613ad0565b50829750879550505050505092915050565b6000613b2582614495565b613b2f81856144e1565b9350613b3a8361447a565b8060005b83811015613b6b578151613b528882613a7e565b9750613b5d836144c3565b925050600181019050613b3e565b5085935050505092915050565b613b8181614657565b82525050565b613b9081614663565b82525050565b6000613ba1826144a0565b613bab81856144f2565b9350613bbb8185602086016146d2565b613bc4816148c8565b840191505092915050565b6000613bda826144ab565b613be48185614503565b9350613bf48185602086016146d2565b613bfd816148c8565b840191505092915050565b6000613c13826144ab565b613c1d8185614514565b9350613c2d8185602086016146d2565b613c36816148c8565b840191505092915050565b6000613c4c826144ab565b613c568185614525565b9350613c668185602086016146d2565b80840191505092915050565b6000613c7f602083614514565b9150613c8a826148d9565b602082019050919050565b6000613ca2602b83614514565b9150613cad82614902565b604082019050919050565b6000613cc5603283614514565b9150613cd082614951565b604082019050919050565b6000613ce8601c83614514565b9150613cf3826149a0565b602082019050919050565b6000613d0b602483614514565b9150613d16826149c9565b604082019050919050565b6000613d2e601983614514565b9150613d3982614a18565b602082019050919050565b6000613d51602c83614514565b9150613d5c82614a41565b604082019050919050565b6000613d74603883614514565b9150613d7f82614a90565b604082019050919050565b6000613d97602a83614514565b9150613da282614adf565b604082019050919050565b6000613dba602983614514565b9150613dc582614b2e565b604082019050919050565b6000613ddd602e83614514565b9150613de882614b7d565b604082019050919050565b6000613e00601183614514565b9150613e0b82614bcc565b602082019050919050565b6000613e23601983614514565b9150613e2e82614bf5565b602082019050919050565b6000613e46602083614514565b9150613e5182614c1e565b602082019050919050565b6000613e69603183614514565b9150613e7482614c47565b604082019050919050565b6000613e8c602c83614514565b9150613e9782614c96565b604082019050919050565b6000613eaf602983614514565b9150613eba82614ce5565b604082019050919050565b6000613ed2602f83614514565b9150613edd82614d34565b604082019050919050565b6000613ef5602183614514565b9150613f0082614d83565b604082019050919050565b6000613f18603183614514565b9150613f2382614dd2565b604082019050919050565b6000613f3b602c83614514565b9150613f4682614e21565b604082019050919050565b6000613f5e601783614525565b9150613f6982614e70565b601782019050919050565b6000613f81601183614525565b9150613f8c82614e99565b601182019050919050565b6000613fa4602f83614514565b9150613faf82614ec2565b604082019050919050565b613fc3816146b9565b82525050565b613fd2816146b9565b82525050565b6000613fe48285613c41565b9150613ff08284613c41565b91508190509392505050565b600061400782613f51565b91506140138285613c41565b915061401e82613f74565b915061402a8284613c41565b91508190509392505050565b600060208201905061404b6000830184613a96565b92915050565b60006080820190506140666000830187613a96565b6140736020830186613a96565b6140806040830185613fc9565b81810360608301526140928184613b96565b905095945050505050565b600060208201905081810360008301526140b78184613aa5565b905092915050565b600060208201905081810360008301526140d98184613b1a565b905092915050565b60006020820190506140f66000830184613b78565b92915050565b60006020820190506141116000830184613b87565b92915050565b600060208201905081810360008301526141318184613c08565b905092915050565b6000602082019050818103600083015261415281613c72565b9050919050565b6000602082019050818103600083015261417281613c95565b9050919050565b6000602082019050818103600083015261419281613cb8565b9050919050565b600060208201905081810360008301526141b281613cdb565b9050919050565b600060208201905081810360008301526141d281613cfe565b9050919050565b600060208201905081810360008301526141f281613d21565b9050919050565b6000602082019050818103600083015261421281613d44565b9050919050565b6000602082019050818103600083015261423281613d67565b9050919050565b6000602082019050818103600083015261425281613d8a565b9050919050565b6000602082019050818103600083015261427281613dad565b9050919050565b6000602082019050818103600083015261429281613dd0565b9050919050565b600060208201905081810360008301526142b281613df3565b9050919050565b600060208201905081810360008301526142d281613e16565b9050919050565b600060208201905081810360008301526142f281613e39565b9050919050565b6000602082019050818103600083015261431281613e5c565b9050919050565b6000602082019050818103600083015261433281613e7f565b9050919050565b6000602082019050818103600083015261435281613ea2565b9050919050565b6000602082019050818103600083015261437281613ec5565b9050919050565b6000602082019050818103600083015261439281613ee8565b9050919050565b600060208201905081810360008301526143b281613f0b565b9050919050565b600060208201905081810360008301526143d281613f2e565b9050919050565b600060208201905081810360008301526143f281613f97565b9050919050565b600060208201905061440e6000830184613fc9565b92915050565b600061441e61442f565b905061442a8282614761565b919050565b6000604051905090565b600067ffffffffffffffff82111561445457614453614899565b5b61445d826148c8565b9050602081019050919050565b6000819050602082019050919050565b6000819050602082019050919050565b600081519050919050565b600081519050919050565b600081519050919050565b600081519050919050565b6000602082019050919050565b6000602082019050919050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600082825260208201905092915050565b600081905092915050565b600061453b826146b9565b9150614546836146b9565b9250827fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff0382111561457b5761457a61480c565b5b828201905092915050565b6000614591826146b9565b915061459c836146b9565b9250826145ac576145ab61483b565b5b828204905092915050565b60006145c2826146b9565b91506145cd836146b9565b9250817fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff04831182151516156146065761460561480c565b5b828202905092915050565b600061461c826146b9565b9150614627836146b9565b92508282101561463a5761463961480c565b5b828203905092915050565b600061465082614699565b9050919050565b60008115159050919050565b6000819050919050565b60007fffffffff0000000000000000000000000000000000000000000000000000000082169050919050565b600073ffffffffffffffffffffffffffffffffffffffff82169050919050565b6000819050919050565b82818337600083830152505050565b60005b838110156146f05780820151818401526020810190506146d5565b838111156146ff576000848401525b50505050565b6000614710826146b9565b915060008214156147245761472361480c565b5b600182039050919050565b6000600282049050600182168061474757607f821691505b6020821081141561475b5761475a61486a565b5b50919050565b61476a826148c8565b810181811067ffffffffffffffff8211171561478957614788614899565b5b80604052505050565b600061479d826146b9565b91507fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff8214156147d0576147cf61480c565b5b600182019050919050565b60006147e6826146b9565b91506147f1836146b9565b9250826148015761480061483b565b5b828206905092915050565b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601160045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052601260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052602260045260246000fd5b7f4e487b7100000000000000000000000000000000000000000000000000000000600052604160045260246000fd5b6000601f19601f8301169050919050565b7f537472696e67733a20686578206c656e67746820696e73756666696369656e74600082015250565b7f455243373231456e756d657261626c653a206f776e657220696e646578206f7560008201527f74206f6620626f756e6473000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560008201527f63656976657220696d706c656d656e7465720000000000000000000000000000602082015250565b7f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000600082015250565b7f4552433732313a207472616e7366657220746f20746865207a65726f2061646460008201527f7265737300000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f766520746f2063616c6c657200000000000000600082015250565b7f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760008201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000602082015250565b7f4552433732313a2062616c616e636520717565727920666f7220746865207a6560008201527f726f206164647265737300000000000000000000000000000000000000000000602082015250565b7f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460008201527f656e7420746f6b656e0000000000000000000000000000000000000000000000602082015250565b7f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60008201527f6578697374656e7420746f6b656e000000000000000000000000000000000000602082015250565b7f6e6f6e6578697374656e74204e46544964000000000000000000000000000000600082015250565b7f746f6b656e5552492063616e206e6f7420626520656d70747900000000000000600082015250565b7f4552433732313a206d696e7420746f20746865207a65726f2061646472657373600082015250565b7f45524337323155524953746f726167653a2055524920717565727920666f722060008201527f6e6f6e6578697374656e7420746f6b656e000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860008201527f697374656e7420746f6b656e0000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e73666572206f6620746f6b656e2074686174206960008201527f73206e6f74206f776e0000000000000000000000000000000000000000000000602082015250565b7f4552433732314d657461646174613a2055524920717565727920666f72206e6f60008201527f6e6578697374656e7420746f6b656e0000000000000000000000000000000000602082015250565b7f4552433732313a20617070726f76616c20746f2063757272656e74206f776e6560008201527f7200000000000000000000000000000000000000000000000000000000000000602082015250565b7f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f60008201527f776e6572206e6f7220617070726f766564000000000000000000000000000000602082015250565b7f455243373231456e756d657261626c653a20676c6f62616c20696e646578206f60008201527f7574206f6620626f756e64730000000000000000000000000000000000000000602082015250565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000600082015250565b7f206973206d697373696e6720726f6c6520000000000000000000000000000000600082015250565b7f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560008201527f20726f6c657320666f722073656c660000000000000000000000000000000000602082015250565b614f1a81614645565b8114614f2557600080fd5b50565b614f3181614657565b8114614f3c57600080fd5b50565b614f4881614663565b8114614f5357600080fd5b50565b614f5f8161466d565b8114614f6a57600080fd5b50565b614f76816146b9565b8114614f8157600080fd5b5056fea264697066735822122050febd0f3d7876f0610d054a0822005fec6cd12125285236884b3d2702579d9064736f6c63430008040033
Constructor Arguments (ABI-Encoded and is the last bytes of the Contract Creation Code above)
00000000000000000000000000000000000000000000000000000000000000200000000000000000000000000000000000000000000000000000000000000000
-----Decoded View---------------
Arg [0] : _bURI (string):
-----Encoded View---------------
2 Constructor Arguments found :
Arg [0] : 0000000000000000000000000000000000000000000000000000000000000020
Arg [1] : 0000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode Sourcemap
52735:5808:0:-:0;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;58073:245;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;52907:43;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32504:100;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34063:221;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55458:398;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;33586:411;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;53008:47;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;45248:113;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34953:339;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;27090:123;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;55931:350;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27475:147;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;44916:256;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;28523:218;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56759:499;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;35363:185;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;57339:226;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;45438:233;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32198:239;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;31928:208;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53880:102;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;53505:60;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54467:129;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54238:159;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54655:727;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;25975:139;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;32673:104;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;23953:49;;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34356:295;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;35619:328;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;58372:166;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;27867:149;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;56368:313;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;34722:164;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;54055:117;;;;;;;;;;;;;:::i;:::-;;:::i;:::-;;;;;;;:::i;:::-;;;;;;;;58073:245;58191:4;58215:47;58250:11;58215:34;:47::i;:::-;:95;;;;58266:44;58298:11;58266:31;:44::i;:::-;58215:95;58208:102;;58073:245;;;:::o;52907:43::-;;;;;;;;;;;;;;;;;:::o;32504:100::-;32558:13;32591:5;32584:12;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32504:100;:::o;34063:221::-;34139:7;34167:16;34175:7;34167;:16::i;:::-;34159:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;34252:15;:24;34268:7;34252:24;;;;;;;;;;;;;;;;;;;;;34245:31;;34063:221;;;:::o;55458:398::-;55530:15;55558:13;55574:23;55591:5;55574:16;:23::i;:::-;55558:39;;55618:20;55654:5;55641:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55618:42;;55678:9;55673:152;55697:5;55693:1;:9;55673:152;;;55724:15;55742:29;55762:5;55769:1;55742:19;:29::i;:::-;55724:47;;55796:17;55805:7;55796:8;:17::i;:::-;55786:4;55791:1;55786:7;;;;;;;;;;;;;;;;;;;;;:27;;;;55673:152;55704:3;;;;;:::i;:::-;;;;55673:152;;;;55844:4;55837:11;;;;55458:398;;;:::o;33586:411::-;33667:13;33683:23;33698:7;33683:14;:23::i;:::-;33667:39;;33731:5;33725:11;;:2;:11;;;;33717:57;;;;;;;;;;;;:::i;:::-;;;;;;;;;33825:5;33809:21;;:12;:10;:12::i;:::-;:21;;;:62;;;;33834:37;33851:5;33858:12;:10;:12::i;:::-;33834:16;:37::i;:::-;33809:62;33787:168;;;;;;;;;;;;:::i;:::-;;;;;;;;;33968:21;33977:2;33981:7;33968:8;:21::i;:::-;33586:411;;;:::o;53008:47::-;;;;;;;;;;;;;;;;;:::o;45248:113::-;45309:7;45336:10;:17;;;;45329:24;;45248:113;:::o;34953:339::-;35148:41;35167:12;:10;:12::i;:::-;35181:7;35148:18;:41::i;:::-;35140:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35256:28;35266:4;35272:2;35276:7;35256:9;:28::i;:::-;34953:339;;;:::o;27090:123::-;27156:7;27183:6;:12;27190:4;27183:12;;;;;;;;;;;:22;;;27176:29;;27090:123;;;:::o;55931:350::-;56002:16;56031:13;56047:23;56064:5;56047:16;:23::i;:::-;56031:39;;56091:21;56129:5;56115:20;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56091:44;;56153:9;56148:102;56172:5;56168:1;:9;56148:102;;;56209:29;56229:5;56236:1;56209:19;:29::i;:::-;56199:4;56204:1;56199:7;;;;;;;;;;;;;;;;;;;;;:39;;;;;56179:3;;;;;:::i;:::-;;;;56148:102;;;;56269:4;56262:11;;;;55931:350;;;:::o;27475:147::-;27558:18;27571:4;27558:12;:18::i;:::-;25557:30;25568:4;25574:12;:10;:12::i;:::-;25557:10;:30::i;:::-;27589:25:::1;27600:4;27606:7;27589:10;:25::i;:::-;27475:147:::0;;;:::o;44916:256::-;45013:7;45049:23;45066:5;45049:16;:23::i;:::-;45041:5;:31;45033:87;;;;;;;;;;;;:::i;:::-;;;;;;;;;45138:12;:19;45151:5;45138:19;;;;;;;;;;;;;;;:26;45158:5;45138:26;;;;;;;;;;;;45131:33;;44916:256;;;;:::o;28523:218::-;28630:12;:10;:12::i;:::-;28619:23;;:7;:23;;;28611:83;;;;;;;;;;;;:::i;:::-;;;;;;;;;28707:26;28719:4;28725:7;28707:11;:26::i;:::-;28523:218;;:::o;56759:499::-;56864:7;53542:23;25557:30;25568:4;25574:12;:10;:12::i;:::-;25557:10;:30::i;:::-;56884:17:::1;56904:11;:18;56916:5;56904:18;;;;;;;;;;;56884:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;56961:1;56947:3;56941:17;:21;56933:51;;;;;;;;;;;;:::i;:::-;;;;;;;;;56995:18;57016:22;:12;:20;:22::i;:::-;56995:43;;57049:24;:12;:22;:24::i;:::-;57114:5;57084:15;:27;57100:10;57084:27;;;;;;;;;;;:35;;;;57149:1;57130:8;:15;57139:5;57130:15;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;57161:21;57167:2;57171:10;57161:5;:21::i;:::-;57193:29;57206:10;57218:3;57193:12;:29::i;:::-;57240:10;57233:17;;;;56759:499:::0;;;;;:::o;35363:185::-;35501:39;35518:4;35524:2;35528:7;35501:39;;;;;;;;;;;;:16;:39::i;:::-;35363:185;;;:::o;57339:226::-;53542:23;25557:30;25568:4;25574:12;:10;:12::i;:::-;25557:10;:30::i;:::-;57411:18:::1;57432:15;:24;57448:7;57432:24;;;;;;;;;;;;57411:45;;57491:1;57467:8;:20;57476:10;57467:20;;;;;;;;;;;;:25;;;;;;;:::i;:::-;;;;;;;;57531:1;57503:12;:24;57516:10;57503:24;;;;;;;;;;;;:29;;;;;;;:::i;:::-;;;;;;;;57543:14;57549:7;57543:5;:14::i;:::-;25598:1;57339:226:::0;;:::o;45438:233::-;45513:7;45549:30;:28;:30::i;:::-;45541:5;:38;45533:95;;;;;;;;;;;;:::i;:::-;;;;;;;;;45646:10;45657:5;45646:17;;;;;;;;;;;;;;;;;;;;;;;;45639:24;;45438:233;;;:::o;32198:239::-;32270:7;32290:13;32306:7;:16;32314:7;32306:16;;;;;;;;;;;;;;;;;;;;;32290:32;;32358:1;32341:19;;:5;:19;;;;32333:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;32424:5;32417:12;;;32198:239;;;:::o;31928:208::-;32000:7;32045:1;32028:19;;:5;:19;;;;32020:74;;;;;;;;;;;;:::i;:::-;;;;;;;;;32112:9;:16;32122:5;32112:16;;;;;;;;;;;;;;;;32105:23;;31928:208;;;:::o;53880:102::-;53925:13;53958:16;53951:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53880:102;:::o;53505:60::-;53542:23;53505:60;:::o;54467:129::-;54515:7;54532:13;54548:20;:10;:18;:20::i;:::-;54532:36;;54583:5;54576:12;;;54467:129;:::o;54238:159::-;54304:13;54330:17;54350:11;:18;54362:5;54350:18;;;;;;;;;;;54330:38;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54386:3;54379:10;;;54238:159;;;:::o;54655:727::-;54705:15;54730:13;54746:20;:10;:18;:20::i;:::-;54730:36;;54781:20;54817:5;54804:19;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;54781:42;;54831:18;54852:10;:8;:10::i;:::-;54831:31;;54880:9;54875:468;54899:5;54895:1;:9;54875:468;;;54926:17;54946:11;:14;54958:1;54946:14;;;;;;;;;;;54926:34;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;55064:1;55048:4;55042:18;:23;55038:77;;;55096:3;55086:4;55091:1;55086:7;;;;;;;;;;;;;;;;;;;;;:13;;;;55038:77;55249:1;55235:3;55229:17;:21;55225:107;;;55305:4;55311:3;55288:27;;;;;;;;;:::i;:::-;;;;;;;;;;;;;55271:4;55276:1;55271:7;;;;;;;;;;;;;;;;;;;;;:45;;;;55225:107;54875:468;54906:3;;;;:::i;:::-;;;54875:468;;;;55370:4;55363:11;;;;;54655:727;:::o;25975:139::-;26053:4;26077:6;:12;26084:4;26077:12;;;;;;;;;;;:20;;:29;26098:7;26077:29;;;;;;;;;;;;;;;;;;;;;;;;;26070:36;;25975:139;;;;:::o;32673:104::-;32729:13;32762:7;32755:14;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;32673:104;:::o;23953:49::-;23998:4;23953:49;;;:::o;34356:295::-;34471:12;:10;:12::i;:::-;34459:24;;:8;:24;;;;34451:62;;;;;;;;;;;;:::i;:::-;;;;;;;;;34571:8;34526:18;:32;34545:12;:10;:12::i;:::-;34526:32;;;;;;;;;;;;;;;:42;34559:8;34526:42;;;;;;;;;;;;;;;;:53;;;;;;;;;;;;;;;;;;34624:8;34595:48;;34610:12;:10;:12::i;:::-;34595:48;;;34634:8;34595:48;;;;;;:::i;:::-;;;;;;;;34356:295;;:::o;35619:328::-;35794:41;35813:12;:10;:12::i;:::-;35827:7;35794:18;:41::i;:::-;35786:103;;;;;;;;;;;;:::i;:::-;;;;;;;;;35900:39;35914:4;35920:2;35924:7;35933:5;35900:13;:39::i;:::-;35619:328;;;;:::o;58372:166::-;58463:13;58496:34;58522:7;58496:25;:34::i;:::-;58489:41;;58372:166;;;:::o;27867:149::-;27951:18;27964:4;27951:12;:18::i;:::-;25557:30;25568:4;25574:12;:10;:12::i;:::-;25557:10;:30::i;:::-;27982:26:::1;27994:4;28000:7;27982:11;:26::i;:::-;27867:149:::0;;;:::o;56368:313::-;56447:7;53542:23;25557:30;25568:4;25574:12;:10;:12::i;:::-;25557:10;:30::i;:::-;56495:1:::1;56481:3;;56475:17;;:21;56467:59;;;;;;;;;;;;:::i;:::-;;;;;;;;;56537:16;56556:20;:10;:18;:20::i;:::-;56537:39;;56587:22;:10;:20;:22::i;:::-;56644:3;;56620:11;:21;56632:8;56620:21;;;;;;;;;;;:27;;;;;;;:::i;:::-;;56665:8;56658:15;;;56368:313:::0;;;;;:::o;34722:164::-;34819:4;34843:18;:25;34862:5;34843:25;;;;;;;;;;;;;;;:35;34869:8;34843:35;;;;;;;;;;;;;;;;;;;;;;;;;34836:42;;34722:164;;;;:::o;54055:117::-;54113:7;54140:15;:24;54156:7;54140:24;;;;;;;;;;;;54133:31;;54055:117;;;:::o;44608:224::-;44710:4;44749:35;44734:50;;;:11;:50;;;;:90;;;;44788:36;44812:11;44788:23;:36::i;:::-;44734:90;44727:97;;44608:224;;;:::o;25679:204::-;25764:4;25803:32;25788:47;;;:11;:47;;;;:87;;;;25839:36;25863:11;25839:23;:36::i;:::-;25788:87;25781:94;;25679:204;;;:::o;37457:127::-;37522:4;37574:1;37546:30;;:7;:16;37554:7;37546:16;;;;;;;;;;;;;;;;;;;;;:30;;;;37539:37;;37457:127;;;:::o;620:98::-;673:7;700:10;693:17;;620:98;:::o;41439:174::-;41541:2;41514:15;:24;41530:7;41514:24;;;;;;;;;;;;:29;;;;;;;;;;;;;;;;;;41597:7;41593:2;41559:46;;41568:23;41583:7;41568:14;:23::i;:::-;41559:46;;;;;;;;;;;;41439:174;;:::o;37751:348::-;37844:4;37869:16;37877:7;37869;:16::i;:::-;37861:73;;;;;;;;;;;;:::i;:::-;;;;;;;;;37945:13;37961:23;37976:7;37961:14;:23::i;:::-;37945:39;;38014:5;38003:16;;:7;:16;;;:51;;;;38047:7;38023:31;;:20;38035:7;38023:11;:20::i;:::-;:31;;;38003:51;:87;;;;38058:32;38075:5;38082:7;38058:16;:32::i;:::-;38003:87;37995:96;;;37751:348;;;;:::o;40743:578::-;40902:4;40875:31;;:23;40890:7;40875:14;:23::i;:::-;:31;;;40867:85;;;;;;;;;;;;:::i;:::-;;;;;;;;;40985:1;40971:16;;:2;:16;;;;40963:65;;;;;;;;;;;;:::i;:::-;;;;;;;;;41041:39;41062:4;41068:2;41072:7;41041:20;:39::i;:::-;41145:29;41162:1;41166:7;41145:8;:29::i;:::-;41206:1;41187:9;:15;41197:4;41187:15;;;;;;;;;;;;;;;;:20;;;;;;;:::i;:::-;;;;;;;;41235:1;41218:9;:13;41228:2;41218:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;41266:2;41247:7;:16;41255:7;41247:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;41305:7;41301:2;41286:27;;41295:4;41286:27;;;;;;;;;;;;40743:578;;;:::o;26404:497::-;26485:22;26493:4;26499:7;26485;:22::i;:::-;26480:414;;26673:41;26701:7;26673:41;;26711:2;26673:19;:41::i;:::-;26787:38;26815:4;26807:13;;26822:2;26787:19;:38::i;:::-;26578:270;;;;;;;;;:::i;:::-;;;;;;;;;;;;;26524:358;;;;;;;;;;;:::i;:::-;;;;;;;;26480:414;26404:497;;:::o;29771:229::-;29846:22;29854:4;29860:7;29846;:22::i;:::-;29841:152;;29917:4;29885:6;:12;29892:4;29885:12;;;;;;;;;;;:20;;:29;29906:7;29885:29;;;;;;;;;;;;;;;;:36;;;;;;;;;;;;;;;;;;29968:12;:10;:12::i;:::-;29941:40;;29959:7;29941:40;;29953:4;29941:40;;;;;;;;;;29841:152;29771:229;;:::o;30008:230::-;30083:22;30091:4;30097:7;30083;:22::i;:::-;30079:152;;;30154:5;30122:6;:12;30129:4;30122:12;;;;;;;;;;;:20;;:29;30143:7;30122:29;;;;;;;;;;;;;;;;:37;;;;;;;;;;;;;;;;;;30206:12;:10;:12::i;:::-;30179:40;;30197:7;30179:40;;30191:4;30179:40;;;;;;;;;;30079:152;30008:230;;:::o;1781:114::-;1846:7;1873;:14;;;1866:21;;1781:114;;;:::o;1903:127::-;2010:1;1992:7;:14;;;:19;;;;;;;;;;;1903:127;:::o;39435:382::-;39529:1;39515:16;;:2;:16;;;;39507:61;;;;;;;;;;;;:::i;:::-;;;;;;;;;39588:16;39596:7;39588;:16::i;:::-;39587:17;39579:58;;;;;;;;;;;;:::i;:::-;;;;;;;;;39650:45;39679:1;39683:2;39687:7;39650:20;:45::i;:::-;39725:1;39708:9;:13;39718:2;39708:13;;;;;;;;;;;;;;;;:18;;;;;;;:::i;:::-;;;;;;;;39756:2;39737:7;:16;39745:7;39737:16;;;;;;;;;;;;:21;;;;;;;;;;;;;;;;;;39801:7;39797:2;39776:33;;39793:1;39776:33;;;;;;;;;;;;39435:382;;:::o;52015:217::-;52115:16;52123:7;52115;:16::i;:::-;52107:75;;;;;;;;;;;;:::i;:::-;;;;;;;;;52215:9;52193:10;:19;52204:7;52193:19;;;;;;;;;;;:31;;;;;;;;;;;;:::i;:::-;;52015:217;;:::o;57896:127::-;57984:31;58007:7;57984:22;:31::i;:::-;57896:127;:::o;53751:117::-;53811:13;53844:16;53837:23;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;53751:117;:::o;36829:315::-;36986:28;36996:4;37002:2;37006:7;36986:9;:28::i;:::-;37033:48;37056:4;37062:2;37066:7;37075:5;37033:22;:48::i;:::-;37025:111;;;;;;;;;;;;:::i;:::-;;;;;;;;;36829:315;;;;:::o;51180:679::-;51253:13;51287:16;51295:7;51287;:16::i;:::-;51279:78;;;;;;;;;;;;:::i;:::-;;;;;;;;;51370:23;51396:10;:19;51407:7;51396:19;;;;;;;;;;;51370:45;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;51426:18;51447:10;:8;:10::i;:::-;51426:31;;51555:1;51539:4;51533:18;:23;51529:72;;;51580:9;51573:16;;;;;;51529:72;51731:1;51711:9;51705:23;:27;51701:108;;;51780:4;51786:9;51763:33;;;;;;;;;:::i;:::-;;;;;;;;;;;;;51749:48;;;;;;51701:108;51828:23;51843:7;51828:14;:23::i;:::-;51821:30;;;;51180:679;;;;:::o;31559:305::-;31661:4;31713:25;31698:40;;;:11;:40;;;;:105;;;;31770:33;31755:48;;;:11;:48;;;;31698:105;:158;;;;31820:36;31844:11;31820:23;:36::i;:::-;31698:158;31678:178;;31559:305;;;:::o;57615:227::-;57778:56;57816:4;57822:2;57826:7;57778:37;:56::i;:::-;57615:227;;;:::o;21118:448::-;21193:13;21219:19;21264:1;21255:6;21251:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;21241:25;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;21219:47;;21277:15;:6;21284:1;21277:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;21303;:6;21310:1;21303:9;;;;;;;;;;;;;;;;;;;:15;;;;;;;;;;;21334:9;21359:1;21350:6;21346:1;:10;;;;:::i;:::-;:14;;;;:::i;:::-;21334:26;;21329:132;21366:1;21362;:5;21329:132;;;21401:9;21419:3;21411:5;:11;21401:22;;;;;;;;;;;;;;;;;;21389:6;21396:1;21389:9;;;;;;;;;;;;;;;;;;;:34;;;;;;;;;;;21448:1;21438:11;;;;;21369:3;;;;:::i;:::-;;;21329:132;;;;21488:1;21479:5;:10;21471:55;;;;;;;;;;;;:::i;:::-;;;;;;;;;21551:6;21537:21;;;21118:448;;;;:::o;52461:206::-;52530:20;52542:7;52530:11;:20::i;:::-;52604:1;52573:10;:19;52584:7;52573:19;;;;;;;;;;;52567:33;;;;;:::i;:::-;;;:38;52563:97;;52629:10;:19;52640:7;52629:19;;;;;;;;;;;;52622:26;;;;:::i;:::-;52563:97;52461:206;:::o;42178:803::-;42333:4;42354:15;:2;:13;;;:15::i;:::-;42350:624;;;42406:2;42390:36;;;42427:12;:10;:12::i;:::-;42441:4;42447:7;42456:5;42390:72;;;;;;;;;;;;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;42386:533;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;42653:1;42636:6;:13;:18;42632:272;;;42679:60;;;;;;;;;;:::i;:::-;;;;;;;;42632:272;42854:6;42848:13;42839:6;42835:2;42831:15;42824:38;42386:533;42523:45;;;42513:55;;;:6;:55;;;;42506:62;;;;;42350:624;42958:4;42951:11;;42178:803;;;;;;;:::o;32848:334::-;32921:13;32955:16;32963:7;32955;:16::i;:::-;32947:76;;;;;;;;;;;;:::i;:::-;;;;;;;;;33036:21;33060:10;:8;:10::i;:::-;33036:34;;33112:1;33094:7;33088:21;:25;:86;;;;;;;;;;;;;;;;;33140:7;33149:18;:7;:16;:18::i;:::-;33123:45;;;;;;;;;:::i;:::-;;;;;;;;;;;;;33088:86;33081:93;;;32848:334;;;:::o;11474:157::-;11559:4;11598:25;11583:40;;;:11;:40;;;;11576:47;;11474:157;;;:::o;46284:589::-;46428:45;46455:4;46461:2;46465:7;46428:26;:45::i;:::-;46506:1;46490:18;;:4;:18;;;46486:187;;;46525:40;46557:7;46525:31;:40::i;:::-;46486:187;;;46595:2;46587:10;;:4;:10;;;46583:90;;46614:47;46647:4;46653:7;46614:32;:47::i;:::-;46583:90;46486:187;46701:1;46687:16;;:2;:16;;;46683:183;;;46720:45;46757:7;46720:36;:45::i;:::-;46683:183;;;46793:4;46787:10;;:2;:10;;;46783:83;;46814:40;46842:2;46846:7;46814:27;:40::i;:::-;46783:83;46683:183;46284:589;;;:::o;40046:360::-;40106:13;40122:23;40137:7;40122:14;:23::i;:::-;40106:39;;40158:48;40179:5;40194:1;40198:7;40158:20;:48::i;:::-;40247:29;40264:1;40268:7;40247:8;:29::i;:::-;40309:1;40289:9;:16;40299:5;40289:16;;;;;;;;;;;;;;;;:21;;;;;;;:::i;:::-;;;;;;;;40328:7;:16;40336:7;40328:16;;;;;;;;;;;;40321:23;;;;;;;;;;;40390:7;40386:1;40362:36;;40371:5;40362:36;;;;;;;;;;;;40046:360;;:::o;12400:387::-;12460:4;12668:12;12735:7;12723:20;12715:28;;12778:1;12771:4;:8;12764:15;;;12400:387;;;:::o;19817:723::-;19873:13;20103:1;20094:5;:10;20090:53;;;20121:10;;;;;;;;;;;;;;;;;;;;;20090:53;20153:12;20168:5;20153:20;;20184:14;20209:78;20224:1;20216:4;:9;20209:78;;20242:8;;;;;:::i;:::-;;;;20273:2;20265:10;;;;;:::i;:::-;;;20209:78;;;20297:19;20329:6;20319:17;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;20297:39;;20347:154;20363:1;20354:5;:10;20347:154;;20391:1;20381:11;;;;;:::i;:::-;;;20458:2;20450:5;:10;;;;:::i;:::-;20437:2;:24;;;;:::i;:::-;20424:39;;20407:6;20414;20407:14;;;;;;;;;;;;;;;;;;;:56;;;;;;;;;;;20487:2;20478:11;;;;;:::i;:::-;;;20347:154;;;20525:6;20511:21;;;;;19817:723;;;;:::o;43553:126::-;;;;:::o;47596:164::-;47700:10;:17;;;;47673:15;:24;47689:7;47673:24;;;;;;;;;;;:44;;;;47728:10;47744:7;47728:24;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;47596:164;:::o;48387:988::-;48653:22;48703:1;48678:22;48695:4;48678:16;:22::i;:::-;:26;;;;:::i;:::-;48653:51;;48715:18;48736:17;:26;48754:7;48736:26;;;;;;;;;;;;48715:47;;48883:14;48869:10;:28;48865:328;;48914:19;48936:12;:18;48949:4;48936:18;;;;;;;;;;;;;;;:34;48955:14;48936:34;;;;;;;;;;;;48914:56;;49020:11;48987:12;:18;49000:4;48987:18;;;;;;;;;;;;;;;:30;49006:10;48987:30;;;;;;;;;;;:44;;;;49137:10;49104:17;:30;49122:11;49104:30;;;;;;;;;;;:43;;;;48865:328;;49289:17;:26;49307:7;49289:26;;;;;;;;;;;49282:33;;;49333:12;:18;49346:4;49333:18;;;;;;;;;;;;;;;:34;49352:14;49333:34;;;;;;;;;;;49326:41;;;48387:988;;;;:::o;49670:1079::-;49923:22;49968:1;49948:10;:17;;;;:21;;;;:::i;:::-;49923:46;;49980:18;50001:15;:24;50017:7;50001:24;;;;;;;;;;;;49980:45;;50352:19;50374:10;50385:14;50374:26;;;;;;;;;;;;;;;;;;;;;;;;50352:48;;50438:11;50413:10;50424;50413:22;;;;;;;;;;;;;;;;;;;;;;;:36;;;;50549:10;50518:15;:28;50534:11;50518:28;;;;;;;;;;;:41;;;;50690:15;:24;50706:7;50690:24;;;;;;;;;;;50683:31;;;50725:10;:16;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;49670:1079;;;;:::o;47174:221::-;47259:14;47276:20;47293:2;47276:16;:20::i;:::-;47259:37;;47334:7;47307:12;:16;47320:2;47307:16;;;;;;;;;;;;;;;:24;47324:6;47307:24;;;;;;;;;;;:34;;;;47381:6;47352:17;:26;47370:7;47352:26;;;;;;;;;;;:35;;;;47174:221;;;:::o;-1:-1:-1:-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;:::i;:::-;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;:::i;:::-;;;:::o;:::-;;;;;;;;;;;;;;;;;;;;;:::o;7:343:1:-;84:5;109:65;125:48;166:6;125:48;:::i;:::-;109:65;:::i;:::-;100:74;;197:6;190:5;183:21;235:4;228:5;224:16;273:3;264:6;259:3;255:16;252:25;249:2;;;290:1;287;280:12;249:2;303:41;337:6;332:3;327;303:41;:::i;:::-;90:260;;;;;;:::o;356:139::-;402:5;440:6;427:20;418:29;;456:33;483:5;456:33;:::i;:::-;408:87;;;;:::o;501:133::-;544:5;582:6;569:20;560:29;;598:30;622:5;598:30;:::i;:::-;550:84;;;;:::o;640:139::-;686:5;724:6;711:20;702:29;;740:33;767:5;740:33;:::i;:::-;692:87;;;;:::o;785:137::-;830:5;868:6;855:20;846:29;;884:32;910:5;884:32;:::i;:::-;836:86;;;;:::o;928:141::-;984:5;1015:6;1009:13;1000:22;;1031:32;1057:5;1031:32;:::i;:::-;990:79;;;;:::o;1088:271::-;1143:5;1192:3;1185:4;1177:6;1173:17;1169:27;1159:2;;1210:1;1207;1200:12;1159:2;1250:6;1237:20;1275:78;1349:3;1341:6;1334:4;1326:6;1322:17;1275:78;:::i;:::-;1266:87;;1149:210;;;;;:::o;1379:352::-;1437:8;1447:6;1497:3;1490:4;1482:6;1478:17;1474:27;1464:2;;1515:1;1512;1505:12;1464:2;1551:6;1538:20;1528:30;;1581:18;1573:6;1570:30;1567:2;;;1613:1;1610;1603:12;1567:2;1650:4;1642:6;1638:17;1626:29;;1704:3;1696:4;1688:6;1684:17;1674:8;1670:32;1667:41;1664:2;;;1721:1;1718;1711:12;1664:2;1454:277;;;;;:::o;1737:139::-;1783:5;1821:6;1808:20;1799:29;;1837:33;1864:5;1837:33;:::i;:::-;1789:87;;;;:::o;1882:262::-;1941:6;1990:2;1978:9;1969:7;1965:23;1961:32;1958:2;;;2006:1;2003;1996:12;1958:2;2049:1;2074:53;2119:7;2110:6;2099:9;2095:22;2074:53;:::i;:::-;2064:63;;2020:117;1948:196;;;;:::o;2150:407::-;2218:6;2226;2275:2;2263:9;2254:7;2250:23;2246:32;2243:2;;;2291:1;2288;2281:12;2243:2;2334:1;2359:53;2404:7;2395:6;2384:9;2380:22;2359:53;:::i;:::-;2349:63;;2305:117;2461:2;2487:53;2532:7;2523:6;2512:9;2508:22;2487:53;:::i;:::-;2477:63;;2432:118;2233:324;;;;;:::o;2563:552::-;2640:6;2648;2656;2705:2;2693:9;2684:7;2680:23;2676:32;2673:2;;;2721:1;2718;2711:12;2673:2;2764:1;2789:53;2834:7;2825:6;2814:9;2810:22;2789:53;:::i;:::-;2779:63;;2735:117;2891:2;2917:53;2962:7;2953:6;2942:9;2938:22;2917:53;:::i;:::-;2907:63;;2862:118;3019:2;3045:53;3090:7;3081:6;3070:9;3066:22;3045:53;:::i;:::-;3035:63;;2990:118;2663:452;;;;;:::o;3121:809::-;3216:6;3224;3232;3240;3289:3;3277:9;3268:7;3264:23;3260:33;3257:2;;;3306:1;3303;3296:12;3257:2;3349:1;3374:53;3419:7;3410:6;3399:9;3395:22;3374:53;:::i;:::-;3364:63;;3320:117;3476:2;3502:53;3547:7;3538:6;3527:9;3523:22;3502:53;:::i;:::-;3492:63;;3447:118;3604:2;3630:53;3675:7;3666:6;3655:9;3651:22;3630:53;:::i;:::-;3620:63;;3575:118;3760:2;3749:9;3745:18;3732:32;3791:18;3783:6;3780:30;3777:2;;;3823:1;3820;3813:12;3777:2;3851:62;3905:7;3896:6;3885:9;3881:22;3851:62;:::i;:::-;3841:72;;3703:220;3247:683;;;;;;;:::o;3936:401::-;4001:6;4009;4058:2;4046:9;4037:7;4033:23;4029:32;4026:2;;;4074:1;4071;4064:12;4026:2;4117:1;4142:53;4187:7;4178:6;4167:9;4163:22;4142:53;:::i;:::-;4132:63;;4088:117;4244:2;4270:50;4312:7;4303:6;4292:9;4288:22;4270:50;:::i;:::-;4260:60;;4215:115;4016:321;;;;;:::o;4343:407::-;4411:6;4419;4468:2;4456:9;4447:7;4443:23;4439:32;4436:2;;;4484:1;4481;4474:12;4436:2;4527:1;4552:53;4597:7;4588:6;4577:9;4573:22;4552:53;:::i;:::-;4542:63;;4498:117;4654:2;4680:53;4725:7;4716:6;4705:9;4701:22;4680:53;:::i;:::-;4670:63;;4625:118;4426:324;;;;;:::o;4756:262::-;4815:6;4864:2;4852:9;4843:7;4839:23;4835:32;4832:2;;;4880:1;4877;4870:12;4832:2;4923:1;4948:53;4993:7;4984:6;4973:9;4969:22;4948:53;:::i;:::-;4938:63;;4894:117;4822:196;;;;:::o;5024:407::-;5092:6;5100;5149:2;5137:9;5128:7;5124:23;5120:32;5117:2;;;5165:1;5162;5155:12;5117:2;5208:1;5233:53;5278:7;5269:6;5258:9;5254:22;5233:53;:::i;:::-;5223:63;;5179:117;5335:2;5361:53;5406:7;5397:6;5386:9;5382:22;5361:53;:::i;:::-;5351:63;;5306:118;5107:324;;;;;:::o;5437:260::-;5495:6;5544:2;5532:9;5523:7;5519:23;5515:32;5512:2;;;5560:1;5557;5550:12;5512:2;5603:1;5628:52;5672:7;5663:6;5652:9;5648:22;5628:52;:::i;:::-;5618:62;;5574:116;5502:195;;;;:::o;5703:282::-;5772:6;5821:2;5809:9;5800:7;5796:23;5792:32;5789:2;;;5837:1;5834;5827:12;5789:2;5880:1;5905:63;5960:7;5951:6;5940:9;5936:22;5905:63;:::i;:::-;5895:73;;5851:127;5779:206;;;;:::o;5991:395::-;6062:6;6070;6119:2;6107:9;6098:7;6094:23;6090:32;6087:2;;;6135:1;6132;6125:12;6087:2;6206:1;6195:9;6191:17;6178:31;6236:18;6228:6;6225:30;6222:2;;;6268:1;6265;6258:12;6222:2;6304:65;6361:7;6352:6;6341:9;6337:22;6304:65;:::i;:::-;6286:83;;;;6149:230;6077:309;;;;;:::o;6392:262::-;6451:6;6500:2;6488:9;6479:7;6475:23;6471:32;6468:2;;;6516:1;6513;6506:12;6468:2;6559:1;6584:53;6629:7;6620:6;6609:9;6605:22;6584:53;:::i;:::-;6574:63;;6530:117;6458:196;;;;:::o;6660:::-;6749:10;6784:66;6846:3;6838:6;6784:66;:::i;:::-;6770:80;;6760:96;;;;:::o;6862:179::-;6931:10;6952:46;6994:3;6986:6;6952:46;:::i;:::-;7030:4;7025:3;7021:14;7007:28;;6942:99;;;;:::o;7047:118::-;7134:24;7152:5;7134:24;:::i;:::-;7129:3;7122:37;7112:53;;:::o;7199:991::-;7338:3;7367:64;7425:5;7367:64;:::i;:::-;7447:96;7536:6;7531:3;7447:96;:::i;:::-;7440:103;;7569:3;7614:4;7606:6;7602:17;7597:3;7593:27;7644:66;7704:5;7644:66;:::i;:::-;7733:7;7764:1;7749:396;7774:6;7771:1;7768:13;7749:396;;;7845:9;7839:4;7835:20;7830:3;7823:33;7896:6;7890:13;7924:84;8003:4;7988:13;7924:84;:::i;:::-;7916:92;;8031:70;8094:6;8031:70;:::i;:::-;8021:80;;8130:4;8125:3;8121:14;8114:21;;7809:336;7796:1;7793;7789:9;7784:14;;7749:396;;;7753:14;8161:4;8154:11;;8181:3;8174:10;;7343:847;;;;;;;;;:::o;8226:732::-;8345:3;8374:54;8422:5;8374:54;:::i;:::-;8444:86;8523:6;8518:3;8444:86;:::i;:::-;8437:93;;8554:56;8604:5;8554:56;:::i;:::-;8633:7;8664:1;8649:284;8674:6;8671:1;8668:13;8649:284;;;8750:6;8744:13;8777:63;8836:3;8821:13;8777:63;:::i;:::-;8770:70;;8863:60;8916:6;8863:60;:::i;:::-;8853:70;;8709:224;8696:1;8693;8689:9;8684:14;;8649:284;;;8653:14;8949:3;8942:10;;8350:608;;;;;;;:::o;8964:109::-;9045:21;9060:5;9045:21;:::i;:::-;9040:3;9033:34;9023:50;;:::o;9079:118::-;9166:24;9184:5;9166:24;:::i;:::-;9161:3;9154:37;9144:53;;:::o;9203:360::-;9289:3;9317:38;9349:5;9317:38;:::i;:::-;9371:70;9434:6;9429:3;9371:70;:::i;:::-;9364:77;;9450:52;9495:6;9490:3;9483:4;9476:5;9472:16;9450:52;:::i;:::-;9527:29;9549:6;9527:29;:::i;:::-;9522:3;9518:39;9511:46;;9293:270;;;;;:::o;9569:344::-;9647:3;9675:39;9708:5;9675:39;:::i;:::-;9730:61;9784:6;9779:3;9730:61;:::i;:::-;9723:68;;9800:52;9845:6;9840:3;9833:4;9826:5;9822:16;9800:52;:::i;:::-;9877:29;9899:6;9877:29;:::i;:::-;9872:3;9868:39;9861:46;;9651:262;;;;;:::o;9919:364::-;10007:3;10035:39;10068:5;10035:39;:::i;:::-;10090:71;10154:6;10149:3;10090:71;:::i;:::-;10083:78;;10170:52;10215:6;10210:3;10203:4;10196:5;10192:16;10170:52;:::i;:::-;10247:29;10269:6;10247:29;:::i;:::-;10242:3;10238:39;10231:46;;10011:272;;;;;:::o;10289:377::-;10395:3;10423:39;10456:5;10423:39;:::i;:::-;10478:89;10560:6;10555:3;10478:89;:::i;:::-;10471:96;;10576:52;10621:6;10616:3;10609:4;10602:5;10598:16;10576:52;:::i;:::-;10653:6;10648:3;10644:16;10637:23;;10399:267;;;;;:::o;10672:366::-;10814:3;10835:67;10899:2;10894:3;10835:67;:::i;:::-;10828:74;;10911:93;11000:3;10911:93;:::i;:::-;11029:2;11024:3;11020:12;11013:19;;10818:220;;;:::o;11044:366::-;11186:3;11207:67;11271:2;11266:3;11207:67;:::i;:::-;11200:74;;11283:93;11372:3;11283:93;:::i;:::-;11401:2;11396:3;11392:12;11385:19;;11190:220;;;:::o;11416:366::-;11558:3;11579:67;11643:2;11638:3;11579:67;:::i;:::-;11572:74;;11655:93;11744:3;11655:93;:::i;:::-;11773:2;11768:3;11764:12;11757:19;;11562:220;;;:::o;11788:366::-;11930:3;11951:67;12015:2;12010:3;11951:67;:::i;:::-;11944:74;;12027:93;12116:3;12027:93;:::i;:::-;12145:2;12140:3;12136:12;12129:19;;11934:220;;;:::o;12160:366::-;12302:3;12323:67;12387:2;12382:3;12323:67;:::i;:::-;12316:74;;12399:93;12488:3;12399:93;:::i;:::-;12517:2;12512:3;12508:12;12501:19;;12306:220;;;:::o;12532:366::-;12674:3;12695:67;12759:2;12754:3;12695:67;:::i;:::-;12688:74;;12771:93;12860:3;12771:93;:::i;:::-;12889:2;12884:3;12880:12;12873:19;;12678:220;;;:::o;12904:366::-;13046:3;13067:67;13131:2;13126:3;13067:67;:::i;:::-;13060:74;;13143:93;13232:3;13143:93;:::i;:::-;13261:2;13256:3;13252:12;13245:19;;13050:220;;;:::o;13276:366::-;13418:3;13439:67;13503:2;13498:3;13439:67;:::i;:::-;13432:74;;13515:93;13604:3;13515:93;:::i;:::-;13633:2;13628:3;13624:12;13617:19;;13422:220;;;:::o;13648:366::-;13790:3;13811:67;13875:2;13870:3;13811:67;:::i;:::-;13804:74;;13887:93;13976:3;13887:93;:::i;:::-;14005:2;14000:3;13996:12;13989:19;;13794:220;;;:::o;14020:366::-;14162:3;14183:67;14247:2;14242:3;14183:67;:::i;:::-;14176:74;;14259:93;14348:3;14259:93;:::i;:::-;14377:2;14372:3;14368:12;14361:19;;14166:220;;;:::o;14392:366::-;14534:3;14555:67;14619:2;14614:3;14555:67;:::i;:::-;14548:74;;14631:93;14720:3;14631:93;:::i;:::-;14749:2;14744:3;14740:12;14733:19;;14538:220;;;:::o;14764:366::-;14906:3;14927:67;14991:2;14986:3;14927:67;:::i;:::-;14920:74;;15003:93;15092:3;15003:93;:::i;:::-;15121:2;15116:3;15112:12;15105:19;;14910:220;;;:::o;15136:366::-;15278:3;15299:67;15363:2;15358:3;15299:67;:::i;:::-;15292:74;;15375:93;15464:3;15375:93;:::i;:::-;15493:2;15488:3;15484:12;15477:19;;15282:220;;;:::o;15508:366::-;15650:3;15671:67;15735:2;15730:3;15671:67;:::i;:::-;15664:74;;15747:93;15836:3;15747:93;:::i;:::-;15865:2;15860:3;15856:12;15849:19;;15654:220;;;:::o;15880:366::-;16022:3;16043:67;16107:2;16102:3;16043:67;:::i;:::-;16036:74;;16119:93;16208:3;16119:93;:::i;:::-;16237:2;16232:3;16228:12;16221:19;;16026:220;;;:::o;16252:366::-;16394:3;16415:67;16479:2;16474:3;16415:67;:::i;:::-;16408:74;;16491:93;16580:3;16491:93;:::i;:::-;16609:2;16604:3;16600:12;16593:19;;16398:220;;;:::o;16624:366::-;16766:3;16787:67;16851:2;16846:3;16787:67;:::i;:::-;16780:74;;16863:93;16952:3;16863:93;:::i;:::-;16981:2;16976:3;16972:12;16965:19;;16770:220;;;:::o;16996:366::-;17138:3;17159:67;17223:2;17218:3;17159:67;:::i;:::-;17152:74;;17235:93;17324:3;17235:93;:::i;:::-;17353:2;17348:3;17344:12;17337:19;;17142:220;;;:::o;17368:366::-;17510:3;17531:67;17595:2;17590:3;17531:67;:::i;:::-;17524:74;;17607:93;17696:3;17607:93;:::i;:::-;17725:2;17720:3;17716:12;17709:19;;17514:220;;;:::o;17740:366::-;17882:3;17903:67;17967:2;17962:3;17903:67;:::i;:::-;17896:74;;17979:93;18068:3;17979:93;:::i;:::-;18097:2;18092:3;18088:12;18081:19;;17886:220;;;:::o;18112:366::-;18254:3;18275:67;18339:2;18334:3;18275:67;:::i;:::-;18268:74;;18351:93;18440:3;18351:93;:::i;:::-;18469:2;18464:3;18460:12;18453:19;;18258:220;;;:::o;18484:402::-;18644:3;18665:85;18747:2;18742:3;18665:85;:::i;:::-;18658:92;;18759:93;18848:3;18759:93;:::i;:::-;18877:2;18872:3;18868:12;18861:19;;18648:238;;;:::o;18892:402::-;19052:3;19073:85;19155:2;19150:3;19073:85;:::i;:::-;19066:92;;19167:93;19256:3;19167:93;:::i;:::-;19285:2;19280:3;19276:12;19269:19;;19056:238;;;:::o;19300:366::-;19442:3;19463:67;19527:2;19522:3;19463:67;:::i;:::-;19456:74;;19539:93;19628:3;19539:93;:::i;:::-;19657:2;19652:3;19648:12;19641:19;;19446:220;;;:::o;19672:108::-;19749:24;19767:5;19749:24;:::i;:::-;19744:3;19737:37;19727:53;;:::o;19786:118::-;19873:24;19891:5;19873:24;:::i;:::-;19868:3;19861:37;19851:53;;:::o;19910:435::-;20090:3;20112:95;20203:3;20194:6;20112:95;:::i;:::-;20105:102;;20224:95;20315:3;20306:6;20224:95;:::i;:::-;20217:102;;20336:3;20329:10;;20094:251;;;;;:::o;20351:967::-;20733:3;20755:148;20899:3;20755:148;:::i;:::-;20748:155;;20920:95;21011:3;21002:6;20920:95;:::i;:::-;20913:102;;21032:148;21176:3;21032:148;:::i;:::-;21025:155;;21197:95;21288:3;21279:6;21197:95;:::i;:::-;21190:102;;21309:3;21302:10;;20737:581;;;;;:::o;21324:222::-;21417:4;21455:2;21444:9;21440:18;21432:26;;21468:71;21536:1;21525:9;21521:17;21512:6;21468:71;:::i;:::-;21422:124;;;;:::o;21552:640::-;21747:4;21785:3;21774:9;21770:19;21762:27;;21799:71;21867:1;21856:9;21852:17;21843:6;21799:71;:::i;:::-;21880:72;21948:2;21937:9;21933:18;21924:6;21880:72;:::i;:::-;21962;22030:2;22019:9;22015:18;22006:6;21962:72;:::i;:::-;22081:9;22075:4;22071:20;22066:2;22055:9;22051:18;22044:48;22109:76;22180:4;22171:6;22109:76;:::i;:::-;22101:84;;21752:440;;;;;;;:::o;22198:413::-;22361:4;22399:2;22388:9;22384:18;22376:26;;22448:9;22442:4;22438:20;22434:1;22423:9;22419:17;22412:47;22476:128;22599:4;22590:6;22476:128;:::i;:::-;22468:136;;22366:245;;;;:::o;22617:373::-;22760:4;22798:2;22787:9;22783:18;22775:26;;22847:9;22841:4;22837:20;22833:1;22822:9;22818:17;22811:47;22875:108;22978:4;22969:6;22875:108;:::i;:::-;22867:116;;22765:225;;;;:::o;22996:210::-;23083:4;23121:2;23110:9;23106:18;23098:26;;23134:65;23196:1;23185:9;23181:17;23172:6;23134:65;:::i;:::-;23088:118;;;;:::o;23212:222::-;23305:4;23343:2;23332:9;23328:18;23320:26;;23356:71;23424:1;23413:9;23409:17;23400:6;23356:71;:::i;:::-;23310:124;;;;:::o;23440:313::-;23553:4;23591:2;23580:9;23576:18;23568:26;;23640:9;23634:4;23630:20;23626:1;23615:9;23611:17;23604:47;23668:78;23741:4;23732:6;23668:78;:::i;:::-;23660:86;;23558:195;;;;:::o;23759:419::-;23925:4;23963:2;23952:9;23948:18;23940:26;;24012:9;24006:4;24002:20;23998:1;23987:9;23983:17;23976:47;24040:131;24166:4;24040:131;:::i;:::-;24032:139;;23930:248;;;:::o;24184:419::-;24350:4;24388:2;24377:9;24373:18;24365:26;;24437:9;24431:4;24427:20;24423:1;24412:9;24408:17;24401:47;24465:131;24591:4;24465:131;:::i;:::-;24457:139;;24355:248;;;:::o;24609:419::-;24775:4;24813:2;24802:9;24798:18;24790:26;;24862:9;24856:4;24852:20;24848:1;24837:9;24833:17;24826:47;24890:131;25016:4;24890:131;:::i;:::-;24882:139;;24780:248;;;:::o;25034:419::-;25200:4;25238:2;25227:9;25223:18;25215:26;;25287:9;25281:4;25277:20;25273:1;25262:9;25258:17;25251:47;25315:131;25441:4;25315:131;:::i;:::-;25307:139;;25205:248;;;:::o;25459:419::-;25625:4;25663:2;25652:9;25648:18;25640:26;;25712:9;25706:4;25702:20;25698:1;25687:9;25683:17;25676:47;25740:131;25866:4;25740:131;:::i;:::-;25732:139;;25630:248;;;:::o;25884:419::-;26050:4;26088:2;26077:9;26073:18;26065:26;;26137:9;26131:4;26127:20;26123:1;26112:9;26108:17;26101:47;26165:131;26291:4;26165:131;:::i;:::-;26157:139;;26055:248;;;:::o;26309:419::-;26475:4;26513:2;26502:9;26498:18;26490:26;;26562:9;26556:4;26552:20;26548:1;26537:9;26533:17;26526:47;26590:131;26716:4;26590:131;:::i;:::-;26582:139;;26480:248;;;:::o;26734:419::-;26900:4;26938:2;26927:9;26923:18;26915:26;;26987:9;26981:4;26977:20;26973:1;26962:9;26958:17;26951:47;27015:131;27141:4;27015:131;:::i;:::-;27007:139;;26905:248;;;:::o;27159:419::-;27325:4;27363:2;27352:9;27348:18;27340:26;;27412:9;27406:4;27402:20;27398:1;27387:9;27383:17;27376:47;27440:131;27566:4;27440:131;:::i;:::-;27432:139;;27330:248;;;:::o;27584:419::-;27750:4;27788:2;27777:9;27773:18;27765:26;;27837:9;27831:4;27827:20;27823:1;27812:9;27808:17;27801:47;27865:131;27991:4;27865:131;:::i;:::-;27857:139;;27755:248;;;:::o;28009:419::-;28175:4;28213:2;28202:9;28198:18;28190:26;;28262:9;28256:4;28252:20;28248:1;28237:9;28233:17;28226:47;28290:131;28416:4;28290:131;:::i;:::-;28282:139;;28180:248;;;:::o;28434:419::-;28600:4;28638:2;28627:9;28623:18;28615:26;;28687:9;28681:4;28677:20;28673:1;28662:9;28658:17;28651:47;28715:131;28841:4;28715:131;:::i;:::-;28707:139;;28605:248;;;:::o;28859:419::-;29025:4;29063:2;29052:9;29048:18;29040:26;;29112:9;29106:4;29102:20;29098:1;29087:9;29083:17;29076:47;29140:131;29266:4;29140:131;:::i;:::-;29132:139;;29030:248;;;:::o;29284:419::-;29450:4;29488:2;29477:9;29473:18;29465:26;;29537:9;29531:4;29527:20;29523:1;29512:9;29508:17;29501:47;29565:131;29691:4;29565:131;:::i;:::-;29557:139;;29455:248;;;:::o;29709:419::-;29875:4;29913:2;29902:9;29898:18;29890:26;;29962:9;29956:4;29952:20;29948:1;29937:9;29933:17;29926:47;29990:131;30116:4;29990:131;:::i;:::-;29982:139;;29880:248;;;:::o;30134:419::-;30300:4;30338:2;30327:9;30323:18;30315:26;;30387:9;30381:4;30377:20;30373:1;30362:9;30358:17;30351:47;30415:131;30541:4;30415:131;:::i;:::-;30407:139;;30305:248;;;:::o;30559:419::-;30725:4;30763:2;30752:9;30748:18;30740:26;;30812:9;30806:4;30802:20;30798:1;30787:9;30783:17;30776:47;30840:131;30966:4;30840:131;:::i;:::-;30832:139;;30730:248;;;:::o;30984:419::-;31150:4;31188:2;31177:9;31173:18;31165:26;;31237:9;31231:4;31227:20;31223:1;31212:9;31208:17;31201:47;31265:131;31391:4;31265:131;:::i;:::-;31257:139;;31155:248;;;:::o;31409:419::-;31575:4;31613:2;31602:9;31598:18;31590:26;;31662:9;31656:4;31652:20;31648:1;31637:9;31633:17;31626:47;31690:131;31816:4;31690:131;:::i;:::-;31682:139;;31580:248;;;:::o;31834:419::-;32000:4;32038:2;32027:9;32023:18;32015:26;;32087:9;32081:4;32077:20;32073:1;32062:9;32058:17;32051:47;32115:131;32241:4;32115:131;:::i;:::-;32107:139;;32005:248;;;:::o;32259:419::-;32425:4;32463:2;32452:9;32448:18;32440:26;;32512:9;32506:4;32502:20;32498:1;32487:9;32483:17;32476:47;32540:131;32666:4;32540:131;:::i;:::-;32532:139;;32430:248;;;:::o;32684:419::-;32850:4;32888:2;32877:9;32873:18;32865:26;;32937:9;32931:4;32927:20;32923:1;32912:9;32908:17;32901:47;32965:131;33091:4;32965:131;:::i;:::-;32957:139;;32855:248;;;:::o;33109:222::-;33202:4;33240:2;33229:9;33225:18;33217:26;;33253:71;33321:1;33310:9;33306:17;33297:6;33253:71;:::i;:::-;33207:124;;;;:::o;33337:129::-;33371:6;33398:20;;:::i;:::-;33388:30;;33427:33;33455:4;33447:6;33427:33;:::i;:::-;33378:88;;;:::o;33472:75::-;33505:6;33538:2;33532:9;33522:19;;33512:35;:::o;33553:307::-;33614:4;33704:18;33696:6;33693:30;33690:2;;;33726:18;;:::i;:::-;33690:2;33764:29;33786:6;33764:29;:::i;:::-;33756:37;;33848:4;33842;33838:15;33830:23;;33619:241;;;:::o;33866:142::-;33943:4;33966:3;33958:11;;33996:4;33991:3;33987:14;33979:22;;33948:60;;;:::o;34014:132::-;34081:4;34104:3;34096:11;;34134:4;34129:3;34125:14;34117:22;;34086:60;;;:::o;34152:124::-;34229:6;34263:5;34257:12;34247:22;;34236:40;;;:::o;34282:114::-;34349:6;34383:5;34377:12;34367:22;;34356:40;;;:::o;34402:98::-;34453:6;34487:5;34481:12;34471:22;;34460:40;;;:::o;34506:99::-;34558:6;34592:5;34586:12;34576:22;;34565:40;;;:::o;34611:123::-;34691:4;34723;34718:3;34714:14;34706:22;;34696:38;;;:::o;34740:113::-;34810:4;34842;34837:3;34833:14;34825:22;;34815:38;;;:::o;34859:194::-;34968:11;35002:6;34997:3;34990:19;35042:4;35037:3;35033:14;35018:29;;34980:73;;;;:::o;35059:184::-;35158:11;35192:6;35187:3;35180:19;35232:4;35227:3;35223:14;35208:29;;35170:73;;;;:::o;35249:168::-;35332:11;35366:6;35361:3;35354:19;35406:4;35401:3;35397:14;35382:29;;35344:73;;;;:::o;35423:159::-;35497:11;35531:6;35526:3;35519:19;35571:4;35566:3;35562:14;35547:29;;35509:73;;;;:::o;35588:169::-;35672:11;35706:6;35701:3;35694:19;35746:4;35741:3;35737:14;35722:29;;35684:73;;;;:::o;35763:148::-;35865:11;35902:3;35887:18;;35877:34;;;;:::o;35917:305::-;35957:3;35976:20;35994:1;35976:20;:::i;:::-;35971:25;;36010:20;36028:1;36010:20;:::i;:::-;36005:25;;36164:1;36096:66;36092:74;36089:1;36086:81;36083:2;;;36170:18;;:::i;:::-;36083:2;36214:1;36211;36207:9;36200:16;;35961:261;;;;:::o;36228:185::-;36268:1;36285:20;36303:1;36285:20;:::i;:::-;36280:25;;36319:20;36337:1;36319:20;:::i;:::-;36314:25;;36358:1;36348:2;;36363:18;;:::i;:::-;36348:2;36405:1;36402;36398:9;36393:14;;36270:143;;;;:::o;36419:348::-;36459:7;36482:20;36500:1;36482:20;:::i;:::-;36477:25;;36516:20;36534:1;36516:20;:::i;:::-;36511:25;;36704:1;36636:66;36632:74;36629:1;36626:81;36621:1;36614:9;36607:17;36603:105;36600:2;;;36711:18;;:::i;:::-;36600:2;36759:1;36756;36752:9;36741:20;;36467:300;;;;:::o;36773:191::-;36813:4;36833:20;36851:1;36833:20;:::i;:::-;36828:25;;36867:20;36885:1;36867:20;:::i;:::-;36862:25;;36906:1;36903;36900:8;36897:2;;;36911:18;;:::i;:::-;36897:2;36956:1;36953;36949:9;36941:17;;36818:146;;;;:::o;36970:96::-;37007:7;37036:24;37054:5;37036:24;:::i;:::-;37025:35;;37015:51;;;:::o;37072:90::-;37106:7;37149:5;37142:13;37135:21;37124:32;;37114:48;;;:::o;37168:77::-;37205:7;37234:5;37223:16;;37213:32;;;:::o;37251:149::-;37287:7;37327:66;37320:5;37316:78;37305:89;;37295:105;;;:::o;37406:126::-;37443:7;37483:42;37476:5;37472:54;37461:65;;37451:81;;;:::o;37538:77::-;37575:7;37604:5;37593:16;;37583:32;;;:::o;37621:154::-;37705:6;37700:3;37695;37682:30;37767:1;37758:6;37753:3;37749:16;37742:27;37672:103;;;:::o;37781:307::-;37849:1;37859:113;37873:6;37870:1;37867:13;37859:113;;;37958:1;37953:3;37949:11;37943:18;37939:1;37934:3;37930:11;37923:39;37895:2;37892:1;37888:10;37883:15;;37859:113;;;37990:6;37987:1;37984:13;37981:2;;;38070:1;38061:6;38056:3;38052:16;38045:27;37981:2;37830:258;;;;:::o;38094:171::-;38133:3;38156:24;38174:5;38156:24;:::i;:::-;38147:33;;38202:4;38195:5;38192:15;38189:2;;;38210:18;;:::i;:::-;38189:2;38257:1;38250:5;38246:13;38239:20;;38137:128;;;:::o;38271:320::-;38315:6;38352:1;38346:4;38342:12;38332:22;;38399:1;38393:4;38389:12;38420:18;38410:2;;38476:4;38468:6;38464:17;38454:27;;38410:2;38538;38530:6;38527:14;38507:18;38504:38;38501:2;;;38557:18;;:::i;:::-;38501:2;38322:269;;;;:::o;38597:281::-;38680:27;38702:4;38680:27;:::i;:::-;38672:6;38668:40;38810:6;38798:10;38795:22;38774:18;38762:10;38759:34;38756:62;38753:2;;;38821:18;;:::i;:::-;38753:2;38861:10;38857:2;38850:22;38640:238;;;:::o;38884:233::-;38923:3;38946:24;38964:5;38946:24;:::i;:::-;38937:33;;38992:66;38985:5;38982:77;38979:2;;;39062:18;;:::i;:::-;38979:2;39109:1;39102:5;39098:13;39091:20;;38927:190;;;:::o;39123:176::-;39155:1;39172:20;39190:1;39172:20;:::i;:::-;39167:25;;39206:20;39224:1;39206:20;:::i;:::-;39201:25;;39245:1;39235:2;;39250:18;;:::i;:::-;39235:2;39291:1;39288;39284:9;39279:14;;39157:142;;;;:::o;39305:180::-;39353:77;39350:1;39343:88;39450:4;39447:1;39440:15;39474:4;39471:1;39464:15;39491:180;39539:77;39536:1;39529:88;39636:4;39633:1;39626:15;39660:4;39657:1;39650:15;39677:180;39725:77;39722:1;39715:88;39822:4;39819:1;39812:15;39846:4;39843:1;39836:15;39863:180;39911:77;39908:1;39901:88;40008:4;40005:1;39998:15;40032:4;40029:1;40022:15;40049:102;40090:6;40141:2;40137:7;40132:2;40125:5;40121:14;40117:28;40107:38;;40097:54;;;:::o;40157:182::-;40297:34;40293:1;40285:6;40281:14;40274:58;40263:76;:::o;40345:230::-;40485:34;40481:1;40473:6;40469:14;40462:58;40554:13;40549:2;40541:6;40537:15;40530:38;40451:124;:::o;40581:237::-;40721:34;40717:1;40709:6;40705:14;40698:58;40790:20;40785:2;40777:6;40773:15;40766:45;40687:131;:::o;40824:178::-;40964:30;40960:1;40952:6;40948:14;40941:54;40930:72;:::o;41008:223::-;41148:34;41144:1;41136:6;41132:14;41125:58;41217:6;41212:2;41204:6;41200:15;41193:31;41114:117;:::o;41237:175::-;41377:27;41373:1;41365:6;41361:14;41354:51;41343:69;:::o;41418:231::-;41558:34;41554:1;41546:6;41542:14;41535:58;41627:14;41622:2;41614:6;41610:15;41603:39;41524:125;:::o;41655:243::-;41795:34;41791:1;41783:6;41779:14;41772:58;41864:26;41859:2;41851:6;41847:15;41840:51;41761:137;:::o;41904:229::-;42044:34;42040:1;42032:6;42028:14;42021:58;42113:12;42108:2;42100:6;42096:15;42089:37;42010:123;:::o;42139:228::-;42279:34;42275:1;42267:6;42263:14;42256:58;42348:11;42343:2;42335:6;42331:15;42324:36;42245:122;:::o;42373:233::-;42513:34;42509:1;42501:6;42497:14;42490:58;42582:16;42577:2;42569:6;42565:15;42558:41;42479:127;:::o;42612:167::-;42752:19;42748:1;42740:6;42736:14;42729:43;42718:61;:::o;42785:175::-;42925:27;42921:1;42913:6;42909:14;42902:51;42891:69;:::o;42966:182::-;43106:34;43102:1;43094:6;43090:14;43083:58;43072:76;:::o;43154:236::-;43294:34;43290:1;43282:6;43278:14;43271:58;43363:19;43358:2;43350:6;43346:15;43339:44;43260:130;:::o;43396:231::-;43536:34;43532:1;43524:6;43520:14;43513:58;43605:14;43600:2;43592:6;43588:15;43581:39;43502:125;:::o;43633:228::-;43773:34;43769:1;43761:6;43757:14;43750:58;43842:11;43837:2;43829:6;43825:15;43818:36;43739:122;:::o;43867:234::-;44007:34;44003:1;43995:6;43991:14;43984:58;44076:17;44071:2;44063:6;44059:15;44052:42;43973:128;:::o;44107:220::-;44247:34;44243:1;44235:6;44231:14;44224:58;44316:3;44311:2;44303:6;44299:15;44292:28;44213:114;:::o;44333:236::-;44473:34;44469:1;44461:6;44457:14;44450:58;44542:19;44537:2;44529:6;44525:15;44518:44;44439:130;:::o;44575:231::-;44715:34;44711:1;44703:6;44699:14;44692:58;44784:14;44779:2;44771:6;44767:15;44760:39;44681:125;:::o;44812:173::-;44952:25;44948:1;44940:6;44936:14;44929:49;44918:67;:::o;44991:167::-;45131:19;45127:1;45119:6;45115:14;45108:43;45097:61;:::o;45164:234::-;45304:34;45300:1;45292:6;45288:14;45281:58;45373:17;45368:2;45360:6;45356:15;45349:42;45270:128;:::o;45404:122::-;45477:24;45495:5;45477:24;:::i;:::-;45470:5;45467:35;45457:2;;45516:1;45513;45506:12;45457:2;45447:79;:::o;45532:116::-;45602:21;45617:5;45602:21;:::i;:::-;45595:5;45592:32;45582:2;;45638:1;45635;45628:12;45582:2;45572:76;:::o;45654:122::-;45727:24;45745:5;45727:24;:::i;:::-;45720:5;45717:35;45707:2;;45766:1;45763;45756:12;45707:2;45697:79;:::o;45782:120::-;45854:23;45871:5;45854:23;:::i;:::-;45847:5;45844:34;45834:2;;45892:1;45889;45882:12;45834:2;45824:78;:::o;45908:122::-;45981:24;45999:5;45981:24;:::i;:::-;45974:5;45971:35;45961:2;;46020:1;46017;46010:12;45961:2;45951:79;:::o
Swarm Source
ipfs://50febd0f3d7876f0610d054a0822005fec6cd12125285236884b3d2702579d90
Loading...
Loading
[ Download: CSV Export ]
[ Download: CSV Export ]
A token is a representation of an on-chain or off-chain asset. The token page shows information such as price, total supply, holders, transfers and social links. Learn more about this page in our Knowledge Base.