Token
test ()
ERC-1155
Overview
Max Total Supply
34
Holders
7
Market
Onchain Market Cap
$0.00
Circulating Supply Market Cap
-
Other Info
Token Contract
Loading...
Loading
Loading...
Loading
Loading...
Loading
This contract may be a proxy contract. Click on More Options and select Is this a proxy? to confirm and enable the "Read as Proxy" & "Write as Proxy" tabs.
Contract Name:
ERC1155Items
Compiler Version
v0.8.19+commit.7dd6d404
ZkSolc Version
v1.5.11
Optimization Enabled:
Yes with Mode 3
Other Settings:
paris EvmVersion
Contract Source Code (Solidity Standard Json-Input format)
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.19; import { IERC1155Items, IERC1155ItemsFunctions } from "@0xsequence/contracts-library/tokens/ERC1155/presets/items/IERC1155Items.sol"; import {ERC1155BaseToken} from "@0xsequence/contracts-library/tokens/ERC1155/ERC1155BaseToken.sol"; import {ERC2981Controlled} from "@0xsequence/contracts-library/tokens/common/ERC2981Controlled.sol"; /** * An implementation of ERC-1155 capable of minting when role provided. */ contract ERC1155Items is ERC1155BaseToken, IERC1155Items { bytes32 internal constant MINTER_ROLE = keccak256("MINTER_ROLE"); address private immutable initializer; bool private initialized; constructor() { initializer = msg.sender; } /** * Initialize the contract. * @param owner Owner address * @param tokenName Token name * @param tokenBaseURI Base URI for token metadata * @param tokenContractURI Contract URI for token metadata * @param royaltyReceiver Address of who should be sent the royalty payment * @param royaltyFeeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500) * @dev This should be called immediately after deployment. */ function initialize( address owner, string memory tokenName, string memory tokenBaseURI, string memory tokenContractURI, address royaltyReceiver, uint96 royaltyFeeNumerator ) public virtual { if (msg.sender != initializer || initialized) { revert InvalidInitialization(); } ERC1155BaseToken._initialize(owner, tokenName, tokenBaseURI, tokenContractURI); _setDefaultRoyalty(royaltyReceiver, royaltyFeeNumerator); _grantRole(MINTER_ROLE, owner); initialized = true; } // // Minting // /** * Mint tokens. * @param to Address to mint tokens to. * @param tokenId Token ID to mint. * @param amount Amount of tokens to mint. * @param data Data to pass if receiver is contract. */ function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) external onlyRole(MINTER_ROLE) { _mint(to, tokenId, amount, data); } /** * Mint tokens. * @param to Address to mint tokens to. * @param tokenIds Token IDs to mint. * @param amounts Amounts of tokens to mint. * @param data Data to pass if receiver is contract. */ function batchMint(address to, uint256[] memory tokenIds, uint256[] memory amounts, bytes memory data) external onlyRole(MINTER_ROLE) { _batchMint(to, tokenIds, amounts, data); } // // Views // /** * Check interface support. * @param interfaceId Interface id * @return True if supported */ function supportsInterface(bytes4 interfaceId) public view virtual override (ERC1155BaseToken) returns (bool) { return type(IERC1155ItemsFunctions).interfaceId == interfaceId || ERC1155BaseToken.supportsInterface(interfaceId) || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.19; interface IERC1155ItemsFunctions { /** * Mint tokens. * @param to Address to mint tokens to. * @param tokenId Token ID to mint. * @param amount Amount of tokens to mint. * @param data Data to pass if receiver is contract. */ function mint(address to, uint256 tokenId, uint256 amount, bytes memory data) external; /** * Mint tokens. * @param to Address to mint tokens to. * @param tokenIds Token IDs to mint. * @param amounts Amounts of tokens to mint. * @param data Data to pass if receiver is contract. */ function batchMint(address to, uint256[] memory tokenIds, uint256[] memory amounts, bytes memory data) external; } interface IERC1155ItemsSignals { /** * Invalid initialization error. */ error InvalidInitialization(); } interface IERC1155Items is IERC1155ItemsFunctions, IERC1155ItemsSignals {}
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.19; import { ERC1155Supply, ERC1155 } from "@0xsequence/contracts-library/tokens/ERC1155/extensions/supply/ERC1155Supply.sol"; import {ERC1155Metadata} from "@0xsequence/erc-1155/contracts/tokens/ERC1155/ERC1155Metadata.sol"; import {ERC2981Controlled} from "@0xsequence/contracts-library/tokens/common/ERC2981Controlled.sol"; error InvalidInitialization(); /** * A standard base implementation of ERC-1155 for use in Sequence library contracts. */ abstract contract ERC1155BaseToken is ERC1155Supply, ERC1155Metadata, ERC2981Controlled { bytes32 internal constant METADATA_ADMIN_ROLE = keccak256("METADATA_ADMIN_ROLE"); string private _contractURI; /** * Deploy contract. */ constructor() ERC1155Metadata("", "") {} /** * Initialize the contract. * @param owner Owner address. * @param tokenName Token name. * @param tokenBaseURI Base URI for token metadata. * @param tokenContractURI Contract URI for token metadata. * @dev This should be called immediately after deployment. */ function _initialize( address owner, string memory tokenName, string memory tokenBaseURI, string memory tokenContractURI ) internal { name = tokenName; baseURI = tokenBaseURI; _contractURI = tokenContractURI; _grantRole(DEFAULT_ADMIN_ROLE, owner); _grantRole(ROYALTY_ADMIN_ROLE, owner); _grantRole(METADATA_ADMIN_ROLE, owner); } // // Metadata // /** * Update the base URI of token's URI. * @param tokenBaseURI New base URI of token's URI */ function setBaseMetadataURI(string memory tokenBaseURI) external onlyRole(METADATA_ADMIN_ROLE) { _setBaseMetadataURI(tokenBaseURI); } /** * Update the name of the contract. * @param tokenName New contract name */ function setContractName(string memory tokenName) external onlyRole(METADATA_ADMIN_ROLE) { _setContractName(tokenName); } /** * Update the contract URI of token's URI. * @param tokenContractURI New contract URI of token's URI * @notice Refer to https://docs.opensea.io/docs/contract-level-metadata */ function setContractURI(string memory tokenContractURI) external onlyRole(METADATA_ADMIN_ROLE) { _contractURI = tokenContractURI; } // // Burn // /** * Allows the owner of the token to burn their tokens. * @param tokenId Id of token to burn * @param amount Amount of tokens to burn */ function burn(uint256 tokenId, uint256 amount) public virtual { _burn(msg.sender, tokenId, amount); } /** * Burn tokens of given token id for each (tokenIds[i], amounts[i]) pair. * @param tokenIds Array of token ids to burn * @param amounts Array of the amount to be burned */ function batchBurn(uint256[] memory tokenIds, uint256[] memory amounts) public virtual { _batchBurn(msg.sender, tokenIds, amounts); } // // Views // /** * Get the contract URI of token's URI. * @return Contract URI of token's URI * @notice Refer to https://docs.opensea.io/docs/contract-level-metadata */ function contractURI() public view returns (string memory) { return _contractURI; } /** * Check interface support. * @param interfaceId Interface id * @return True if supported */ function supportsInterface(bytes4 interfaceId) public view virtual override (ERC1155Supply, ERC1155Metadata, ERC2981Controlled) returns (bool) { return ERC1155Supply.supportsInterface(interfaceId) || ERC1155Metadata.supportsInterface(interfaceId) || ERC2981Controlled.supportsInterface(interfaceId) || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.19; import {IERC2981Controlled} from "@0xsequence/contracts-library/tokens/common/IERC2981Controlled.sol"; import {ERC2981} from "@openzeppelin/contracts/token/common/ERC2981.sol"; import {AccessControlEnumerable} from "@openzeppelin/contracts/access/AccessControlEnumerable.sol"; /** * An implementation of ERC-2981 that allows updates by roles. */ abstract contract ERC2981Controlled is ERC2981, AccessControlEnumerable, IERC2981Controlled { bytes32 internal constant ROYALTY_ADMIN_ROLE = keccak256("ROYALTY_ADMIN_ROLE"); // // Royalty // /** * Sets the royalty information that all ids in this contract will default to. * @param receiver Address of who should be sent the royalty payment * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500) */ function setDefaultRoyalty(address receiver, uint96 feeNumerator) external onlyRole(ROYALTY_ADMIN_ROLE) { _setDefaultRoyalty(receiver, feeNumerator); } /** * Sets the royalty information that a given token id in this contract will use. * @param tokenId The token id to set the royalty information for * @param receiver Address of who should be sent the royalty payment * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500) * @notice This overrides the default royalty information for this token id */ function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external onlyRole(ROYALTY_ADMIN_ROLE) { _setTokenRoyalty(tokenId, receiver, feeNumerator); } // // Views // /** * Check interface support. * @param interfaceId Interface id * @return True if supported */ function supportsInterface(bytes4 interfaceId) public view virtual override (ERC2981, AccessControlEnumerable) returns (bool) { return ERC2981.supportsInterface(interfaceId) || AccessControlEnumerable.supportsInterface(interfaceId) || type(IERC2981Controlled).interfaceId == interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.19; import {ERC1155} from "@0xsequence/erc-1155/contracts/tokens/ERC1155/ERC1155.sol"; import { IERC1155Supply, IERC1155SupplyFunctions } from "@0xsequence/contracts-library/tokens/ERC1155/extensions/supply/IERC1155Supply.sol"; /** * An ERC-1155 extension that tracks token supply. */ abstract contract ERC1155Supply is ERC1155, IERC1155Supply { // Current supply uint256 public totalSupply; mapping(uint256 => uint256) public tokenSupply; /** * Mint _amount of tokens of a given id * @param _to The address to mint tokens to * @param _id Token id to mint * @param _amount The amount to be minted * @param _data Data to pass if receiver is contract */ function _mint(address _to, uint256 _id, uint256 _amount, bytes memory _data) internal virtual { totalSupply += _amount; tokenSupply[_id] += _amount; balances[_to][_id] += _amount; emit TransferSingle(msg.sender, address(0x0), _to, _id, _amount); _callonERC1155Received(address(0x0), _to, _id, _amount, gasleft(), _data); } /** * Mint tokens for each ids in _ids * @param _to The address to mint tokens to * @param _ids Array of ids to mint * @param _amounts Array of amount of tokens to mint per id * @param _data Data to pass if receiver is contract */ function _batchMint(address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data) internal virtual { uint256 nMint = _ids.length; if (nMint != _amounts.length) { revert InvalidArrayLength(); } // Executing all minting uint256 totalAmount = 0; for (uint256 i = 0; i < nMint; i++) { // Update storage balance balances[_to][_ids[i]] += _amounts[i]; tokenSupply[_ids[i]] += _amounts[i]; totalAmount += _amounts[i]; } totalSupply += totalAmount; emit TransferBatch(msg.sender, address(0x0), _to, _ids, _amounts); // Calling onReceive method if recipient is contract _callonERC1155BatchReceived(address(0x0), _to, _ids, _amounts, gasleft(), _data); } /** * Burn _amount of tokens of a given token id * @param _from The address to burn tokens from * @param _id Token id to burn * @param _amount The amount to be burned */ function _burn(address _from, uint256 _id, uint256 _amount) internal virtual { // Supply totalSupply -= _amount; tokenSupply[_id] -= _amount; // Balances balances[_from][_id] -= _amount; // Emit event emit TransferSingle(msg.sender, _from, address(0x0), _id, _amount); } /** * Burn tokens of given token id for each (_ids[i], _amounts[i]) pair * @param _from The address to burn tokens from * @param _ids Array of token ids to burn * @param _amounts Array of the amount to be burned */ function _batchBurn(address _from, uint256[] memory _ids, uint256[] memory _amounts) internal virtual { uint256 nBurn = _ids.length; if (nBurn != _amounts.length) { revert InvalidArrayLength(); } uint256 totalAmount = 0; for (uint256 i = 0; i < nBurn; i++) { // Update balances balances[_from][_ids[i]] -= _amounts[i]; tokenSupply[_ids[i]] -= _amounts[i]; totalAmount += _amounts[i]; } totalSupply -= totalAmount; // Emit batch mint event emit TransferBatch(msg.sender, _from, address(0x0), _ids, _amounts); } // // Views // /** * Check interface support. * @param interfaceId Interface id * @return True if supported */ function supportsInterface(bytes4 interfaceId) public view virtual override (ERC1155) returns (bool) { return type(IERC1155SupplyFunctions).interfaceId == interfaceId || super.supportsInterface(interfaceId); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; import '../../interfaces/IERC1155Metadata.sol'; import '../../utils/ERC165.sol'; /** * @notice Contract that handles metadata related methods. * @dev Methods assume a deterministic generation of URI based on token IDs. * Methods also assume that URI uses hex representation of token IDs. */ contract ERC1155Metadata is IERC1155Metadata, ERC165 { // URI's default URI prefix string public baseURI; string public name; // set the initial name and base URI constructor(string memory _name, string memory _baseURI) { name = _name; baseURI = _baseURI; } /***********************************| | Metadata Public Functions | |__________________________________*/ /** * @notice A distinct Uniform Resource Identifier (URI) for a given token. * @dev URIs are defined in RFC 3986. * URIs are assumed to be deterministically generated based on token ID * @return URI string */ function uri(uint256 _id) public view virtual override returns (string memory) { return string(abi.encodePacked(baseURI, _uint2str(_id), ".json")); } /***********************************| | Metadata Internal Functions | |__________________________________*/ /** * @notice Will emit default URI log event for corresponding token _id * @param _tokenIDs Array of IDs of tokens to log default URI */ function _logURIs(uint256[] memory _tokenIDs) internal virtual { string memory baseURL = baseURI; string memory tokenURI; for (uint256 i = 0; i < _tokenIDs.length; i++) { tokenURI = string(abi.encodePacked(baseURL, _uint2str(_tokenIDs[i]), ".json")); emit URI(tokenURI, _tokenIDs[i]); } } /** * @notice Will update the base URL of token's URI * @param _newBaseMetadataURI New base URL of token's URI */ function _setBaseMetadataURI(string memory _newBaseMetadataURI) internal { baseURI = _newBaseMetadataURI; } /** * @notice Will update the name of the contract * @param _newName New contract name */ function _setContractName(string memory _newName) internal { name = _newName; } /** * @notice Query if a contract implements an interface * @param _interfaceID The interface identifier, as specified in ERC-165 * @return `true` if the contract implements `_interfaceID` and */ function supportsInterface(bytes4 _interfaceID) public view virtual override returns (bool) { if (_interfaceID == type(IERC1155Metadata).interfaceId) { return true; } return super.supportsInterface(_interfaceID); } /***********************************| | Utility Internal Functions | |__________________________________*/ function _uint2str(uint _i) internal pure returns (string memory _uintAsString) { if (_i == 0) { return '0'; } uint j = _i; uint len; while (j != 0) { len++; j /= 10; } bytes memory bstr = new bytes(len); uint k = len; while (_i != 0) { k = k - 1; uint8 temp = (48 + uint8(_i - (_i / 10) * 10)); bytes1 b1 = bytes1(temp); bstr[k] = b1; _i /= 10; } return string(bstr); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.19; interface IERC2981ControlledFunctions { /** * Sets the royalty information that all ids in this contract will default to. * @param receiver Address of who should be sent the royalty payment * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500) */ function setDefaultRoyalty(address receiver, uint96 feeNumerator) external; /** * Sets the royalty information that a given token id in this contract will use. * @param tokenId The token id to set the royalty information for * @param receiver Address of who should be sent the royalty payment * @param feeNumerator The royalty fee numerator in basis points (e.g. 15% would be 1500) * @notice This overrides the default royalty information for this token id */ function setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) external; } interface IERC2981Controlled is IERC2981ControlledFunctions {}
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (token/common/ERC2981.sol) pragma solidity ^0.8.0; import "../../interfaces/IERC2981.sol"; import "../../utils/introspection/ERC165.sol"; /** * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information. * * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first. * * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the * fee is specified in basis points by default. * * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported. * * _Available since v4.5._ */ abstract contract ERC2981 is IERC2981, ERC165 { struct RoyaltyInfo { address receiver; uint96 royaltyFraction; } RoyaltyInfo private _defaultRoyaltyInfo; mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) { return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId); } /** * @inheritdoc IERC2981 */ function royaltyInfo(uint256 tokenId, uint256 salePrice) public view virtual override returns (address, uint256) { RoyaltyInfo memory royalty = _tokenRoyaltyInfo[tokenId]; if (royalty.receiver == address(0)) { royalty = _defaultRoyaltyInfo; } uint256 royaltyAmount = (salePrice * royalty.royaltyFraction) / _feeDenominator(); return (royalty.receiver, royaltyAmount); } /** * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an * override. */ function _feeDenominator() internal pure virtual returns (uint96) { return 10000; } /** * @dev Sets the royalty information that all ids in this contract will default to. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: invalid receiver"); _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Removes default royalty information. */ function _deleteDefaultRoyalty() internal virtual { delete _defaultRoyaltyInfo; } /** * @dev Sets the royalty information for a specific token id, overriding the global default. * * Requirements: * * - `receiver` cannot be the zero address. * - `feeNumerator` cannot be greater than the fee denominator. */ function _setTokenRoyalty(uint256 tokenId, address receiver, uint96 feeNumerator) internal virtual { require(feeNumerator <= _feeDenominator(), "ERC2981: royalty fee will exceed salePrice"); require(receiver != address(0), "ERC2981: Invalid parameters"); _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator); } /** * @dev Resets royalty information for the token id back to the global default. */ function _resetTokenRoyalty(uint256 tokenId) internal virtual { delete _tokenRoyaltyInfo[tokenId]; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControlEnumerable.sol) pragma solidity ^0.8.0; import "./IAccessControlEnumerable.sol"; import "./AccessControl.sol"; import "../utils/structs/EnumerableSet.sol"; /** * @dev Extension of {AccessControl} that allows enumerating the members of each role. */ abstract contract AccessControlEnumerable is IAccessControlEnumerable, AccessControl { using EnumerableSet for EnumerableSet.AddressSet; mapping(bytes32 => EnumerableSet.AddressSet) private _roleMembers; /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControlEnumerable).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) public view virtual override returns (address) { return _roleMembers[role].at(index); } /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) public view virtual override returns (uint256) { return _roleMembers[role].length(); } /** * @dev Overload {_grantRole} to track enumerable memberships */ function _grantRole(bytes32 role, address account) internal virtual override { super._grantRole(role, account); _roleMembers[role].add(account); } /** * @dev Overload {_revokeRole} to track enumerable memberships */ function _revokeRole(bytes32 role, address account) internal virtual override { super._revokeRole(role, account); _roleMembers[role].remove(account); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; import "../../interfaces/IERC1155TokenReceiver.sol"; import "../../interfaces/IERC1155.sol"; import "../../utils/Address.sol"; import "../../utils/ERC165.sol"; /** * @dev Implementation of Multi-Token Standard contract */ contract ERC1155 is IERC1155, ERC165 { using Address for address; /***********************************| | Variables and Events | |__________________________________*/ // onReceive function signatures bytes4 constant internal ERC1155_RECEIVED_VALUE = 0xf23a6e61; bytes4 constant internal ERC1155_BATCH_RECEIVED_VALUE = 0xbc197c81; // Objects balances mapping (address => mapping(uint256 => uint256)) internal balances; // Operator Functions mapping (address => mapping(address => bool)) internal operators; /***********************************| | Public Transfer Functions | |__________________________________*/ /** * @notice Transfers amount amount of an _id from the _from address to the _to address specified * @param _from Source address * @param _to Target address * @param _id ID of the token type * @param _amount Transfered amount * @param _data Additional data with no specified format, sent in call to `_to` */ function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes memory _data) public virtual override { require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), "ERC1155#safeTransferFrom: INVALID_OPERATOR"); require(_to != address(0),"ERC1155#safeTransferFrom: INVALID_RECIPIENT"); _safeTransferFrom(_from, _to, _id, _amount); _callonERC1155Received(_from, _to, _id, _amount, gasleft(), _data); } /** * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call) * @param _from Source addresses * @param _to Target addresses * @param _ids IDs of each token type * @param _amounts Transfer amounts per token type * @param _data Additional data with no specified format, sent in call to `_to` */ function safeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, bytes memory _data) public virtual override { // Requirements require((msg.sender == _from) || isApprovedForAll(_from, msg.sender), "ERC1155#safeBatchTransferFrom: INVALID_OPERATOR"); require(_to != address(0), "ERC1155#safeBatchTransferFrom: INVALID_RECIPIENT"); _safeBatchTransferFrom(_from, _to, _ids, _amounts); _callonERC1155BatchReceived(_from, _to, _ids, _amounts, gasleft(), _data); } /***********************************| | Internal Transfer Functions | |__________________________________*/ /** * @notice Transfers amount amount of an _id from the _from address to the _to address specified * @param _from Source address * @param _to Target address * @param _id ID of the token type * @param _amount Transfered amount */ function _safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount) internal virtual { // Update balances balances[_from][_id] -= _amount; balances[_to][_id] += _amount; // Emit event emit TransferSingle(msg.sender, _from, _to, _id, _amount); } /** * @notice Verifies if receiver is contract and if so, calls (_to).onERC1155Received(...) */ function _callonERC1155Received(address _from, address _to, uint256 _id, uint256 _amount, uint256 _gasLimit, bytes memory _data) internal virtual { // Check if recipient is contract if (_to.isContract()) { bytes4 retval = IERC1155TokenReceiver(_to).onERC1155Received{gas: _gasLimit}(msg.sender, _from, _id, _amount, _data); require(retval == ERC1155_RECEIVED_VALUE, "ERC1155#_callonERC1155Received: INVALID_ON_RECEIVE_MESSAGE"); } } /** * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call) * @param _from Source addresses * @param _to Target addresses * @param _ids IDs of each token type * @param _amounts Transfer amounts per token type */ function _safeBatchTransferFrom(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts) internal virtual { require(_ids.length == _amounts.length, "ERC1155#_safeBatchTransferFrom: INVALID_ARRAYS_LENGTH"); // Number of transfer to execute uint256 nTransfer = _ids.length; // Executing all transfers for (uint256 i = 0; i < nTransfer; i++) { // Update storage balance of previous bin balances[_from][_ids[i]] -= _amounts[i]; balances[_to][_ids[i]] += _amounts[i]; } // Emit event emit TransferBatch(msg.sender, _from, _to, _ids, _amounts); } /** * @notice Verifies if receiver is contract and if so, calls (_to).onERC1155BatchReceived(...) */ function _callonERC1155BatchReceived(address _from, address _to, uint256[] memory _ids, uint256[] memory _amounts, uint256 _gasLimit, bytes memory _data) internal virtual { // Pass data if recipient is contract if (_to.isContract()) { bytes4 retval = IERC1155TokenReceiver(_to).onERC1155BatchReceived{gas: _gasLimit}(msg.sender, _from, _ids, _amounts, _data); require(retval == ERC1155_BATCH_RECEIVED_VALUE, "ERC1155#_callonERC1155BatchReceived: INVALID_ON_RECEIVE_MESSAGE"); } } /***********************************| | Operator Functions | |__________________________________*/ /** * @notice Enable or disable approval for a third party ("operator") to manage all of caller's tokens * @param _operator Address to add to the set of authorized operators * @param _approved True if the operator is approved, false to revoke approval */ function setApprovalForAll(address _operator, bool _approved) external virtual override { // Update operator status operators[msg.sender][_operator] = _approved; emit ApprovalForAll(msg.sender, _operator, _approved); } /** * @notice Queries the approval status of an operator for a given owner * @param _owner The owner of the Tokens * @param _operator Address of authorized operator * @return isOperator True if the operator is approved, false if not */ function isApprovedForAll(address _owner, address _operator) public view virtual override returns (bool isOperator) { return operators[_owner][_operator]; } /***********************************| | Balance Functions | |__________________________________*/ /** * @notice Get the balance of an account's Tokens * @param _owner The address of the token holder * @param _id ID of the Token * @return The _owner's balance of the Token type requested */ function balanceOf(address _owner, uint256 _id) public view virtual override returns (uint256) { return balances[_owner][_id]; } /** * @notice Get the balance of multiple account/token pairs * @param _owners The addresses of the token holders * @param _ids ID of the Tokens * @return The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair) */ function balanceOfBatch(address[] memory _owners, uint256[] memory _ids) public view virtual override returns (uint256[] memory) { require(_owners.length == _ids.length, "ERC1155#balanceOfBatch: INVALID_ARRAY_LENGTH"); // Variables uint256[] memory batchBalances = new uint256[](_owners.length); // Iterate over each owner and token ID for (uint256 i = 0; i < _owners.length; i++) { batchBalances[i] = balances[_owners[i]][_ids[i]]; } return batchBalances; } /***********************************| | ERC165 Functions | |__________________________________*/ /** * @notice Query if a contract implements an interface * @param _interfaceID The interface identifier, as specified in ERC-165 * @return `true` if the contract implements `_interfaceID` and */ function supportsInterface(bytes4 _interfaceID) public view virtual override(ERC165, IERC165) returns (bool) { if (_interfaceID == type(IERC1155).interfaceId) { return true; } return super.supportsInterface(_interfaceID); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.19; interface IERC1155SupplyFunctions { /** * Returns the total supply of ERC1155 tokens. */ function totalSupply() external returns (uint256); /** * Returns the total supply of a given ERC1155 token. * @param tokenId The ERC1155 token id. */ function tokenSupply(uint256 tokenId) external returns (uint256); } interface IERC1155SupplySignals { /** * Invalid array input length. */ error InvalidArrayLength(); } interface IERC1155Supply is IERC1155SupplySignals {}
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; interface IERC1155Metadata { event URI(string _uri, uint256 indexed _id); /****************************************| | Functions | |_______________________________________*/ /** * @notice A distinct Uniform Resource Identifier (URI) for a given token. * @dev URIs are defined in RFC 3986. * URIs are assumed to be deterministically generated based on token ID * Token IDs are assumed to be represented in their hex format in URIs * @return URI string */ function uri(uint256 _id) external view returns (string memory); }
pragma solidity ^0.8.0; import "../interfaces/IERC165.sol"; abstract contract ERC165 is IERC165 { /** * @notice Query if a contract implements an interface * @param _interfaceID The interface identifier, as specified in ERC-165 * @return `true` if the contract implements `_interfaceID` */ function supportsInterface(bytes4 _interfaceID) public view virtual override returns (bool) { return _interfaceID == this.supportsInterface.selector; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (interfaces/IERC2981.sol) pragma solidity ^0.8.0; import "../utils/introspection/IERC165.sol"; /** * @dev Interface for the NFT Royalty Standard. * * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal * support for royalty payments across all NFT marketplaces and ecosystem participants. * * _Available since v4.5._ */ interface IERC2981 is IERC165 { /** * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of * exchange. The royalty amount is denominated and should be paid in that same unit of exchange. */ function royaltyInfo( uint256 tokenId, uint256 salePrice ) external view returns (address receiver, uint256 royaltyAmount); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol) pragma solidity ^0.8.0; import "./IERC165.sol"; /** * @dev Implementation of the {IERC165} interface. * * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check * for the additional interface id that will be supported. For example: * * ```solidity * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId); * } * ``` * * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation. */ abstract contract ERC165 is IERC165 { /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IERC165).interfaceId; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControlEnumerable.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; /** * @dev External interface of AccessControlEnumerable declared to support ERC165 detection. */ interface IAccessControlEnumerable is IAccessControl { /** * @dev Returns one of the accounts that have `role`. `index` must be a * value between 0 and {getRoleMemberCount}, non-inclusive. * * Role bearers are not sorted in any particular way, and their ordering may * change at any point. * * WARNING: When using {getRoleMember} and {getRoleMemberCount}, make sure * you perform all queries on the same block. See the following * https://forum.openzeppelin.com/t/iterating-over-elements-on-enumerableset-in-openzeppelin-contracts/2296[forum post] * for more information. */ function getRoleMember(bytes32 role, uint256 index) external view returns (address); /** * @dev Returns the number of accounts that have `role`. Can be used * together with {getRoleMember} to enumerate all bearers of a role. */ function getRoleMemberCount(bytes32 role) external view returns (uint256); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (access/AccessControl.sol) pragma solidity ^0.8.0; import "./IAccessControl.sol"; import "../utils/Context.sol"; import "../utils/Strings.sol"; import "../utils/introspection/ERC165.sol"; /** * @dev Contract module that allows children to implement role-based access * control mechanisms. This is a lightweight version that doesn't allow enumerating role * members except through off-chain means by accessing the contract event logs. Some * applications may benefit from on-chain enumerability, for those cases see * {AccessControlEnumerable}. * * Roles are referred to by their `bytes32` identifier. These should be exposed * in the external API and be unique. The best way to achieve this is by * using `public constant` hash digests: * * ```solidity * 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}: * * ```solidity * 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. We recommend using {AccessControlDefaultAdminRules} * to enforce additional security measures for this role. */ abstract contract AccessControl is Context, IAccessControl, ERC165 { struct RoleData { mapping(address => bool) members; bytes32 adminRole; } mapping(bytes32 => RoleData) private _roles; bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00; /** * @dev Modifier that checks that an account has a specific role. Reverts * with a standardized message including the required role. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ * * _Available since v4.1._ */ modifier onlyRole(bytes32 role) { _checkRole(role); _; } /** * @dev See {IERC165-supportsInterface}. */ function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) { return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId); } /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) public view virtual override returns (bool) { return _roles[role].members[account]; } /** * @dev Revert with a standard message if `_msgSender()` is missing `role`. * Overriding this function changes the behavior of the {onlyRole} modifier. * * Format of the revert message is described in {_checkRole}. * * _Available since v4.6._ */ function _checkRole(bytes32 role) internal view virtual { _checkRole(role, _msgSender()); } /** * @dev Revert with a standard message if `account` is missing `role`. * * The format of the revert reason is given by the following regular expression: * * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/ */ function _checkRole(bytes32 role, address account) internal view virtual { if (!hasRole(role, account)) { revert( string( abi.encodePacked( "AccessControl: account ", Strings.toHexString(account), " is missing role ", Strings.toHexString(uint256(role), 32) ) ) ); } } /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) { return _roles[role].adminRole; } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleGranted} event. */ function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _grantRole(role, account); } /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. * * May emit a {RoleRevoked} event. */ function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) { _revokeRole(role, account); } /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been revoked `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. * * May emit a {RoleRevoked} event. */ function renounceRole(bytes32 role, address account) public virtual override { require(account == _msgSender(), "AccessControl: can only renounce roles for self"); _revokeRole(role, account); } /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. Note that unlike {grantRole}, this function doesn't perform any * checks on the calling account. * * May emit a {RoleGranted} event. * * [WARNING] * ==== * This function should only be called from the constructor when setting * up the initial roles for the system. * * Using this function in any other way is effectively circumventing the admin * system imposed by {AccessControl}. * ==== * * NOTE: This function is deprecated in favor of {_grantRole}. */ function _setupRole(bytes32 role, address account) internal virtual { _grantRole(role, account); } /** * @dev Sets `adminRole` as ``role``'s admin role. * * Emits a {RoleAdminChanged} event. */ function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual { bytes32 previousAdminRole = getRoleAdmin(role); _roles[role].adminRole = adminRole; emit RoleAdminChanged(role, previousAdminRole, adminRole); } /** * @dev Grants `role` to `account`. * * Internal function without access restriction. * * May emit a {RoleGranted} event. */ function _grantRole(bytes32 role, address account) internal virtual { if (!hasRole(role, account)) { _roles[role].members[account] = true; emit RoleGranted(role, account, _msgSender()); } } /** * @dev Revokes `role` from `account`. * * Internal function without access restriction. * * May emit a {RoleRevoked} event. */ function _revokeRole(bytes32 role, address account) internal virtual { if (hasRole(role, account)) { _roles[role].members[account] = false; emit RoleRevoked(role, account, _msgSender()); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/structs/EnumerableSet.sol) // This file was procedurally generated from scripts/generate/templates/EnumerableSet.js. pragma solidity ^0.8.0; /** * @dev Library for managing * https://en.wikipedia.org/wiki/Set_(abstract_data_type)[sets] of primitive * types. * * Sets have the following properties: * * - Elements are added, removed, and checked for existence in constant time * (O(1)). * - Elements are enumerated in O(n). No guarantees are made on the ordering. * * ```solidity * contract Example { * // Add the library methods * using EnumerableSet for EnumerableSet.AddressSet; * * // Declare a set state variable * EnumerableSet.AddressSet private mySet; * } * ``` * * As of v3.3.0, sets of type `bytes32` (`Bytes32Set`), `address` (`AddressSet`) * and `uint256` (`UintSet`) are supported. * * [WARNING] * ==== * Trying to delete such a structure from storage will likely result in data corruption, rendering the structure * unusable. * See https://github.com/ethereum/solidity/pull/11843[ethereum/solidity#11843] for more info. * * In order to clean an EnumerableSet, you can either remove all elements one by one or create a fresh instance using an * array of EnumerableSet. * ==== */ library EnumerableSet { // To implement this library for multiple types with as little code // repetition as possible, we write it in terms of a generic Set type with // bytes32 values. // The Set implementation uses private functions, and user-facing // implementations (such as AddressSet) are just wrappers around the // underlying Set. // This means that we can only create new EnumerableSets for types that fit // in bytes32. struct Set { // Storage of set values bytes32[] _values; // Position of the value in the `values` array, plus 1 because index 0 // means a value is not in the set. mapping(bytes32 => uint256) _indexes; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function _add(Set storage set, bytes32 value) private returns (bool) { if (!_contains(set, value)) { set._values.push(value); // The value is stored at length-1, but we add 1 to all indexes // and use 0 as a sentinel value set._indexes[value] = set._values.length; return true; } else { return false; } } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function _remove(Set storage set, bytes32 value) private returns (bool) { // We read and store the value's index to prevent multiple reads from the same storage slot uint256 valueIndex = set._indexes[value]; if (valueIndex != 0) { // Equivalent to contains(set, value) // To delete an element from the _values array in O(1), we swap the element to delete with the last one in // the array, and then remove the last element (sometimes called as 'swap and pop'). // This modifies the order of the array, as noted in {at}. uint256 toDeleteIndex = valueIndex - 1; uint256 lastIndex = set._values.length - 1; if (lastIndex != toDeleteIndex) { bytes32 lastValue = set._values[lastIndex]; // Move the last value to the index where the value to delete is set._values[toDeleteIndex] = lastValue; // Update the index for the moved value set._indexes[lastValue] = valueIndex; // Replace lastValue's index to valueIndex } // Delete the slot where the moved value was stored set._values.pop(); // Delete the index for the deleted slot delete set._indexes[value]; return true; } else { return false; } } /** * @dev Returns true if the value is in the set. O(1). */ function _contains(Set storage set, bytes32 value) private view returns (bool) { return set._indexes[value] != 0; } /** * @dev Returns the number of values on the set. O(1). */ function _length(Set storage set) private view returns (uint256) { return set._values.length; } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function _at(Set storage set, uint256 index) private view returns (bytes32) { return set._values[index]; } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function _values(Set storage set) private view returns (bytes32[] memory) { return set._values; } // Bytes32Set struct Bytes32Set { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _add(set._inner, value); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(Bytes32Set storage set, bytes32 value) internal returns (bool) { return _remove(set._inner, value); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(Bytes32Set storage set, bytes32 value) internal view returns (bool) { return _contains(set._inner, value); } /** * @dev Returns the number of values in the set. O(1). */ function length(Bytes32Set storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(Bytes32Set storage set, uint256 index) internal view returns (bytes32) { return _at(set._inner, index); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(Bytes32Set storage set) internal view returns (bytes32[] memory) { bytes32[] memory store = _values(set._inner); bytes32[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // AddressSet struct AddressSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(AddressSet storage set, address value) internal returns (bool) { return _add(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(AddressSet storage set, address value) internal returns (bool) { return _remove(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(AddressSet storage set, address value) internal view returns (bool) { return _contains(set._inner, bytes32(uint256(uint160(value)))); } /** * @dev Returns the number of values in the set. O(1). */ function length(AddressSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(AddressSet storage set, uint256 index) internal view returns (address) { return address(uint160(uint256(_at(set._inner, index)))); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(AddressSet storage set) internal view returns (address[] memory) { bytes32[] memory store = _values(set._inner); address[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } // UintSet struct UintSet { Set _inner; } /** * @dev Add a value to a set. O(1). * * Returns true if the value was added to the set, that is if it was not * already present. */ function add(UintSet storage set, uint256 value) internal returns (bool) { return _add(set._inner, bytes32(value)); } /** * @dev Removes a value from a set. O(1). * * Returns true if the value was removed from the set, that is if it was * present. */ function remove(UintSet storage set, uint256 value) internal returns (bool) { return _remove(set._inner, bytes32(value)); } /** * @dev Returns true if the value is in the set. O(1). */ function contains(UintSet storage set, uint256 value) internal view returns (bool) { return _contains(set._inner, bytes32(value)); } /** * @dev Returns the number of values in the set. O(1). */ function length(UintSet storage set) internal view returns (uint256) { return _length(set._inner); } /** * @dev Returns the value stored at position `index` in the set. O(1). * * Note that there are no guarantees on the ordering of values inside the * array, and it may change when more values are added or removed. * * Requirements: * * - `index` must be strictly less than {length}. */ function at(UintSet storage set, uint256 index) internal view returns (uint256) { return uint256(_at(set._inner, index)); } /** * @dev Return the entire set in an array * * WARNING: This operation will copy the entire storage to memory, which can be quite expensive. This is designed * to mostly be used by view accessors that are queried without any gas fees. Developers should keep in mind that * this function has an unbounded cost, and using it as part of a state-changing function may render the function * uncallable if the set grows to a point where copying to memory consumes too much gas to fit in a block. */ function values(UintSet storage set) internal view returns (uint256[] memory) { bytes32[] memory store = _values(set._inner); uint256[] memory result; /// @solidity memory-safe-assembly assembly { result := store } return result; } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /** * @dev ERC-1155 interface for accepting safe transfers. */ interface IERC1155TokenReceiver { /** * @notice Handle the receipt of a single ERC1155 token type * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeTransferFrom` after the balance has been updated * This function MAY throw to revert and reject the transfer * Return of other amount than the magic value MUST result in the transaction being reverted * Note: The token contract address is always the message sender * @param _operator The address which called the `safeTransferFrom` function * @param _from The address which previously owned the token * @param _id The id of the token being transferred * @param _amount The amount of tokens being transferred * @param _data Additional data with no specified format * @return `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` */ function onERC1155Received(address _operator, address _from, uint256 _id, uint256 _amount, bytes calldata _data) external returns(bytes4); /** * @notice Handle the receipt of multiple ERC1155 token types * @dev An ERC1155-compliant smart contract MUST call this function on the token recipient contract, at the end of a `safeBatchTransferFrom` after the balances have been updated * This function MAY throw to revert and reject the transfer * Return of other amount than the magic value WILL result in the transaction being reverted * Note: The token contract address is always the message sender * @param _operator The address which called the `safeBatchTransferFrom` function * @param _from The address which previously owned the token * @param _ids An array containing ids of each token being transferred * @param _amounts An array containing amounts of each token being transferred * @param _data Additional data with no specified format * @return `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` */ function onERC1155BatchReceived(address _operator, address _from, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) external returns(bytes4); }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; import './IERC165.sol'; interface IERC1155 is IERC165 { /****************************************| | Events | |_______________________________________*/ /** * @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, including zero amount transfers as well as minting or burning * Operator MUST be msg.sender * When minting/creating tokens, the `_from` field MUST be set to `0x0` * When burning/destroying tokens, the `_to` field MUST be set to `0x0` * The total amount transferred from address 0x0 minus the total amount transferred to 0x0 may be used by clients and exchanges to be added to the "circulating supply" for a given token ID * To broadcast the existence of a token ID with no initial balance, the contract SHOULD emit the TransferSingle event from `0x0` to `0x0`, with the token creator as `_operator`, and a `_amount` of 0 */ event TransferSingle(address indexed _operator, address indexed _from, address indexed _to, uint256 _id, uint256 _amount); /** * @dev Either TransferSingle or TransferBatch MUST emit when tokens are transferred, including zero amount transfers as well as minting or burning * Operator MUST be msg.sender * When minting/creating tokens, the `_from` field MUST be set to `0x0` * When burning/destroying tokens, the `_to` field MUST be set to `0x0` * The total amount transferred from address 0x0 minus the total amount transferred to 0x0 may be used by clients and exchanges to be added to the "circulating supply" for a given token ID * To broadcast the existence of multiple token IDs with no initial balance, this SHOULD emit the TransferBatch event from `0x0` to `0x0`, with the token creator as `_operator`, and a `_amount` of 0 */ event TransferBatch(address indexed _operator, address indexed _from, address indexed _to, uint256[] _ids, uint256[] _amounts); /** * @dev MUST emit when an approval is updated */ event ApprovalForAll(address indexed _owner, address indexed _operator, bool _approved); /****************************************| | Functions | |_______________________________________*/ /** * @notice Transfers amount of an _id from the _from address to the _to address specified * @dev MUST emit TransferSingle event on success * Caller must be approved to manage the _from account's tokens (see isApprovedForAll) * MUST throw if `_to` is the zero address * MUST throw if balance of sender for token `_id` is lower than the `_amount` sent * MUST throw on any other error * When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). If so, it MUST call `onERC1155Received` on `_to` and revert if the return amount is not `bytes4(keccak256("onERC1155Received(address,address,uint256,uint256,bytes)"))` * @param _from Source address * @param _to Target address * @param _id ID of the token type * @param _amount Transfered amount * @param _data Additional data with no specified format, sent in call to `_to` */ function safeTransferFrom(address _from, address _to, uint256 _id, uint256 _amount, bytes calldata _data) external; /** * @notice Send multiple types of Tokens from the _from address to the _to address (with safety call) * @dev MUST emit TransferBatch event on success * Caller must be approved to manage the _from account's tokens (see isApprovedForAll) * MUST throw if `_to` is the zero address * MUST throw if length of `_ids` is not the same as length of `_amounts` * MUST throw if any of the balance of sender for token `_ids` is lower than the respective `_amounts` sent * MUST throw on any other error * When transfer is complete, this function MUST check if `_to` is a smart contract (code size > 0). If so, it MUST call `onERC1155BatchReceived` on `_to` and revert if the return amount is not `bytes4(keccak256("onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)"))` * Transfers and events MUST occur in the array order they were submitted (_ids[0] before _ids[1], etc) * @param _from Source addresses * @param _to Target addresses * @param _ids IDs of each token type * @param _amounts Transfer amounts per token type * @param _data Additional data with no specified format, sent in call to `_to` */ function safeBatchTransferFrom(address _from, address _to, uint256[] calldata _ids, uint256[] calldata _amounts, bytes calldata _data) external; /** * @notice Get the balance of an account's Tokens * @param _owner The address of the token holder * @param _id ID of the Token * @return The _owner's balance of the Token type requested */ function balanceOf(address _owner, uint256 _id) external view returns (uint256); /** * @notice Get the balance of multiple account/token pairs * @param _owners The addresses of the token holders * @param _ids ID of the Tokens * @return The _owner's balance of the Token types requested (i.e. balance for each (owner, id) pair) */ function balanceOfBatch(address[] calldata _owners, uint256[] calldata _ids) external view returns (uint256[] memory); /** * @notice Enable or disable approval for a third party ("operator") to manage all of caller's tokens * @dev MUST emit the ApprovalForAll event on success * @param _operator Address to add to the set of authorized operators * @param _approved True if the operator is approved, false to revoke approval */ function setApprovalForAll(address _operator, bool _approved) external; /** * @notice Queries the approval status of an operator for a given owner * @param _owner The owner of the Tokens * @param _operator Address of authorized operator * @return isOperator True if the operator is approved, false if not */ function isApprovedForAll(address _owner, address _operator) external view returns (bool isOperator); }
pragma solidity ^0.8.0; /** * Utility library of inline functions on addresses */ library Address { // Default hash for EOA accounts returned by extcodehash bytes32 constant internal ACCOUNT_HASH = 0xc5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470; /** * Returns whether the target address is a contract * @dev This function will return false if invoked during the constructor of a contract. * @param _address address of the account to check * @return Whether the target address is a contract */ function isContract(address _address) internal view returns (bool) { bytes32 codehash; // Currently there is no better way to check if there is a contract in an address // than to check the size of the code at that address or if it has a non-zero code hash or account hash assembly { codehash := extcodehash(_address) } return (codehash != 0x0 && codehash != ACCOUNT_HASH); } }
// SPDX-License-Identifier: Apache-2.0 pragma solidity ^0.8.0; /** * @title ERC165 * @dev https://github.com/ethereum/EIPs/blob/master/EIPS/eip-165.md */ interface IERC165 { /** * @notice Query if a contract implements an interface * @dev Interface identification is specified in ERC-165. This function * uses less than 30,000 gas * @param _interfaceId The interface identifier, as specified in ERC-165 */ function supportsInterface(bytes4 _interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol) pragma solidity ^0.8.0; /** * @dev Interface of the ERC165 standard, as defined in the * https://eips.ethereum.org/EIPS/eip-165[EIP]. * * Implementers can declare support of contract interfaces, which can then be * queried by others ({ERC165Checker}). * * For an implementation, see {ERC165}. */ interface IERC165 { /** * @dev Returns true if this contract implements the interface defined by * `interfaceId`. See the corresponding * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section] * to learn more about how these ids are created. * * This function call must use less than 30 000 gas. */ function supportsInterface(bytes4 interfaceId) external view returns (bool); }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol) pragma solidity ^0.8.0; /** * @dev External interface of AccessControl declared to support ERC165 detection. */ interface IAccessControl { /** * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole` * * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite * {RoleAdminChanged} not being emitted signaling this. * * _Available since v3.1._ */ event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole); /** * @dev Emitted when `account` is granted `role`. * * `sender` is the account that originated the contract call, an admin role * bearer except when using {AccessControl-_setupRole}. */ event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Emitted when `account` is revoked `role`. * * `sender` is the account that originated the contract call: * - if using `revokeRole`, it is the admin role bearer * - if using `renounceRole`, it is the role bearer (i.e. `account`) */ event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender); /** * @dev Returns `true` if `account` has been granted `role`. */ function hasRole(bytes32 role, address account) external view returns (bool); /** * @dev Returns the admin role that controls `role`. See {grantRole} and * {revokeRole}. * * To change a role's admin, use {AccessControl-_setRoleAdmin}. */ function getRoleAdmin(bytes32 role) external view returns (bytes32); /** * @dev Grants `role` to `account`. * * If `account` had not been already granted `role`, emits a {RoleGranted} * event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function grantRole(bytes32 role, address account) external; /** * @dev Revokes `role` from `account`. * * If `account` had been granted `role`, emits a {RoleRevoked} event. * * Requirements: * * - the caller must have ``role``'s admin role. */ function revokeRole(bytes32 role, address account) external; /** * @dev Revokes `role` from the calling account. * * Roles are often managed via {grantRole} and {revokeRole}: this function's * purpose is to provide a mechanism for accounts to lose their privileges * if they are compromised (such as when a trusted device is misplaced). * * If the calling account had been granted `role`, emits a {RoleRevoked} * event. * * Requirements: * * - the caller must be `account`. */ function renounceRole(bytes32 role, address account) external; }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts v4.4.1 (utils/Context.sol) pragma solidity ^0.8.0; /** * @dev Provides information about the current execution context, including the * sender of the transaction and its data. While these are generally available * via msg.sender and msg.data, they should not be accessed in such a direct * manner, since when dealing with meta-transactions the account sending and * paying for execution may not be the actual sender (as far as an application * is concerned). * * This contract is only required for intermediate, library-like contracts. */ abstract contract Context { function _msgSender() internal view virtual returns (address) { return msg.sender; } function _msgData() internal view virtual returns (bytes calldata) { return msg.data; } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/Strings.sol) pragma solidity ^0.8.0; import "./math/Math.sol"; import "./math/SignedMath.sol"; /** * @dev String operations. */ library Strings { bytes16 private constant _SYMBOLS = "0123456789abcdef"; uint8 private constant _ADDRESS_LENGTH = 20; /** * @dev Converts a `uint256` to its ASCII `string` decimal representation. */ function toString(uint256 value) internal pure returns (string memory) { unchecked { uint256 length = Math.log10(value) + 1; string memory buffer = new string(length); uint256 ptr; /// @solidity memory-safe-assembly assembly { ptr := add(buffer, add(32, length)) } while (true) { ptr--; /// @solidity memory-safe-assembly assembly { mstore8(ptr, byte(mod(value, 10), _SYMBOLS)) } value /= 10; if (value == 0) break; } return buffer; } } /** * @dev Converts a `int256` to its ASCII `string` decimal representation. */ function toString(int256 value) internal pure returns (string memory) { return string(abi.encodePacked(value < 0 ? "-" : "", toString(SignedMath.abs(value)))); } /** * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation. */ function toHexString(uint256 value) internal pure returns (string memory) { unchecked { return toHexString(value, Math.log256(value) + 1); } } /** * @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] = _SYMBOLS[value & 0xf]; value >>= 4; } require(value == 0, "Strings: hex length insufficient"); return string(buffer); } /** * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation. */ function toHexString(address addr) internal pure returns (string memory) { return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH); } /** * @dev Returns true if the two strings are equal. */ function equal(string memory a, string memory b) internal pure returns (bool) { return keccak256(bytes(a)) == keccak256(bytes(b)); } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.9.0) (utils/math/Math.sol) pragma solidity ^0.8.0; /** * @dev Standard math utilities missing in the Solidity language. */ library Math { enum Rounding { Down, // Toward negative infinity Up, // Toward infinity Zero // Toward zero } /** * @dev Returns the largest of two numbers. */ function max(uint256 a, uint256 b) internal pure returns (uint256) { return a > b ? a : b; } /** * @dev Returns the smallest of two numbers. */ function min(uint256 a, uint256 b) internal pure returns (uint256) { return a < b ? a : b; } /** * @dev Returns the average of two numbers. The result is rounded towards * zero. */ function average(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b) / 2 can overflow. return (a & b) + (a ^ b) / 2; } /** * @dev Returns the ceiling of the division of two numbers. * * This differs from standard division with `/` in that it rounds up instead * of rounding down. */ function ceilDiv(uint256 a, uint256 b) internal pure returns (uint256) { // (a + b - 1) / b can overflow on addition, so we distribute. return a == 0 ? 0 : (a - 1) / b + 1; } /** * @notice Calculates floor(x * y / denominator) with full precision. Throws if result overflows a uint256 or denominator == 0 * @dev Original credit to Remco Bloemen under MIT license (https://xn--2-umb.com/21/muldiv) * with further edits by Uniswap Labs also under MIT license. */ function mulDiv(uint256 x, uint256 y, uint256 denominator) internal pure returns (uint256 result) { unchecked { // 512-bit multiply [prod1 prod0] = x * y. Compute the product mod 2^256 and mod 2^256 - 1, then use // use the Chinese Remainder Theorem to reconstruct the 512 bit result. The result is stored in two 256 // variables such that product = prod1 * 2^256 + prod0. uint256 prod0; // Least significant 256 bits of the product uint256 prod1; // Most significant 256 bits of the product assembly { let mm := mulmod(x, y, not(0)) prod0 := mul(x, y) prod1 := sub(sub(mm, prod0), lt(mm, prod0)) } // Handle non-overflow cases, 256 by 256 division. if (prod1 == 0) { // Solidity will revert if denominator == 0, unlike the div opcode on its own. // The surrounding unchecked block does not change this fact. // See https://docs.soliditylang.org/en/latest/control-structures.html#checked-or-unchecked-arithmetic. return prod0 / denominator; } // Make sure the result is less than 2^256. Also prevents denominator == 0. require(denominator > prod1, "Math: mulDiv overflow"); /////////////////////////////////////////////// // 512 by 256 division. /////////////////////////////////////////////// // Make division exact by subtracting the remainder from [prod1 prod0]. uint256 remainder; assembly { // Compute remainder using mulmod. remainder := mulmod(x, y, denominator) // Subtract 256 bit number from 512 bit number. prod1 := sub(prod1, gt(remainder, prod0)) prod0 := sub(prod0, remainder) } // Factor powers of two out of denominator and compute largest power of two divisor of denominator. Always >= 1. // See https://cs.stackexchange.com/q/138556/92363. // Does not overflow because the denominator cannot be zero at this stage in the function. uint256 twos = denominator & (~denominator + 1); assembly { // Divide denominator by twos. denominator := div(denominator, twos) // Divide [prod1 prod0] by twos. prod0 := div(prod0, twos) // Flip twos such that it is 2^256 / twos. If twos is zero, then it becomes one. twos := add(div(sub(0, twos), twos), 1) } // Shift in bits from prod1 into prod0. prod0 |= prod1 * twos; // Invert denominator mod 2^256. Now that denominator is an odd number, it has an inverse modulo 2^256 such // that denominator * inv = 1 mod 2^256. Compute the inverse by starting with a seed that is correct for // four bits. That is, denominator * inv = 1 mod 2^4. uint256 inverse = (3 * denominator) ^ 2; // Use the Newton-Raphson iteration to improve the precision. Thanks to Hensel's lifting lemma, this also works // in modular arithmetic, doubling the correct bits in each step. inverse *= 2 - denominator * inverse; // inverse mod 2^8 inverse *= 2 - denominator * inverse; // inverse mod 2^16 inverse *= 2 - denominator * inverse; // inverse mod 2^32 inverse *= 2 - denominator * inverse; // inverse mod 2^64 inverse *= 2 - denominator * inverse; // inverse mod 2^128 inverse *= 2 - denominator * inverse; // inverse mod 2^256 // Because the division is now exact we can divide by multiplying with the modular inverse of denominator. // This will give us the correct result modulo 2^256. Since the preconditions guarantee that the outcome is // less than 2^256, this is the final result. We don't need to compute the high bits of the result and prod1 // is no longer required. result = prod0 * inverse; return result; } } /** * @notice Calculates x * y / denominator with full precision, following the selected rounding direction. */ function mulDiv(uint256 x, uint256 y, uint256 denominator, Rounding rounding) internal pure returns (uint256) { uint256 result = mulDiv(x, y, denominator); if (rounding == Rounding.Up && mulmod(x, y, denominator) > 0) { result += 1; } return result; } /** * @dev Returns the square root of a number. If the number is not a perfect square, the value is rounded down. * * Inspired by Henry S. Warren, Jr.'s "Hacker's Delight" (Chapter 11). */ function sqrt(uint256 a) internal pure returns (uint256) { if (a == 0) { return 0; } // For our first guess, we get the biggest power of 2 which is smaller than the square root of the target. // // We know that the "msb" (most significant bit) of our target number `a` is a power of 2 such that we have // `msb(a) <= a < 2*msb(a)`. This value can be written `msb(a)=2**k` with `k=log2(a)`. // // This can be rewritten `2**log2(a) <= a < 2**(log2(a) + 1)` // → `sqrt(2**k) <= sqrt(a) < sqrt(2**(k+1))` // → `2**(k/2) <= sqrt(a) < 2**((k+1)/2) <= 2**(k/2 + 1)` // // Consequently, `2**(log2(a) / 2)` is a good first approximation of `sqrt(a)` with at least 1 correct bit. uint256 result = 1 << (log2(a) >> 1); // At this point `result` is an estimation with one bit of precision. We know the true value is a uint128, // since it is the square root of a uint256. Newton's method converges quadratically (precision doubles at // every iteration). We thus need at most 7 iteration to turn our partial result with one bit of precision // into the expected uint128 result. unchecked { result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; result = (result + a / result) >> 1; return min(result, a / result); } } /** * @notice Calculates sqrt(a), following the selected rounding direction. */ function sqrt(uint256 a, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = sqrt(a); return result + (rounding == Rounding.Up && result * result < a ? 1 : 0); } } /** * @dev Return the log in base 2, rounded down, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 128; } if (value >> 64 > 0) { value >>= 64; result += 64; } if (value >> 32 > 0) { value >>= 32; result += 32; } if (value >> 16 > 0) { value >>= 16; result += 16; } if (value >> 8 > 0) { value >>= 8; result += 8; } if (value >> 4 > 0) { value >>= 4; result += 4; } if (value >> 2 > 0) { value >>= 2; result += 2; } if (value >> 1 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 2, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log2(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log2(value); return result + (rounding == Rounding.Up && 1 << result < value ? 1 : 0); } } /** * @dev Return the log in base 10, rounded down, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >= 10 ** 64) { value /= 10 ** 64; result += 64; } if (value >= 10 ** 32) { value /= 10 ** 32; result += 32; } if (value >= 10 ** 16) { value /= 10 ** 16; result += 16; } if (value >= 10 ** 8) { value /= 10 ** 8; result += 8; } if (value >= 10 ** 4) { value /= 10 ** 4; result += 4; } if (value >= 10 ** 2) { value /= 10 ** 2; result += 2; } if (value >= 10 ** 1) { result += 1; } } return result; } /** * @dev Return the log in base 10, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log10(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log10(value); return result + (rounding == Rounding.Up && 10 ** result < value ? 1 : 0); } } /** * @dev Return the log in base 256, rounded down, of a positive value. * Returns 0 if given 0. * * Adding one to the result gives the number of pairs of hex symbols needed to represent `value` as a hex string. */ function log256(uint256 value) internal pure returns (uint256) { uint256 result = 0; unchecked { if (value >> 128 > 0) { value >>= 128; result += 16; } if (value >> 64 > 0) { value >>= 64; result += 8; } if (value >> 32 > 0) { value >>= 32; result += 4; } if (value >> 16 > 0) { value >>= 16; result += 2; } if (value >> 8 > 0) { result += 1; } } return result; } /** * @dev Return the log in base 256, following the selected rounding direction, of a positive value. * Returns 0 if given 0. */ function log256(uint256 value, Rounding rounding) internal pure returns (uint256) { unchecked { uint256 result = log256(value); return result + (rounding == Rounding.Up && 1 << (result << 3) < value ? 1 : 0); } } }
// SPDX-License-Identifier: MIT // OpenZeppelin Contracts (last updated v4.8.0) (utils/math/SignedMath.sol) pragma solidity ^0.8.0; /** * @dev Standard signed math utilities missing in the Solidity language. */ library SignedMath { /** * @dev Returns the largest of two signed numbers. */ function max(int256 a, int256 b) internal pure returns (int256) { return a > b ? a : b; } /** * @dev Returns the smallest of two signed numbers. */ function min(int256 a, int256 b) internal pure returns (int256) { return a < b ? a : b; } /** * @dev Returns the average of two signed numbers without overflow. * The result is rounded towards zero. */ function average(int256 a, int256 b) internal pure returns (int256) { // Formula from the book "Hacker's Delight" int256 x = (a & b) + ((a ^ b) >> 1); return x + (int256(uint256(x) >> 255) & (a ^ b)); } /** * @dev Returns the absolute unsigned value of a signed value. */ function abs(int256 n) internal pure returns (uint256) { unchecked { // must be unchecked in order to support `n = type(int256).min` return uint256(n >= 0 ? n : -n); } } }
{ "viaIR": true, "codegen": "yul", "remappings": [ "@0xsequence/contracts-library/=src/", "ds-test/=lib/forge-std/lib/ds-test/src/", "forge-std/=lib/forge-std/src/", "murky/=lib/murky/src/", "@0xsequence/erc20-meta-token/=lib/0xsequence/erc20-meta-token/src/", "@0xsequence/erc-1155/=lib/0xsequence/erc-1155/src/", "erc721a/=lib/chiru-labs/erc721a/", "erc721a-upgradeable/=lib/chiru-labs/erc721a-upgradeable/", "@openzeppelin/=lib/openzeppelin/", "@openzeppelin-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "solady/=lib/solady/src/", "0xsequence/=lib/0xsequence/", "chiru-labs/=lib/chiru-labs/", "erc4626-tests/=lib/openzeppelin-contracts-upgradeable/lib/erc4626-tests/", "openzeppelin-contracts-upgradeable/=lib/openzeppelin-contracts-upgradeable/", "openzeppelin-contracts/=lib/murky/lib/openzeppelin-contracts/", "openzeppelin/=lib/openzeppelin/" ], "evmVersion": "paris", "outputSelection": { "*": { "*": [ "abi" ] } }, "optimizer": { "enabled": true, "mode": "3", "fallback_to_optimizing_for_size": false, "disable_system_request_memoization": true }, "metadata": {}, "libraries": {}, "enableEraVMExtensions": false, "forceEVMLA": false }
[{"inputs":[],"stateMutability":"nonpayable","type":"constructor"},{"inputs":[],"name":"InvalidArrayLength","type":"error"},{"inputs":[],"name":"InvalidInitialization","type":"error"},{"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":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256[]","name":"_ids","type":"uint256[]"},{"indexed":false,"internalType":"uint256[]","name":"_amounts","type":"uint256[]"}],"name":"TransferBatch","type":"event"},{"anonymous":false,"inputs":[{"indexed":true,"internalType":"address","name":"_operator","type":"address"},{"indexed":true,"internalType":"address","name":"_from","type":"address"},{"indexed":true,"internalType":"address","name":"_to","type":"address"},{"indexed":false,"internalType":"uint256","name":"_id","type":"uint256"},{"indexed":false,"internalType":"uint256","name":"_amount","type":"uint256"}],"name":"TransferSingle","type":"event"},{"anonymous":false,"inputs":[{"indexed":false,"internalType":"string","name":"_uri","type":"string"},{"indexed":true,"internalType":"uint256","name":"_id","type":"uint256"}],"name":"URI","type":"event"},{"inputs":[],"name":"DEFAULT_ADMIN_ROLE","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"balanceOf","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address[]","name":"_owners","type":"address[]"},{"internalType":"uint256[]","name":"_ids","type":"uint256[]"}],"name":"balanceOfBatch","outputs":[{"internalType":"uint256[]","name":"","type":"uint256[]"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"baseURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"}],"name":"batchBurn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256[]","name":"tokenIds","type":"uint256[]"},{"internalType":"uint256[]","name":"amounts","type":"uint256[]"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"batchMint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"}],"name":"burn","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"contractURI","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleAdmin","outputs":[{"internalType":"bytes32","name":"","type":"bytes32"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"uint256","name":"index","type":"uint256"}],"name":"getRoleMember","outputs":[{"internalType":"address","name":"","type":"address"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"}],"name":"getRoleMemberCount","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"grantRole","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"bytes32","name":"role","type":"bytes32"},{"internalType":"address","name":"account","type":"address"}],"name":"hasRole","outputs":[{"internalType":"bool","name":"","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"owner","type":"address"},{"internalType":"string","name":"tokenName","type":"string"},{"internalType":"string","name":"tokenBaseURI","type":"string"},{"internalType":"string","name":"tokenContractURI","type":"string"},{"internalType":"address","name":"royaltyReceiver","type":"address"},{"internalType":"uint96","name":"royaltyFeeNumerator","type":"uint96"}],"name":"initialize","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_owner","type":"address"},{"internalType":"address","name":"_operator","type":"address"}],"name":"isApprovedForAll","outputs":[{"internalType":"bool","name":"isOperator","type":"bool"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"address","name":"to","type":"address"},{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"amount","type":"uint256"},{"internalType":"bytes","name":"data","type":"bytes"}],"name":"mint","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[],"name":"name","outputs":[{"internalType":"string","name":"","type":"string"}],"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":"uint256","name":"tokenId","type":"uint256"},{"internalType":"uint256","name":"salePrice","type":"uint256"}],"name":"royaltyInfo","outputs":[{"internalType":"address","name":"","type":"address"},{"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":"_ids","type":"uint256[]"},{"internalType":"uint256[]","name":"_amounts","type":"uint256[]"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeBatchTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_from","type":"address"},{"internalType":"address","name":"_to","type":"address"},{"internalType":"uint256","name":"_id","type":"uint256"},{"internalType":"uint256","name":"_amount","type":"uint256"},{"internalType":"bytes","name":"_data","type":"bytes"}],"name":"safeTransferFrom","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"_operator","type":"address"},{"internalType":"bool","name":"_approved","type":"bool"}],"name":"setApprovalForAll","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenBaseURI","type":"string"}],"name":"setBaseMetadataURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenName","type":"string"}],"name":"setContractName","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"string","name":"tokenContractURI","type":"string"}],"name":"setContractURI","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setDefaultRoyalty","outputs":[],"stateMutability":"nonpayable","type":"function"},{"inputs":[{"internalType":"uint256","name":"tokenId","type":"uint256"},{"internalType":"address","name":"receiver","type":"address"},{"internalType":"uint96","name":"feeNumerator","type":"uint96"}],"name":"setTokenRoyalty","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":[{"internalType":"uint256","name":"","type":"uint256"}],"name":"tokenSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[],"name":"totalSupply","outputs":[{"internalType":"uint256","name":"","type":"uint256"}],"stateMutability":"view","type":"function"},{"inputs":[{"internalType":"uint256","name":"_id","type":"uint256"}],"name":"uri","outputs":[{"internalType":"string","name":"","type":"string"}],"stateMutability":"view","type":"function"}]
Contract Creation Code
9c4d535b0000000000000000000000000000000000000000000000000000000000000000010006a128ec6a3b3bee5d51e824f145b1cbdc867b49d6892e007859426a4b8300000000000000000000000000000000000000000000000000000000000000600000000000000000000000000000000000000000000000000000000000000000
Deployed Bytecode
0x0002000000000002000c000000000002000000000501034f00000060011002700001000000050355000006050010019d00000001002001900000002f0000c13d00000605011001970000008002000039000000400020043f000000040010008c0000132f0000413d000000000305043b000000e003300270000006090030009c000000480000213d000000000215034f000006210030009c000001900000213d0000062d0030009c000003970000213d000006330030009c0000045e0000213d000006360030009c0000076a0000613d000006370030009c0000132f0000c13d000000240010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000000401500370000000000201043b0000065f002001980000132f0000c13d0000000101000039000006840020009c00000ae70000a13d000006850020009c000009910000613d000006860020009c000009910000613d000006870020009c000009910000613d00000aeb0000013d000000a001000039000000400010043f0000000001000416000000000001004b0000132f0000c13d000000a00000043f000000e001000039000000400010043f000000c00000043f0000000503000039000000000103041a000000010210019000000001041002700000007f0440618f0000001f0040008c00000000010000390000000101002039000000000012004b0000016d0000613d0000067e01000041000000000010043f0000002201000039000000040010043f0000067f0100004100001810000104300000060a0030009c000001a20000213d000006160030009c000003c80000213d0000061c0030009c000004810000213d0000061f0030009c0000077d0000613d000006200030009c0000132f0000c13d000000840010008c0000132f0000413d0000000002000416000000000002004b0000132f0000c13d0000000402500370000000000202043b000c00000002001d000006380020009c0000132f0000213d0000004402500370000000000202043b000b00000002001d0000002402500370000000000202043b000a00000002001d0000006402500370000000000302043b000006390030009c0000132f0000213d0000002302300039000000000012004b0000132f0000813d0000000404300039000000000245034f000000000202043b000006390020009c0000018a0000213d000000000605034f0000001f0520003900000690055001970000003f0550003900000690055001970000063a0050009c0000018a0000213d0000008005500039000000400050043f000000800020043f00000000032300190000002403300039000000000013004b0000132f0000213d0000002001400039000000000316034f00000690042001980000001f0520018f000000a001400039000000880000613d000000a006000039000000000703034f000000007807043c0000000006860436000000000016004b000000840000c13d000000000005004b000000950000613d000000000343034f0000000304500210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000a0012000390000000000010435180e14f00000040f0000000201000039000000000201041a0000000b03000029000000000032001a000007b70000413d0000000002320019000000000021041b0000000a01000029000000000010043f0000000301000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a0000000b03000029000000000032001a000007b70000413d0000000002320019000000000021041b0000000c01000029000000000010043f000000200000043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000a02000029000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a0000000b03000029000000000032001a000007b70000413d0000000002320019000000000021041b000000400100043d000000200210003900000000003204350000000a020000290000000000210435000006050010009c000006050100804100000040011002100000000002000414000006050020009c0000060502008041000000c002200210000000000112019f0000064a011001c70000800d0200003900000004030000390000000005000411000006590400004100000000060000190000000c07000029180e18040000040f00000001002001900000132f0000613d0000000001000414000900000001001d0000065a0100004100000000001004430000000c0100002900000004001004430000000001000414000006050010009c0000060501008041000000c0011002100000065b011001c70000800202000039180e18090000040f000000010020019000000fab0000613d000000000101043b000000000001004b00000a980000613d0000065c0010009c00000a980000613d000000400300043d0000008401300039000000a002000039000000000021043500000064013000390000000b02000029000000000021043500000044013000390000000a0200002900000000002104350000065d01000041000000000013043500000004013000390000000002000411000000000021043500000024013000390000000000010435000000a402300039000000800100043d0000000000120435000800000003001d000000c402300039000000000001004b0000011e0000613d00000000030000190000000004230019000000a005300039000000000505043300000000005404350000002003300039000000000013004b000001170000413d0000001f03100039000006900330019700000000012100190000000000010435000000c401300039000006050010009c000006050100804100000060011002100000000802000029000006050020009c00000605020080410000004002200210000000000121019f0000000902000029000006050020009c0000060502008041000000c002200210000000000121019f0000000c02000029180e18040000040f00000060031002700000060503300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000805700029000001410000613d000000000801034f0000000809000029000000008a08043c0000000009a90436000000000059004b0000013d0000c13d000000000006004b0000014e0000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000010020019000000e130000613d0000001f01400039000000600210018f0000000801200029000000000021004b00000000020000390000000102004039000006390010009c0000018a0000213d00000001002001900000018a0000c13d000000400010043f000000200030008c0000132f0000413d000000080200002900000000020204330000065f002001980000132f0000c13d00000660022001970000065d0020009c00000a980000613d00000064021000390000066103000041000000000032043500000044021000390000066203000041000000000032043500000024021000390000003a03000039000006470000013d000000200040008c000001860000413d000c00000004001d000000000030043f0000000001000414000006050010009c0000060501008041000000c00110021000000606011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000c020000290000001f0220003900000005022002700000000002210019000000000021004b0000000503000039000001860000813d000000000001041b0000000101100039000000000021004b000001820000413d000000000003041b000000c00500043d000006070050009c0000033f0000413d0000067e01000041000000000010043f0000004101000039000000040010043f0000067f010000410000181000010430000006220030009c000004300000213d000006280030009c000004a30000213d0000062b0030009c0000079c0000613d0000062c0030009c0000132f0000c13d000000240010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000000401500370000000000101043b000000000010043f0000000301000039000009850000013d0000060b0030009c000004470000213d000006110030009c000005650000213d000006140030009c000007aa0000613d000006150030009c0000132f0000c13d000000840010008c0000132f0000413d0000000003000416000000000003004b0000132f0000c13d0000000403500370000000000303043b000300000003001d000006380030009c0000132f0000213d0000002403500370000000000303043b000006390030009c0000132f0000213d0000002304300039000000000014004b0000132f0000813d0000000404300039000000000705034f000000000445034f000000000504043b000006390050009c0000018a0000213d00000005045002100000003f0640003900000665066001970000063a0060009c0000018a0000213d0000008006600039000000400060043f000000800050043f00000024033000390000000004340019000000000014004b0000132f0000213d000000000607034f000000000005004b000001d70000613d000000000536034f000000000505043b000000200220003900000000005204350000002003300039000000000043004b000001d00000413d0000004402600370000000000202043b000006390020009c0000132f0000213d0000002303200039000000000013004b000000000400001900000666040080410000066603300197000000000003004b00000000050000190000066605004041000006660030009c000000000504c019000000000005004b0000132f0000c13d0000000403200039000000000336034f000000000303043b000006390030009c0000018a0000213d00000005043002100000003f054000390000066505500197000000400600043d0000000005560019000900000006001d000000000065004b00000000060000390000000106004039000006390050009c0000018a0000213d00000001006001900000018a0000c13d000000400050043f00000009050000290000000005350436000600000005001d00000024022000390000000004240019000000000014004b0000132f0000213d000000000607034f000000000003004b0000020c0000613d0000000903000029000000000526034f000000000505043b000000200330003900000000005304350000002002200039000000000042004b000002050000413d0000006402600370000000000302043b000006390030009c0000132f0000213d0000002302300039000000000012004b000000000400001900000666040080410000066602200197000000000002004b00000000050000190000066605004041000006660020009c000000000504c019000000000005004b0000132f0000c13d0000000404300039000000000246034f000000000202043b000006390020009c0000018a0000213d0000001f0520003900000690055001970000003f055000390000069005500197000000400600043d0000000005560019000200000006001d000000000065004b00000000060000390000000106004039000006390050009c0000018a0000213d00000001006001900000018a0000c13d000000400050043f00000002050000290000000005250436000100000005001d00000000032300190000002403300039000000000013004b0000132f0000213d0000002001400039000000000317034f00000690042001980000001f0520018f0000000101400029000002430000613d000000000603034f0000000107000029000000006806043c0000000007870436000000000017004b0000023f0000c13d000000000005004b000002500000613d000000000343034f0000000304500210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f000000000031043500000001012000290000000000010435180e14f00000040f00000009010000290000000001010433000000800200043d000500000002001d000000000012004b00000d0e0000c13d0000000301000029000406380010019b000000050000006b000b00000000001d00000e490000c13d0000000201000039000000000201041a0000000b0020002a000007b70000413d0000000b02200029000000000021041b0000004002000039000000400100043d00000000022104360000004003100039000000800400043d00000000004304350000006003100039000000000004004b000002750000613d000000800500003900000000060000190000002005500039000000000705043300000000037304360000000106600039000000000046004b0000026f0000413d00000000041300490000000000420435000000090200002900000000040204330000000002430436000000000004004b000002840000613d000000000300001900000009050000290000002005500039000000000605043300000000026204360000000103300039000000000043004b0000027e0000413d0000000002120049000006050020009c00000605020080410000006002200210000006050010009c00000605010080410000004001100210000000000112019f0000000002000414000006050020009c0000060502008041000000c002200210000000000121019f0000064b011001c70000800d0200003900000004030000390000066704000041000000000500041100000000060000190000000407000029180e18040000040f00000001002001900000132f0000613d0000000001000414000c00000001001d0000065a010000410000000000100443000000030100002900000004001004430000000001000414000006050010009c0000060501008041000000c0011002100000065b011001c70000800202000039180e18090000040f000000010020019000000fab0000613d000000000101043b000000000001004b00000a980000613d0000065c0010009c00000a980000613d000000400300043d0000004401300039000000a00200003900000000002104350000066801000041000000000013043500000004013000390000000002000411000000000021043500000024013000390000000000010435000000a401300039000000800200043d0000000000210435000b00000003001d000000c401300039000000000002004b000002c90000613d000000800300003900000000040000190000002003300039000000000503043300000000015104360000000104400039000000000024004b000002c30000413d0000000b030000290000000002310049000000040220008a00000064033000390000000000230435000000090200002900000000020204330000000001210436000000000002004b000002db0000613d000000000300001900000009050000290000002005500039000000000405043300000000014104360000000103300039000000000023004b000002d50000413d0000000b030000290000000002310049000000040220008a00000084033000390000000000230435000000020200002900000000020204330000000001210436000000000002004b0000000106000029000002ee0000613d000000000300001900000000041300190000000005630019000000000505043300000000005404350000002003300039000000000023004b000002e70000413d0000001f0320003900000690033001970000000b050000290000000004510049000000000334001900000000011200190000000000010435000006050030009c00000605030080410000006001300210000006050050009c000006050200004100000000020540190000004002200210000000000121019f0000000c02000029000006050020009c0000060502008041000000c002200210000000000121019f0000000402000029180e18040000040f00000060031002700000060503300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000b05700029000003130000613d000000000801034f0000000b09000029000000008a08043c0000000009a90436000000000059004b0000030f0000c13d000000000006004b000003200000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f000000000065043500000001002001900000103c0000613d0000001f01400039000000600210018f0000000b01200029000000000021004b00000000020000390000000102004039000006390010009c0000018a0000213d00000001002001900000018a0000c13d000000400010043f000000200030008c0000132f0000413d0000000b0200002900000000020204330000065f002001980000132f0000c13d0000066002200197000006680020009c00000a980000613d00000064021000390000066903000041000000000032043500000044021000390000066a03000041000000000032043500000024021000390000003f03000039000006470000013d0000000404000039000000000104041a000000010010019000000001031002700000007f0330618f0000001f0030008c00000000020000390000000102002039000000000121013f0000000100100190000000420000c13d000000200030008c0000036a0000413d000b00000003001d000c00000005001d000000000040043f0000000001000414000006050010009c0000060501008041000000c00110021000000606011001c70000801002000039180e18090000040f00000001002001900000132f0000613d0000000c050000290000001f025000390000000502200270000000200050008c0000000002004019000000000301043b0000000b010000290000001f01100039000000050110027000000000011300190000000002230019000000000012004b00000004040000390000036a0000813d000000000002041b0000000102200039000000000012004b000003660000413d0000001f0050008c000007550000a13d000c00000005001d000000000040043f0000000001000414000006050010009c0000060501008041000000c00110021000000606011001c70000801002000039180e18090000040f00000001002001900000132f0000613d0000000c060000290000069002600198000000000101043b000000e0040000390000038a0000613d000000010320008a00000005033002700000000003310019000000200400003900000001033000390000000005040019000000c0044000390000000004040433000000000041041b00000020045000390000000101100039000000000031004b000003810000c13d000000e004500039000000000062004b000003930000813d0000000302600210000000f80220018f000006910220027f00000691022001670000000003040433000000000223016f000000000021041b0000000101000039000000010260021000000004040000390000075e0000013d0000062e0030009c000005830000213d000006310030009c000007bd0000613d000006320030009c0000132f0000c13d000000240010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000000401500370000000000101043b000000000001004b00000aa00000c13d000000c006000039000000400060043f0000000101000039000000800010043f0000068201000041000000a00010043f0000000404000039000000000304041a000000010530019000000001013002700000007f0110618f0000001f0010008c00000000020000390000000102002039000000000223013f0000000100200190000000420000c13d0000002002600039000000000005004b000c00000006001d00000b070000613d000000000040043f000000000001004b00000b090000613d000006440300004100000000040000190000000005240019000000000603041a000000000065043500000001033000390000002004400039000000000014004b000003c00000413d00000b090000013d000006170030009c000005e00000213d0000061a0030009c0000081f0000613d0000061b0030009c0000132f0000c13d000000240010008c0000132f0000413d0000000002000416000000000002004b0000132f0000c13d0000000402500370000000000302043b000006390030009c0000132f0000213d0000002302300039000000000012004b0000132f0000813d0000000404300039000000000245034f000000000202043b000006390020009c0000018a0000213d000000000605034f0000001f0520003900000690055001970000003f0550003900000690055001970000063a0050009c0000018a0000213d0000008005500039000000400050043f000000800020043f00000000032300190000002403300039000000000013004b0000132f0000213d0000002001400039000000000316034f00000690042001980000001f0520018f000000a001400039000003f90000613d000000a006000039000000000703034f000000007807043c0000000006860436000000000016004b000003f50000c13d000000000005004b000004060000613d000000000343034f0000000304500210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000a0012000390000000000010435180e14350000040f000000800200043d000006390020009c0000018a0000213d0000000a01000039000000000401041a000000010040019000000001034002700000007f0330618f0000001f0030008c00000000050000390000000105002039000000000454013f0000000100400190000000420000c13d000000200030008c000004280000413d000000000010043f0000001f042000390000000504400270000006460440009a000000200020008c00000647040040410000001f033000390000000503300270000006460330009a000000000034004b000004280000813d000000000004041b0000000104400039000000000034004b000004240000413d0000001f0020008c00000b6d0000a13d000000000010043f000006900420019800000ca60000c13d000000a005000039000006470300004100000cb40000013d000006230030009c000006270000213d000006260030009c0000083c0000613d000006270030009c0000132f0000c13d000000440010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000002401500370000000000101043b000006380010009c0000132f0000213d0000000002000411000000000021004b00000adb0000c13d0000000401500370000000000101043b180e16730000040f00000000010000190000180f0001042e0000060c0030009c000006520000213d0000060f0030009c000008af0000613d000006100030009c0000132f0000c13d000000440010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000000401500370000000000101043b000006380010009c0000132f0000213d0000002402500370000000000202043b000c00000002001d000006380020009c0000132f0000213d000000000010043f00000001010000390000082d0000013d000006340030009c000008c50000613d000006350030009c0000132f0000c13d0000000001000416000000000001004b0000132f0000c13d0000000503000039000000000203041a000000010420019000000001012002700000007f0110618f0000001f0010008c00000000050000390000000105002039000000000552013f0000000100500190000000420000c13d000000800010043f000000000004004b00000a9a0000613d000000000030043f000000000001004b00000ad90000613d000006410200004100000000040000190000000003040019000000000402041a000000a005300039000000000045043500000001022000390000002004300039000000000014004b000004780000413d00000b2b0000013d0000061d0030009c000008da0000613d0000061e0030009c0000132f0000c13d000000440010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000000401500370000000000101043b000000000010043f0000000901000039000000200010043f0000002401500370000000000101043b000c00000001001d0000004001000039180e17f30000040f0000000c02000029180e17570000040f0000000302200210000000000101041a000000000121022f0000063801100197000000ff0020008c0000000001002019000000400200043d0000000000120435000006050020009c000006050200804100000040012002100000066c011001c70000180f0001042e000006290030009c0000093c0000613d0000062a0030009c0000132f0000c13d000000a40010008c0000132f0000413d0000000002000416000000000002004b0000132f0000c13d0000000402500370000000000202043b000006380020009c0000132f0000213d0000002403500370000000000303043b000700000003001d000006380030009c0000132f0000213d0000004403500370000000000303043b000006390030009c0000132f0000213d0000002304300039000000000014004b0000132f0000813d0000000404300039000000000805034f000000000445034f000000000504043b000006390050009c0000018a0000213d00000005045002100000003f0640003900000665066001970000063a0060009c0000018a0000213d0000008006600039000000400060043f000000800050043f00000024033000390000000004340019000000000014004b0000132f0000213d000000000708034f000000000005004b000004d90000613d0000008005000039000000000637034f000000000606043b000000200550003900000000006504350000002003300039000000000043004b000004d20000413d0000006403700370000000000303043b000006390030009c0000132f0000213d0000002304300039000000000014004b000000000500001900000666050080410000066604400197000000000004004b00000000060000190000066606004041000006660040009c000000000605c019000000000006004b0000132f0000c13d0000000404300039000000000447034f000000000404043b000006390040009c0000018a0000213d00000005054002100000003f065000390000066506600197000000400700043d0000000006670019000b00000007001d000000000076004b00000000070000390000000107004039000006390060009c0000018a0000213d00000001007001900000018a0000c13d000000400060043f0000000b060000290000000006460436000600000006001d00000024033000390000000005350019000000000015004b0000132f0000213d000000000708034f000000000004004b0000050e0000613d0000000b04000029000000000637034f000000000606043b000000200440003900000000006404350000002003300039000000000053004b000005070000413d0000008403700370000000000403043b000006390040009c0000132f0000213d0000002303400039000000000013004b000000000500001900000666050080410000066603300197000000000003004b00000000060000190000066606004041000006660030009c000000000605c019000000000006004b0000132f0000c13d0000000405400039000000000357034f000000000303043b000006390030009c0000018a0000213d0000001f0630003900000690066001970000003f066000390000069006600197000000400700043d0000000006670019000200000007001d000000000076004b00000000070000390000000107004039000006390060009c0000018a0000213d00000001007001900000018a0000c13d000000400060043f00000002060000290000000006360436000100000006001d00000000043400190000002404400039000000000014004b0000132f0000213d0000002001500039000000000418034f00000690053001980000001f0630018f0000000101500029000005450000613d000000000704034f0000000108000029000000007907043c0000000008980436000000000018004b000005410000c13d000000000006004b000005520000613d000000000454034f0000000305600210000000000601043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f000000000041043500000001013000290000000000010435000506380020019b0000000001000411000000050010006c00000ea90000c13d0000000701000029000406380010019c00000ed10000c13d000000400100043d00000064021000390000067a03000041000000000032043500000044021000390000067703000041000000000032043500000024021000390000003003000039000006470000013d000006120030009c0000097c0000613d000006130030009c0000132f0000c13d000000440010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000002401500370000000000101043b000c00000001001d000006380010009c0000132f0000213d0000000401500370000000000101043b000b00000001001d000000000010043f0000000801000039000000200010043f0000004001000039180e17f30000040f0000000101100039000000000101041a180e15ab0000040f0000000b010000290000000c02000029180e16730000040f00000000010000190000180f0001042e0000062f0030009c0000098c0000613d000006300030009c0000132f0000c13d000000440010008c0000132f0000413d0000000002000416000000000002004b0000132f0000c13d0000000402500370000000000202043b000006390020009c0000132f0000213d0000002303200039000000000013004b0000132f0000813d0000000403200039000000000335034f000000000403043b000006390040009c0000018a0000213d000000000705034f00000005034002100000003f0530003900000665055001970000063a0050009c0000018a0000213d0000008005500039000000400050043f000000800040043f00000024022000390000000003230019000000000013004b0000132f0000213d000000000607034f000000000004004b000005b00000613d0000008004000039000000000526034f000000000505043b000000200440003900000000005404350000002002200039000000000032004b000005a90000413d0000002402600370000000000202043b000006390020009c0000132f0000213d0000002303200039000000000013004b000000000400001900000666040080410000066603300197000000000003004b00000000050000190000066605004041000006660030009c000000000504c019000000000005004b0000132f0000c13d0000000403200039000000000336034f000000000303043b000006390030009c0000018a0000213d00000005043002100000003f054000390000066505500197000000400600043d0000000005560019000900000006001d000000000065004b00000000060000390000000106004039000006390050009c0000018a0000213d00000001006001900000018a0000c13d000000400050043f00000009050000290000000005350436000600000005001d00000024022000390000000004240019000000000014004b0000132f0000213d000000000003004b00000cc30000c13d000000800100043d000000000001004b00000cd30000613d00000d0e0000013d000006180030009c000009940000613d000006190030009c0000132f0000c13d000000440010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000000401500370000000000101043b000c00000001001d000006380010009c0000132f0000213d0000002401500370000000000201043b000000000002004b0000000001000039000000010100c039000b00000002001d000000000012004b0000132f0000c13d0000000001000411000000000010043f0000000101000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a00000692022001970000000b03000029000000000232019f000000000021041b000000400100043d0000000000310435000006050010009c000006050100804100000040011002100000000002000414000006050020009c0000060502008041000000c002200210000000000112019f00000606011001c70000800d0200003900000003030000390000066b0400004100000000050004110000000c0600002900000a950000013d000006240030009c0000099a0000613d000006250030009c0000132f0000c13d000000640010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000002401500370000000000101043b000c00000001001d000006380010009c0000132f0000213d0000004401500370000000000101043b0000063b0010009c0000132f0000213d000b063b0010019b180e137a0000040f0000000b01000029000027110010008c00000b3f0000413d000000400100043d00000064021000390000066e03000041000000000032043500000044021000390000066f03000041000000000032043500000024021000390000002a03000039000000000032043500000654020000410000000000210435000000040210003900000020030000390000000000320435000006050010009c0000060501008041000000400110021000000658011001c700001810000104300000060d0030009c000009f50000613d0000060e0030009c0000132f0000c13d000000c40010008c0000132f0000413d0000000002000416000000000002004b0000132f0000c13d0000000402500370000000000202043b000c00000002001d000006380020009c0000132f0000213d0000002402500370000000000302043b000006390030009c0000132f0000213d0000002302300039000000000012004b0000132f0000813d0000000404300039000000000245034f000000000202043b000006390020009c0000018a0000213d000000000a05034f0000001f0520003900000690055001970000003f0550003900000690055001970000063a0050009c0000018a0000213d0000008005500039000000400050043f000000800020043f00000000032300190000002403300039000000000013004b0000132f0000213d000000200340003900000000043a034f00000690052001980000001f0620018f000000a003500039000006860000613d000000a007000039000000000804034f000000008908043c0000000007970436000000000037004b000006820000c13d000000000006004b000006930000613d000000000454034f0000000305600210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f0000000000430435000000a00220003900000000000204350000004402a00370000000000302043b000006390030009c0000132f0000213d0000002302300039000000000012004b0000132f0000813d000000040430003900000000024a034f000000000202043b000006390020009c0000018a0000213d0000001f0520003900000690055001970000003f055000390000069005500197000000400600043d0000000005560019000a00000006001d000000000065004b00000000060000390000000106004039000006390050009c0000018a0000213d00000001006001900000018a0000c13d000000400050043f0000000a050000290000000005250436000900000005001d00000000032300190000002403300039000000000013004b0000132f0000213d000000200340003900000000043a034f00000690052001980000001f0620018f0000000903500029000006c30000613d000000000704034f0000000908000029000000007907043c0000000008980436000000000038004b000006bf0000c13d000000000006004b000006d00000613d000000000454034f0000000305600210000000000603043300000000065601cf000000000656022f000000000404043b0000010005500089000000000454022f00000000045401cf000000000464019f0000000000430435000000090220002900000000000204350000006402a00370000000000302043b000006390030009c0000132f0000213d0000002302300039000000000012004b0000132f0000813d000000040430003900000000024a034f000000000202043b000006390020009c0000018a0000213d0000001f0520003900000690055001970000003f055000390000069005500197000000400600043d0000000005560019000b00000006001d000000000065004b00000000060000390000000106004039000006390050009c0000018a0000213d00000001006001900000018a0000c13d000000400050043f0000000b050000290000000005250436000800000005001d00000000032300190000002403300039000000000013004b0000132f0000213d000000200140003900000000031a034f00000690042001980000001f0520018f0000000801400029000007000000613d000000000603034f0000000807000029000000006806043c0000000007870436000000000017004b000006fc0000c13d000000000005004b0000070d0000613d000000000343034f0000000304500210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000080120002900000000000104350000008401a00370000000000101043b000006380010009c0000132f0000213d000000a401a00370000000000101043b0000063b0010009c0000132f0000213d0000063c0100004100000000001004430000000001000412000000040010044300000024000004430000000001000414000006050010009c0000060501008041000000c0011002100000063d011001c70000800502000039180e18090000040f000000010020019000000fab0000613d000000000101043b00000638011001970000000002000411000000000012004b00000fac0000c13d0000000b01000039000000000101041a000000ff0010019000000fac0000c13d000000800200043d000006390020009c0000018a0000213d0000000501000039000000000401041a000000010040019000000001034002700000007f0330618f0000001f0030008c00000000050000390000000105002039000000000454013f0000000100400190000000420000c13d000000200030008c0000074d0000413d000000000010043f0000001f042000390000000504400270000006400440009a000000200020008c00000641040040410000001f033000390000000503300270000006400330009a000000000034004b0000074d0000813d000000000004041b0000000104400039000000000034004b000007490000413d0000001f0020008c000010480000a13d000000000010043f0000069005200198000010530000c13d000000200400003900000641030000410000105f0000013d000000000005004b0000000001000019000007590000613d000000e00100043d0000000302500210000006910220027f0000069102200167000000000221016f0000000101500210000000000112019f000000000014041b0000000001000411000000800010043f00000140000004430000016000100443000000200100003900000100001004430000000101000039000001200010044300000608010000410000180f0001042e000000440010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000000401500370000000000101043b000006380010009c0000132f0000213d000000000010043f000000200000043f0000004001000039000c000000050353180e17f30000040f0000000c0200035f0000002402200370000000000202043b000000000020043f000009850000013d0000000001000416000000000001004b0000132f0000c13d0000000403000039000000000203041a000000010420019000000001012002700000007f0110618f0000001f0010008c00000000050000390000000105002039000000000552013f0000000100500190000000420000c13d000000800010043f000000000004004b00000a9a0000613d000000000030043f000000000001004b00000ad90000613d000006440200004100000000040000190000000003040019000000000402041a000000a005300039000000000045043500000001022000390000002004300039000000000014004b000007930000413d00000b2b0000013d000000240010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000000401500370000000000101043b000000000010043f0000000801000039000000200010043f0000004001000039180e17f30000040f0000000101100039000009880000013d000000440010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000000401500370000000000401043b0000000201000039000000000201041a0000002403500370000000000303043b000000000232004b00000a4e0000813d0000067e01000041000000000010043f0000001101000039000000040010043f0000067f010000410000181000010430000000240010008c0000132f0000413d0000000002000416000000000002004b0000132f0000c13d0000000402500370000000000302043b000006390030009c0000132f0000213d0000002302300039000000000012004b0000132f0000813d0000000404300039000000000245034f000000000202043b000006390020009c0000018a0000213d000000000605034f0000001f0520003900000690055001970000003f0550003900000690055001970000063a0050009c0000018a0000213d0000008005500039000000400050043f000000800020043f00000000032300190000002403300039000000000013004b0000132f0000213d0000002001400039000000000316034f00000690042001980000001f0520018f000000a001400039000007e80000613d000000a006000039000000000703034f000000007807043c0000000006860436000000000016004b000007e40000c13d000000000005004b000007f50000613d000000000343034f0000000304500210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000a0012000390000000000010435180e14350000040f000000800200043d000006390020009c0000018a0000213d0000000501000039000000000401041a000000010040019000000001034002700000007f0330618f0000001f0030008c00000000050000390000000105002039000000000454013f0000000100400190000000420000c13d000000200030008c000008170000413d000000000010043f0000001f042000390000000504400270000006400440009a000000200020008c00000641040040410000001f033000390000000503300270000006400330009a000000000034004b000008170000813d000000000004041b0000000104400039000000000034004b000008130000413d0000001f0020008c00000b6d0000a13d000000000010043f000006900420019800000c8a0000c13d000000a005000039000006410300004100000cb40000013d000000440010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000002401500370000000000101043b000c00000001001d000006380010009c0000132f0000213d0000000401500370000000000101043b000000000010043f0000000801000039000000200010043f0000004001000039180e17f30000040f0000000c02000029000000000020043f000000200010043f0000004001000039180e17f30000040f000000000101041a000000ff001001900000000001000039000000010100c039000000800010043f00000664010000410000180f0001042e000000440010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000000401500370000000000101043b000c00000001001d0000002401500370000000000101043b000b00000001001d000006380010009c0000132f0000213d0000000c01000029000000000010043f0000000801000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000101100039000000000101041a180e15ab0000040f0000000c01000029000000000010043f0000000801000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000b02000029000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000101041a000000ff00100190000008a50000c13d0000000c01000029000000000010043f0000000801000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000b02000029000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a000006920220019700000001022001bf000000000021041b0000000001000414000006050010009c0000060501008041000000c0011002100000064b011001c70000800d02000039000000040300003900000000070004110000064c040000410000000c050000290000000b06000029180e18040000040f00000001002001900000132f0000613d0000000c01000029000000000010043f0000000901000039000000200010043f0000004001000039180e17f30000040f0000000b02000029180e17720000040f00000000010000190000180f0001042e0000000001000416000000000001004b0000132f0000c13d0000000a03000039000000000203041a000000010520019000000001012002700000007f0410018f00000000010460190000001f0010008c00000000060000390000000106002039000000000662013f0000000100600190000000420000c13d000000800010043f000000000005004b00000ad60000c13d0000069201200197000000a00010043f000000000004004b00000a9d0000013d000000440010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000000401500370000000000101043b000c00000001001d000006380010009c0000132f0000213d0000002401500370000000000101043b000b00000001001d0000063b0010009c0000132f0000213d180e137a0000040f0000000c010000290000000b02000029180e17b70000040f00000000010000190000180f0001042e000000240010008c0000132f0000413d0000000002000416000000000002004b0000132f0000c13d0000000402500370000000000302043b000006390030009c0000132f0000213d0000002302300039000000000012004b0000132f0000813d0000000404300039000000000245034f000000000202043b000006390020009c0000018a0000213d000000000605034f0000001f0520003900000690055001970000003f0550003900000690055001970000063a0050009c0000018a0000213d0000008005500039000000400050043f000000800020043f00000000032300190000002403300039000000000013004b0000132f0000213d0000002001400039000000000316034f00000690042001980000001f0520018f000000a001400039000009050000613d000000a006000039000000000703034f000000007807043c0000000006860436000000000016004b000009010000c13d000000000005004b000009120000613d000000000343034f0000000304500210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000a0012000390000000000010435180e14350000040f000000800200043d000006390020009c0000018a0000213d0000000401000039000000000401041a000000010040019000000001034002700000007f0330618f0000001f0030008c00000000050000390000000105002039000000000454013f0000000100400190000000420000c13d000000200030008c000009340000413d000000000010043f0000001f042000390000000504400270000006430440009a000000200020008c00000644040040410000001f033000390000000503300270000006430330009a000000000034004b000009340000813d000000000004041b0000000104400039000000000034004b000009300000413d0000001f0020008c00000b6d0000a13d000000000010043f000006900420019800000c980000c13d000000a005000039000006440300004100000cb40000013d000000440010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000002401500370000000000101043b000c00000001001d0000000401500370000000000101043b000000000010043f0000000701000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000400300043d000006510030009c0000018a0000213d000000000101043b0000004002300039000000400020043f000000000101041a0000002004300039000000a0021002700000000000240435000006380110019800000000001304350000096b0000c13d000000400300043d000006510030009c0000018a0000213d0000004001300039000000400010043f0000000601000039000000000101041a0000002004300039000000a0021002700000000000240435000006380110019700000000001304350000000c0400002900000000034200a9000000000004004b000009720000613d00000000044300d9000000000042004b000007b70000c13d000027100230011a000000400300043d000000200430003900000000002404350000000000130435000006050030009c000006050300804100000040013002100000067b011001c70000180f0001042e000000240010008c0000132f0000413d0000000001000416000000000001004b0000132f0000c13d0000000401500370000000000101043b000000000010043f0000000901000039000000200010043f0000004001000039180e17f30000040f000000000101041a000000800010043f00000664010000410000180f0001042e0000000001000416000000000001004b0000132f0000c13d0000000201000039000000000101041a000000800010043f00000664010000410000180f0001042e0000000001000416000000000001004b0000132f0000c13d000000800000043f00000664010000410000180f0001042e000000440010008c0000132f0000413d0000000003000416000000000003004b0000132f0000c13d0000000403500370000000000303043b000006390030009c0000132f0000213d0000002304300039000000000014004b0000132f0000813d0000000404300039000000000805034f000000000445034f000000000504043b000006390050009c0000018a0000213d00000005045002100000003f0640003900000665066001970000063a0060009c0000018a0000213d0000008006600039000000400060043f000000800050043f00000024033000390000000004340019000000000014004b0000132f0000213d000000000708034f000000000005004b000009c40000613d000000a005000039000000000637034f000000000606043b000006380060009c0000132f0000213d00000000056504360000002003300039000000000043004b000009bc0000413d0000002403700370000000000303043b000006390030009c0000132f0000213d0000002304300039000000000014004b000000000500001900000666050040410000066604400197000000000004004b00000000060000190000066606002041000006660040009c000000000605c019000000000006004b0000132f0000613d0000000404300039000000000447034f000000000404043b000006390040009c0000018a0000213d00000005054002100000003f065000390000066506600197000000400700043d0000000006670019000a00000007001d000000000076004b00000000070000390000000107004039000006390060009c0000018a0000213d00000001007001900000018a0000c13d000000400060043f0000000a060000290000000006460436000900000006001d00000024033000390000000005350019000000000015004b0000132f0000213d000000000004004b00000d160000c13d000000800100043d000000000001004b000000000100001900000d250000613d00000d4a0000013d000000a40010008c0000132f0000413d0000000002000416000000000002004b0000132f0000c13d0000000402500370000000000202043b000c00000002001d000006380020009c0000132f0000213d0000002402500370000000000202043b000b00000002001d000006380020009c0000132f0000213d0000006402500370000000000202043b000900000002001d0000004402500370000000000202043b000a00000002001d0000008402500370000000000302043b000006390030009c0000132f0000213d0000002302300039000000000012004b0000132f0000813d0000000404300039000000000245034f000000000202043b000006390020009c0000018a0000213d000000000605034f0000001f0520003900000690055001970000003f0550003900000690055001970000063a0050009c0000018a0000213d0000008005500039000000400050043f000000800020043f00000000032300190000002403300039000000000013004b0000132f0000213d0000002001400039000000000316034f00000690042001980000001f0520018f000000a00140003900000a300000613d000000a006000039000000000703034f000000007807043c0000000006860436000000000016004b00000a2c0000c13d000000000005004b00000a3d0000613d000000000343034f0000000304500210000000000501043300000000054501cf000000000545022f000000000303043b0000010004400089000000000343022f00000000034301cf000000000353019f0000000000310435000000a001200039000000000001043500000000020004110000000c0020006c00000b770000c13d0000000b0000006b00000bbc0000c13d000000400100043d00000064021000390000066303000041000000000032043500000044021000390000065703000041000000000032043500000024021000390000002b03000039000006470000013d000c00000003001d000000000021041b000b00000004001d000000000040043f0000000301000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a0000000c0220006c000007b70000413d000000000021041b0000000001000411000000000010043f000000200000043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000b02000029000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a0000000c04000029000000000242004b0000000b03000029000007b70000413d000000000021041b000000400100043d000000200210003900000000004204350000000000310435000006050010009c000006050100804100000040011002100000000002000414000006050020009c0000060502008041000000c002200210000000000112019f0000064a011001c70000800d0200003900000004030000390000065904000041000000000500041100000000060500190000000007000019180e18040000040f00000001002001900000132f0000613d00000000010000190000180f0001042e0000069202200197000000a00020043f000000000001004b000000c001000039000000a00100603900000b2c0000013d000000000501001900000000030000190000000004030019000000010330003a000007b70000613d000000090050008c0000000a0550011a00000aa20000213d0000067d0040009c0000018a0000213d00000690044001970000005f0640003900000690066001970000063a0060009c0000018a0000213d0000008006600039000000400060043f000000800030043f000000200440003900000690054001980000001f0440018f00000abc0000613d000000a005500039000000a006000039000000002702043c0000000006760436000000000056004b00000ab80000c13d000000000004004b000000000003004b000007b70000613d0000000a4210011a0000000a052000c9000000000015004b000007b70000213d000000000000004b000007b70000c13d000000010530008a000000800600043d000000000056004b0000102e0000a13d000000f8044002100000009f0330003900000000060304330000068006600197000000000464019f000006810440009a0000000000430435000000090010008c0000000001020019000000000305001900000abd0000213d000000400600043d000003ac0000013d000000000030043f000000020020008c00000b210000813d000000a00100003900000b2c0000013d0000065401000041000000800010043f0000002001000039000000840010043f0000002f01000039000000a40010043f0000067301000041000000c40010043f0000067401000041000000e40010043f00000675010000410000181000010430000006880020009c000009910000613d000006890020009c000009910000613d000006880020009c000000000300003900000001030060390000068a0020009c00000000040000390000000104006039000009910000613d0000068b0020009c000009910000613d0000068c0020009c000009910000613d000000000334019f0000068d0020009c000000000403001900000001044041bf000000010440018f000000000504001900000ba20000413d0000068e0020009c00000b9c0000213d000006880020009c000000000504001900000ba20000613d0000068a0020009c000000000504001900000ba20000613d000000000503001900000ba10000013d000006920330019700000000003204350000000002120019000b00000002001d000000800300043d000a00000003001d000000a001000039180e134e0000040f0000000a020000290000000b03200029000006830200004100000000002304350000000c0100002900000000031300490000001b0230008a00000000002104350000000502300039180e133c0000040f0000002001000039000000400200043d000b00000002001d00000000021204360000000c01000029180e135b0000040f0000000b0200002900000b360000013d000006470200004100000000040000190000000003040019000000000402041a000000a005300039000000000045043500000001022000390000002004300039000000000014004b00000b230000413d000000c001300039000000800210008a0000008001000039180e133c0000040f0000002001000039000000400200043d000c00000002001d00000000021204360000008001000039180e135b0000040f0000000c020000290000000001210049000006050010009c00000605010080410000006001100210000006050020009c00000605020080410000004002200210000000000121019f0000180f0001042e000000400100043d0000000c0000006b00000b520000c13d00000044031000390000066d02000041000000000023043500000024031000390000001b02000039000000000023043500000654020000410000000000210435000000040310003900000020020000390000000000230435000006050010009c0000060501008041000000400110021000000655011001c70000181000010430000a00000001001d180e13310000040f0000000a020000290000002003200039000900000003001d0000000b0100002900000000001304350000000c01000029000000000012043500000004010000390000000101100367000000000101043b000000000010043f0000000701000039000000200010043f0000004001000039180e17f30000040f0000000a020000290000000002020433000006380220019700000009030000290000000003030433000000a003300210000000000223019f000000000021041b00000000010000190000180f0001042e000000000002004b000000000300001900000b710000613d000000a00300043d0000000304200210000006910440027f0000069104400167000000000443016f000000010320021000000cbf0000013d0000000c01000029000000000010043f0000000101000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000101041a000000ff0010019000000a420000c13d000000400100043d00000064021000390000065603000041000000000032043500000044021000390000065703000041000006440000013d00000001050000390000068b0020009c00000ba20000613d0000068c0020009c000000000503c019000000010550018f000000000005004b000009910000c13d0000068e0020009c00000bab0000213d000006880020009c000009910000613d0000068a0020009c000009910000613d00000baf0000013d0000068b0020009c000009910000613d0000068c0020009c000009910000613d0000068d0020009c000000000504001900000d5a0000413d0000068e0020009c00000d540000213d000006880020009c000000000504001900000d5a0000613d0000068a0020009c000000000504001900000d5a0000613d000000000503001900000d590000013d0000000c01000029000000000010043f000000200000043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000a02000029000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a000000090220006c000007b70000413d000000000021041b0000000b01000029000000000010043f000000200000043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000a02000029000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a000000090020002a000007b70000413d00000009030000290000000002320019000000000021041b000000400100043d000000200210003900000000003204350000000a020000290000000000210435000006050010009c000006050100804100000040011002100000000002000414000006050020009c0000060502008041000000c002200210000000000112019f0000064a011001c70000800d020000390000000403000039000006590400004100000000050004110000000c060000290000000b07000029180e18040000040f00000001002001900000132f0000613d0000000001000414000800000001001d0000065a0100004100000000001004430000000b0100002900000004001004430000000001000414000006050010009c0000060501008041000000c0011002100000065b011001c70000800202000039180e18090000040f000000010020019000000fab0000613d000000000101043b000000000001004b00000a980000613d0000065c0010009c00000a980000613d000000400300043d0000008401300039000000a002000039000000000021043500000064013000390000000902000029000000000021043500000044013000390000000a02000029000000000021043500000024013000390000000c0200002900000000002104350000065d010000410000000000130435000000040130003900000000020004110000000000210435000000a402300039000000800100043d0000000000120435000700000003001d000000c402300039000000000001004b00000c460000613d00000000030000190000000004230019000000a005300039000000000505043300000000005404350000002003300039000000000013004b00000c3f0000413d0000001f03100039000006900330019700000000012100190000000000010435000000c401300039000006050010009c000006050100804100000060011002100000000702000029000006050020009c00000605020080410000004002200210000000000121019f0000000802000029000006050020009c0000060502008041000000c002200210000000000121019f0000000b02000029180e18040000040f00000060031002700000060503300197000000200030008c000000200400003900000000040340190000001f0640018f0000002007400190000000070570002900000c690000613d000000000801034f0000000709000029000000008a08043c0000000009a90436000000000059004b00000c650000c13d000000000006004b00000c760000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f0000000000650435000000010020019000000fc20000613d0000001f01400039000000600210018f0000000701200029000000000021004b00000000020000390000000102004039000006390010009c0000018a0000213d00000001002001900000018a0000c13d000000400010043f000000200030008c0000132f0000413d000000070200002900000000020204330000065f00200198000001610000613d0000132f0000013d00000641030000410000002006000039000000010540008a0000000505500270000006420550009a000000000706001900000080066000390000000006060433000000000063041b00000020067000390000000103300039000000000053004b00000c8f0000c13d00000cb30000013d00000644030000410000002006000039000000010540008a0000000505500270000006450550009a000000000706001900000080066000390000000006060433000000000063041b00000020067000390000000103300039000000000053004b00000c9d0000c13d00000cb30000013d00000647030000410000002006000039000000010540008a0000000505500270000006480550009a000000000706001900000080066000390000000006060433000000000063041b00000020067000390000000103300039000000000053004b00000cab0000c13d000000a005700039000000000024004b00000cbd0000813d0000000304200210000000f80440018f000006910440027f00000691044001670000000005050433000000000445016f000000000043041b00000001030000390000000104200210000000000234019f000000000021041b00000000010000190000180f0001042e0000000901000029000000000327034f000000000303043b000000200110003900000000003104350000002002200039000000000042004b00000cc40000413d00000009010000290000000002010433000000800100043d000500000002001d000000000021004b00000d0e0000c13d000000050000006b00000d650000c13d0000000001000411000400000001001d0000000201000039000000000101041a000b00000000001d0000000b0110006a0000000202000039000000000012041b0000004002000039000000400100043d00000000022104360000004003100039000000800400043d00000000004304350000006003100039000000000004004b00000cec0000613d000000800500003900000000060000190000002005500039000000000705043300000000037304360000000106600039000000000046004b00000ce60000413d00000000041300490000000000420435000000090200002900000000040204330000000002430436000000000004004b00000cfb0000613d000000000300001900000009060000290000002006600039000000000506043300000000025204360000000103300039000000000043004b00000cf50000413d0000000002120049000006050020009c00000605020080410000006002200210000006050010009c00000605010080410000004001100210000000000112019f0000000002000414000006050020009c0000060502008041000000c002200210000000000121019f0000064b011001c70000800d0200003900000004030000390000066704000041000000040500002900000a930000013d000000400100043d0000067c020000410000000000210435000006050010009c000006050100804100000040011002100000063f011001c700001810000104300000000a01000029000000000438034f000000000404043b000000200110003900000000004104350000002003300039000000000053004b00000d170000413d0000000a010000290000000001010433000000800300043d000000000013004b00000d4a0000c13d000006390010009c0000018a0000213d00000005031002100000003f043000390000067205400197000000400400043d000800000004001d0000000004450019000000000054004b00000000050000390000000105004039000006390040009c0000018a0000213d00000001005001900000018a0000c13d000000400040043f00000008040000290000000001140436000700000001001d0000001f0130018f000000000003004b00000d3f0000613d00000007040000290000000003340019000000002502043c0000000004540436000000000034004b00000d3b0000c13d000000000001004b000000800100043d000000000001004b00000ddf0000c13d000000400200043d000c00000002001d000000200100003900000000021204360000000801000029180e136d0000040f00000b350000013d000000400100043d00000064021000390000067003000041000000000032043500000044021000390000067103000041000000000032043500000024021000390000002c03000039000006470000013d00000001050000390000068b0020009c00000d5a0000613d0000068c0020009c000000000503c019000000010550018f000000000005004b000009910000c13d000006840020009c00000dc70000a13d0000068f0020009c00000dce0000213d000006850020009c000009910000613d0000068b0020009c000009910000613d00000dd20000013d0000000001000411000400000001001d00000005010000290000000004000019000b00000000001d000000000041004b0000102e0000a13d000c00000004001d0000000502400210000800000002001d0000000601200029000a00000001001d0000000001010433000700000001001d0000000001000411000000000010043f000000200000043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000800200043d0000000c0020006c0000102e0000a13d000000000101043b0000000802000029000000a002200039000800000002001d0000000002020433000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a000000070220006c00000009030000290000000c04000029000007b70000413d000000000021041b0000000001030433000000000041004b0000102e0000a13d000000800100043d000000000041004b0000102e0000a13d0000000a010000290000000001010433000700000001001d00000008010000290000000001010433000000000010043f0000000301000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a000000070220006c00000009030000290000000c04000029000007b70000413d000000000021041b0000000001030433000000000041004b0000102e0000a13d0000000a0200002900000000020204330000000b0020002a000007b70000413d000b000b0020002d0000000104400039000000050040006c00000d6a0000413d0000000201000039000000000101041a0000000b0010006b000007b70000213d00000cd80000013d000006880020009c000009910000613d000006890020009c000009910000613d0000068a0020009c000009910000613d00000dd20000013d0000068c0020009c000009910000613d000006870020009c000009910000613d0000068d0020009c000000000504001900000e370000413d0000068e0020009c00000e310000213d000006880020009c000000000504001900000e370000613d0000068a0020009c000000000504001900000e370000613d000000000503001900000e360000013d0000000003000019000c00000003001d0000000501300210000b00000001001d000000a00110003900000000010104330000063801100197000000000010043f000000200000043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d0000000a0200002900000000020204330000000c0020006c0000102e0000a13d0000000b0400002900000009024000290000000002020433000000000101043b000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000080200002900000000020204330000000c03000029000000000032004b0000102e0000a13d0000000b040000290000000702400029000000000101043b000000000101041a00000000001204350000000103300039000000800100043d000000000013004b00000de00000413d00000d430000013d0000001f0530018f0000065e06300198000000400200043d000000000462001900000e1e0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000e1a0000c13d000000000005004b00000e2b0000613d000000000161034f0000000305500210000000000604043300000000065601cf000000000656022f000000000101043b0000010005500089000000000151022f00000000015101cf000000000161019f00000000001404350000006001300210000006050020009c00000605020080410000004002200210000000000112019f000018100001043000000001050000390000068b0020009c00000e370000613d0000068c0020009c000000000503c019000000010550018f000000000005004b000009910000c13d0000068e0020009c00000e400000213d000006880020009c000009910000613d0000068a0020009c000009910000613d00000e440000013d0000068b0020009c000009910000613d0000068c0020009c000009910000613d0000068d0020009c00000fb90000813d000000800040043f00000664010000410000180f0001042e00000005010000290000000004000019000b00000000001d000000000041004b0000102e0000a13d000c00000004001d0000000502400210000800000002001d0000000601200029000a00000001001d0000000001010433000700000001001d0000000401000029000000000010043f000000200000043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000800200043d0000000c0020006c0000102e0000a13d000000000101043b0000000802000029000000a002200039000800000002001d0000000002020433000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a0000000705000029000000000052001a00000009030000290000000c04000029000007b70000413d0000000002520019000000000021041b0000000001030433000000000041004b0000102e0000a13d000000800100043d000000000041004b0000102e0000a13d0000000a010000290000000001010433000700000001001d00000008010000290000000001010433000000000010043f0000000301000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a0000000705000029000000000052001a00000009030000290000000c04000029000007b70000413d0000000002520019000000000021041b0000000001030433000000000041004b0000102e0000a13d0000000a0200002900000000020204330000000b0020002a000007b70000413d000b000b0020002d0000000104400039000000050040006c00000e4c0000413d0000025e0000013d0000000501000029000000000010043f0000000101000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000101041a000000ff00100190000005580000c13d000000400100043d00000064021000390000067603000041000000000032043500000044021000390000067703000041000000000032043500000024021000390000002f03000039000006470000013d0000000b010000290000000001010433000000800200043d000300000002001d000000000012004b00000faf0000c13d000000030000006b0000000b0100002900000fce0000c13d000000400100043d000000400200003900000000022104360000004003100039000000800400043d00000000004304350000006003100039000000000004004b00000eeb0000613d000000800500003900000000060000190000002005500039000000000705043300000000037304360000000106600039000000000046004b00000ee50000413d000000000413004900000000004204350000000b0200002900000000040204330000000002430436000000000004004b00000efa0000613d00000000030000190000000b050000290000002005500039000000000605043300000000026204360000000103300039000000000043004b00000ef40000413d0000000002120049000006050020009c00000605020080410000006002200210000006050010009c00000605010080410000004001100210000000000112019f0000000002000414000006050020009c0000060502008041000000c002200210000000000121019f0000064b011001c70000800d0200003900000004030000390000066704000041000000000500041100000005060000290000000407000029180e18040000040f00000001002001900000132f0000613d0000000001000414000c00000001001d0000065a010000410000000000100443000000070100002900000004001004430000000001000414000006050010009c0000060501008041000000c0011002100000065b011001c70000800202000039180e18090000040f000000010020019000000fab0000613d000000000101043b000000000001004b00000a980000613d0000065c0010009c00000a980000613d000000400300043d0000004401300039000000a002000039000000000021043500000024013000390000000502000029000000000021043500000668010000410000000000130435000000040130003900000000020004110000000000210435000000a401300039000000800200043d0000000000210435000a00000003001d000000c401300039000000000002004b00000f400000613d000000800300003900000000040000190000002003300039000000000503043300000000015104360000000104400039000000000024004b00000f3a0000413d0000000a030000290000000002310049000000040220008a000000640330003900000000002304350000000b0200002900000000020204330000000001210436000000000002004b00000f520000613d00000000030000190000000b050000290000002005500039000000000405043300000000014104360000000103300039000000000023004b00000f4c0000413d0000000a030000290000000002310049000000040220008a00000084033000390000000000230435000000020200002900000000020204330000000001210436000000000002004b000000010600002900000f650000613d000000000300001900000000041300190000000005630019000000000505043300000000005404350000002003300039000000000023004b00000f5e0000413d0000001f0320003900000690033001970000000a050000290000000004510049000000000334001900000000011200190000000000010435000006050030009c00000605030080410000006001300210000006050050009c000006050200004100000000020540190000004002200210000000000121019f0000000c02000029000006050020009c0000060502008041000000c002200210000000000121019f0000000402000029180e18040000040f00000060031002700000060503300197000000200030008c000000200400003900000000040340190000001f0640018f00000020074001900000000a0570002900000f8a0000613d000000000801034f0000000a09000029000000008a08043c0000000009a90436000000000059004b00000f860000c13d000000000006004b00000f970000613d000000000771034f0000000306600210000000000805043300000000086801cf000000000868022f000000000707043b0000010006600089000000000767022f00000000066701cf000000000686019f00000000006504350000000100200190000010950000613d0000001f01400039000000600210018f0000000a01200029000000000021004b00000000020000390000000102004039000006390010009c0000018a0000213d00000001002001900000018a0000c13d000000400010043f000000200030008c0000132f0000413d0000000a0200002900000000020204330000065f00200198000003330000613d0000132f0000013d000000000001042f000000400100043d0000063e0200004100000d100000013d000000400100043d00000064021000390000067803000041000000000032043500000044021000390000067903000041000000000032043500000024021000390000003503000039000006470000013d0000068e0020009c000010340000213d000006880020009c00000e460000613d0000068a0020009c0000000001040019000009910000613d0000000001030019000010380000013d0000001f0530018f0000065e06300198000000400200043d000000000462001900000e1e0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b00000fc90000c13d00000e1e0000013d00000000020000190000000001010433000000000021004b0000102e0000a13d000c00000002001d0000000502200210000a00000002001d0000000601200029000800000001001d0000000001010433000900000001001d0000000501000029000000000010043f000000200000043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000800200043d0000000c0020006c0000102e0000a13d000000000101043b0000000a02000029000000a002200039000a00000002001d0000000002020433000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a000000090220006c000007b70000413d000000000021041b0000000b0100002900000000010104330000000c0010006c0000102e0000a13d00000008010000290000000001010433000900000001001d0000000401000029000000000010043f000000200000043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000800200043d0000000c0020006c0000102e0000a13d000000000101043b0000000a020000290000000002020433000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a0000000903000029000000000032001a000007b70000413d0000000002320019000000000021041b0000000c020000290000000102200039000000030020006c0000000b0100002900000fcf0000413d00000eda0000013d0000067e01000041000000000010043f0000003201000039000000040010043f0000067f0100004100001810000104300000068b0020009c000009910000613d0000068c0020009c000000000103c019000000010110018f000000800010043f00000664010000410000180f0001042e0000001f0530018f0000065e06300198000000400200043d000000000462001900000e1e0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b000010430000c13d00000e1e0000013d000000000002004b00000000030000190000104c0000613d000000a00300043d0000000304200210000006910440027f0000069104400167000000000343016f0000000102200210000000000223019f0000106b0000013d00000641030000410000002004000039000000010650008a0000000506600270000006420660009a00000080074000390000000007070433000000000073041b00000020044000390000000103300039000000000063004b000010580000c13d000000000025004b000010690000813d0000000305200210000000f80550018f000006910550027f000006910550016700000080044000390000000004040433000000000454016f000000000043041b000000010220021000000001022001bf000000000021041b0000000a010000290000000002010433000006390020009c0000018a0000213d0000000401000039000000000401041a000000010040019000000001034002700000007f0330618f0000001f0030008c00000000050000390000000105002039000000000454013f0000000100400190000000420000c13d000000200030008c0000108c0000413d000000000010043f0000001f042000390000000504400270000006430440009a000000200020008c00000644040040410000001f033000390000000503300270000006430330009a000000000034004b0000108c0000813d000000000004041b0000000104400039000000000034004b000010880000413d0000001f0020008c0000000103200210000010a10000a13d000000000010043f0000069006200198000010ac0000c13d00000020050000390000064404000041000010b90000013d0000001f0530018f0000065e06300198000000400200043d000000000462001900000e1e0000613d000000000701034f0000000008020019000000007907043c0000000008980436000000000048004b0000109c0000c13d00000e1e0000013d000000000002004b0000000004000019000010a60000613d000000090400002900000000040404330000000302200210000006910220027f0000069102200167000000000224016f000000000232019f000010c40000013d00000644040000410000002005000039000000010760008a0000000507700270000006450770009a0000000a0900002900000000089500190000000008080433000000000084041b00000020055000390000000104400039000000000074004b000010b20000c13d000000000026004b000010c30000813d0000000302200210000000f80220018f000006910220027f00000691022001670000000a055000290000000005050433000000000225016f000000000024041b00000001023001bf000000000021041b0000000b010000290000000002010433000006390020009c0000018a0000213d0000000a01000039000000000401041a000000010040019000000001034002700000007f0330618f0000001f0030008c00000000050000390000000105002039000000000454013f0000000100400190000000420000c13d000000200030008c000010e50000413d000000000010043f0000001f042000390000000504400270000006460440009a000000200020008c00000647040040410000001f033000390000000503300270000006460330009a000000000034004b000010e50000813d000000000004041b0000000104400039000000000034004b000010e10000413d0000001f0020008c0000000103200210000010ee0000a13d000000000010043f0000069006200198000010f90000c13d00000020050000390000064704000041000011050000013d000000000002004b0000000004000019000010f30000613d000000080400002900000000040404330000000302200210000006910220027f0000069102200167000000000224016f000000000232019f000011100000013d00000647040000410000002005000039000000010760008a0000000507700270000006480770009a0000000b085000290000000008080433000000000084041b00000020055000390000000104400039000000000074004b000010fe0000c13d000000000026004b0000110f0000813d0000000302200210000000f80220018f000006910220027f00000691022001670000000b055000290000000005050433000000000225016f000000000024041b00000001023001bf000000000021041b0000000c010000290000063801100197000c00000001001d000000000010043f0000064901000041000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000101041a000000ff00100190000011500000c13d000000000000043f0000000801000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a000006920220019700000001022001bf000000000021041b0000000001000414000006050010009c0000060501008041000000c0011002100000064b011001c70000800d0200003900000004030000390000064c0400004100000000050000190000000c060000290000000007000411180e18040000040f00000001002001900000132f0000613d0000000c01000029000000000010043f0000064d01000041000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000101041a000000000001004b000011890000c13d0000064e01000041000000000201041a000b00000002001d000006390020009c0000018a0000213d0000000b020000290000000102200039000000000021041b000000000010043f0000000001000414000006050010009c0000060501008041000000c00110021000000606011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000b011000290000000c02000029000000000021041b0000064e01000041000000000101041a000b00000001001d000000000020043f0000064d01000041000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000b02000029000000000021041b0000064f01000041000000000010043f0000000801000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000101041a000000ff00100190000011d40000c13d0000064f01000041000000000010043f0000000801000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a000006920220019700000001022001bf000000000021041b0000000001000414000006050010009c0000060501008041000000c0011002100000064b011001c70000800d0200003900000004030000390000064c040000410000064f050000410000000c060000290000000007000411180e18040000040f00000001002001900000132f0000613d0000064f01000041000000000010043f0000000901000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000201043b0000000c01000029000000000010043f000b00000002001d0000000101200039000a00000001001d000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000101041a000000000001004b0000121e0000c13d0000000b01000029000000000101041a000900000001001d000006390010009c0000018a0000213d000000090100002900000001011000390000000b02000029000000000012041b000000000020043f0000000001000414000006050010009c0000060501008041000000c00110021000000606011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b00000009011000290000000c02000029000000000021041b0000000b01000029000000000101041a000b00000001001d000000000020043f0000000a01000029000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000b02000029000000000021041b0000065001000041000000000010043f0000000801000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000101041a000000ff00100190000012690000c13d0000065001000041000000000010043f0000000801000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a000006920220019700000001022001bf000000000021041b0000000001000414000006050010009c0000060501008041000000c0011002100000064b011001c70000800d0200003900000004030000390000064c0400004100000650050000410000000c060000290000000007000411180e18040000040f00000001002001900000132f0000613d0000065001000041000000000010043f0000000901000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000201043b0000000c01000029000000000010043f000b00000002001d0000000101200039000a00000001001d000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000101041a000000000001004b000012b30000c13d0000000b01000029000000000101041a000900000001001d000006390010009c0000018a0000213d000000090100002900000001011000390000000b02000029000000000012041b000000000020043f0000000001000414000006050010009c0000060501008041000000c00110021000000606011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b00000009011000290000000c02000029000000000021041b0000000b01000029000000000101041a000b00000001001d000000000020043f0000000a01000029000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000b02000029000000000021041b0000000104000367000000a401400370000000000201043b0000063b03200197000027100030008c0000063e0000213d000000400100043d0000008404400370000000000404043b0000063804400198000012ca0000c13d0000004402100039000006530300004100000000003204350000002402100039000000190300003900000000003204350000065402000041000000000021043500000004021000390000002003000039000000000032043500000b4d0000013d000006510010009c0000018a0000213d0000004005100039000000400050043f000000200510003900000000003504350000000000410435000000a001200210000000000114019f0000000602000039000000000012041b0000065201000041000000000010043f0000000801000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000101041a000000ff00100190000013200000c13d0000065201000041000000000010043f0000000801000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b0000000c02000029000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000132f0000613d000000000101043b000000000201041a000006920220019700000001022001bf000000000021041b0000000001000414000006050010009c0000060501008041000000c0011002100000064b011001c70000800d0200003900000004030000390000064c0400004100000652050000410000000c060000290000000007000411180e18040000040f00000001002001900000132f0000613d0000065201000041000000000010043f0000000901000039000000200010043f0000004001000039180e17f30000040f0000000c02000029180e17720000040f0000000b02000039000000000102041a000006920110019700000001011001bf000000000012041b00000000010000190000180f0001042e00000000010000190000181000010430000006930010009c000013360000813d0000004001100039000000400010043f000000000001042d0000067e01000041000000000010043f0000004101000039000000040010043f0000067f0100004100001810000104300000001f0220003900000690022001970000000001120019000000000021004b00000000020000390000000102004039000006390010009c000013480000213d0000000100200190000013480000c13d000000400010043f000000000001042d0000067e01000041000000000010043f0000004101000039000000040010043f0000067f010000410000181000010430000000000003004b000013580000613d000000000400001900000000052400190000000006140019000000000606043300000000006504350000002004400039000000000034004b000013510000413d00000000012300190000000000010435000000000001042d00000000430104340000000001320436000000000003004b000013670000613d000000000200001900000000051200190000000006240019000000000606043300000000006504350000002002200039000000000032004b000013600000413d000000000213001900000000000204350000001f0230003900000690022001970000000001210019000000000001042d000000000301001900000000040104330000000001420436000000000004004b000013790000613d00000000020000190000002003300039000000000503043300000000015104360000000102200039000000000042004b000013730000413d000000000001042d00040000000000020000000001000411000000000010043f0000069401000041000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f00000001002001900000138d0000613d000000000101043b000000000101041a000000ff001001900000138f0000613d000000000001042d00000000010000190000181000010430000000400200043d000006950020009c000013980000413d0000067e01000041000000000010043f0000004101000039000000040010043f0000067f0100004100001810000104300000006004200039000000400040043f0000002a01000039000000000112043600000000030000310000000103300367000000000503034f0000000006010019000000005705043c0000000006760436000000000046004b000013a00000c13d0000000004010433000006800440019700000682044001c7000000000041043500000021042000390000000005040433000006800550019700000696055001c700000000005404350000002904000039000000000600041100000000050600190000000006020433000000000046004b0000141f0000a13d0000000006140019000000000706043300000680077001970000000308500210000000780880018f000006970880021f0000069808800197000000000787019f00000000007604350000000406500270000000010440008a000000010040008c000013af0000213d000000100050008c000014250000813d000000400400043d000400000004001d0000063a0040009c000013920000213d00000004060000290000008004600039000000400040043f00000042050000390000000005560436000300000005001d000000003603043c0000000005650436000000000045004b000013cc0000c13d00000003090000290000000003090433000006800330019700000682033001c70000000000390435000000040800002900000021038000390000000004030433000006800440019700000696044001c700000000004304350000064f05000041000000410300003900000000040500190000000005080433000000000035004b0000141f0000a13d0000000005930019000000000605043300000680066001970000000307400210000000780770018f000006970770021f0000069807700197000000000667019f00000000006504350000000405400270000000010330008a000000010030008c000013dd0000213d000000100040008c000014250000813d000000400500043d000200000005001d00000020035000390000069a0400004100000000004304350000000003020433000100000003001d0000003702500039180e134e0000040f0000000102000029000000020120002900000037021000390000069b030000410000000000320435000000480210003900000004010000290000000003010433000400000003001d0000000301000029180e134e0000040f000000040200002900000001032000290000002802300039000000020100002900000000002104350000004802300039180e133c0000040f0000065401000041000000400300043d000400000003001d000000000013043500000020010000390000000402300039000000000012043500000024023000390000000201000029180e135b0000040f00000004020000290000000001210049000006050010009c0000060501008041000006050020009c000006050200804100000060011002100000004002200210000000000121019f00001810000104300000067e01000041000000000010043f0000003201000039000000040010043f0000067f010000410000181000010430000000400100043d0000004402100039000006990300004100000000003204350000065402000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000006050010009c0000060501008041000000400110021000000655011001c7000018100001043000040000000000020000000001000411000000000010043f0000069c01000041000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f0000000100200190000014480000613d000000000101043b000000000101041a000000ff001001900000144a0000613d000000000001042d00000000010000190000181000010430000000400200043d000006950020009c000014530000413d0000067e01000041000000000010043f0000004101000039000000040010043f0000067f0100004100001810000104300000006004200039000000400040043f0000002a01000039000000000112043600000000030000310000000103300367000000000503034f0000000006010019000000005705043c0000000006760436000000000046004b0000145b0000c13d0000000004010433000006800440019700000682044001c7000000000041043500000021042000390000000005040433000006800550019700000696055001c700000000005404350000002904000039000000000600041100000000050600190000000006020433000000000046004b000014da0000a13d0000000006140019000000000706043300000680077001970000000308500210000000780880018f000006970880021f0000069808800197000000000787019f00000000007604350000000406500270000000010440008a000000010040008c0000146a0000213d000000100050008c000014e00000813d000000400400043d000400000004001d0000063a0040009c0000144d0000213d00000004060000290000008004600039000000400040043f00000042050000390000000005560436000300000005001d000000003603043c0000000005650436000000000045004b000014870000c13d00000003090000290000000003090433000006800330019700000682033001c70000000000390435000000040800002900000021038000390000000004030433000006800440019700000696044001c700000000004304350000065005000041000000410300003900000000040500190000000005080433000000000035004b000014da0000a13d0000000005930019000000000605043300000680066001970000000307400210000000780770018f000006970770021f0000069807700197000000000667019f00000000006504350000000405400270000000010330008a000000010030008c000014980000213d000000100040008c000014e00000813d000000400500043d000200000005001d00000020035000390000069a0400004100000000004304350000000003020433000100000003001d0000003702500039180e134e0000040f0000000102000029000000020120002900000037021000390000069b030000410000000000320435000000480210003900000004010000290000000003010433000400000003001d0000000301000029180e134e0000040f000000040200002900000001032000290000002802300039000000020100002900000000002104350000004802300039180e133c0000040f0000065401000041000000400300043d000400000003001d000000000013043500000020010000390000000402300039000000000012043500000024023000390000000201000029180e135b0000040f00000004020000290000000001210049000006050010009c0000060501008041000006050020009c000006050200804100000060011002100000004002200210000000000121019f00001810000104300000067e01000041000000000010043f0000003201000039000000040010043f0000067f010000410000181000010430000000400100043d0000004402100039000006990300004100000000003204350000065402000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000006050010009c0000060501008041000000400110021000000655011001c7000018100001043000040000000000020000000001000411000000000010043f0000069d01000041000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f0000000100200190000015030000613d000000000101043b000000000101041a000000ff00100190000015050000613d000000000001042d00000000010000190000181000010430000000400200043d000006950020009c0000150e0000413d0000067e01000041000000000010043f0000004101000039000000040010043f0000067f0100004100001810000104300000006004200039000000400040043f0000002a01000039000000000112043600000000030000310000000103300367000000000503034f0000000006010019000000005705043c0000000006760436000000000046004b000015160000c13d0000000004010433000006800440019700000682044001c7000000000041043500000021042000390000000005040433000006800550019700000696055001c700000000005404350000002904000039000000000600041100000000050600190000000006020433000000000046004b000015950000a13d0000000006140019000000000706043300000680077001970000000308500210000000780880018f000006970880021f0000069808800197000000000787019f00000000007604350000000406500270000000010440008a000000010040008c000015250000213d000000100050008c0000159b0000813d000000400400043d000400000004001d0000063a0040009c000015080000213d00000004060000290000008004600039000000400040043f00000042050000390000000005560436000300000005001d000000003603043c0000000005650436000000000045004b000015420000c13d00000003090000290000000003090433000006800330019700000682033001c70000000000390435000000040800002900000021038000390000000004030433000006800440019700000696044001c700000000004304350000065205000041000000410300003900000000040500190000000005080433000000000035004b000015950000a13d0000000005930019000000000605043300000680066001970000000307400210000000780770018f000006970770021f0000069807700197000000000667019f00000000006504350000000405400270000000010330008a000000010030008c000015530000213d000000100040008c0000159b0000813d000000400500043d000200000005001d00000020035000390000069a0400004100000000004304350000000003020433000100000003001d0000003702500039180e134e0000040f0000000102000029000000020120002900000037021000390000069b030000410000000000320435000000480210003900000004010000290000000003010433000400000003001d0000000301000029180e134e0000040f000000040200002900000001032000290000002802300039000000020100002900000000002104350000004802300039180e133c0000040f0000065401000041000000400300043d000400000003001d000000000013043500000020010000390000000402300039000000000012043500000024023000390000000201000029180e135b0000040f00000004020000290000000001210049000006050010009c0000060501008041000006050020009c000006050200804100000060011002100000004002200210000000000121019f00001810000104300000067e01000041000000000010043f0000003201000039000000040010043f0000067f010000410000181000010430000000400100043d0000004402100039000006990300004100000000003204350000065402000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000006050010009c0000060501008041000000400110021000000655011001c700001810000104300004000000000002000400000001001d000000000010043f0000000801000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f0000000100200190000015cb0000613d000000000101043b0000000002000411000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f0000000100200190000015cb0000613d000000000101043b000000000101041a000000ff00100190000015cd0000613d000000000001042d00000000010000190000181000010430000000400200043d000006950020009c000015d60000413d0000067e01000041000000000010043f0000004101000039000000040010043f0000067f0100004100001810000104300000006004200039000000400040043f0000002a01000039000000000112043600000000030000310000000103300367000000000503034f0000000006010019000000005705043c0000000006760436000000000046004b000015de0000c13d0000000004010433000006800440019700000682044001c7000000000041043500000021042000390000000005040433000006800550019700000696055001c700000000005404350000002904000039000000000600041100000000050600190000000006020433000000000046004b0000165d0000a13d0000000006140019000000000706043300000680077001970000000308500210000000780880018f000006970880021f0000069808800197000000000787019f00000000007604350000000406500270000000010440008a000000010040008c000015ed0000213d000000100050008c000016630000813d000000400400043d000300000004001d0000063a0040009c000015d00000213d00000003060000290000008004600039000000400040043f00000042050000390000000005560436000200000005001d000000003603043c0000000005650436000000000045004b0000160a0000c13d00000002090000290000000003090433000006800330019700000682033001c70000000000390435000000030800002900000021038000390000000004030433000006800440019700000696044001c700000000004304350000004103000039000000040500002900000000040500190000000005080433000000000035004b0000165d0000a13d0000000005930019000000000605043300000680066001970000000307400210000000780770018f000006970770021f0000069807700197000000000667019f00000000006504350000000405400270000000010330008a000000010030008c0000161b0000213d000000100040008c000016630000813d000000400500043d000400000005001d00000020035000390000069a0400004100000000004304350000000003020433000100000003001d0000003702500039180e134e0000040f0000000102000029000000040120002900000037021000390000069b030000410000000000320435000000480210003900000003010000290000000003010433000300000003001d0000000201000029180e134e0000040f000000030200002900000001032000290000002802300039000000040100002900000000002104350000004802300039180e133c0000040f0000065401000041000000400300043d000300000003001d000000000013043500000020010000390000000402300039000000000012043500000024023000390000000401000029180e135b0000040f00000003020000290000000001210049000006050010009c0000060501008041000006050020009c000006050200804100000060011002100000004002200210000000000121019f00001810000104300000067e01000041000000000010043f0000003201000039000000040010043f0000067f010000410000181000010430000000400100043d0000004402100039000006990300004100000000003204350000065402000041000000000021043500000024021000390000002003000039000000000032043500000004021000390000000000320435000006050010009c0000060501008041000000400110021000000655011001c700001810000104300006000000000002000600000002001d000500000001001d000000000010043f0000000801000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f0000000100200190000017430000613d000000000101043b00000006020000290000063802200197000600000002001d000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f0000000100200190000017430000613d000000000101043b000000000101041a000000ff00100190000016c10000613d0000000501000029000000000010043f0000000801000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f0000000100200190000017430000613d000000000101043b0000000602000029000000000020043f000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f0000000100200190000017430000613d000000000101043b000000000201041a0000069202200197000000000021041b0000000001000414000006050010009c0000060501008041000000c0011002100000064b011001c70000800d02000039000000040300003900000000070004110000069e0400004100000005050000290000000606000029180e18040000040f0000000100200190000017430000613d0000000501000029000000000010043f0000000901000039000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f0000000100200190000017430000613d000000000201043b0000000601000029000000000010043f000500000002001d0000000101200039000300000001001d000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f0000000100200190000017430000613d0000000503000029000000000101043b000000000101041a000000000001004b000017420000613d000000000203041a000000000002004b000017450000613d000000000012004b000400000001001d000017220000613d000200000002001d000000000030043f0000000001000414000006050010009c0000060501008041000000c00110021000000606011001c70000801002000039180e18090000040f0000000100200190000017430000613d00000004020000290001000100200092000000000101043b0000000504000029000000000204041a000000010020006c0000174b0000a13d0000000202000029000000010220008a0000000001120019000000000101041a000200000001001d000000000040043f0000000001000414000006050010009c0000060501008041000000c00110021000000606011001c70000801002000039180e18090000040f0000000100200190000017430000613d000000000101043b00000001011000290000000202000029000000000021041b000000000020043f0000000301000029000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f0000000100200190000017430000613d000000000101043b0000000402000029000000000021041b0000000503000029000000000103041a000400000001001d000000000001004b000017510000613d000000000030043f0000000001000414000006050010009c0000060501008041000000c00110021000000606011001c70000801002000039180e18090000040f0000000100200190000017430000613d0000000402000029000000010220008a000000000101043b0000000001210019000000000001041b0000000501000029000000000021041b0000000601000029000000000010043f0000000301000029000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f0000000100200190000017430000613d000000000101043b000000000001041b000000000001042d000000000100001900001810000104300000067e01000041000000000010043f0000001101000039000000040010043f0000067f0100004100001810000104300000067e01000041000000000010043f0000003201000039000000040010043f0000067f0100004100001810000104300000067e01000041000000000010043f0000003101000039000000040010043f0000067f0100004100001810000104300001000000000002000000000301041a000100000002001d000000000023004b0000176a0000a13d000000000010043f0000000001000414000006050010009c0000060501008041000000c00110021000000606011001c70000801002000039180e18090000040f0000000100200190000017700000613d000000000101043b00000001011000290000000002000019000000000001042d0000067e01000041000000000010043f0000003201000039000000040010043f0000067f010000410000181000010430000000000100001900001810000104300004000000000002000300000002001d000000000020043f000400000001001d0000000101100039000200000001001d000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f0000000100200190000017af0000613d000000000101043b000000000101041a000000000001004b000017870000613d000000000001042d0000000402000029000000000102041a000006070010009c000017b10000813d000100000001001d0000000101100039000000000012041b000000000020043f0000000001000414000006050010009c0000060501008041000000c00110021000000606011001c70000801002000039180e18090000040f0000000100200190000017af0000613d000000000101043b00000001011000290000000302000029000000000021041b0000000401000029000000000101041a000400000001001d000000000020043f0000000201000029000000200010043f0000000001000414000006050010009c0000060501008041000000c0011002100000064a011001c70000801002000039180e18090000040f0000000100200190000017af0000613d000000000101043b0000000402000029000000000021041b000000000001042d000000000100001900001810000104300000067e01000041000000000010043f0000004101000039000000040010043f0000067f010000410000181000010430000000400300043d0000063b04200197000027110040008c000017c90000813d0000063801100198000017dc0000613d000006930030009c000017ec0000813d0000004005300039000000400050043f000000200530003900000000004504350000000000130435000000a002200210000000000112019f0000000602000039000000000012041b000000000001042d00000064013000390000066e02000041000000000021043500000044013000390000066f02000041000000000021043500000024013000390000002a02000039000000000021043500000654010000410000000000130435000000040130003900000020020000390000000000210435000006050030009c0000060503008041000000400130021000000658011001c7000018100001043000000044013000390000065302000041000000000021043500000024013000390000001902000039000000000021043500000654010000410000000000130435000000040130003900000020020000390000000000210435000006050030009c0000060503008041000000400130021000000655011001c700001810000104300000067e01000041000000000010043f0000004101000039000000040010043f0000067f010000410000181000010430000000000001042f000006050010009c000006050100804100000060011002100000000002000414000006050020009c0000060502008041000000c002200210000000000112019f0000064b011001c70000801002000039180e18090000040f0000000100200190000018020000613d000000000101043b000000000001042d0000000001000019000018100001043000001807002104210000000102000039000000000001042d0000000002000019000000000001042d0000180c002104230000000102000039000000000001042d0000000002000019000000000001042d0000180e000004320000180f0001042e000018100001043000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffff020000000000000000000000000000000000002000000000000000000000000000000000000000000000000000000000000000000000000100000000000000000000000200000000000000000000000000000080000001000000000000000000000000000000000000000000000000000000000000000000000000006c0360ea00000000000000000000000000000000000000000000000000000000b390c0aa00000000000000000000000000000000000000000000000000000000e8a3d48400000000000000000000000000000000000000000000000000000000f242432900000000000000000000000000000000000000000000000000000000f242432a00000000000000000000000000000000000000000000000000000000f895481800000000000000000000000000000000000000000000000000000000e8a3d48500000000000000000000000000000000000000000000000000000000e985e9c500000000000000000000000000000000000000000000000000000000ca15c87200000000000000000000000000000000000000000000000000000000ca15c87300000000000000000000000000000000000000000000000000000000d547741f00000000000000000000000000000000000000000000000000000000b390c0ab00000000000000000000000000000000000000000000000000000000b48ab8b60000000000000000000000000000000000000000000000000000000091d1485300000000000000000000000000000000000000000000000000000000a217fdde00000000000000000000000000000000000000000000000000000000a217fddf00000000000000000000000000000000000000000000000000000000a22cb4650000000000000000000000000000000000000000000000000000000091d1485400000000000000000000000000000000000000000000000000000000938e3d7b000000000000000000000000000000000000000000000000000000007e518ec7000000000000000000000000000000000000000000000000000000007e518ec8000000000000000000000000000000000000000000000000000000009010d07c000000000000000000000000000000000000000000000000000000006c0360eb00000000000000000000000000000000000000000000000000000000731133e900000000000000000000000000000000000000000000000000000000248a9ca2000000000000000000000000000000000000000000000000000000002f2ff15c000000000000000000000000000000000000000000000000000000004e1273f3000000000000000000000000000000000000000000000000000000004e1273f4000000000000000000000000000000000000000000000000000000005944c753000000000000000000000000000000000000000000000000000000002f2ff15d0000000000000000000000000000000000000000000000000000000036568abe000000000000000000000000000000000000000000000000000000002a552059000000000000000000000000000000000000000000000000000000002a55205a000000000000000000000000000000000000000000000000000000002eb2c2d600000000000000000000000000000000000000000000000000000000248a9ca3000000000000000000000000000000000000000000000000000000002693ebf2000000000000000000000000000000000000000000000000000000000b5ee0050000000000000000000000000000000000000000000000000000000018160ddc0000000000000000000000000000000000000000000000000000000018160ddd0000000000000000000000000000000000000000000000000000000020ec271b000000000000000000000000000000000000000000000000000000000b5ee006000000000000000000000000000000000000000000000000000000000e89341c0000000000000000000000000000000000000000000000000000000004634d8c0000000000000000000000000000000000000000000000000000000004634d8d0000000000000000000000000000000000000000000000000000000006fdde030000000000000000000000000000000000000000000000000000000000fdd58e0000000000000000000000000000000000000000000000000000000001ffc9a7000000000000000000000000ffffffffffffffffffffffffffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffffff000000000000000000000000000000000000000000000000ffffffffffffff7f0000000000000000000000000000000000000000ffffffffffffffffffffffff310ab089e4439a4c15d089f94afb7896ff553aecb10793d0ab882de59d99a32e0200000200000000000000000000000000000044000000000000000000000000f92ee8a9000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000004000000000000000000000000fc949c7b4a13586e39d89eead2f38644f9fb3efb5a0490b14f8fc0ceab44c250036b6384b5eca791c62761152d0c79bb0604c104a5fb6f4eb0703f3154bb3db0fc949c7b4a13586e39d89eead2f38644f9fb3efb5a0490b14f8fc0ceab44c24f75ca53043ea007e5c65182cbb028f60d7179ff4b55739a3949b401801c942e658a35acfbc15ff81a39ae7d344fd709f28e8600b4aa8c65c6b64bfe7fe36bd19b75ca53043ea007e5c65182cbb028f60d7179ff4b55739a3949b401801c942e6439a5844729cae3e308f36a5ce933956d7c6367997d26743ca06a70b77c062d58c65a7bb8d6351c1cf70c95a316cc6a92839c986682d98bc35f958f4883f9d2a839a5844729cae3e308f36a5ce933956d7c6367997d26743ca06a70b77c062d575eff886ea0ce6ca488a3d6e336d6c0f75f46d19b42c06ce5ee98e42c96d256c7020000000000000000000000000000000000004000000000000000000000000002000000000000000000000000000000000000000000000000000000000000002f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0dec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6cec8156718a8372b1db44bb411437d0870f3e3790d4a08526d024ce1b0b668f6b6db4061a20ca83a3be756ee172bd37a029093ac5afe4ce968c6d5435b43cb011e02a0315b383857ac496e9d2b2546a699afaeb4e5e83a1fdef64376d0b74e5a5000000000000000000000000000000000000000000000000ffffffffffffffbf9f2df0fed2c77648de5860a4cc508cd0818c85b8b8a1ab4ceeef8d981c8956a6455243323938313a20696e76616c69642072656365697665720000000000000008c379a0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000064000000000000000000000000445f4f50455241544f52000000000000000000000000000000000000000000004552433131353523736166655472616e7366657246726f6d3a20494e56414c490000000000000000000000000000000000000084000000000000000000000000c3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62e03fe177bb050a40ea1b3ecd64121a3fa063a94b6d404b2f45c64697555efe0e0200000200000000000000000000000000000024000000000000000000000000c5d2460186f7233c927e7db2dcc703c0e500b653ca82273b7bfad8045d85a470f23a6e610000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000ffffffe000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000000000494e56414c49445f4f4e5f524543454956455f4d45535341474500000000000045524331313535235f63616c6c6f6e4552433131353552656365697665643a20445f524543495049454e5400000000000000000000000000000000000000000000000000000000000000000000000000000000200000008000000000000000007fffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe080000000000000000000000000000000000000000000000000000000000000004a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fbbc197c81000000000000000000000000000000000000000000000000000000007665643a20494e56414c49445f4f4e5f524543454956455f4d4553534147450045524331313535235f63616c6c6f6e455243313135354261746368526563656917307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c310000000000000000000000000000000000000020000000000000000000000000455243323938313a20496e76616c696420706172616d657465727300000000002073616c65507269636500000000000000000000000000000000000000000000455243323938313a20726f79616c7479206665652077696c6c2065786365656441525241595f4c454e4754480000000000000000000000000000000000000000455243313135352362616c616e63654f6642617463683a20494e56414c49445f00000000000000000000000000000000000000000000003fffffffffffffffe0416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636520726f6c657320666f722073656c66000000000000000000000000000000000000000000000000000000000000000000000000840000008000000000000000004e56414c49445f4f50455241544f52000000000000000000000000000000000045524331313535237361666542617463685472616e7366657246726f6d3a2049494e56414c49445f4152524159535f4c454e475448000000000000000000000045524331313535235f7361666542617463685472616e7366657246726f6d3a204e56414c49445f524543495049454e540000000000000000000000000000000000000000000000000000000000000000000000400000000000000000000000009d89020a00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000fffffffffffffffe4e487b7100000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000002400000000000000000000000000ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffd00000000000000000000000000000000000000000000000000000000000000030000000000000000000000000000000000000000000000000000000000000002e6a736f6e0000000000000000000000000000000000000000000000000000003e85e62effffffffffffffffffffffffffffffffffffffffffffffffffffffff3e85e62f00000000000000000000000000000000000000000000000000000000c79b8b5f00000000000000000000000000000000000000000000000000000000d9b67a260000000000000000000000000000000000000000000000000000000001ffc9a7000000000000000000000000000000000000000000000000000000000e89341c000000000000000000000000000000000000000000000000000000002a55205a000000000000000000000000000000000000000000000000000000005a05180f000000000000000000000000000000000000000000000000000000007965db0b0000000000000000000000000000000000000000000000000000000000000001000000000000000000000000000000000000000000000000000000005a05180effffffffffffffffffffffffffffffffffffffffffffffffffffffff7965db0affffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffe0ffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffffff00000000000000000000000000000000000000000000000000ffffffffffffffc0a9ced9fdc45cded6d4b7a90e36d1ee82b957a500cc22704c465e9bdf275406fd000000000000000000000000000000000000000000000000ffffffffffffffa0780000000000000000000000000000000000000000000000000000000000000030313233343536373839616263646566000000000000000000000000000000007f00000000000000000000000000000000000000000000000000000000000000537472696e67733a20686578206c656e67746820696e73756666696369656e74416363657373436f6e74726f6c3a206163636f756e7420000000000000000000206973206d697373696e6720726f6c652000000000000000000000000000000095f185554aba264de8ed412af70e5aba6acb0e648f258c912ad29ed85d11ca1851a495916474fe1a0c0fcfb65a8a97682b84a054118858cdd1f5dfd7fc0919ebf6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b00000000000000000000000000000000000000000000000000000000000000004f31ddc6f9b4fe3b142e0af0382d753a3bb98dab10b4daa53f8a0677747fb116
[ 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.