diff --git a/deployments/polygon/ERC1155NFTProductContract.json b/deployments/polygon/ERC1155NFTProductContract.json new file mode 100644 index 0000000..a74b90a --- /dev/null +++ b/deployments/polygon/ERC1155NFTProductContract.json @@ -0,0 +1,1835 @@ +{ + "address": "0xcD29022cdd501C2f7Ee0f97a7Ea3e3EE87F22706", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bool", + "name": "tokensBurnable", + "type": "bool" + } + ], + "internalType": "struct Config.Deployment", + "name": "deploymentConfig", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "string", + "name": "baseURI", + "type": "string" + }, + { + "internalType": "bool", + "name": "metadataUpdatable", + "type": "bool" + }, + { + "internalType": "bool", + "name": "tokensTransferable", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "royaltiesBps", + "type": "uint256" + }, + { + "internalType": "address", + "name": "royaltiesAddress", + "type": "address" + } + ], + "internalType": "struct Config.Runtime", + "name": "runtimeConfig", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "addresses", + "type": "address[]" + }, + { + "internalType": "bool", + "name": "frozen", + "type": "bool" + } + ], + "internalType": "struct GranularRoles.RolesAddresses[]", + "name": "rolesAddresses", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "_value", + "type": "string" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "PermanentURI", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "PermanentURIGlobal", + "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": "values", + "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": "value", + "type": "uint256" + } + ], + "name": "TransferSingle", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "value", + "type": "string" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "URI", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "BURN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_URI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINT_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NAME", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ROYALTIES_BASIS", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TRANSFER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UPDATE_CONTRACT_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UPDATE_TOKEN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "accounts", + "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": "id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "value", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "values", + "type": "uint256[]" + } + ], + "name": "burnBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "contractURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "freezeTokenUris", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "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": "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": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bool", + "name": "tokensBurnable", + "type": "bool" + } + ], + "internalType": "struct Config.Deployment", + "name": "deploymentConfig", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "string", + "name": "baseURI", + "type": "string" + }, + { + "internalType": "bool", + "name": "metadataUpdatable", + "type": "bool" + }, + { + "internalType": "bool", + "name": "tokensTransferable", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "royaltiesBps", + "type": "uint256" + }, + { + "internalType": "address", + "name": "royaltiesAddress", + "type": "address" + } + ], + "internalType": "struct Config.Runtime", + "name": "runtimeConfig", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "addresses", + "type": "address[]" + }, + { + "internalType": "bool", + "name": "frozen", + "type": "bool" + } + ], + "internalType": "struct GranularRoles.RolesAddresses[]", + "name": "rolesAddresses", + "type": "tuple[]" + } + ], + "name": "initialize", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "address", + "name": "operator", + "type": "address" + } + ], + "name": "isApprovedForAll", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "metadataUpdatable", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + }, + { + "internalType": "string", + "name": "tokenUri", + "type": "string" + } + ], + "name": "mintByOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "to", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + }, + { + "internalType": "string[]", + "name": "uris", + "type": "string[]" + } + ], + "name": "mintByOwnerBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "revokeNFTPortPermissions", + "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": [], + "name": "royaltiesAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "royaltiesBasisPoints", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "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": "_newURI", + "type": "string" + } + ], + "name": "setURI", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "tokenSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "tokensBurnable", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "tokensTransferable", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "id", + "type": "uint256" + }, + { + "internalType": "uint256", + "name": "amount", + "type": "uint256" + } + ], + "name": "transferByOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address[]", + "name": "to", + "type": "address[]" + }, + { + "internalType": "uint256[]", + "name": "ids", + "type": "uint256[]" + }, + { + "internalType": "uint256[]", + "name": "amounts", + "type": "uint256[]" + } + ], + "name": "transferByOwnerBatch", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "baseURI", + "type": "string" + }, + { + "internalType": "bool", + "name": "metadataUpdatable", + "type": "bool" + }, + { + "internalType": "bool", + "name": "tokensTransferable", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "royaltiesBps", + "type": "uint256" + }, + { + "internalType": "address", + "name": "royaltiesAddress", + "type": "address" + } + ], + "internalType": "struct Config.Runtime", + "name": "newConfig", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "addresses", + "type": "address[]" + }, + { + "internalType": "bool", + "name": "frozen", + "type": "bool" + } + ], + "internalType": "struct GranularRoles.RolesAddresses[]", + "name": "rolesAddresses", + "type": "tuple[]" + }, + { + "internalType": "bool", + "name": "isRevokeNFTPortPermissions", + "type": "bool" + } + ], + "name": "update", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_newUri", + "type": "string" + }, + { + "internalType": "bool", + "name": "_isFreezeTokenUri", + "type": "bool" + } + ], + "name": "updateTokenUri", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "uri", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + } + ], + "transactionHash": "0x248ca8fb4d2f2716dd2df40a8075b462de78c3f30b67205ba4cb30d008511a1f", + "receipt": { + "to": null, + "from": "0xd39Ec8F40acF251c092CE64A9db5EA428abC7E72", + "contractAddress": "0xcD29022cdd501C2f7Ee0f97a7Ea3e3EE87F22706", + "transactionIndex": 30, + "gasUsed": "4673918", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000400100000000000000000000000000000000080000400000000000000000000080000000000000000000000000000000000000000000000000000000000080000000000000000004200000000000000000000000000400000000008000000000000000000000004000000000000000000001000000040000080000000000000000100200000000000000000000000000000000000000000000000000000004000000000000100020", + "blockHash": "0x0bad87f30059b33b0bb97a8eaefd5fa607c85b7f1eb9bdb62f11e2f3d46ed442", + "transactionHash": "0x248ca8fb4d2f2716dd2df40a8075b462de78c3f30b67205ba4cb30d008511a1f", + "logs": [ + { + "transactionIndex": 30, + "blockNumber": 37903842, + "transactionHash": "0x248ca8fb4d2f2716dd2df40a8075b462de78c3f30b67205ba4cb30d008511a1f", + "address": "0xcD29022cdd501C2f7Ee0f97a7Ea3e3EE87F22706", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 104, + "blockHash": "0x0bad87f30059b33b0bb97a8eaefd5fa607c85b7f1eb9bdb62f11e2f3d46ed442" + }, + { + "transactionIndex": 30, + "blockNumber": 37903842, + "transactionHash": "0x248ca8fb4d2f2716dd2df40a8075b462de78c3f30b67205ba4cb30d008511a1f", + "address": "0xcD29022cdd501C2f7Ee0f97a7Ea3e3EE87F22706", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 105, + "blockHash": "0x0bad87f30059b33b0bb97a8eaefd5fa607c85b7f1eb9bdb62f11e2f3d46ed442" + }, + { + "transactionIndex": 30, + "blockNumber": 37903842, + "transactionHash": "0x248ca8fb4d2f2716dd2df40a8075b462de78c3f30b67205ba4cb30d008511a1f", + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000d39ec8f40acf251c092ce64a9db5ea428abc7e72", + "0x000000000000000000000000127685d6dd6683085da4b6a041efcef1681e5c9c" + ], + "data": "0x00000000000000000000000000000000000000000000000002b54ab209a24f6c0000000000000000000000000000000000000000000000002323c7114776032a0000000000000000000000000000000000000000000008d8968988d27451f1a3000000000000000000000000000000000000000000000000206e7c5f3dd3b3be0000000000000000000000000000000000000000000008d8993ed3847df4410f", + "logIndex": 106, + "blockHash": "0x0bad87f30059b33b0bb97a8eaefd5fa607c85b7f1eb9bdb62f11e2f3d46ed442" + } + ], + "blockNumber": 37903842, + "cumulativeGasUsed": "9302106", + "status": 1, + "byzantium": true + }, + "args": [ + { + "name": "NFTPort", + "symbol": "NFT", + "owner": "0xd39Ec8F40acF251c092CE64A9db5EA428abC7E72", + "tokensBurnable": true + }, + { + "baseURI": "ipfs://baseURI", + "metadataUpdatable": true, + "tokensTransferable": true, + "royaltiesBps": 250, + "royaltiesAddress": "0xd39Ec8F40acF251c092CE64A9db5EA428abC7E72" + }, + [] + ], + "numDeployments": 1, + "solcInputHash": "1e300b8e19558e2a4c02af65df638f3f", + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"tokensBurnable\",\"type\":\"bool\"}],\"internalType\":\"struct Config.Deployment\",\"name\":\"deploymentConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"metadataUpdatable\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"tokensTransferable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"royaltiesBps\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"royaltiesAddress\",\"type\":\"address\"}],\"internalType\":\"struct Config.Runtime\",\"name\":\"runtimeConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"frozen\",\"type\":\"bool\"}],\"internalType\":\"struct GranularRoles.RolesAddresses[]\",\"name\":\"rolesAddresses\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"PermanentURI\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"PermanentURIGlobal\",\"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\":\"values\",\"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\":\"value\",\"type\":\"uint256\"}],\"name\":\"TransferSingle\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"URI\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BURN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_URI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NAME\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTIES_BASIS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TRANSFER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPDATE_CONTRACT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPDATE_TOKEN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"accounts\",\"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\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"value\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"values\",\"type\":\"uint256[]\"}],\"name\":\"burnBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"contractURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"freezeTokenUris\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"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\":\"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\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"tokensBurnable\",\"type\":\"bool\"}],\"internalType\":\"struct Config.Deployment\",\"name\":\"deploymentConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"metadataUpdatable\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"tokensTransferable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"royaltiesBps\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"royaltiesAddress\",\"type\":\"address\"}],\"internalType\":\"struct Config.Runtime\",\"name\":\"runtimeConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"frozen\",\"type\":\"bool\"}],\"internalType\":\"struct GranularRoles.RolesAddresses[]\",\"name\":\"rolesAddresses\",\"type\":\"tuple[]\"}],\"name\":\"initialize\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"}],\"name\":\"isApprovedForAll\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataUpdatable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenUri\",\"type\":\"string\"}],\"name\":\"mintByOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"to\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"},{\"internalType\":\"string[]\",\"name\":\"uris\",\"type\":\"string[]\"}],\"name\":\"mintByOwnerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revokeNFTPortPermissions\",\"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\":[],\"name\":\"royaltiesAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"royaltiesBasisPoints\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"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\":\"_newURI\",\"type\":\"string\"}],\"name\":\"setURI\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"tokenSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokensBurnable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokensTransferable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"id\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"transferByOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address[]\",\"name\":\"to\",\"type\":\"address[]\"},{\"internalType\":\"uint256[]\",\"name\":\"ids\",\"type\":\"uint256[]\"},{\"internalType\":\"uint256[]\",\"name\":\"amounts\",\"type\":\"uint256[]\"}],\"name\":\"transferByOwnerBatch\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"metadataUpdatable\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"tokensTransferable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"royaltiesBps\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"royaltiesAddress\",\"type\":\"address\"}],\"internalType\":\"struct Config.Runtime\",\"name\":\"newConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"frozen\",\"type\":\"bool\"}],\"internalType\":\"struct GranularRoles.RolesAddresses[]\",\"name\":\"rolesAddresses\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isRevokeNFTPortPermissions\",\"type\":\"bool\"}],\"name\":\"update\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_newUri\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"_isFreezeTokenUri\",\"type\":\"bool\"}],\"name\":\"updateTokenUri\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"uri\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"balanceOf(address,uint256)\":{\"details\":\"See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address.\"},\"balanceOfBatch(address[],uint256[])\":{\"details\":\"See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length.\"},\"contractURI()\":{\"details\":\"OpenSea contract metadata, returns a base64 encoded JSON string containing royalties basis points and royalties address\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"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.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC1155-isApprovedForAll}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"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.\"},\"revokeRole(bytes32,address)\":{\"details\":\"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.\"},\"safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)\":{\"details\":\"See {IERC1155-safeBatchTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,uint256,bytes)\":{\"details\":\"See {IERC1155-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC1155-setApprovalForAll}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/standalone/ERC1155NFTProductContract.sol\":\"ERC1155NFTProductContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlUpgradeable.sol\\\";\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../utils/StringsUpgradeable.sol\\\";\\nimport \\\"../utils/introspection/ERC165Upgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable {\\n function __AccessControl_init() internal onlyInitializing {\\n }\\n\\n function __AccessControl_init_unchained() internal onlyInitializing {\\n }\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n StringsUpgradeable.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n StringsUpgradeable.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x2ea9f206854c98b67dd228f8cad22bfe90ba7b1c2295315672f2e1e244623fc3\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControlUpgradeable {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0xb8f5302f12138c5561362e88a78d061573e6298b7a1a5afe84a1e2c8d4d5aeaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n * initialization step. This is essential to configure modules that are added through upgrades and that require\\n * initialization.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal onlyInitializing {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x8cc03c5ac17e8a7396e487cda41fc1f1dfdb91db7d528e6da84bee3b6dd7e167\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/ERC1155.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC1155Upgradeable.sol\\\";\\nimport \\\"./IERC1155ReceiverUpgradeable.sol\\\";\\nimport \\\"./extensions/IERC1155MetadataURIUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../../utils/introspection/ERC165Upgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the basic standard multi-token.\\n * See https://eips.ethereum.org/EIPS/eip-1155\\n * Originally based on code by Enjin: https://github.com/enjin/erc-1155\\n *\\n * _Available since v3.1._\\n */\\ncontract ERC1155Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC1155Upgradeable, IERC1155MetadataURIUpgradeable {\\n using AddressUpgradeable for address;\\n\\n // Mapping from token ID to account balances\\n mapping(uint256 => mapping(address => uint256)) private _balances;\\n\\n // Mapping from account to operator approvals\\n mapping(address => mapping(address => bool)) private _operatorApprovals;\\n\\n // Used as the URI for all token types by relying on ID substitution, e.g. https://token-cdn-domain/{id}.json\\n string private _uri;\\n\\n /**\\n * @dev See {_setURI}.\\n */\\n function __ERC1155_init(string memory uri_) internal onlyInitializing {\\n __ERC1155_init_unchained(uri_);\\n }\\n\\n function __ERC1155_init_unchained(string memory uri_) internal onlyInitializing {\\n _setURI(uri_);\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {\\n return\\n interfaceId == type(IERC1155Upgradeable).interfaceId ||\\n interfaceId == type(IERC1155MetadataURIUpgradeable).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC1155MetadataURI-uri}.\\n *\\n * This implementation returns the same URI for *all* token types. It relies\\n * on the token type ID substitution mechanism\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\\n *\\n * Clients calling this function must replace the `\\\\{id\\\\}` substring with the\\n * actual token type ID.\\n */\\n function uri(uint256) public view virtual override returns (string memory) {\\n return _uri;\\n }\\n\\n /**\\n * @dev See {IERC1155-balanceOf}.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function balanceOf(address account, uint256 id) public view virtual override returns (uint256) {\\n require(account != address(0), \\\"ERC1155: address zero is not a valid owner\\\");\\n return _balances[id][account];\\n }\\n\\n /**\\n * @dev See {IERC1155-balanceOfBatch}.\\n *\\n * Requirements:\\n *\\n * - `accounts` and `ids` must have the same length.\\n */\\n function balanceOfBatch(address[] memory accounts, uint256[] memory ids)\\n public\\n view\\n virtual\\n override\\n returns (uint256[] memory)\\n {\\n require(accounts.length == ids.length, \\\"ERC1155: accounts and ids length mismatch\\\");\\n\\n uint256[] memory batchBalances = new uint256[](accounts.length);\\n\\n for (uint256 i = 0; i < accounts.length; ++i) {\\n batchBalances[i] = balanceOf(accounts[i], ids[i]);\\n }\\n\\n return batchBalances;\\n }\\n\\n /**\\n * @dev See {IERC1155-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual override {\\n _setApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC1155-isApprovedForAll}.\\n */\\n function isApprovedForAll(address account, address operator) public view virtual override returns (bool) {\\n return _operatorApprovals[account][operator];\\n }\\n\\n /**\\n * @dev See {IERC1155-safeTransferFrom}.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) public virtual override {\\n require(\\n from == _msgSender() || isApprovedForAll(from, _msgSender()),\\n \\\"ERC1155: caller is not token owner nor approved\\\"\\n );\\n _safeTransferFrom(from, to, id, amount, data);\\n }\\n\\n /**\\n * @dev See {IERC1155-safeBatchTransferFrom}.\\n */\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) public virtual override {\\n require(\\n from == _msgSender() || isApprovedForAll(from, _msgSender()),\\n \\\"ERC1155: caller is not token owner nor approved\\\"\\n );\\n _safeBatchTransferFrom(from, to, ids, amounts, data);\\n }\\n\\n /**\\n * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `from` must have a balance of tokens of type `id` of at least `amount`.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function _safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) internal virtual {\\n require(to != address(0), \\\"ERC1155: transfer to the zero address\\\");\\n\\n address operator = _msgSender();\\n uint256[] memory ids = _asSingletonArray(id);\\n uint256[] memory amounts = _asSingletonArray(amount);\\n\\n _beforeTokenTransfer(operator, from, to, ids, amounts, data);\\n\\n uint256 fromBalance = _balances[id][from];\\n require(fromBalance >= amount, \\\"ERC1155: insufficient balance for transfer\\\");\\n unchecked {\\n _balances[id][from] = fromBalance - amount;\\n }\\n _balances[id][to] += amount;\\n\\n emit TransferSingle(operator, from, to, id, amount);\\n\\n _afterTokenTransfer(operator, from, to, ids, amounts, data);\\n\\n _doSafeTransferAcceptanceCheck(operator, from, to, id, amount, data);\\n }\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_safeTransferFrom}.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n */\\n function _safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n require(ids.length == amounts.length, \\\"ERC1155: ids and amounts length mismatch\\\");\\n require(to != address(0), \\\"ERC1155: transfer to the zero address\\\");\\n\\n address operator = _msgSender();\\n\\n _beforeTokenTransfer(operator, from, to, ids, amounts, data);\\n\\n for (uint256 i = 0; i < ids.length; ++i) {\\n uint256 id = ids[i];\\n uint256 amount = amounts[i];\\n\\n uint256 fromBalance = _balances[id][from];\\n require(fromBalance >= amount, \\\"ERC1155: insufficient balance for transfer\\\");\\n unchecked {\\n _balances[id][from] = fromBalance - amount;\\n }\\n _balances[id][to] += amount;\\n }\\n\\n emit TransferBatch(operator, from, to, ids, amounts);\\n\\n _afterTokenTransfer(operator, from, to, ids, amounts, data);\\n\\n _doSafeBatchTransferAcceptanceCheck(operator, from, to, ids, amounts, data);\\n }\\n\\n /**\\n * @dev Sets a new URI for all token types, by relying on the token type ID\\n * substitution mechanism\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata[defined in the EIP].\\n *\\n * By this mechanism, any occurrence of the `\\\\{id\\\\}` substring in either the\\n * URI or any of the amounts in the JSON file at said URI will be replaced by\\n * clients with the token type ID.\\n *\\n * For example, the `https://token-cdn-domain/\\\\{id\\\\}.json` URI would be\\n * interpreted by clients as\\n * `https://token-cdn-domain/000000000000000000000000000000000000000000000000000000000004cce0.json`\\n * for token type ID 0x4cce0.\\n *\\n * See {uri}.\\n *\\n * Because these URIs cannot be meaningfully represented by the {URI} event,\\n * this function emits no events.\\n */\\n function _setURI(string memory newuri) internal virtual {\\n _uri = newuri;\\n }\\n\\n /**\\n * @dev Creates `amount` tokens of token type `id`, and assigns them to `to`.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function _mint(\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) internal virtual {\\n require(to != address(0), \\\"ERC1155: mint to the zero address\\\");\\n\\n address operator = _msgSender();\\n uint256[] memory ids = _asSingletonArray(id);\\n uint256[] memory amounts = _asSingletonArray(amount);\\n\\n _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);\\n\\n _balances[id][to] += amount;\\n emit TransferSingle(operator, address(0), to, id, amount);\\n\\n _afterTokenTransfer(operator, address(0), to, ids, amounts, data);\\n\\n _doSafeTransferAcceptanceCheck(operator, address(0), to, id, amount, data);\\n }\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_mint}.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `ids` and `amounts` must have the same length.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n */\\n function _mintBatch(\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {\\n require(to != address(0), \\\"ERC1155: mint to the zero address\\\");\\n require(ids.length == amounts.length, \\\"ERC1155: ids and amounts length mismatch\\\");\\n\\n address operator = _msgSender();\\n\\n _beforeTokenTransfer(operator, address(0), to, ids, amounts, data);\\n\\n for (uint256 i = 0; i < ids.length; i++) {\\n _balances[ids[i]][to] += amounts[i];\\n }\\n\\n emit TransferBatch(operator, address(0), to, ids, amounts);\\n\\n _afterTokenTransfer(operator, address(0), to, ids, amounts, data);\\n\\n _doSafeBatchTransferAcceptanceCheck(operator, address(0), to, ids, amounts, data);\\n }\\n\\n /**\\n * @dev Destroys `amount` tokens of token type `id` from `from`\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `from` must have at least `amount` tokens of token type `id`.\\n */\\n function _burn(\\n address from,\\n uint256 id,\\n uint256 amount\\n ) internal virtual {\\n require(from != address(0), \\\"ERC1155: burn from the zero address\\\");\\n\\n address operator = _msgSender();\\n uint256[] memory ids = _asSingletonArray(id);\\n uint256[] memory amounts = _asSingletonArray(amount);\\n\\n _beforeTokenTransfer(operator, from, address(0), ids, amounts, \\\"\\\");\\n\\n uint256 fromBalance = _balances[id][from];\\n require(fromBalance >= amount, \\\"ERC1155: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[id][from] = fromBalance - amount;\\n }\\n\\n emit TransferSingle(operator, from, address(0), id, amount);\\n\\n _afterTokenTransfer(operator, from, address(0), ids, amounts, \\\"\\\");\\n }\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {_burn}.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `ids` and `amounts` must have the same length.\\n */\\n function _burnBatch(\\n address from,\\n uint256[] memory ids,\\n uint256[] memory amounts\\n ) internal virtual {\\n require(from != address(0), \\\"ERC1155: burn from the zero address\\\");\\n require(ids.length == amounts.length, \\\"ERC1155: ids and amounts length mismatch\\\");\\n\\n address operator = _msgSender();\\n\\n _beforeTokenTransfer(operator, from, address(0), ids, amounts, \\\"\\\");\\n\\n for (uint256 i = 0; i < ids.length; i++) {\\n uint256 id = ids[i];\\n uint256 amount = amounts[i];\\n\\n uint256 fromBalance = _balances[id][from];\\n require(fromBalance >= amount, \\\"ERC1155: burn amount exceeds balance\\\");\\n unchecked {\\n _balances[id][from] = fromBalance - amount;\\n }\\n }\\n\\n emit TransferBatch(operator, from, address(0), ids, amounts);\\n\\n _afterTokenTransfer(operator, from, address(0), ids, amounts, \\\"\\\");\\n }\\n\\n /**\\n * @dev Approve `operator` to operate on all of `owner` tokens\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function _setApprovalForAll(\\n address owner,\\n address operator,\\n bool approved\\n ) internal virtual {\\n require(owner != operator, \\\"ERC1155: setting approval status for self\\\");\\n _operatorApprovals[owner][operator] = approved;\\n emit ApprovalForAll(owner, operator, approved);\\n }\\n\\n /**\\n * @dev Hook that is called before any token transfer. This includes minting\\n * and burning, as well as batched variants.\\n *\\n * The same hook is called on both single and batched variants. For single\\n * transfers, the length of the `ids` and `amounts` arrays will be 1.\\n *\\n * Calling conditions (for each `id` and `amount` pair):\\n *\\n * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * of token type `id` will be transferred to `to`.\\n * - When `from` is zero, `amount` tokens of token type `id` will be minted\\n * for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`\\n * will be burned.\\n * - `from` and `to` are never both zero.\\n * - `ids` and `amounts` have the same, non-zero length.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address operator,\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any token transfer. This includes minting\\n * and burning, as well as batched variants.\\n *\\n * The same hook is called on both single and batched variants. For single\\n * transfers, the length of the `id` and `amount` arrays will be 1.\\n *\\n * Calling conditions (for each `id` and `amount` pair):\\n *\\n * - When `from` and `to` are both non-zero, `amount` of ``from``'s tokens\\n * of token type `id` will be transferred to `to`.\\n * - When `from` is zero, `amount` tokens of token type `id` will be minted\\n * for `to`.\\n * - when `to` is zero, `amount` of ``from``'s tokens of token type `id`\\n * will be burned.\\n * - `from` and `to` are never both zero.\\n * - `ids` and `amounts` have the same, non-zero length.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address operator,\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) internal virtual {}\\n\\n function _doSafeTransferAcceptanceCheck(\\n address operator,\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes memory data\\n ) private {\\n if (to.isContract()) {\\n try IERC1155ReceiverUpgradeable(to).onERC1155Received(operator, from, id, amount, data) returns (bytes4 response) {\\n if (response != IERC1155ReceiverUpgradeable.onERC1155Received.selector) {\\n revert(\\\"ERC1155: ERC1155Receiver rejected tokens\\\");\\n }\\n } catch Error(string memory reason) {\\n revert(reason);\\n } catch {\\n revert(\\\"ERC1155: transfer to non ERC1155Receiver implementer\\\");\\n }\\n }\\n }\\n\\n function _doSafeBatchTransferAcceptanceCheck(\\n address operator,\\n address from,\\n address to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n bytes memory data\\n ) private {\\n if (to.isContract()) {\\n try IERC1155ReceiverUpgradeable(to).onERC1155BatchReceived(operator, from, ids, amounts, data) returns (\\n bytes4 response\\n ) {\\n if (response != IERC1155ReceiverUpgradeable.onERC1155BatchReceived.selector) {\\n revert(\\\"ERC1155: ERC1155Receiver rejected tokens\\\");\\n }\\n } catch Error(string memory reason) {\\n revert(reason);\\n } catch {\\n revert(\\\"ERC1155: transfer to non ERC1155Receiver implementer\\\");\\n }\\n }\\n }\\n\\n function _asSingletonArray(uint256 element) private pure returns (uint256[] memory) {\\n uint256[] memory array = new uint256[](1);\\n array[0] = element;\\n\\n return array;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[47] private __gap;\\n}\\n\",\"keccak256\":\"0xe9208ac0602174f0ed30fb10c6292193308424dfa375a8270027d65878d4a812\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC1155/IERC1155Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev _Available since v3.1._\\n */\\ninterface IERC1155ReceiverUpgradeable is IERC165Upgradeable {\\n /**\\n * @dev Handles the receipt of a single ERC1155 token type. This function is\\n * called at the end of a `safeTransferFrom` after the balance has been updated.\\n *\\n * NOTE: To accept the transfer, this must return\\n * `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))`\\n * (i.e. 0xf23a6e61, or its own function selector).\\n *\\n * @param operator The address which initiated the transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param id The ID of the token being transferred\\n * @param value The amount of tokens being transferred\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155Received(address,address,uint256,uint256,bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155Received(\\n address operator,\\n address from,\\n uint256 id,\\n uint256 value,\\n bytes calldata data\\n ) external returns (bytes4);\\n\\n /**\\n * @dev Handles the receipt of a multiple ERC1155 token types. This function\\n * is called at the end of a `safeBatchTransferFrom` after the balances have\\n * been updated.\\n *\\n * NOTE: To accept the transfer(s), this must return\\n * `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))`\\n * (i.e. 0xbc197c81, or its own function selector).\\n *\\n * @param operator The address which initiated the batch transfer (i.e. msg.sender)\\n * @param from The address which previously owned the token\\n * @param ids An array containing ids of each token being transferred (order and length must match values array)\\n * @param values An array containing amounts of each token being transferred (order and length must match ids array)\\n * @param data Additional data with no specified format\\n * @return `bytes4(keccak256(\\\"onERC1155BatchReceived(address,address,uint256[],uint256[],bytes)\\\"))` if transfer is allowed\\n */\\n function onERC1155BatchReceived(\\n address operator,\\n address from,\\n uint256[] calldata ids,\\n uint256[] calldata values,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xffcb29612efb57efc8f0d4897deb5abaeac830022c59a3aa17446d698dbc856b\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC1155/IERC1155Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC1155/IERC1155.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC1155 compliant contract, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-1155[EIP].\\n *\\n * _Available since v3.1._\\n */\\ninterface IERC1155Upgradeable is IERC165Upgradeable {\\n /**\\n * @dev Emitted when `value` tokens of token type `id` are transferred from `from` to `to` by `operator`.\\n */\\n event TransferSingle(address indexed operator, address indexed from, address indexed to, uint256 id, uint256 value);\\n\\n /**\\n * @dev Equivalent to multiple {TransferSingle} events, where `operator`, `from` and `to` are the same for all\\n * transfers.\\n */\\n event TransferBatch(\\n address indexed operator,\\n address indexed from,\\n address indexed to,\\n uint256[] ids,\\n uint256[] values\\n );\\n\\n /**\\n * @dev Emitted when `account` grants or revokes permission to `operator` to transfer their tokens, according to\\n * `approved`.\\n */\\n event ApprovalForAll(address indexed account, address indexed operator, bool approved);\\n\\n /**\\n * @dev Emitted when the URI for token type `id` changes to `value`, if it is a non-programmatic URI.\\n *\\n * If an {URI} event was emitted for `id`, the standard\\n * https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[guarantees] that `value` will equal the value\\n * returned by {IERC1155MetadataURI-uri}.\\n */\\n event URI(string value, uint256 indexed id);\\n\\n /**\\n * @dev Returns the amount of tokens of token type `id` owned by `account`.\\n *\\n * Requirements:\\n *\\n * - `account` cannot be the zero address.\\n */\\n function balanceOf(address account, uint256 id) external view returns (uint256);\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {balanceOf}.\\n *\\n * Requirements:\\n *\\n * - `accounts` and `ids` must have the same length.\\n */\\n function balanceOfBatch(address[] calldata accounts, uint256[] calldata ids)\\n external\\n view\\n returns (uint256[] memory);\\n\\n /**\\n * @dev Grants or revokes permission to `operator` to transfer the caller's tokens, according to `approved`,\\n *\\n * Emits an {ApprovalForAll} event.\\n *\\n * Requirements:\\n *\\n * - `operator` cannot be the caller.\\n */\\n function setApprovalForAll(address operator, bool approved) external;\\n\\n /**\\n * @dev Returns true if `operator` is approved to transfer ``account``'s tokens.\\n *\\n * See {setApprovalForAll}.\\n */\\n function isApprovedForAll(address account, address operator) external view returns (bool);\\n\\n /**\\n * @dev Transfers `amount` tokens of token type `id` from `from` to `to`.\\n *\\n * Emits a {TransferSingle} event.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - If the caller is not `from`, it must have been approved to spend ``from``'s tokens via {setApprovalForAll}.\\n * - `from` must have a balance of tokens of type `id` of at least `amount`.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155Received} and return the\\n * acceptance magic value.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 id,\\n uint256 amount,\\n bytes calldata data\\n ) external;\\n\\n /**\\n * @dev xref:ROOT:erc1155.adoc#batch-operations[Batched] version of {safeTransferFrom}.\\n *\\n * Emits a {TransferBatch} event.\\n *\\n * Requirements:\\n *\\n * - `ids` and `amounts` must have the same length.\\n * - If `to` refers to a smart contract, it must implement {IERC1155Receiver-onERC1155BatchReceived} and return the\\n * acceptance magic value.\\n */\\n function safeBatchTransferFrom(\\n address from,\\n address to,\\n uint256[] calldata ids,\\n uint256[] calldata amounts,\\n bytes calldata data\\n ) external;\\n}\\n\",\"keccak256\":\"0x091a49ef99a2be002680781a10cc9dd74c0f348301ede5482c4ea625f79a8ffe\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC1155/extensions/IERC1155MetadataURIUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC1155/extensions/IERC1155MetadataURI.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC1155Upgradeable.sol\\\";\\n\\n/**\\n * @dev Interface of the optional ERC1155MetadataExtension interface, as defined\\n * in the https://eips.ethereum.org/EIPS/eip-1155#metadata-extensions[EIP].\\n *\\n * _Available since v3.1._\\n */\\ninterface IERC1155MetadataURIUpgradeable is IERC1155Upgradeable {\\n /**\\n * @dev Returns the URI for token type `id`.\\n *\\n * If the `\\\\{id\\\\}` substring is present in the URI, it must be replaced by\\n * clients with the actual token type ID.\\n */\\n function uri(uint256 id) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0xa350df12a8c10e821af05e0863f44e8317a0efa44df27bfd5dc1d63fdfa3c448\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary StringsUpgradeable {\\n bytes16 private constant _HEX_SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n // Inspired by OraclizeAPI's implementation - MIT licence\\n // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n if (value == 0) {\\n return \\\"0\\\";\\n }\\n uint256 temp = value;\\n uint256 digits;\\n while (temp != 0) {\\n digits++;\\n temp /= 10;\\n }\\n bytes memory buffer = new bytes(digits);\\n while (value != 0) {\\n digits -= 1;\\n buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\\n value /= 10;\\n }\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n if (value == 0) {\\n return \\\"0x00\\\";\\n }\\n uint256 temp = value;\\n uint256 length = 0;\\n while (temp != 0) {\\n length++;\\n temp >>= 8;\\n }\\n return toHexString(value, length);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _HEX_SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xea5339a7fff0ed42b45be56a88efdd0b2ddde9fa480dc99fef9a6a4c5b776863\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165Upgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\\n function __ERC165_init() internal onlyInitializing {\\n }\\n\\n function __ERC165_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165Upgradeable).interfaceId;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Interface for the NFT Royalty Standard.\\n *\\n * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal\\n * support for royalty payments across all NFT marketplaces and ecosystem participants.\\n *\\n * _Available since v4.5._\\n */\\ninterface IERC2981 is IERC165 {\\n /**\\n * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of\\n * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\\n */\\n function royaltyInfo(uint256 tokenId, uint256 salePrice)\\n external\\n view\\n returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0xa812eed728198acd2c30d06950a5bea8d68436e4f694dd892273266ec2f79f5b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/common/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC2981.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.\\n *\\n * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for\\n * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.\\n *\\n * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the\\n * fee is specified in basis points by default.\\n *\\n * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See\\n * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to\\n * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.\\n *\\n * _Available since v4.5._\\n */\\nabstract contract ERC2981 is IERC2981, ERC165 {\\n struct RoyaltyInfo {\\n address receiver;\\n uint96 royaltyFraction;\\n }\\n\\n RoyaltyInfo private _defaultRoyaltyInfo;\\n mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @inheritdoc IERC2981\\n */\\n function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {\\n RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];\\n\\n if (royalty.receiver == address(0)) {\\n royalty = _defaultRoyaltyInfo;\\n }\\n\\n uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();\\n\\n return (royalty.receiver, royaltyAmount);\\n }\\n\\n /**\\n * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a\\n * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an\\n * override.\\n */\\n function _feeDenominator() internal pure virtual returns (uint96) {\\n return 10000;\\n }\\n\\n /**\\n * @dev Sets the royalty information that all ids in this contract will default to.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: invalid receiver\\\");\\n\\n _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Removes default royalty information.\\n */\\n function _deleteDefaultRoyalty() internal virtual {\\n delete _defaultRoyaltyInfo;\\n }\\n\\n /**\\n * @dev Sets the royalty information for a specific token id, overriding the global default.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setTokenRoyalty(\\n uint256 tokenId,\\n address receiver,\\n uint96 feeNumerator\\n ) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: Invalid parameters\\\");\\n\\n _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Resets royalty information for the token id back to the global default.\\n */\\n function _resetTokenRoyalty(uint256 tokenId) internal virtual {\\n delete _tokenRoyaltyInfo[tokenId];\\n }\\n}\\n\",\"keccak256\":\"0x9bc4d7eb03c4e87fd5122e03cdff5f60fa360d76925980ad022b2c6fac9876f3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _HEX_SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n // Inspired by OraclizeAPI's implementation - MIT licence\\n // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n if (value == 0) {\\n return \\\"0\\\";\\n }\\n uint256 temp = value;\\n uint256 digits;\\n while (temp != 0) {\\n digits++;\\n temp /= 10;\\n }\\n bytes memory buffer = new bytes(digits);\\n while (value != 0) {\\n digits -= 1;\\n buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\\n value /= 10;\\n }\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n if (value == 0) {\\n return \\\"0x00\\\";\\n }\\n uint256 temp = value;\\n uint256 length = 0;\\n while (temp != 0) {\\n length++;\\n temp >>= 8;\\n }\\n return toHexString(value, length);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _HEX_SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/lib/Base64.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.14;\\n\\n/// @title Base64\\n/// @notice Provides a function for encoding some bytes in base64\\n/// @author Brecht Devos \\nlibrary Base64 {\\n bytes internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\\\";\\n\\n /// @notice Encodes some bytes to the base64 representation\\n function encode(bytes memory data) internal pure returns (string memory) {\\n uint256 len = data.length;\\n if (len == 0) return \\\"\\\";\\n\\n // multiply by 4/3 rounded up\\n uint256 encodedLen = 4 * ((len + 2) / 3);\\n\\n // Add some extra buffer at the end\\n bytes memory result = new bytes(encodedLen + 32);\\n\\n bytes memory table = _TABLE;\\n\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let i := 0\\n } lt(i, len) {\\n // solhint-disable-previous-line no-empty-blocks\\n } {\\n i := add(i, 3)\\n let input := and(mload(add(data, i)), 0xffffff)\\n\\n let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n out := shl(8, out)\\n out := add(\\n out,\\n and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)\\n )\\n out := shl(8, out)\\n out := add(\\n out,\\n and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)\\n )\\n out := shl(8, out)\\n out := add(\\n out,\\n and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)\\n )\\n out := shl(224, out)\\n\\n mstore(resultPtr, out)\\n\\n resultPtr := add(resultPtr, 4)\\n }\\n\\n switch mod(len, 3)\\n case 1 {\\n mstore(sub(resultPtr, 2), shl(240, 0x3d3d))\\n }\\n case 2 {\\n mstore(sub(resultPtr, 1), shl(248, 0x3d))\\n }\\n\\n mstore(result, encodedLen)\\n }\\n\\n return string(result);\\n }\\n}\\n\",\"keccak256\":\"0x48822add7a355a6d6c04679ecba55383d0490eedd1c02915871c36f9e1683185\",\"license\":\"MIT\"},\"contracts/lib/Config.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nlibrary Config {\\n /// Fixed at deployment time\\n struct Deployment {\\n // Name of the NFT contract.\\n string name;\\n // Symbol of the NFT contract.\\n string symbol;\\n // The contract owner address. If you wish to own the contract, then set it as your wallet address.\\n // This is also the wallet that can manage the contract on NFT marketplaces.\\n address owner;\\n // If true, tokens may be burned by owner. Cannot be changed later.\\n bool tokensBurnable;\\n }\\n\\n /// Updatable by admins and owner\\n struct Runtime {\\n // Metadata base URI for tokens, NFTs minted in this contract will have metadata URI of `baseURI` + `tokenID`.\\n // Set this to reveal token metadata.\\n string baseURI;\\n // If true, the base URI of the NFTs minted in the specified contract can be updated after minting (token URIs\\n // are not frozen on the contract level). This is useful for revealing NFTs after the drop. If false, all the\\n // NFTs minted in this contract are frozen by default which means token URIs are non-updatable.\\n bool metadataUpdatable;\\n // If true, tokens may be transferred by owner. Default is true. Can be only changed to false.\\n bool tokensTransferable;\\n // Secondary market royalties in basis points (100 bps = 1%)\\n uint256 royaltiesBps;\\n // Address for royalties\\n address royaltiesAddress;\\n }\\n}\\n\",\"keccak256\":\"0x5d34e33120817203948d5ac07093553a3546ed02e6289345017fc06d057ea9be\",\"license\":\"MIT\"},\"contracts/lib/GranularRoles.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol\\\";\\n\\n/*\\n * Custom roles handling abstract contract.\\n * Used for fine-grained access controls to contracts.\\n * Supported roles are:\\n * - `ADMIN_ROLE`, is granted to the initializer and one other account specified during intialization\\n * - `MINT_ROLE`, is used for minting tokens\\n * - `UPDATE_CONTRACT_ROLE`, is used for updating the contract\\n * - `BURN_ROLE`, is used for burning tokens\\n * - `TRANSFER_ROLE`, is used for transferring tokens\\n * `ADMIN_ROLE` has all the access rights for all the roles.\\n *\\n * Each role besides the `ADMIN_ROLE` can have any amount of addresses and can be made immutable.\\n */\\nabstract contract GranularRoles is AccessControlUpgradeable {\\n // Roles list\\n // Admin role can have 2 addresses:\\n // one address same as (_owner) which can be changed\\n // one for NFTPort API access which can only be revoked\\n bytes32 public constant ADMIN_ROLE = keccak256(\\\"ADMIN_ROLE\\\");\\n // Following roles can have multiple addresses, can be changed by admin or update contract role\\n bytes32 public constant MINT_ROLE = keccak256(\\\"MINT_ROLE\\\");\\n bytes32 public constant UPDATE_CONTRACT_ROLE =\\n keccak256(\\\"UPDATE_CONTRACT_ROLE\\\");\\n bytes32 public constant UPDATE_TOKEN_ROLE = keccak256(\\\"UPDATE_TOKEN_ROLE\\\");\\n bytes32 public constant BURN_ROLE = keccak256(\\\"BURN_ROLE\\\");\\n bytes32 public constant TRANSFER_ROLE = keccak256(\\\"TRANSFER_ROLE\\\");\\n\\n /*\\n * Used for intializing and updating roles\\n * Each role can have any number of addresses attached to it and can be frozen separately,\\n * meaning any further updates to it are disabled.\\n * Cannot be used to update or initialize `ADMIN_ROLE`.\\n */\\n struct RolesAddresses {\\n bytes32 role;\\n address[] addresses;\\n bool frozen;\\n }\\n\\n // Contract owner address, this address can edit the contract on OpenSea and has `ADMIN_ROLE`\\n address internal _owner;\\n // Initialized as the address that initializes the contract.\\n address internal _nftPort;\\n\\n // Used to get roles enumeration\\n mapping(bytes32 => address[]) internal _rolesAddressesIndexed;\\n // Mapping from role to boolean that shows if role can be updated\\n mapping(bytes32 => bool) internal _rolesFrozen;\\n\\n // Event emitted when `transferOwnership` called by current owner.\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n /*\\n * Contract owner address\\n * @dev Required for easy integration with OpenSea, the owner address can edit the collection there\\n */\\n function owner() public view returns (address) {\\n return _owner;\\n }\\n\\n // Transfer contract ownership, only callable by the current owner\\n function transferOwnership(address newOwner) public {\\n require(newOwner != _owner, \\\"GranularRoles: already the owner\\\");\\n require(msg.sender == _owner, \\\"GranularRoles: not the owner\\\");\\n _revokeRole(ADMIN_ROLE, _owner);\\n address previousOwner = _owner;\\n _owner = newOwner;\\n _grantRole(ADMIN_ROLE, _owner);\\n emit OwnershipTransferred(previousOwner, newOwner);\\n }\\n\\n // Removes `ADMIN_ROLE` from the account that initialized the contract\\n function revokeNFTPortPermissions() public onlyRole(ADMIN_ROLE) {\\n _revokeRole(ADMIN_ROLE, _nftPort);\\n _nftPort = address(0);\\n }\\n\\n // Admin role has all access granted by default\\n function hasRole(bytes32 role, address account)\\n public\\n view\\n virtual\\n override\\n returns (bool)\\n {\\n // Contract owner has all access rights\\n if (account == _owner) return true;\\n // Anyone else cannot have DEFAULT_ADMIN_ROLE\\n if (role == DEFAULT_ADMIN_ROLE) return false;\\n // ADMIN_ROLE inherits any other roles\\n return\\n super.hasRole(ADMIN_ROLE, account) || super.hasRole(role, account);\\n }\\n\\n /**\\n * Initialize roles, should only be called once, for updating `_updateRoles` is used.\\n * Can only be used to set the `_owner` and `_nftport` addresses,\\n * or any amount of accounts for any supported role.\\n */\\n function _initRoles(address owner_, RolesAddresses[] memory rolesAddresses)\\n internal\\n {\\n require(owner_ != address(0), \\\"Contract must have an owner\\\");\\n _owner = owner_;\\n _nftPort = msg.sender;\\n _grantRole(ADMIN_ROLE, _owner);\\n _grantRole(ADMIN_ROLE, _nftPort);\\n\\n // Loop through all roles from the input\\n for (\\n uint256 roleIndex = 0;\\n roleIndex < rolesAddresses.length;\\n roleIndex++\\n ) {\\n bytes32 role = rolesAddresses[roleIndex].role;\\n // Check if the role is supported and is not `ADMIN_ROLE`\\n require(\\n _regularRoleValid(role),\\n string(\\n abi.encodePacked(\\n \\\"GranularRoles: invalid role \\\",\\n StringsUpgradeable.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n // Loop through all the addresses for the role being processed\\n // Grant the given role to all the specified addresses\\n // and add them to the roles enumaration `_rolesAddressesIndexed`\\n for (\\n uint256 addressIndex = 0;\\n addressIndex < rolesAddresses[roleIndex].addresses.length;\\n addressIndex++\\n ) {\\n _grantRole(\\n role,\\n rolesAddresses[roleIndex].addresses[addressIndex]\\n );\\n _rolesAddressesIndexed[role].push(\\n rolesAddresses[roleIndex].addresses[addressIndex]\\n );\\n }\\n // If the given role is frozen then further updates to it are disabled\\n if (rolesAddresses[roleIndex].frozen) {\\n _rolesFrozen[role] = true;\\n }\\n }\\n }\\n\\n /**\\n * Used for updating and/or freezing roles.\\n * Only callable by accounts with the `ADMIN_ROLE`\\n * and cannot be used to update `ADMIN_ROLE`\\n */\\n function _updateRoles(RolesAddresses[] memory rolesAddresses) internal {\\n if (rolesAddresses.length > 0) {\\n require(\\n hasRole(ADMIN_ROLE, msg.sender),\\n \\\"GranularRoles: not an admin\\\"\\n );\\n\\n // Loop through all roles from the input\\n for (\\n uint256 roleIndex = 0;\\n roleIndex < rolesAddresses.length;\\n roleIndex++\\n ) {\\n bytes32 role = rolesAddresses[roleIndex].role;\\n // Check if the role is supported and is not `ADMIN_ROLE`\\n require(\\n _regularRoleValid(role),\\n string(\\n abi.encodePacked(\\n \\\"GranularRoles: invalid role \\\",\\n StringsUpgradeable.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n // If given role is frozen then it cannot be updated\\n require(\\n !_rolesFrozen[role],\\n string(\\n abi.encodePacked(\\n \\\"GranularRoles: role \\\",\\n StringsUpgradeable.toHexString(uint256(role), 32),\\n \\\" is frozen\\\"\\n )\\n )\\n );\\n // Loop through all the addresses for the given role\\n // Remove all accounts from the role being processed to add new ones from the input\\n for (\\n uint256 addressIndex = 0;\\n addressIndex < _rolesAddressesIndexed[role].length;\\n addressIndex++\\n ) {\\n _revokeRole(\\n role,\\n _rolesAddressesIndexed[role][addressIndex]\\n );\\n }\\n delete _rolesAddressesIndexed[role];\\n // Loop through all the addresses for the given role from the input.\\n // Grant roles to given addresses for the role being processed\\n // and add the accounts to the role enumeration.\\n for (\\n uint256 addressIndex = 0;\\n addressIndex < rolesAddresses[roleIndex].addresses.length;\\n addressIndex++\\n ) {\\n _grantRole(\\n role,\\n rolesAddresses[roleIndex].addresses[addressIndex]\\n );\\n _rolesAddressesIndexed[role].push(\\n rolesAddresses[roleIndex].addresses[addressIndex]\\n );\\n }\\n if (rolesAddresses[roleIndex].frozen) {\\n _rolesFrozen[role] = true;\\n }\\n }\\n }\\n }\\n\\n // Checks if role is valid, does not contain the `ADMIN_ROLE`\\n function _regularRoleValid(bytes32 role) internal pure returns (bool) {\\n return\\n role == MINT_ROLE ||\\n role == UPDATE_CONTRACT_ROLE ||\\n role == UPDATE_TOKEN_ROLE ||\\n role == BURN_ROLE ||\\n role == TRANSFER_ROLE;\\n }\\n}\\n\",\"keccak256\":\"0x353e8fd619cc2dd340a8923d9fc763abbd410b4f47bd3da1e5611ac97a05e96b\",\"license\":\"MIT\"},\"contracts/lib/ITemplate.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/*\\n * Template interface, used by factory contracts to get the name and version of a contract,\\n * that extends this interface.\\n */\\ninterface ITemplate {\\n function NAME() external view returns (string memory);\\n\\n function VERSION() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xbf583f0046bf96a84fc2bc5cef21d433c838a7f701f7c93229d9faf026014e20\",\"license\":\"MIT\"},\"contracts/standalone/ERC1155NFTProductContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../templates/ERC1155NFTProduct.sol\\\";\\n\\ncontract ERC1155NFTProductContract is ERC1155NFTProduct {\\n constructor(\\n Config.Deployment memory deploymentConfig,\\n Config.Runtime memory runtimeConfig,\\n RolesAddresses[] memory rolesAddresses\\n ) initializer {\\n initialize(deploymentConfig, runtimeConfig, rolesAddresses);\\n }\\n}\",\"keccak256\":\"0x7a8ecb42a4912eb2ea1cde5c730ef74681a8498ef8c6b0003dd79c317ce6a9e9\",\"license\":\"MIT\"},\"contracts/templates/ERC1155NFTProduct.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC1155/ERC1155Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\nimport {IERC2981} from \\\"@openzeppelin/contracts/token/common/ERC2981.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Strings.sol\\\";\\n\\nimport \\\"../lib/GranularRoles.sol\\\";\\nimport \\\"../lib/Base64.sol\\\";\\nimport \\\"../lib/Config.sol\\\";\\nimport \\\"../lib/ITemplate.sol\\\";\\n\\n/*\\n * ERC-1155 proxy contract, meaning it does not make use of a constructor,\\n * but rather uses `initialize` with `initializer` modifier, see {Initializable}\\n *\\n * Minting and other write transactions only supported for accounts with relevant access rights.\\n */\\ncontract ERC1155NFTProduct is\\n ERC1155Upgradeable,\\n GranularRoles,\\n ITemplate,\\n ReentrancyGuardUpgradeable\\n{\\n /*******************************\\n * Extensions, structs, events *\\n *******************************/\\n\\n using Strings for uint256;\\n\\n /*\\n * Event emitted to show opensea that metadata of a token is frozen,\\n * see https://docs.opensea.io/docs/metadata-standards\\n */\\n event PermanentURI(string _value, uint256 indexed _id);\\n // Event emitted to show that all tokens have their metadata frozen\\n event PermanentURIGlobal();\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // Template name\\n string public constant NAME = \\\"ERC1155NFTProduct\\\";\\n // Template version\\n uint256 public constant VERSION = 1_00_01;\\n\\n // Basis for calculating royalties.\\n // This has to be 10k for royaltiesBps to be in basis points.\\n uint16 public constant ROYALTIES_BASIS = 10000;\\n // Default URI for tokens, each minted token will have a token URI, so default URI is empty\\n string public constant DEFAULT_URI = \\\"\\\";\\n\\n /********************\\n * Public variables *\\n ********************/\\n\\n // If true then tokens metadata can be updated\\n bool public metadataUpdatable;\\n // If true then tokens can be burned by their owners\\n bool public tokensBurnable;\\n // If true then tokens can be transferred by having the correct access rights {GranularRoles-TRANSFER_ROLE}\\n // if the token is owned by {GranularRoles-_owner} address\\n bool public tokensTransferable;\\n\\n // Token name\\n string public name;\\n // Token symbol\\n string public symbol;\\n // Token IDs are returned as `baseURI` + `tokenURI`\\n string public baseURI;\\n\\n // Address where royalties will be transferred to\\n address public royaltiesAddress;\\n // Secondary market royalties in basis points (100 bps = 1%). Royalties use ERC2981 standard and support\\n // OpenSea standard.\\n uint256 public royaltiesBasisPoints;\\n\\n // Mapping of individually frozen tokens\\n mapping(uint256 => bool) public freezeTokenUris;\\n // Mapping of token ID to supply\\n mapping(uint256 => uint256) public tokenSupply;\\n\\n /***************************\\n * Contract initialization *\\n ***************************/\\n\\n constructor() initializer {\\n // solhint-disable-previous-line no-empty-blocks\\n }\\n\\n // Can only be called once, used because constructors cannot be used for proxy contracts\\n function initialize(\\n Config.Deployment memory deploymentConfig,\\n Config.Runtime memory runtimeConfig,\\n RolesAddresses[] memory rolesAddresses\\n ) public initializer {\\n __ERC1155_init(DEFAULT_URI);\\n __ReentrancyGuard_init();\\n\\n _setRoyalties(\\n runtimeConfig.royaltiesAddress,\\n runtimeConfig.royaltiesBps\\n );\\n\\n metadataUpdatable = runtimeConfig.metadataUpdatable;\\n tokensBurnable = deploymentConfig.tokensBurnable;\\n tokensTransferable = runtimeConfig.tokensTransferable;\\n\\n name = deploymentConfig.name;\\n symbol = deploymentConfig.symbol;\\n baseURI = runtimeConfig.baseURI;\\n\\n _initRoles(deploymentConfig.owner, rolesAddresses);\\n }\\n\\n /*******************\\n * Write functions *\\n *******************/\\n\\n // Allows to set a default URI for tokens, which is only returned if token URI does not exist for given token ID\\n function setURI(string memory _newURI)\\n public\\n onlyRole(UPDATE_CONTRACT_ROLE)\\n {\\n _setURI(_newURI);\\n }\\n\\n /*\\n * Allows to update token URI for given `_tokenId` and freeze it.\\n * For the transaction to succeed either `_newUri` or `_isFreezeTokenUri` as true must be specified, or both.\\n * The `_newURI` cannot be the same as the current URI for the token.\\n *\\n * Token ID must exist, `metadataUpdatable` must be true and token URI for given token cannot be frozen.\\n * Only callable by accounts with `UPDATE_TOKEN_ROLE` or `ADMIN_ROLE`.\\n */\\n function updateTokenUri(\\n uint256 _tokenId,\\n string memory _newUri,\\n bool _isFreezeTokenUri\\n ) public onlyRole(UPDATE_TOKEN_ROLE) {\\n require(_exists(_tokenId), \\\"Token does not exist\\\");\\n require(metadataUpdatable, \\\"Metadata is frozen\\\");\\n require(freezeTokenUris[_tokenId] != true, \\\"Token is frozen\\\");\\n require(\\n _isFreezeTokenUri || (bytes(_newUri).length != 0),\\n \\\"Either _newUri or _isFreezeTokenUri=true required\\\"\\n );\\n\\n if (bytes(_newUri).length != 0) {\\n require(\\n keccak256(bytes(_tokenURIs[_tokenId])) !=\\n keccak256(bytes(string(abi.encodePacked(_newUri)))),\\n \\\"New token URI is same as updated\\\"\\n );\\n _tokenURIs[_tokenId] = _newUri;\\n emit URI(_newUri, _tokenId);\\n }\\n if (_isFreezeTokenUri) {\\n freezeTokenUris[_tokenId] = true;\\n emit PermanentURI(_tokenURIs[_tokenId], _tokenId);\\n }\\n }\\n\\n /*\\n * Allows to burn given `value` amount of tokens with `id`.\\n * `tokensBurnable` must be true in order for the transaction to succeed and\\n * at least `value` amount of tokens must exist.\\n * Only callable by accounts with `BURN_ROLE` or `ADMIN_ROLE`.\\n */\\n function burn(uint256 id, uint256 value) public onlyRole(BURN_ROLE) {\\n require(tokensBurnable, \\\"Burns are disabled\\\");\\n\\n _burn(_owner, id, value);\\n tokenSupply[id] -= value;\\n }\\n\\n /*\\n * Same functionality as `burn` but for a batch of tokens.\\n * Input `ids` and `values` must be in direct correlation,\\n * an index in both lists referring to the same token.\\n */\\n function burnBatch(uint256[] memory ids, uint256[] memory values)\\n public\\n onlyRole(BURN_ROLE)\\n {\\n require(tokensBurnable, \\\"Burns are disabled\\\");\\n _burnBatch(_owner, ids, values);\\n for (uint256 i = 0; i < ids.length; i++) {\\n tokenSupply[ids[i]] -= values[i];\\n }\\n }\\n\\n /*\\n * Allows to transfer given `value` amount of tokens with `id`.\\n * `tokensTransferable` must be true and the tokens to be transferred must be owned by the `_owner`,\\n * at least `value` amount of tokens must exist.\\n * Only callable by accounts with `TRANSFER_ROLE` or `ADMIN_ROLE`.\\n */\\n function transferByOwner(\\n address to,\\n uint256 id,\\n uint256 amount\\n ) public onlyRole(TRANSFER_ROLE) {\\n require(tokensTransferable, \\\"Transfers are disabled\\\");\\n _safeTransferFrom(_owner, to, id, amount, \\\"\\\");\\n }\\n\\n /*\\n * Same functionality as `transferByOwner` but for a batch of tokens.\\n * Input `ids` and `values` must be in direct correlation,\\n * an index in both lists referring to the same token.\\n */\\n function transferByOwnerBatch(\\n address[] memory to,\\n uint256[] memory ids,\\n uint256[] memory amounts\\n ) public onlyRole(TRANSFER_ROLE) {\\n require(tokensTransferable, \\\"Transfers are disabled\\\");\\n require(\\n to.length == ids.length && ids.length == amounts.length,\\n \\\"Mismatched input arrays\\\"\\n );\\n\\n for (uint256 i = 0; i < ids.length; i++) {\\n _safeTransferFrom(_owner, to[i], ids[i], amounts[i], \\\"\\\");\\n }\\n }\\n\\n /*\\n * Allows to update contract configuration and revoke NFTPort's access to the contract.\\n * `baseURI` can only be updated if `metadataUpdatable` is true.\\n * Tokens can only be made to not be transferable or updatable, not vice-versa.\\n * Only callable by accounts with `UPDATE_CONTRACT_ROLE` or `ADMIN_ROLE`.\\n */\\n function update(\\n Config.Runtime calldata newConfig,\\n RolesAddresses[] memory rolesAddresses,\\n bool isRevokeNFTPortPermissions\\n ) public onlyRole(UPDATE_CONTRACT_ROLE) {\\n // If metadata is frozen, baseURI cannot be updated\\n require(\\n metadataUpdatable ||\\n (keccak256(abi.encodePacked(newConfig.baseURI)) ==\\n keccak256(abi.encodePacked(baseURI))),\\n \\\"Metadata is frozen\\\"\\n );\\n\\n baseURI = newConfig.baseURI;\\n _setRoyalties(newConfig.royaltiesAddress, newConfig.royaltiesBps);\\n\\n if (!newConfig.tokensTransferable) {\\n tokensTransferable = false;\\n }\\n if (!newConfig.metadataUpdatable && metadataUpdatable) {\\n metadataUpdatable = false;\\n emit PermanentURIGlobal();\\n }\\n\\n _updateRoles(rolesAddresses);\\n\\n if (isRevokeNFTPortPermissions) {\\n revokeNFTPortPermissions();\\n }\\n }\\n\\n /*\\n * Allows to mint tokens by the contract `_owner`.\\n * Only callable by accounts with `MINT_ROLE` or `ADMIN_ROLE`.\\n */\\n function mintByOwner(\\n address account,\\n uint256 id,\\n uint256 amount,\\n string memory tokenUri\\n ) public onlyRole(MINT_ROLE) nonReentrant {\\n require(!_exists(id), \\\"NFT: token already minted\\\");\\n if (bytes(tokenUri).length > 0) {\\n _tokenURIs[id] = tokenUri;\\n emit URI(tokenUri, id);\\n }\\n tokenSupply[id] += amount;\\n _mint(account, id, amount, \\\"\\\");\\n }\\n\\n /*\\n * Same functionality as `mintByOwner` but for a batch of tokens.\\n * Input `ids` and `values` must be in direct correlation,\\n * an index in both lists referring to the same token.\\n */\\n function mintByOwnerBatch(\\n address[] memory to,\\n uint256[] memory ids,\\n uint256[] memory amounts,\\n string[] memory uris\\n ) public onlyRole(MINT_ROLE) nonReentrant {\\n require(\\n to.length == ids.length &&\\n ids.length == amounts.length &&\\n amounts.length == uris.length,\\n \\\"Mismatched input arrays\\\"\\n );\\n\\n for (uint256 i = 0; i < ids.length; i++) {\\n require(!_exists(ids[i]), \\\"One of tokens is already minted\\\");\\n require(\\n to[i] == address(to[i]),\\n \\\"NFT: one of addresses is invalid\\\"\\n );\\n require(amounts[i] > 0, \\\"NFT: all amounts must be > 0\\\");\\n tokenSupply[ids[i]] += amounts[i];\\n if (bytes(uris[i]).length > 0) {\\n _tokenURIs[ids[i]] = uris[i];\\n emit URI(uris[i], ids[i]);\\n }\\n _mint(to[i], ids[i], amounts[i], \\\"\\\");\\n }\\n }\\n\\n /******************\\n * View functions *\\n ******************/\\n\\n // Returns total supply for the given token ID\\n function totalSupply(uint256 _id) public view returns (uint256) {\\n return tokenSupply[_id];\\n }\\n\\n /*\\n * Returns token URI for the given token ID.\\n * If token URI is not empty and base URI is not empty then returns base URI + token URI,\\n * if base URI is empty and token URI is not empty then returns just token URI.\\n * If the token URI for the given token ID is empty then returns the default token URI.\\n */\\n function uri(uint256 _id) public view override returns (string memory) {\\n if (bytes(_tokenURIs[_id]).length > 0) {\\n if (bytes(baseURI).length > 0) {\\n return string(abi.encodePacked(baseURI, _tokenURIs[_id]));\\n } else {\\n return _tokenURIs[_id];\\n }\\n } else {\\n return super.uri(_id);\\n }\\n }\\n\\n // @dev ERC2981 token royalty info\\n function royaltyInfo(uint256, uint256 salePrice)\\n external\\n view\\n returns (address, uint256)\\n {\\n return (\\n royaltiesAddress,\\n (royaltiesBasisPoints * salePrice) / ROYALTIES_BASIS\\n );\\n }\\n\\n /**\\n * @dev OpenSea contract metadata, returns a base64 encoded JSON string containing royalties basis points\\n * and royalties address\\n */\\n function contractURI() external view returns (string memory) {\\n string memory json = Base64.encode(\\n bytes(\\n string(\\n abi.encodePacked(\\n // solium-disable-next-line quotes\\n '{\\\"seller_fee_basis_points\\\": ', // solhint-disable-line\\n royaltiesBasisPoints.toString(),\\n // solium-disable-next-line quotes\\n ', \\\"fee_recipient\\\": \\\"', // solhint-disable-line\\n uint256(uint160(royaltiesAddress)).toHexString(20),\\n // solium-disable-next-line quotes\\n '\\\"}' // solhint-disable-line\\n )\\n )\\n )\\n );\\n\\n string memory output = string(\\n abi.encodePacked(\\\"data:application/json;base64,\\\", json)\\n );\\n\\n return output;\\n }\\n\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(ERC1155Upgradeable, AccessControlUpgradeable)\\n returns (bool)\\n {\\n return\\n ERC1155Upgradeable.supportsInterface(interfaceId) ||\\n interfaceId == type(IERC2981).interfaceId;\\n }\\n\\n /*************\\n * Internals *\\n *************/\\n\\n // Mapping of token ID to URI\\n mapping(uint256 => string) private _tokenURIs;\\n\\n // Used for checking if token with given ID exists\\n function _exists(uint256 _tokenId) internal view virtual returns (bool) {\\n return tokenSupply[_tokenId] > 0;\\n }\\n\\n function _setRoyalties(address newAddress, uint256 newBps) internal {\\n require(newBps <= ROYALTIES_BASIS, \\\"Cannot set royalties to over 100%\\\");\\n\\n royaltiesAddress = newAddress;\\n royaltiesBasisPoints = newBps;\\n }\\n}\\n\",\"keccak256\":\"0x96e7912dbb93038eb197c392111045626207d861bf3ffdea1d1af73307d20f29\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200627138038062006271833981016040819052620000349162001083565b600054610100900460ff1615808015620000555750600054600160ff909116105b8062000085575062000072306200024e60201b62001eab1760201c565b15801562000085575060005460ff166001145b620000dd5760405162461bcd60e51b815260206004820152602e6024820152600080516020620061f183398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000101576000805461ff0019166101001790555b801562000137576000805461ff001916905560405160018152600080516020620062318339815191529060200160405180910390a15b50600054610100900460ff1615808015620001595750600054600160ff909116105b8062000189575062000176306200024e60201b62001eab1760201c565b15801562000189575060005460ff166001145b620001dd5760405162461bcd60e51b815260206004820152602e6024820152600080516020620061f183398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000d4565b6000805460ff19166001179055801562000201576000805461ff0019166101001790555b6200020e8484846200025d565b801562000244576000805461ff001916905560405160018152600080516020620062318339815191529060200160405180910390a15b5050505062001409565b6001600160a01b03163b151590565b600054610100900460ff16158080156200027e5750600054600160ff909116105b80620002ae57506200029b306200024e60201b62001eab1760201c565b158015620002ae575060005460ff166001145b620003025760405162461bcd60e51b815260206004820152602e6024820152600080516020620061f183398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000d4565b6000805460ff19166001179055801562000326576000805461ff0019166101001790555b60408051602081019091526000815262000340906200042c565b6200034a62000496565b6200036483608001518460600151620004fe60201b60201c565b602083015160ff80546060870151604087015161ffff1990921693151561ff0019169390931761010093151584021762ff0000191662010000911515919091021790558451620003b5908262001222565b50602084015161010190620003cb908262001222565b50825161010290620003de908262001222565b506040840151620003f0908362000584565b801562000426576000805461ff001916905560405160018152600080516020620062318339815191529060200160405180910390a15b50505050565b600054610100900460ff16620004885760405162461bcd60e51b815260206004820152602b60248201526000805160206200621183398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d4565b620004938162000853565b50565b600054610100900460ff16620004f25760405162461bcd60e51b815260206004820152602b60248201526000805160206200621183398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d4565b620004fc620008ba565b565b6127108111156200055c5760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f742073657420726f79616c7469657320746f206f766572203130306044820152602560f81b6064820152608401620000d4565b61010380546001600160a01b0319166001600160a01b03939093169290921790915561010455565b6001600160a01b038216620005dc5760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206d757374206861766520616e206f776e657200000000006044820152606401620000d4565b60c980546001600160a01b0384166001600160a01b0319918216811790925560ca805490911633179055620006229060008051602062006251833981519152906200091d565b60ca546200064a9060008051602062006251833981519152906001600160a01b03166200091d565b60005b81518110156200084e5760008282815181106200066e576200066e620012ee565b60200260200101516000015190506200068d81620009a860201b60201c565b620006a382602062001eba62000a7f821b17811c565b604051602001620006b5919062001304565b60405160208183030381529060405290620006e55760405162461bcd60e51b8152600401620000d491906200134b565b5060005b838381518110620006fe57620006fe620012ee565b60200260200101516020015151811015620007f65762000761828585815181106200072d576200072d620012ee565b60200260200101516020015183815181106200074d576200074d620012ee565b60200260200101516200091d60201b60201c565b600082815260cb602052604090208451859085908110620007865762000786620012ee565b6020026020010151602001518281518110620007a657620007a6620012ee565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b0390921691909117905580620007ed8162001396565b915050620006e9565b508282815181106200080c576200080c620012ee565b602002602001015160400151156200083857600081815260cc60205260409020805460ff191660011790555b5080620008458162001396565b9150506200064d565b505050565b600054610100900460ff16620008af5760405162461bcd60e51b815260206004820152602b60248201526000805160206200621183398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d4565b620004938162000c3f565b600054610100900460ff16620009165760405162461bcd60e51b815260206004820152602b60248201526000805160206200621183398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d4565b600160cd55565b62000929828262000c4d565b620009a45760008281526097602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620009633390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b60007f154c00819833dac601ee5ddded6fda79d9d8b506b911b3dbd54cdb95fe6c3686821480620009f857507f9b16859c0d694afa65b1b6551542db11ea12d6208b6a17dc922f10f2d74440f582145b8062000a2357507f852fd44a27d33057a8c3d90859d4e4c9f54309d4d66d1d968e063befba9198e682145b8062000a4e57507fe97b137254058bd94f28d2f3eb79e2d34074ffb488d042e3bc958e0a57d2fa2282145b8062000a7957507f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c82145b92915050565b6060600062000a90836002620013b2565b62000a9d906002620013d4565b6001600160401b0381111562000ab75762000ab762000cee565b6040519080825280601f01601f19166020018201604052801562000ae2576020820181803683370190505b509050600360fc1b8160008151811062000b005762000b00620012ee565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811062000b325762000b32620012ee565b60200101906001600160f81b031916908160001a905350600062000b58846002620013b2565b62000b65906001620013d4565b90505b600181111562000be7576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811062000b9d5762000b9d620012ee565b1a60f81b82828151811062000bb65762000bb6620012ee565b60200101906001600160f81b031916908160001a90535060049490941c9362000bdf81620013ef565b905062000b68565b50831562000c385760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620000d4565b9392505050565b6067620009a4828262001222565b60c9546000906001600160a01b039081169083160362000c705750600162000a79565b8262000c7f5750600062000a79565b62000ca5600080516020620062518339815191528362000cc360201b620020551760201c565b8062000c38575062000c38838362000cc360201b620020551760201c565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171562000d295762000d2962000cee565b60405290565b604051608081016001600160401b038111828210171562000d295762000d2962000cee565b604051601f8201601f191681016001600160401b038111828210171562000d7f5762000d7f62000cee565b604052919050565b60005b8381101562000da457818101518382015260200162000d8a565b83811115620004265750506000910152565b600082601f83011262000dc857600080fd5b81516001600160401b0381111562000de45762000de462000cee565b62000df9601f8201601f191660200162000d54565b81815284602083860101111562000e0f57600080fd5b62000e2282602083016020870162000d87565b949350505050565b80516001600160a01b038116811462000e4257600080fd5b919050565b8051801515811462000e4257600080fd5b600060a0828403121562000e6b57600080fd5b60405160a081016001600160401b03808211838310171562000e915762000e9162000cee565b81604052829350845191508082111562000eaa57600080fd5b5062000eb98582860162000db6565b82525062000eca6020840162000e47565b602082015262000edd6040840162000e47565b60408201526060830151606082015262000efa6080840162000e2a565b60808201525092915050565b60006001600160401b0382111562000f225762000f2262000cee565b5060051b60200190565b600082601f83011262000f3e57600080fd5b8151602062000f5762000f518362000f06565b62000d54565b82815260059290921b8401810191818101908684111562000f7757600080fd5b8286015b84811015620010785780516001600160401b038082111562000f9d5760008081fd5b908801906060828b03601f190181131562000fb85760008081fd5b62000fc262000d04565b8784015181526040808501518481111562000fdd5760008081fd5b85019350603f84018d1362000ff25760008081fd5b888401516200100562000f518262000f06565b81815260059190911b85018201908a8101908f831115620010265760008081fd5b958301955b828710156200104f576200103f8762000e2a565b8252958b0195908b01906200102b565b848c01525062001063905085840162000e47565b90820152865250505091830191830162000f7b565b509695505050505050565b6000806000606084860312156200109957600080fd5b83516001600160401b0380821115620010b157600080fd5b9085019060808288031215620010c657600080fd5b620010d062000d2f565b825182811115620010e057600080fd5b620010ee8982860162000db6565b8252506020830151828111156200110457600080fd5b620011128982860162000db6565b602083015250620011266040840162000e2a565b6040820152620011396060840162000e47565b606082015260208701519095509150808211156200115657600080fd5b620011648783880162000e58565b935060408601519150808211156200117b57600080fd5b506200118a8682870162000f2c565b9150509250925092565b600181811c90821680620011a957607f821691505b602082108103620011ca57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200084e57600081815260208120601f850160051c81016020861015620011f95750805b601f850160051c820191505b818110156200121a5782815560010162001205565b505050505050565b81516001600160401b038111156200123e576200123e62000cee565b62001256816200124f845462001194565b84620011d0565b602080601f8311600181146200128e5760008415620012755750858301515b600019600386901b1c1916600185901b1785556200121a565b600085815260208120601f198616915b82811015620012bf578886015182559484019460019091019084016200129e565b5085821015620012de5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b7f4772616e756c6172526f6c65733a20696e76616c696420726f6c6520000000008152600082516200133e81601c85016020870162000d87565b91909101601c0192915050565b60208152600082518060208401526200136c81604085016020870162000d87565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b600060018201620013ab57620013ab62001380565b5060010190565b6000816000190483118215151615620013cf57620013cf62001380565b500290565b60008219821115620013ea57620013ea62001380565b500190565b60008162001401576200140162001380565b506000190190565b614dd880620014196000396000f3fe608060405234801561001057600080fd5b50600436106102d55760003560e01c80638d010db311610182578063b930908f116100e9578063e985e9c5116100a2578063f242432a1161007c578063f242432a14610713578063f2fde38b14610726578063ff0a9f5114610739578063ffa1ad741461074c57600080fd5b8063e985e9c5146106ba578063e9a9c850146106f6578063f153c2e51461070b57600080fd5b8063b930908f14610644578063bd85b03914610659578063d547741f1461067a578063de374d9d1461068d578063e3d52072146106a0578063e8a3d485146106b257600080fd5b8063a22cb4651161013b578063a22cb465146105aa578063a2f551ec146105bd578063a3f4df7e146105d0578063a53a84b614610600578063b29c097a1461060a578063b390c0ab1461063157600080fd5b80638d010db3146105365780638da5cb5b1461055a57806391d148541461056b57806395d89b411461057e5780639da5b0a514610586578063a217fddf146105a257600080fd5b80632c23b965116102415780634e1273f4116101fa5780636f8b1495116101d45780636f8b1495146104e557806375b238fc146104fb5780637e712f381461051057806383ca4b6f1461052357600080fd5b80634e1273f4146104b15780634e6f9dd6146104d15780636c0360eb146104dd57600080fd5b80632c23b965146104245780632e628b61146104395780632eb2c2d61461044c5780632f2ff15d1461045f578063328825351461047257806336568abe1461049e57600080fd5b8063206b60f911610293578063206b60f914610373578063224a177514610388578063248a9ca31461039b57806325d22c8e146103be5780632693ebf2146103d15780632a55205a146103f257600080fd5b8062fdd58e146102da57806301ffc9a71461030057806302fe53051461032357806306fdde03146103385780630e89341c1461034d57806320333b1314610360575b600080fd5b6102ed6102e836600461373f565b610755565b6040519081526020015b60405180910390f35b61031361030e36600461377f565b6107f0565b60405190151581526020016102f7565b610336610331366004613895565b61081b565b005b610340610840565b6040516102f79190613921565b61034061035b366004613934565b6108cf565b61033661036e36600461394d565b6109f9565b6102ed600080516020614cc383398151915281565b6103366103963660046139ad565b610b6c565b6102ed6103a9366004613934565b60009081526097602052604090206001015490565b6103366103cc366004613c17565b610c05565b6102ed6103df366004613934565b6101066020526000908152604090205481565b610405610400366004613d16565b610dc5565b604080516001600160a01b0390931683526020830191909152016102f7565b6102ed600080516020614ce383398151915281565b610336610447366004613d38565b610e03565b61033661045a366004613e19565b610f8b565b61033661046d366004613ec2565b610fd7565b61010354610486906001600160a01b031681565b6040516001600160a01b0390911681526020016102f7565b6103366104ac366004613ec2565b611001565b6104c46104bf366004613eee565b61107b565b6040516102f79190613f8c565b60ff8054610313911681565b6103406111a4565b6103406040518060200160405280600081525081565b6102ed600080516020614d6383398151915281565b61033661051e366004613f9f565b6111b2565b61033661053136600461401c565b611306565b610313610544366004613934565b6101056020526000908152604090205460ff1681565b60c9546001600160a01b0316610486565b610313610579366004613ec2565b6113fa565b610340611457565b61058f61271081565b60405161ffff90911681526020016102f7565b6102ed600081565b6103366105b8366004614052565b611465565b6103366105cb36600461407c565b611470565b61034060405180604001604052806011815260200170115490cc4c4d4d539195141c9bd91d58dd607a1b81525081565b6102ed6101045481565b6102ed7f852fd44a27d33057a8c3d90859d4e4c9f54309d4d66d1d968e063befba9198e681565b61033661063f366004613d16565b611758565b6102ed600080516020614d8383398151915281565b6102ed610667366004613934565b6000908152610106602052604090205490565b610336610688366004613ec2565b6117fb565b60ff805461031391620100009091041681565b60ff8054610313916101009091041681565b610340611820565b6103136106c83660046140ba565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205460ff1690565b6102ed600080516020614d4383398151915281565b61033661189c565b6103366107213660046140e4565b6118ec565b610336610734366004614148565b611931565b610336610747366004614163565b611a8c565b6102ed61271181565b60006001600160a01b0383166107c55760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b5060008181526065602090815260408083206001600160a01b03861684529091529020545b92915050565b60006107fb82612080565b806107ea57506001600160e01b0319821663152a902d60e11b1492915050565b600080516020614ce3833981519152610833816120d0565b61083c826120dd565b5050565b610100805461084e90614287565b80601f016020809104026020016040519081016040528092919081815260200182805461087a90614287565b80156108c75780601f1061089c576101008083540402835291602001916108c7565b820191906000526020600020905b8154815290600101906020018083116108aa57829003601f168201915b505050505081565b600081815261010760205260408120805460609291906108ee90614287565b905011156109eb576000610102805461090690614287565b9050111561094c576101026101076000848152602001908152602001600020604051602001610936929190614334565b6040516020818303038152906040529050919050565b600082815261010760205260409020805461096690614287565b80601f016020809104026020016040519081016040528092919081815260200182805461099290614287565b80156109df5780601f106109b4576101008083540402835291602001916109df565b820191906000526020600020905b8154815290600101906020018083116109c257829003601f168201915b50505050509050919050565b6107ea826120e9565b919050565b600080516020614d43833981519152610a11816120d0565b600260cd5403610a635760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107bc565b600260cd556000848152610106602052604090205415610ac55760405162461bcd60e51b815260206004820152601960248201527f4e46543a20746f6b656e20616c7265616479206d696e7465640000000000000060448201526064016107bc565b815115610b1f57600084815261010760205260409020610ae5838261438f565b50837f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b83604051610b169190613921565b60405180910390a25b6000848152610106602052604081208054859290610b3e908490614464565b92505081905550610b60858585604051806020016040528060008152506120f8565b5050600160cd55505050565b600080516020614cc3833981519152610b84816120d0565b60ff805462010000900416610bd45760405162461bcd60e51b8152602060048201526016602482015275151c985b9cd9995c9cc8185c9948191a5cd8589b195960521b60448201526064016107bc565b60c954604080516020810190915260008152610bff916001600160a01b03169086908690869061220e565b50505050565b600054610100900460ff1615808015610c255750600054600160ff909116105b80610c3f5750303b158015610c3f575060005460ff166001145b610ca25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107bc565b6000805460ff191660011790558015610cc5576000805461ff0019166101001790555b610cdd6040518060200160405280600081525061233c565b610ce561236c565b610cf78360800151846060015161239d565b602083015160ff80546060870151604087015161ffff1990921693151561ff0019169390931761010093151584021762ff0000191662010000911515919091021790558451610d46908261438f565b50602084015161010190610d5a908261438f565b50825161010290610d6b908261438f565b50610d7a846040015183612421565b8015610bff576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610103546101045460009182916001600160a01b039091169061271090610ded90869061447c565b610df791906144b1565b915091505b9250929050565b600080516020614ce3833981519152610e1b816120d0565b60ff80541680610e845750610102604051602001610e3991906144c5565b60408051601f198184030181529190528051602090910120610e5b85806144d1565b604051602001610e6c929190614517565b60405160208183030381529060405280519060200120145b610ec55760405162461bcd60e51b815260206004820152601260248201527126b2ba30b230ba309034b990333937bd32b760711b60448201526064016107bc565b610ecf84806144d1565b61010291610ede919083614527565b50610efc610ef260a0860160808701614148565b856060013561239d565b610f0c60608501604086016145e6565b610f1d5760ff805462ff0000191690555b610f2d60408501602086016145e6565b158015610f3b575060ff8054165b15610f745760ff805460ff191690556040517fb59f45df38ec0d34114b1248c38a29cdbccbf3e745ae3ef310ac66199a4ceccf90600090a15b610f7d836126a5565b8115610bff57610bff61189c565b6001600160a01b038516331480610fa75750610fa785336106c8565b610fc35760405162461bcd60e51b81526004016107bc90614601565b610fd0858585858561298f565b5050505050565b600082815260976020526040902060010154610ff2816120d0565b610ffc8383612b2e565b505050565b6001600160a01b03811633146110715760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016107bc565b61083c8282612bb4565b606081518351146110e05760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016107bc565b600083516001600160401b038111156110fb576110fb61379c565b604051908082528060200260200182016040528015611124578160200160208202803683370190505b50905060005b845181101561119c5761116f85828151811061114857611148614650565b602002602001015185838151811061116257611162614650565b6020026020010151610755565b82828151811061118157611181614650565b602090810291909101015261119581614666565b905061112a565b509392505050565b610102805461084e90614287565b600080516020614cc38339815191526111ca816120d0565b60ff80546201000090041661121a5760405162461bcd60e51b8152602060048201526016602482015275151c985b9cd9995c9cc8185c9948191a5cd8589b195960521b60448201526064016107bc565b8251845114801561122c575081518351145b6112725760405162461bcd60e51b81526020600482015260176024820152764d69736d61746368656420696e7075742061727261797360481b60448201526064016107bc565b60005b8351811015610fd05760c95485516112f4916001600160a01b0316908790849081106112a3576112a3614650565b60200260200101518684815181106112bd576112bd614650565b60200260200101518685815181106112d7576112d7614650565b60200260200101516040518060200160405280600081525061220e565b806112fe81614666565b915050611275565b600080516020614d8383398151915261131e816120d0565b60ff80546101009004166113695760405162461bcd60e51b8152602060048201526012602482015271109d5c9b9cc8185c9948191a5cd8589b195960721b60448201526064016107bc565b60c954611380906001600160a01b03168484612c1b565b60005b8351811015610bff5782818151811061139e5761139e614650565b602002602001015161010660008684815181106113bd576113bd614650565b6020026020010151815260200190815260200160002060008282546113e2919061467f565b909155508190506113f281614666565b915050611383565b60c9546000906001600160a01b039081169083160361141b575060016107ea565b82611428575060006107ea565b611440600080516020614d6383398151915283612055565b8061145057506114508383612055565b9392505050565b610101805461084e90614287565b61083c338383612da8565b7f852fd44a27d33057a8c3d90859d4e4c9f54309d4d66d1d968e063befba9198e661149a816120d0565b600084815261010660205260409020546114ed5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b60448201526064016107bc565b60ff8054166115335760405162461bcd60e51b815260206004820152601260248201527126b2ba30b230ba309034b990333937bd32b760711b60448201526064016107bc565b6000848152610105602052604090205460ff1615156001036115895760405162461bcd60e51b815260206004820152600f60248201526e2a37b5b2b71034b990333937bd32b760891b60448201526064016107bc565b81806115955750825115155b6115fb5760405162461bcd60e51b815260206004820152603160248201527f456974686572205f6e6577557269206f72205f6973467265657a65546f6b656e604482015270155c9a4f5d1c9d59481c995c5d5a5c9959607a1b60648201526084016107bc565b8251156116ed57826040516020016116139190614696565b60408051601f1981840301815282825280516020918201206000888152610107909252919020909161164591906144c5565b60405180910390200361169a5760405162461bcd60e51b815260206004820181905260248201527f4e657720746f6b656e205552492069732073616d65206173207570646174656460448201526064016107bc565b6000848152610107602052604090206116b3848261438f565b50837f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b846040516116e49190613921565b60405180910390a25b8115610bff57600084815261010560209081526040808320805460ff1916600117905561010790915290819020905185917fa109ba539900bf1b633f956d63c96fc89b814c7287f7aa50a9216d0b556572079161174a91906146b2565b60405180910390a250505050565b600080516020614d83833981519152611770816120d0565b60ff80546101009004166117bb5760405162461bcd60e51b8152602060048201526012602482015271109d5c9b9cc8185c9948191a5cd8589b195960721b60448201526064016107bc565b60c9546117d2906001600160a01b03168484612e88565b60008381526101066020526040812080548492906117f190849061467f565b9091555050505050565b600082815260976020526040902060010154611816816120d0565b610ffc8383612bb4565b6060600061187061183361010454612f8f565b6101035461184b906001600160a01b03166014613097565b60405160200161185c92919061473d565b6040516020818303038152906040526131e3565b905060008160405160200161188591906147c4565b60408051601f198184030181529190529392505050565b600080516020614d638339815191526118b4816120d0565b60ca546118d990600080516020614d63833981519152906001600160a01b0316612bb4565b5060ca80546001600160a01b0319169055565b6001600160a01b038516331480611908575061190885336106c8565b6119245760405162461bcd60e51b81526004016107bc90614601565b610fd0858585858561220e565b60c9546001600160a01b039081169082160361198f5760405162461bcd60e51b815260206004820181905260248201527f4772616e756c6172526f6c65733a20616c726561647920746865206f776e657260448201526064016107bc565b60c9546001600160a01b031633146119e95760405162461bcd60e51b815260206004820152601c60248201527f4772616e756c6172526f6c65733a206e6f7420746865206f776e65720000000060448201526064016107bc565b60c954611a0e90600080516020614d63833981519152906001600160a01b0316612bb4565b60c980546001600160a01b038381166001600160a01b0319831681179093551690611a4890600080516020614d6383398151915290612b2e565b816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080516020614d43833981519152611aa4816120d0565b600260cd5403611af65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107bc565b600260cd5583518551148015611b0d575082518451145b8015611b1a575081518351145b611b605760405162461bcd60e51b81526020600482015260176024820152764d69736d61746368656420696e7075742061727261797360481b60448201526064016107bc565b60005b8451811015611e9e57611b9e858281518110611b8157611b81614650565b602002602001015160009081526101066020526040902054151590565b15611beb5760405162461bcd60e51b815260206004820152601f60248201527f4f6e65206f6620746f6b656e7320697320616c7265616479206d696e7465640060448201526064016107bc565b858181518110611bfd57611bfd614650565b60200260200101516001600160a01b0316868281518110611c2057611c20614650565b60200260200101516001600160a01b031614611c7e5760405162461bcd60e51b815260206004820181905260248201527f4e46543a206f6e65206f662061646472657373657320697320696e76616c696460448201526064016107bc565b6000848281518110611c9257611c92614650565b602002602001015111611ce75760405162461bcd60e51b815260206004820152601c60248201527f4e46543a20616c6c20616d6f756e7473206d757374206265203e20300000000060448201526064016107bc565b838181518110611cf957611cf9614650565b60200260200101516101066000878481518110611d1857611d18614650565b602002602001015181526020019081526020016000206000828254611d3d9190614464565b925050819055506000838281518110611d5857611d58614650565b6020026020010151511115611e2657828181518110611d7957611d79614650565b60200260200101516101076000878481518110611d9857611d98614650565b602002602001015181526020019081526020016000209081611dba919061438f565b50848181518110611dcd57611dcd614650565b60200260200101517f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b848381518110611e0857611e08614650565b6020026020010151604051611e1d9190613921565b60405180910390a25b611e8c868281518110611e3b57611e3b614650565b6020026020010151868381518110611e5557611e55614650565b6020026020010151868481518110611e6f57611e6f614650565b6020026020010151604051806020016040528060008152506120f8565b80611e9681614666565b915050611b63565b5050600160cd5550505050565b6001600160a01b03163b151590565b60606000611ec983600261447c565b611ed4906002614464565b6001600160401b03811115611eeb57611eeb61379c565b6040519080825280601f01601f191660200182016040528015611f15576020820181803683370190505b509050600360fc1b81600081518110611f3057611f30614650565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611f5f57611f5f614650565b60200101906001600160f81b031916908160001a9053506000611f8384600261447c565b611f8e906001614464565b90505b6001811115612006576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611fc257611fc2614650565b1a60f81b828281518110611fd857611fd8614650565b60200101906001600160f81b031916908160001a90535060049490941c93611fff81614809565b9050611f91565b5083156114505760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016107bc565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60006001600160e01b03198216636cdb3d1360e11b14806120b157506001600160e01b031982166303a24d0760e21b145b806107ea57506301ffc9a760e01b6001600160e01b03198316146107ea565b6120da813361334c565b50565b606761083c828261438f565b60606067805461096690614287565b6001600160a01b0384166121585760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107bc565b336000612164856133b0565b90506000612171856133b0565b905060008681526065602090815260408083206001600160a01b038b168452909152812080548792906121a5908490614464565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612205836000898989896133fb565b50505050505050565b6001600160a01b0384166122345760405162461bcd60e51b81526004016107bc90614820565b336000612240856133b0565b9050600061224d856133b0565b905060008681526065602090815260408083206001600160a01b038c168452909152902054858110156122925760405162461bcd60e51b81526004016107bc90614865565b60008781526065602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906122d1908490614464565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612331848a8a8a8a8a6133fb565b505050505050505050565b600054610100900460ff166123635760405162461bcd60e51b81526004016107bc906148af565b6120da81613556565b600054610100900460ff166123935760405162461bcd60e51b81526004016107bc906148af565b61239b613586565b565b6127108111156123f95760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f742073657420726f79616c7469657320746f206f766572203130306044820152602560f81b60648201526084016107bc565b61010380546001600160a01b0319166001600160a01b03939093169290921790915561010455565b6001600160a01b0382166124775760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206d757374206861766520616e206f776e6572000000000060448201526064016107bc565b60c980546001600160a01b0384166001600160a01b0319918216811790925560ca8054909116331790556124ba90600080516020614d6383398151915290612b2e565b60ca546124df90600080516020614d63833981519152906001600160a01b0316612b2e565b60005b8151811015610ffc5760008282815181106124ff576124ff614650565b6020026020010151600001519050612516816135b4565b612521826020611eba565b60405160200161253191906148fa565b6040516020818303038152906040529061255e5760405162461bcd60e51b81526004016107bc9190613921565b5060005b83838151811061257457612574614650565b60200260200101516020015151811015612654576125c88285858151811061259e5761259e614650565b60200260200101516020015183815181106125bb576125bb614650565b6020026020010151612b2e565b600082815260cb6020526040902084518590859081106125ea576125ea614650565b602002602001015160200151828151811061260757612607614650565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558061264c81614666565b915050612562565b5082828151811061266757612667614650565b6020026020010151604001511561269257600081815260cc60205260409020805460ff191660011790555b508061269d81614666565b9150506124e2565b8051156120da576126c4600080516020614d63833981519152336113fa565b6127105760405162461bcd60e51b815260206004820152601b60248201527f4772616e756c6172526f6c65733a206e6f7420616e2061646d696e000000000060448201526064016107bc565b60005b815181101561083c57600082828151811061273057612730614650565b6020026020010151600001519050612747816135b4565b612752826020611eba565b60405160200161276291906148fa565b6040516020818303038152906040529061278f5760405162461bcd60e51b81526004016107bc9190613921565b50600081815260cc602090815260409091205460ff1615906127b2908390611eba565b6040516020016127c2919061493f565b604051602081830303815290604052906127ef5760405162461bcd60e51b81526004016107bc9190613921565b5060005b600082815260cb602052604090205481101561285b57600082815260cb6020526040902080546128499184918490811061282f5761282f614650565b6000918252602090912001546001600160a01b0316612bb4565b8061285381614666565b9150506127f3565b50600081815260cb60205260408120612873916136f6565b60005b83838151811061288857612888614650565b6020026020010151602001515181101561293e576128b28285858151811061259e5761259e614650565b600082815260cb6020526040902084518590859081106128d4576128d4614650565b60200260200101516020015182815181106128f1576128f1614650565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558061293681614666565b915050612876565b5082828151811061295157612951614650565b6020026020010151604001511561297c57600081815260cc60205260409020805460ff191660011790555b508061298781614666565b915050612713565b81518351146129b05760405162461bcd60e51b81526004016107bc9061498f565b6001600160a01b0384166129d65760405162461bcd60e51b81526004016107bc90614820565b3360005b8451811015612ac05760008582815181106129f7576129f7614650565b602002602001015190506000858381518110612a1557612a15614650565b60209081029190910181015160008481526065835260408082206001600160a01b038e168352909352919091205490915081811015612a665760405162461bcd60e51b81526004016107bc90614865565b60008381526065602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612aa5908490614464565b9250508190555050505080612ab990614666565b90506129da565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612b109291906149d7565b60405180910390a4612b2681878787878761363b565b505050505050565b612b3882826113fa565b61083c5760008281526097602090815260408083206001600160a01b03851684529091529020805460ff19166001179055612b703390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b612bbe82826113fa565b1561083c5760008281526097602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038316612c415760405162461bcd60e51b81526004016107bc90614a05565b8051825114612c625760405162461bcd60e51b81526004016107bc9061498f565b604080516020810190915260009081905233905b8351811015612d3b576000848281518110612c9357612c93614650565b602002602001015190506000848381518110612cb157612cb1614650565b60209081029190910181015160008481526065835260408082206001600160a01b038c168352909352919091205490915081811015612d025760405162461bcd60e51b81526004016107bc90614a48565b60009283526065602090815260408085206001600160a01b038b1686529091529092209103905580612d3381614666565b915050612c76565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612d8c9291906149d7565b60405180910390a4604080516020810190915260009052610bff565b816001600160a01b0316836001600160a01b031603612e1b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016107bc565b6001600160a01b03838116600081815260666020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038316612eae5760405162461bcd60e51b81526004016107bc90614a05565b336000612eba846133b0565b90506000612ec7846133b0565b6040805160208082018352600091829052888252606581528282206001600160a01b038b1683529052205490915084811015612f155760405162461bcd60e51b81526004016107bc90614a48565b60008681526065602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052612205565b606081600003612fb65750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612fe05780612fca81614666565b9150612fd99050600a836144b1565b9150612fba565b6000816001600160401b03811115612ffa57612ffa61379c565b6040519080825280601f01601f191660200182016040528015613024576020820181803683370190505b5090505b841561308f5761303960018361467f565b9150613046600a86614a8c565b613051906030614464565b60f81b81838151811061306657613066614650565b60200101906001600160f81b031916908160001a905350613088600a866144b1565b9450613028565b949350505050565b606060006130a683600261447c565b6130b1906002614464565b6001600160401b038111156130c8576130c861379c565b6040519080825280601f01601f1916602001820160405280156130f2576020820181803683370190505b509050600360fc1b8160008151811061310d5761310d614650565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061313c5761313c614650565b60200101906001600160f81b031916908160001a905350600061316084600261447c565b61316b906001614464565b90505b6001811115612006576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061319f5761319f614650565b1a60f81b8282815181106131b5576131b5614650565b60200101906001600160f81b031916908160001a90535060049490941c936131dc81614809565b905061316e565b80516060906000819003613207575050604080516020810190915260008152919050565b60006003613216836002614464565b61322091906144b1565b61322b90600461447c565b9050600061323a826020614464565b6001600160401b038111156132515761325161379c565b6040519080825280601f01601f19166020018201604052801561327b576020820181803683370190505b5090506000604051806060016040528060408152602001614d03604091399050600181016020830160005b86811015613307576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016132a6565b50600386066001811461332157600281146133325761333e565b613d3d60f01b60011983015261333e565b603d60f81b6000198301525b505050918152949350505050565b61335682826113fa565b61083c5761336e816001600160a01b03166014611eba565b613379836020611eba565b60405160200161338a929190614aa0565b60408051601f198184030181529082905262461bcd60e51b82526107bc91600401613921565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106133ea576133ea614650565b602090810291909101015292915050565b6001600160a01b0384163b15612b265760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061343f9089908990889088908890600401614b15565b6020604051808303816000875af192505050801561347a575060408051601f3d908101601f1916820190925261347791810190614b5a565b60015b61352657613486614b77565b806308c379a0036134bf575061349a614b93565b806134a557506134c1565b8060405162461bcd60e51b81526004016107bc9190613921565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016107bc565b6001600160e01b0319811663f23a6e6160e01b146122055760405162461bcd60e51b81526004016107bc90614c1c565b600054610100900460ff1661357d5760405162461bcd60e51b81526004016107bc906148af565b6120da816120dd565b600054610100900460ff166135ad5760405162461bcd60e51b81526004016107bc906148af565b600160cd55565b6000600080516020614d438339815191528214806135df5750600080516020614ce383398151915282145b8061360957507f852fd44a27d33057a8c3d90859d4e4c9f54309d4d66d1d968e063befba9198e682145b806136215750600080516020614d8383398151915282145b806107ea575050600080516020614cc38339815191521490565b6001600160a01b0384163b15612b265760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061367f9089908990889088908890600401614c64565b6020604051808303816000875af19250505080156136ba575060408051601f3d908101601f191682019092526136b791810190614b5a565b60015b6136c657613486614b77565b6001600160e01b0319811663bc197c8160e01b146122055760405162461bcd60e51b81526004016107bc90614c1c565b50805460008255906000526020600020908101906120da91905b808211156137245760008155600101613710565b5090565b80356001600160a01b03811681146109f457600080fd5b6000806040838503121561375257600080fd5b61375b83613728565b946020939093013593505050565b6001600160e01b0319811681146120da57600080fd5b60006020828403121561379157600080fd5b813561145081613769565b634e487b7160e01b600052604160045260246000fd5b606081018181106001600160401b03821117156137d1576137d161379c565b60405250565b608081018181106001600160401b03821117156137d1576137d161379c565b601f8201601f191681016001600160401b038111828210171561381b5761381b61379c565b6040525050565b600082601f83011261383357600080fd5b81356001600160401b0381111561384c5761384c61379c565b604051613863601f8301601f1916602001826137f6565b81815284602083860101111561387857600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156138a757600080fd5b81356001600160401b038111156138bd57600080fd5b61308f84828501613822565b60005b838110156138e45781810151838201526020016138cc565b83811115610bff5750506000910152565b6000815180845261390d8160208601602086016138c9565b601f01601f19169290920160200192915050565b60208152600061145060208301846138f5565b60006020828403121561394657600080fd5b5035919050565b6000806000806080858703121561396357600080fd5b61396c85613728565b9350602085013592506040850135915060608501356001600160401b0381111561399557600080fd5b6139a187828801613822565b91505092959194509250565b6000806000606084860312156139c257600080fd5b6139cb84613728565b95602085013595506040909401359392505050565b803580151581146109f457600080fd5b600060a08284031215613a0257600080fd5b60405160a081016001600160401b038282108183111715613a2557613a2561379c565b816040528293508435915080821115613a3d57600080fd5b50613a4a85828601613822565b825250613a59602084016139e0565b6020820152613a6a604084016139e0565b604082015260608301356060820152613a8560808401613728565b60808201525092915050565b60006001600160401b03821115613aaa57613aaa61379c565b5060051b60200190565b600082601f830112613ac557600080fd5b81356020613ad282613a91565b604051613adf82826137f6565b83815260059390931b8501820192828101915086841115613aff57600080fd5b8286015b84811015613b2157613b1481613728565b8352918301918301613b03565b509695505050505050565b600082601f830112613b3d57600080fd5b81356020613b4a82613a91565b60408051613b5883826137f6565b84815260059490941b8601830193838101925087851115613b7857600080fd5b8387015b85811015613c0b5780356001600160401b0380821115613b9c5760008081fd5b908901906060828c03601f1901811315613bb65760008081fd5b8551613bc1816137b2565b8884013581528684013583811115613bd95760008081fd5b613be78e8b83880101613ab4565b8a83015250613bf78285016139e0565b818801528752505050928401928401613b7c565b50979650505050505050565b600080600060608486031215613c2c57600080fd5b83356001600160401b0380821115613c4357600080fd5b9085019060808288031215613c5757600080fd5b604051613c63816137d7565b823582811115613c7257600080fd5b613c7e89828601613822565b825250602083013582811115613c9357600080fd5b613c9f89828601613822565b602083015250613cb160408401613728565b6040820152613cc2606084016139e0565b606082015294506020860135915080821115613cdd57600080fd5b613ce9878388016139f0565b93506040860135915080821115613cff57600080fd5b50613d0c86828701613b2c565b9150509250925092565b60008060408385031215613d2957600080fd5b50508035926020909101359150565b600080600060608486031215613d4d57600080fd5b83356001600160401b0380821115613d6457600080fd5b9085019060a08288031215613d7857600080fd5b90935060208501359080821115613d8e57600080fd5b50613d9b86828701613b2c565b925050613daa604085016139e0565b90509250925092565b600082601f830112613dc457600080fd5b81356020613dd182613a91565b604051613dde82826137f6565b83815260059390931b8501820192828101915086841115613dfe57600080fd5b8286015b84811015613b215780358352918301918301613e02565b600080600080600060a08688031215613e3157600080fd5b613e3a86613728565b9450613e4860208701613728565b935060408601356001600160401b0380821115613e6457600080fd5b613e7089838a01613db3565b94506060880135915080821115613e8657600080fd5b613e9289838a01613db3565b93506080880135915080821115613ea857600080fd5b50613eb588828901613822565b9150509295509295909350565b60008060408385031215613ed557600080fd5b82359150613ee560208401613728565b90509250929050565b60008060408385031215613f0157600080fd5b82356001600160401b0380821115613f1857600080fd5b613f2486838701613ab4565b93506020850135915080821115613f3a57600080fd5b50613f4785828601613db3565b9150509250929050565b600081518084526020808501945080840160005b83811015613f8157815187529582019590820190600101613f65565b509495945050505050565b6020815260006114506020830184613f51565b600080600060608486031215613fb457600080fd5b83356001600160401b0380821115613fcb57600080fd5b613fd787838801613ab4565b94506020860135915080821115613fed57600080fd5b613ff987838801613db3565b9350604086013591508082111561400f57600080fd5b50613d0c86828701613db3565b6000806040838503121561402f57600080fd5b82356001600160401b038082111561404657600080fd5b613f2486838701613db3565b6000806040838503121561406557600080fd5b61406e83613728565b9150613ee5602084016139e0565b60008060006060848603121561409157600080fd5b8335925060208401356001600160401b038111156140ae57600080fd5b613d9b86828701613822565b600080604083850312156140cd57600080fd5b6140d683613728565b9150613ee560208401613728565b600080600080600060a086880312156140fc57600080fd5b61410586613728565b945061411360208701613728565b9350604086013592506060860135915060808601356001600160401b0381111561413c57600080fd5b613eb588828901613822565b60006020828403121561415a57600080fd5b61145082613728565b6000806000806080858703121561417957600080fd5b84356001600160401b038082111561419057600080fd5b61419c88838901613ab4565b95506020915081870135818111156141b357600080fd5b6141bf89828a01613db3565b9550506040870135818111156141d457600080fd5b6141e089828a01613db3565b9450506060870135818111156141f557600080fd5b8701601f8101891361420657600080fd5b803561421181613a91565b60405161421e82826137f6565b82815260059290921b830185019185810191508b83111561423e57600080fd5b8584015b838110156142765780358681111561425a5760008081fd5b6142688e8983890101613822565b845250918601918601614242565b50989b979a50959850505050505050565b600181811c9082168061429b57607f821691505b6020821081036142bb57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546142ce81614287565b600182811680156142e657600181146142fb5761432a565b60ff198416875282151583028701945061432a565b8560005260208060002060005b858110156143215781548a820152908401908201614308565b50505082870194505b5050505092915050565b600061308f61434383866142c1565b846142c1565b601f821115610ffc57600081815260208120601f850160051c810160208610156143705750805b601f850160051c820191505b81811015612b265782815560010161437c565b81516001600160401b038111156143a8576143a861379c565b6143bc816143b68454614287565b84614349565b602080601f8311600181146143f157600084156143d95750858301515b600019600386901b1c1916600185901b178555612b26565b600085815260208120601f198616915b8281101561442057888601518255948401946001909101908401614401565b508582101561443e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600082198211156144775761447761444e565b500190565b60008160001904831182151516156144965761449661444e565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826144c0576144c061449b565b500490565b600061145082846142c1565b6000808335601e198436030181126144e857600080fd5b8301803591506001600160401b0382111561450257600080fd5b602001915036819003821315610dfc57600080fd5b8183823760009101908152919050565b6001600160401b0383111561453e5761453e61379c565b6145528361454c8354614287565b83614349565b6000601f841160018114614586576000851561456e5750838201355b600019600387901b1c1916600186901b178355610fd0565b600083815260209020601f19861690835b828110156145b75786850135825560209485019460019092019101614597565b50868210156145d45760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6000602082840312156145f857600080fd5b611450826139e0565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000600182016146785761467861444e565b5060010190565b6000828210156146915761469161444e565b500390565b600082516146a88184602087016138c9565b9190910192915050565b60006020808352600084546146c681614287565b808487015260406001808416600081146146e757600181146147015761472f565b60ff1985168984015283151560051b89018301955061472f565b896000528660002060005b858110156147275781548b820186015290830190880161470c565b8a0184019650505b509398975050505050505050565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a200000000081526000835161477581601c8501602088016138c9565b731610113332b2afb932b1b4b834b2b73a111d101160611b601c9184019182015283516147a98160308401602088016138c9565b61227d60f01b60309290910191820152603201949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516147fc81601d8501602087016138c9565b91909101601d0192915050565b6000816148185761481861444e565b506000190190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b7f4772616e756c6172526f6c65733a20696e76616c696420726f6c65200000000081526000825161493281601c8501602087016138c9565b91909101601c0192915050565b73023b930b73ab630b92937b632b99d103937b632960651b81526000825161496e8160148501602087016138c9565b691034b990333937bd32b760b11b6014939091019283015250601e01919050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6040815260006149ea6040830185613f51565b82810360208401526149fc8185613f51565b95945050505050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b600082614a9b57614a9b61449b565b500690565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614ad88160178501602088016138c9565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614b098160288401602088016138c9565b01602801949350505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090614b4f908301846138f5565b979650505050505050565b600060208284031215614b6c57600080fd5b815161145081613769565b600060033d1115614b905760046000803e5060005160e01c5b90565b600060443d1015614ba15790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715614bd057505050505090565b8285019150815181811115614be85750505050505090565b843d8701016020828501011115614c025750505050505090565b614c11602082860101876137f6565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090614c9090830186613f51565b8281036060840152614ca28186613f51565b90508281036080840152614cb681856138f5565b9897505050505050505056fe8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c9b16859c0d694afa65b1b6551542db11ea12d6208b6a17dc922f10f2d74440f54142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f154c00819833dac601ee5ddded6fda79d9d8b506b911b3dbd54cdb95fe6c3686a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775e97b137254058bd94f28d2f3eb79e2d34074ffb488d042e3bc958e0a57d2fa22a264697066735822122043d512217255bcebb0e1db488835b9314a498aa33849668034565649d75aac7a64736f6c634300080f0033496e697469616c697a61626c653a20636f6e747261637420697320616c726561496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420697f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102d55760003560e01c80638d010db311610182578063b930908f116100e9578063e985e9c5116100a2578063f242432a1161007c578063f242432a14610713578063f2fde38b14610726578063ff0a9f5114610739578063ffa1ad741461074c57600080fd5b8063e985e9c5146106ba578063e9a9c850146106f6578063f153c2e51461070b57600080fd5b8063b930908f14610644578063bd85b03914610659578063d547741f1461067a578063de374d9d1461068d578063e3d52072146106a0578063e8a3d485146106b257600080fd5b8063a22cb4651161013b578063a22cb465146105aa578063a2f551ec146105bd578063a3f4df7e146105d0578063a53a84b614610600578063b29c097a1461060a578063b390c0ab1461063157600080fd5b80638d010db3146105365780638da5cb5b1461055a57806391d148541461056b57806395d89b411461057e5780639da5b0a514610586578063a217fddf146105a257600080fd5b80632c23b965116102415780634e1273f4116101fa5780636f8b1495116101d45780636f8b1495146104e557806375b238fc146104fb5780637e712f381461051057806383ca4b6f1461052357600080fd5b80634e1273f4146104b15780634e6f9dd6146104d15780636c0360eb146104dd57600080fd5b80632c23b965146104245780632e628b61146104395780632eb2c2d61461044c5780632f2ff15d1461045f578063328825351461047257806336568abe1461049e57600080fd5b8063206b60f911610293578063206b60f914610373578063224a177514610388578063248a9ca31461039b57806325d22c8e146103be5780632693ebf2146103d15780632a55205a146103f257600080fd5b8062fdd58e146102da57806301ffc9a71461030057806302fe53051461032357806306fdde03146103385780630e89341c1461034d57806320333b1314610360575b600080fd5b6102ed6102e836600461373f565b610755565b6040519081526020015b60405180910390f35b61031361030e36600461377f565b6107f0565b60405190151581526020016102f7565b610336610331366004613895565b61081b565b005b610340610840565b6040516102f79190613921565b61034061035b366004613934565b6108cf565b61033661036e36600461394d565b6109f9565b6102ed600080516020614cc383398151915281565b6103366103963660046139ad565b610b6c565b6102ed6103a9366004613934565b60009081526097602052604090206001015490565b6103366103cc366004613c17565b610c05565b6102ed6103df366004613934565b6101066020526000908152604090205481565b610405610400366004613d16565b610dc5565b604080516001600160a01b0390931683526020830191909152016102f7565b6102ed600080516020614ce383398151915281565b610336610447366004613d38565b610e03565b61033661045a366004613e19565b610f8b565b61033661046d366004613ec2565b610fd7565b61010354610486906001600160a01b031681565b6040516001600160a01b0390911681526020016102f7565b6103366104ac366004613ec2565b611001565b6104c46104bf366004613eee565b61107b565b6040516102f79190613f8c565b60ff8054610313911681565b6103406111a4565b6103406040518060200160405280600081525081565b6102ed600080516020614d6383398151915281565b61033661051e366004613f9f565b6111b2565b61033661053136600461401c565b611306565b610313610544366004613934565b6101056020526000908152604090205460ff1681565b60c9546001600160a01b0316610486565b610313610579366004613ec2565b6113fa565b610340611457565b61058f61271081565b60405161ffff90911681526020016102f7565b6102ed600081565b6103366105b8366004614052565b611465565b6103366105cb36600461407c565b611470565b61034060405180604001604052806011815260200170115490cc4c4d4d539195141c9bd91d58dd607a1b81525081565b6102ed6101045481565b6102ed7f852fd44a27d33057a8c3d90859d4e4c9f54309d4d66d1d968e063befba9198e681565b61033661063f366004613d16565b611758565b6102ed600080516020614d8383398151915281565b6102ed610667366004613934565b6000908152610106602052604090205490565b610336610688366004613ec2565b6117fb565b60ff805461031391620100009091041681565b60ff8054610313916101009091041681565b610340611820565b6103136106c83660046140ba565b6001600160a01b03918216600090815260666020908152604080832093909416825291909152205460ff1690565b6102ed600080516020614d4383398151915281565b61033661189c565b6103366107213660046140e4565b6118ec565b610336610734366004614148565b611931565b610336610747366004614163565b611a8c565b6102ed61271181565b60006001600160a01b0383166107c55760405162461bcd60e51b815260206004820152602a60248201527f455243313135353a2061646472657373207a65726f206973206e6f742061207660448201526930b634b21037bbb732b960b11b60648201526084015b60405180910390fd5b5060008181526065602090815260408083206001600160a01b03861684529091529020545b92915050565b60006107fb82612080565b806107ea57506001600160e01b0319821663152a902d60e11b1492915050565b600080516020614ce3833981519152610833816120d0565b61083c826120dd565b5050565b610100805461084e90614287565b80601f016020809104026020016040519081016040528092919081815260200182805461087a90614287565b80156108c75780601f1061089c576101008083540402835291602001916108c7565b820191906000526020600020905b8154815290600101906020018083116108aa57829003601f168201915b505050505081565b600081815261010760205260408120805460609291906108ee90614287565b905011156109eb576000610102805461090690614287565b9050111561094c576101026101076000848152602001908152602001600020604051602001610936929190614334565b6040516020818303038152906040529050919050565b600082815261010760205260409020805461096690614287565b80601f016020809104026020016040519081016040528092919081815260200182805461099290614287565b80156109df5780601f106109b4576101008083540402835291602001916109df565b820191906000526020600020905b8154815290600101906020018083116109c257829003601f168201915b50505050509050919050565b6107ea826120e9565b919050565b600080516020614d43833981519152610a11816120d0565b600260cd5403610a635760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107bc565b600260cd556000848152610106602052604090205415610ac55760405162461bcd60e51b815260206004820152601960248201527f4e46543a20746f6b656e20616c7265616479206d696e7465640000000000000060448201526064016107bc565b815115610b1f57600084815261010760205260409020610ae5838261438f565b50837f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b83604051610b169190613921565b60405180910390a25b6000848152610106602052604081208054859290610b3e908490614464565b92505081905550610b60858585604051806020016040528060008152506120f8565b5050600160cd55505050565b600080516020614cc3833981519152610b84816120d0565b60ff805462010000900416610bd45760405162461bcd60e51b8152602060048201526016602482015275151c985b9cd9995c9cc8185c9948191a5cd8589b195960521b60448201526064016107bc565b60c954604080516020810190915260008152610bff916001600160a01b03169086908690869061220e565b50505050565b600054610100900460ff1615808015610c255750600054600160ff909116105b80610c3f5750303b158015610c3f575060005460ff166001145b610ca25760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016107bc565b6000805460ff191660011790558015610cc5576000805461ff0019166101001790555b610cdd6040518060200160405280600081525061233c565b610ce561236c565b610cf78360800151846060015161239d565b602083015160ff80546060870151604087015161ffff1990921693151561ff0019169390931761010093151584021762ff0000191662010000911515919091021790558451610d46908261438f565b50602084015161010190610d5a908261438f565b50825161010290610d6b908261438f565b50610d7a846040015183612421565b8015610bff576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a150505050565b610103546101045460009182916001600160a01b039091169061271090610ded90869061447c565b610df791906144b1565b915091505b9250929050565b600080516020614ce3833981519152610e1b816120d0565b60ff80541680610e845750610102604051602001610e3991906144c5565b60408051601f198184030181529190528051602090910120610e5b85806144d1565b604051602001610e6c929190614517565b60405160208183030381529060405280519060200120145b610ec55760405162461bcd60e51b815260206004820152601260248201527126b2ba30b230ba309034b990333937bd32b760711b60448201526064016107bc565b610ecf84806144d1565b61010291610ede919083614527565b50610efc610ef260a0860160808701614148565b856060013561239d565b610f0c60608501604086016145e6565b610f1d5760ff805462ff0000191690555b610f2d60408501602086016145e6565b158015610f3b575060ff8054165b15610f745760ff805460ff191690556040517fb59f45df38ec0d34114b1248c38a29cdbccbf3e745ae3ef310ac66199a4ceccf90600090a15b610f7d836126a5565b8115610bff57610bff61189c565b6001600160a01b038516331480610fa75750610fa785336106c8565b610fc35760405162461bcd60e51b81526004016107bc90614601565b610fd0858585858561298f565b5050505050565b600082815260976020526040902060010154610ff2816120d0565b610ffc8383612b2e565b505050565b6001600160a01b03811633146110715760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084016107bc565b61083c8282612bb4565b606081518351146110e05760405162461bcd60e51b815260206004820152602960248201527f455243313135353a206163636f756e747320616e6420696473206c656e677468604482015268040dad2e6dac2e8c6d60bb1b60648201526084016107bc565b600083516001600160401b038111156110fb576110fb61379c565b604051908082528060200260200182016040528015611124578160200160208202803683370190505b50905060005b845181101561119c5761116f85828151811061114857611148614650565b602002602001015185838151811061116257611162614650565b6020026020010151610755565b82828151811061118157611181614650565b602090810291909101015261119581614666565b905061112a565b509392505050565b610102805461084e90614287565b600080516020614cc38339815191526111ca816120d0565b60ff80546201000090041661121a5760405162461bcd60e51b8152602060048201526016602482015275151c985b9cd9995c9cc8185c9948191a5cd8589b195960521b60448201526064016107bc565b8251845114801561122c575081518351145b6112725760405162461bcd60e51b81526020600482015260176024820152764d69736d61746368656420696e7075742061727261797360481b60448201526064016107bc565b60005b8351811015610fd05760c95485516112f4916001600160a01b0316908790849081106112a3576112a3614650565b60200260200101518684815181106112bd576112bd614650565b60200260200101518685815181106112d7576112d7614650565b60200260200101516040518060200160405280600081525061220e565b806112fe81614666565b915050611275565b600080516020614d8383398151915261131e816120d0565b60ff80546101009004166113695760405162461bcd60e51b8152602060048201526012602482015271109d5c9b9cc8185c9948191a5cd8589b195960721b60448201526064016107bc565b60c954611380906001600160a01b03168484612c1b565b60005b8351811015610bff5782818151811061139e5761139e614650565b602002602001015161010660008684815181106113bd576113bd614650565b6020026020010151815260200190815260200160002060008282546113e2919061467f565b909155508190506113f281614666565b915050611383565b60c9546000906001600160a01b039081169083160361141b575060016107ea565b82611428575060006107ea565b611440600080516020614d6383398151915283612055565b8061145057506114508383612055565b9392505050565b610101805461084e90614287565b61083c338383612da8565b7f852fd44a27d33057a8c3d90859d4e4c9f54309d4d66d1d968e063befba9198e661149a816120d0565b600084815261010660205260409020546114ed5760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b60448201526064016107bc565b60ff8054166115335760405162461bcd60e51b815260206004820152601260248201527126b2ba30b230ba309034b990333937bd32b760711b60448201526064016107bc565b6000848152610105602052604090205460ff1615156001036115895760405162461bcd60e51b815260206004820152600f60248201526e2a37b5b2b71034b990333937bd32b760891b60448201526064016107bc565b81806115955750825115155b6115fb5760405162461bcd60e51b815260206004820152603160248201527f456974686572205f6e6577557269206f72205f6973467265657a65546f6b656e604482015270155c9a4f5d1c9d59481c995c5d5a5c9959607a1b60648201526084016107bc565b8251156116ed57826040516020016116139190614696565b60408051601f1981840301815282825280516020918201206000888152610107909252919020909161164591906144c5565b60405180910390200361169a5760405162461bcd60e51b815260206004820181905260248201527f4e657720746f6b656e205552492069732073616d65206173207570646174656460448201526064016107bc565b6000848152610107602052604090206116b3848261438f565b50837f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b846040516116e49190613921565b60405180910390a25b8115610bff57600084815261010560209081526040808320805460ff1916600117905561010790915290819020905185917fa109ba539900bf1b633f956d63c96fc89b814c7287f7aa50a9216d0b556572079161174a91906146b2565b60405180910390a250505050565b600080516020614d83833981519152611770816120d0565b60ff80546101009004166117bb5760405162461bcd60e51b8152602060048201526012602482015271109d5c9b9cc8185c9948191a5cd8589b195960721b60448201526064016107bc565b60c9546117d2906001600160a01b03168484612e88565b60008381526101066020526040812080548492906117f190849061467f565b9091555050505050565b600082815260976020526040902060010154611816816120d0565b610ffc8383612bb4565b6060600061187061183361010454612f8f565b6101035461184b906001600160a01b03166014613097565b60405160200161185c92919061473d565b6040516020818303038152906040526131e3565b905060008160405160200161188591906147c4565b60408051601f198184030181529190529392505050565b600080516020614d638339815191526118b4816120d0565b60ca546118d990600080516020614d63833981519152906001600160a01b0316612bb4565b5060ca80546001600160a01b0319169055565b6001600160a01b038516331480611908575061190885336106c8565b6119245760405162461bcd60e51b81526004016107bc90614601565b610fd0858585858561220e565b60c9546001600160a01b039081169082160361198f5760405162461bcd60e51b815260206004820181905260248201527f4772616e756c6172526f6c65733a20616c726561647920746865206f776e657260448201526064016107bc565b60c9546001600160a01b031633146119e95760405162461bcd60e51b815260206004820152601c60248201527f4772616e756c6172526f6c65733a206e6f7420746865206f776e65720000000060448201526064016107bc565b60c954611a0e90600080516020614d63833981519152906001600160a01b0316612bb4565b60c980546001600160a01b038381166001600160a01b0319831681179093551690611a4890600080516020614d6383398151915290612b2e565b816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600080516020614d43833981519152611aa4816120d0565b600260cd5403611af65760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c0060448201526064016107bc565b600260cd5583518551148015611b0d575082518451145b8015611b1a575081518351145b611b605760405162461bcd60e51b81526020600482015260176024820152764d69736d61746368656420696e7075742061727261797360481b60448201526064016107bc565b60005b8451811015611e9e57611b9e858281518110611b8157611b81614650565b602002602001015160009081526101066020526040902054151590565b15611beb5760405162461bcd60e51b815260206004820152601f60248201527f4f6e65206f6620746f6b656e7320697320616c7265616479206d696e7465640060448201526064016107bc565b858181518110611bfd57611bfd614650565b60200260200101516001600160a01b0316868281518110611c2057611c20614650565b60200260200101516001600160a01b031614611c7e5760405162461bcd60e51b815260206004820181905260248201527f4e46543a206f6e65206f662061646472657373657320697320696e76616c696460448201526064016107bc565b6000848281518110611c9257611c92614650565b602002602001015111611ce75760405162461bcd60e51b815260206004820152601c60248201527f4e46543a20616c6c20616d6f756e7473206d757374206265203e20300000000060448201526064016107bc565b838181518110611cf957611cf9614650565b60200260200101516101066000878481518110611d1857611d18614650565b602002602001015181526020019081526020016000206000828254611d3d9190614464565b925050819055506000838281518110611d5857611d58614650565b6020026020010151511115611e2657828181518110611d7957611d79614650565b60200260200101516101076000878481518110611d9857611d98614650565b602002602001015181526020019081526020016000209081611dba919061438f565b50848181518110611dcd57611dcd614650565b60200260200101517f6bb7ff708619ba0610cba295a58592e0451dee2622938c8755667688daf3529b848381518110611e0857611e08614650565b6020026020010151604051611e1d9190613921565b60405180910390a25b611e8c868281518110611e3b57611e3b614650565b6020026020010151868381518110611e5557611e55614650565b6020026020010151868481518110611e6f57611e6f614650565b6020026020010151604051806020016040528060008152506120f8565b80611e9681614666565b915050611b63565b5050600160cd5550505050565b6001600160a01b03163b151590565b60606000611ec983600261447c565b611ed4906002614464565b6001600160401b03811115611eeb57611eeb61379c565b6040519080825280601f01601f191660200182016040528015611f15576020820181803683370190505b509050600360fc1b81600081518110611f3057611f30614650565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110611f5f57611f5f614650565b60200101906001600160f81b031916908160001a9053506000611f8384600261447c565b611f8e906001614464565b90505b6001811115612006576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110611fc257611fc2614650565b1a60f81b828281518110611fd857611fd8614650565b60200101906001600160f81b031916908160001a90535060049490941c93611fff81614809565b9050611f91565b5083156114505760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016107bc565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60006001600160e01b03198216636cdb3d1360e11b14806120b157506001600160e01b031982166303a24d0760e21b145b806107ea57506301ffc9a760e01b6001600160e01b03198316146107ea565b6120da813361334c565b50565b606761083c828261438f565b60606067805461096690614287565b6001600160a01b0384166121585760405162461bcd60e51b815260206004820152602160248201527f455243313135353a206d696e7420746f20746865207a65726f206164647265736044820152607360f81b60648201526084016107bc565b336000612164856133b0565b90506000612171856133b0565b905060008681526065602090815260408083206001600160a01b038b168452909152812080548792906121a5908490614464565b909155505060408051878152602081018790526001600160a01b03808a1692600092918716917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612205836000898989896133fb565b50505050505050565b6001600160a01b0384166122345760405162461bcd60e51b81526004016107bc90614820565b336000612240856133b0565b9050600061224d856133b0565b905060008681526065602090815260408083206001600160a01b038c168452909152902054858110156122925760405162461bcd60e51b81526004016107bc90614865565b60008781526065602090815260408083206001600160a01b038d8116855292528083208985039055908a168252812080548892906122d1908490614464565b909155505060408051888152602081018890526001600160a01b03808b16928c821692918816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4612331848a8a8a8a8a6133fb565b505050505050505050565b600054610100900460ff166123635760405162461bcd60e51b81526004016107bc906148af565b6120da81613556565b600054610100900460ff166123935760405162461bcd60e51b81526004016107bc906148af565b61239b613586565b565b6127108111156123f95760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f742073657420726f79616c7469657320746f206f766572203130306044820152602560f81b60648201526084016107bc565b61010380546001600160a01b0319166001600160a01b03939093169290921790915561010455565b6001600160a01b0382166124775760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206d757374206861766520616e206f776e6572000000000060448201526064016107bc565b60c980546001600160a01b0384166001600160a01b0319918216811790925560ca8054909116331790556124ba90600080516020614d6383398151915290612b2e565b60ca546124df90600080516020614d63833981519152906001600160a01b0316612b2e565b60005b8151811015610ffc5760008282815181106124ff576124ff614650565b6020026020010151600001519050612516816135b4565b612521826020611eba565b60405160200161253191906148fa565b6040516020818303038152906040529061255e5760405162461bcd60e51b81526004016107bc9190613921565b5060005b83838151811061257457612574614650565b60200260200101516020015151811015612654576125c88285858151811061259e5761259e614650565b60200260200101516020015183815181106125bb576125bb614650565b6020026020010151612b2e565b600082815260cb6020526040902084518590859081106125ea576125ea614650565b602002602001015160200151828151811061260757612607614650565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558061264c81614666565b915050612562565b5082828151811061266757612667614650565b6020026020010151604001511561269257600081815260cc60205260409020805460ff191660011790555b508061269d81614666565b9150506124e2565b8051156120da576126c4600080516020614d63833981519152336113fa565b6127105760405162461bcd60e51b815260206004820152601b60248201527f4772616e756c6172526f6c65733a206e6f7420616e2061646d696e000000000060448201526064016107bc565b60005b815181101561083c57600082828151811061273057612730614650565b6020026020010151600001519050612747816135b4565b612752826020611eba565b60405160200161276291906148fa565b6040516020818303038152906040529061278f5760405162461bcd60e51b81526004016107bc9190613921565b50600081815260cc602090815260409091205460ff1615906127b2908390611eba565b6040516020016127c2919061493f565b604051602081830303815290604052906127ef5760405162461bcd60e51b81526004016107bc9190613921565b5060005b600082815260cb602052604090205481101561285b57600082815260cb6020526040902080546128499184918490811061282f5761282f614650565b6000918252602090912001546001600160a01b0316612bb4565b8061285381614666565b9150506127f3565b50600081815260cb60205260408120612873916136f6565b60005b83838151811061288857612888614650565b6020026020010151602001515181101561293e576128b28285858151811061259e5761259e614650565b600082815260cb6020526040902084518590859081106128d4576128d4614650565b60200260200101516020015182815181106128f1576128f1614650565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558061293681614666565b915050612876565b5082828151811061295157612951614650565b6020026020010151604001511561297c57600081815260cc60205260409020805460ff191660011790555b508061298781614666565b915050612713565b81518351146129b05760405162461bcd60e51b81526004016107bc9061498f565b6001600160a01b0384166129d65760405162461bcd60e51b81526004016107bc90614820565b3360005b8451811015612ac05760008582815181106129f7576129f7614650565b602002602001015190506000858381518110612a1557612a15614650565b60209081029190910181015160008481526065835260408082206001600160a01b038e168352909352919091205490915081811015612a665760405162461bcd60e51b81526004016107bc90614865565b60008381526065602090815260408083206001600160a01b038e8116855292528083208585039055908b16825281208054849290612aa5908490614464565b9250508190555050505080612ab990614666565b90506129da565b50846001600160a01b0316866001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8787604051612b109291906149d7565b60405180910390a4612b2681878787878761363b565b505050505050565b612b3882826113fa565b61083c5760008281526097602090815260408083206001600160a01b03851684529091529020805460ff19166001179055612b703390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b612bbe82826113fa565b1561083c5760008281526097602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6001600160a01b038316612c415760405162461bcd60e51b81526004016107bc90614a05565b8051825114612c625760405162461bcd60e51b81526004016107bc9061498f565b604080516020810190915260009081905233905b8351811015612d3b576000848281518110612c9357612c93614650565b602002602001015190506000848381518110612cb157612cb1614650565b60209081029190910181015160008481526065835260408082206001600160a01b038c168352909352919091205490915081811015612d025760405162461bcd60e51b81526004016107bc90614a48565b60009283526065602090815260408085206001600160a01b038b1686529091529092209103905580612d3381614666565b915050612c76565b5060006001600160a01b0316846001600160a01b0316826001600160a01b03167f4a39dc06d4c0dbc64b70af90fd698a233a518aa5d07e595d983b8c0526c8f7fb8686604051612d8c9291906149d7565b60405180910390a4604080516020810190915260009052610bff565b816001600160a01b0316836001600160a01b031603612e1b5760405162461bcd60e51b815260206004820152602960248201527f455243313135353a2073657474696e6720617070726f76616c20737461747573604482015268103337b91039b2b63360b91b60648201526084016107bc565b6001600160a01b03838116600081815260666020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6001600160a01b038316612eae5760405162461bcd60e51b81526004016107bc90614a05565b336000612eba846133b0565b90506000612ec7846133b0565b6040805160208082018352600091829052888252606581528282206001600160a01b038b1683529052205490915084811015612f155760405162461bcd60e51b81526004016107bc90614a48565b60008681526065602090815260408083206001600160a01b038b81168086529184528285208a8703905582518b81529384018a90529092908816917fc3d58168c5ae7397731d063d5bbf3d657854427343f4c083240f7aacaa2d0f62910160405180910390a4604080516020810190915260009052612205565b606081600003612fb65750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612fe05780612fca81614666565b9150612fd99050600a836144b1565b9150612fba565b6000816001600160401b03811115612ffa57612ffa61379c565b6040519080825280601f01601f191660200182016040528015613024576020820181803683370190505b5090505b841561308f5761303960018361467f565b9150613046600a86614a8c565b613051906030614464565b60f81b81838151811061306657613066614650565b60200101906001600160f81b031916908160001a905350613088600a866144b1565b9450613028565b949350505050565b606060006130a683600261447c565b6130b1906002614464565b6001600160401b038111156130c8576130c861379c565b6040519080825280601f01601f1916602001820160405280156130f2576020820181803683370190505b509050600360fc1b8160008151811061310d5761310d614650565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061313c5761313c614650565b60200101906001600160f81b031916908160001a905350600061316084600261447c565b61316b906001614464565b90505b6001811115612006576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061319f5761319f614650565b1a60f81b8282815181106131b5576131b5614650565b60200101906001600160f81b031916908160001a90535060049490941c936131dc81614809565b905061316e565b80516060906000819003613207575050604080516020810190915260008152919050565b60006003613216836002614464565b61322091906144b1565b61322b90600461447c565b9050600061323a826020614464565b6001600160401b038111156132515761325161379c565b6040519080825280601f01601f19166020018201604052801561327b576020820181803683370190505b5090506000604051806060016040528060408152602001614d03604091399050600181016020830160005b86811015613307576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b8352600490920191016132a6565b50600386066001811461332157600281146133325761333e565b613d3d60f01b60011983015261333e565b603d60f81b6000198301525b505050918152949350505050565b61335682826113fa565b61083c5761336e816001600160a01b03166014611eba565b613379836020611eba565b60405160200161338a929190614aa0565b60408051601f198184030181529082905262461bcd60e51b82526107bc91600401613921565b604080516001808252818301909252606091600091906020808301908036833701905050905082816000815181106133ea576133ea614650565b602090810291909101015292915050565b6001600160a01b0384163b15612b265760405163f23a6e6160e01b81526001600160a01b0385169063f23a6e619061343f9089908990889088908890600401614b15565b6020604051808303816000875af192505050801561347a575060408051601f3d908101601f1916820190925261347791810190614b5a565b60015b61352657613486614b77565b806308c379a0036134bf575061349a614b93565b806134a557506134c1565b8060405162461bcd60e51b81526004016107bc9190613921565b505b60405162461bcd60e51b815260206004820152603460248201527f455243313135353a207472616e7366657220746f206e6f6e20455243313135356044820152732932b1b2b4bb32b91034b6b83632b6b2b73a32b960611b60648201526084016107bc565b6001600160e01b0319811663f23a6e6160e01b146122055760405162461bcd60e51b81526004016107bc90614c1c565b600054610100900460ff1661357d5760405162461bcd60e51b81526004016107bc906148af565b6120da816120dd565b600054610100900460ff166135ad5760405162461bcd60e51b81526004016107bc906148af565b600160cd55565b6000600080516020614d438339815191528214806135df5750600080516020614ce383398151915282145b8061360957507f852fd44a27d33057a8c3d90859d4e4c9f54309d4d66d1d968e063befba9198e682145b806136215750600080516020614d8383398151915282145b806107ea575050600080516020614cc38339815191521490565b6001600160a01b0384163b15612b265760405163bc197c8160e01b81526001600160a01b0385169063bc197c819061367f9089908990889088908890600401614c64565b6020604051808303816000875af19250505080156136ba575060408051601f3d908101601f191682019092526136b791810190614b5a565b60015b6136c657613486614b77565b6001600160e01b0319811663bc197c8160e01b146122055760405162461bcd60e51b81526004016107bc90614c1c565b50805460008255906000526020600020908101906120da91905b808211156137245760008155600101613710565b5090565b80356001600160a01b03811681146109f457600080fd5b6000806040838503121561375257600080fd5b61375b83613728565b946020939093013593505050565b6001600160e01b0319811681146120da57600080fd5b60006020828403121561379157600080fd5b813561145081613769565b634e487b7160e01b600052604160045260246000fd5b606081018181106001600160401b03821117156137d1576137d161379c565b60405250565b608081018181106001600160401b03821117156137d1576137d161379c565b601f8201601f191681016001600160401b038111828210171561381b5761381b61379c565b6040525050565b600082601f83011261383357600080fd5b81356001600160401b0381111561384c5761384c61379c565b604051613863601f8301601f1916602001826137f6565b81815284602083860101111561387857600080fd5b816020850160208301376000918101602001919091529392505050565b6000602082840312156138a757600080fd5b81356001600160401b038111156138bd57600080fd5b61308f84828501613822565b60005b838110156138e45781810151838201526020016138cc565b83811115610bff5750506000910152565b6000815180845261390d8160208601602086016138c9565b601f01601f19169290920160200192915050565b60208152600061145060208301846138f5565b60006020828403121561394657600080fd5b5035919050565b6000806000806080858703121561396357600080fd5b61396c85613728565b9350602085013592506040850135915060608501356001600160401b0381111561399557600080fd5b6139a187828801613822565b91505092959194509250565b6000806000606084860312156139c257600080fd5b6139cb84613728565b95602085013595506040909401359392505050565b803580151581146109f457600080fd5b600060a08284031215613a0257600080fd5b60405160a081016001600160401b038282108183111715613a2557613a2561379c565b816040528293508435915080821115613a3d57600080fd5b50613a4a85828601613822565b825250613a59602084016139e0565b6020820152613a6a604084016139e0565b604082015260608301356060820152613a8560808401613728565b60808201525092915050565b60006001600160401b03821115613aaa57613aaa61379c565b5060051b60200190565b600082601f830112613ac557600080fd5b81356020613ad282613a91565b604051613adf82826137f6565b83815260059390931b8501820192828101915086841115613aff57600080fd5b8286015b84811015613b2157613b1481613728565b8352918301918301613b03565b509695505050505050565b600082601f830112613b3d57600080fd5b81356020613b4a82613a91565b60408051613b5883826137f6565b84815260059490941b8601830193838101925087851115613b7857600080fd5b8387015b85811015613c0b5780356001600160401b0380821115613b9c5760008081fd5b908901906060828c03601f1901811315613bb65760008081fd5b8551613bc1816137b2565b8884013581528684013583811115613bd95760008081fd5b613be78e8b83880101613ab4565b8a83015250613bf78285016139e0565b818801528752505050928401928401613b7c565b50979650505050505050565b600080600060608486031215613c2c57600080fd5b83356001600160401b0380821115613c4357600080fd5b9085019060808288031215613c5757600080fd5b604051613c63816137d7565b823582811115613c7257600080fd5b613c7e89828601613822565b825250602083013582811115613c9357600080fd5b613c9f89828601613822565b602083015250613cb160408401613728565b6040820152613cc2606084016139e0565b606082015294506020860135915080821115613cdd57600080fd5b613ce9878388016139f0565b93506040860135915080821115613cff57600080fd5b50613d0c86828701613b2c565b9150509250925092565b60008060408385031215613d2957600080fd5b50508035926020909101359150565b600080600060608486031215613d4d57600080fd5b83356001600160401b0380821115613d6457600080fd5b9085019060a08288031215613d7857600080fd5b90935060208501359080821115613d8e57600080fd5b50613d9b86828701613b2c565b925050613daa604085016139e0565b90509250925092565b600082601f830112613dc457600080fd5b81356020613dd182613a91565b604051613dde82826137f6565b83815260059390931b8501820192828101915086841115613dfe57600080fd5b8286015b84811015613b215780358352918301918301613e02565b600080600080600060a08688031215613e3157600080fd5b613e3a86613728565b9450613e4860208701613728565b935060408601356001600160401b0380821115613e6457600080fd5b613e7089838a01613db3565b94506060880135915080821115613e8657600080fd5b613e9289838a01613db3565b93506080880135915080821115613ea857600080fd5b50613eb588828901613822565b9150509295509295909350565b60008060408385031215613ed557600080fd5b82359150613ee560208401613728565b90509250929050565b60008060408385031215613f0157600080fd5b82356001600160401b0380821115613f1857600080fd5b613f2486838701613ab4565b93506020850135915080821115613f3a57600080fd5b50613f4785828601613db3565b9150509250929050565b600081518084526020808501945080840160005b83811015613f8157815187529582019590820190600101613f65565b509495945050505050565b6020815260006114506020830184613f51565b600080600060608486031215613fb457600080fd5b83356001600160401b0380821115613fcb57600080fd5b613fd787838801613ab4565b94506020860135915080821115613fed57600080fd5b613ff987838801613db3565b9350604086013591508082111561400f57600080fd5b50613d0c86828701613db3565b6000806040838503121561402f57600080fd5b82356001600160401b038082111561404657600080fd5b613f2486838701613db3565b6000806040838503121561406557600080fd5b61406e83613728565b9150613ee5602084016139e0565b60008060006060848603121561409157600080fd5b8335925060208401356001600160401b038111156140ae57600080fd5b613d9b86828701613822565b600080604083850312156140cd57600080fd5b6140d683613728565b9150613ee560208401613728565b600080600080600060a086880312156140fc57600080fd5b61410586613728565b945061411360208701613728565b9350604086013592506060860135915060808601356001600160401b0381111561413c57600080fd5b613eb588828901613822565b60006020828403121561415a57600080fd5b61145082613728565b6000806000806080858703121561417957600080fd5b84356001600160401b038082111561419057600080fd5b61419c88838901613ab4565b95506020915081870135818111156141b357600080fd5b6141bf89828a01613db3565b9550506040870135818111156141d457600080fd5b6141e089828a01613db3565b9450506060870135818111156141f557600080fd5b8701601f8101891361420657600080fd5b803561421181613a91565b60405161421e82826137f6565b82815260059290921b830185019185810191508b83111561423e57600080fd5b8584015b838110156142765780358681111561425a5760008081fd5b6142688e8983890101613822565b845250918601918601614242565b50989b979a50959850505050505050565b600181811c9082168061429b57607f821691505b6020821081036142bb57634e487b7160e01b600052602260045260246000fd5b50919050565b600081546142ce81614287565b600182811680156142e657600181146142fb5761432a565b60ff198416875282151583028701945061432a565b8560005260208060002060005b858110156143215781548a820152908401908201614308565b50505082870194505b5050505092915050565b600061308f61434383866142c1565b846142c1565b601f821115610ffc57600081815260208120601f850160051c810160208610156143705750805b601f850160051c820191505b81811015612b265782815560010161437c565b81516001600160401b038111156143a8576143a861379c565b6143bc816143b68454614287565b84614349565b602080601f8311600181146143f157600084156143d95750858301515b600019600386901b1c1916600185901b178555612b26565b600085815260208120601f198616915b8281101561442057888601518255948401946001909101908401614401565b508582101561443e5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600082198211156144775761447761444e565b500190565b60008160001904831182151516156144965761449661444e565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826144c0576144c061449b565b500490565b600061145082846142c1565b6000808335601e198436030181126144e857600080fd5b8301803591506001600160401b0382111561450257600080fd5b602001915036819003821315610dfc57600080fd5b8183823760009101908152919050565b6001600160401b0383111561453e5761453e61379c565b6145528361454c8354614287565b83614349565b6000601f841160018114614586576000851561456e5750838201355b600019600387901b1c1916600186901b178355610fd0565b600083815260209020601f19861690835b828110156145b75786850135825560209485019460019092019101614597565b50868210156145d45760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b6000602082840312156145f857600080fd5b611450826139e0565b6020808252602f908201527f455243313135353a2063616c6c6572206973206e6f7420746f6b656e206f776e60408201526e195c881b9bdc88185c1c1c9bdd9959608a1b606082015260800190565b634e487b7160e01b600052603260045260246000fd5b6000600182016146785761467861444e565b5060010190565b6000828210156146915761469161444e565b500390565b600082516146a88184602087016138c9565b9190910192915050565b60006020808352600084546146c681614287565b808487015260406001808416600081146146e757600181146147015761472f565b60ff1985168984015283151560051b89018301955061472f565b896000528660002060005b858110156147275781548b820186015290830190880161470c565b8a0184019650505b509398975050505050505050565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a200000000081526000835161477581601c8501602088016138c9565b731610113332b2afb932b1b4b834b2b73a111d101160611b601c9184019182015283516147a98160308401602088016138c9565b61227d60f01b60309290910191820152603201949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c0000008152600082516147fc81601d8501602087016138c9565b91909101601d0192915050565b6000816148185761481861444e565b506000190190565b60208082526025908201527f455243313135353a207472616e7366657220746f20746865207a65726f206164604082015264647265737360d81b606082015260800190565b6020808252602a908201527f455243313135353a20696e73756666696369656e742062616c616e636520666f60408201526939103a3930b739b332b960b11b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b7f4772616e756c6172526f6c65733a20696e76616c696420726f6c65200000000081526000825161493281601c8501602087016138c9565b91909101601c0192915050565b73023b930b73ab630b92937b632b99d103937b632960651b81526000825161496e8160148501602087016138c9565b691034b990333937bd32b760b11b6014939091019283015250601e01919050565b60208082526028908201527f455243313135353a2069647320616e6420616d6f756e7473206c656e677468206040820152670dad2e6dac2e8c6d60c31b606082015260800190565b6040815260006149ea6040830185613f51565b82810360208401526149fc8185613f51565b95945050505050565b60208082526023908201527f455243313135353a206275726e2066726f6d20746865207a65726f206164647260408201526265737360e81b606082015260800190565b60208082526024908201527f455243313135353a206275726e20616d6f756e7420657863656564732062616c604082015263616e636560e01b606082015260800190565b600082614a9b57614a9b61449b565b500690565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614ad88160178501602088016138c9565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614b098160288401602088016138c9565b01602801949350505050565b6001600160a01b03868116825285166020820152604081018490526060810183905260a060808201819052600090614b4f908301846138f5565b979650505050505050565b600060208284031215614b6c57600080fd5b815161145081613769565b600060033d1115614b905760046000803e5060005160e01c5b90565b600060443d1015614ba15790565b6040516003193d81016004833e81513d6001600160401b038160248401118184111715614bd057505050505090565b8285019150815181811115614be85750505050505090565b843d8701016020828501011115614c025750505050505090565b614c11602082860101876137f6565b509095945050505050565b60208082526028908201527f455243313135353a204552433131353552656365697665722072656a656374656040820152676420746f6b656e7360c01b606082015260800190565b6001600160a01b0386811682528516602082015260a060408201819052600090614c9090830186613f51565b8281036060840152614ca28186613f51565b90508281036080840152614cb681856138f5565b9897505050505050505056fe8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c9b16859c0d694afa65b1b6551542db11ea12d6208b6a17dc922f10f2d74440f54142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2f154c00819833dac601ee5ddded6fda79d9d8b506b911b3dbd54cdb95fe6c3686a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775e97b137254058bd94f28d2f3eb79e2d34074ffb488d042e3bc958e0a57d2fa22a264697066735822122043d512217255bcebb0e1db488835b9314a498aa33849668034565649d75aac7a64736f6c634300080f0033", + "devdoc": { + "kind": "dev", + "methods": { + "balanceOf(address,uint256)": { + "details": "See {IERC1155-balanceOf}. Requirements: - `account` cannot be the zero address." + }, + "balanceOfBatch(address[],uint256[])": { + "details": "See {IERC1155-balanceOfBatch}. Requirements: - `accounts` and `ids` must have the same length." + }, + "contractURI()": { + "details": "OpenSea contract metadata, returns a base64 encoded JSON string containing royalties basis points and royalties address" + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "grantRole(bytes32,address)": { + "details": "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." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "isApprovedForAll(address,address)": { + "details": "See {IERC1155-isApprovedForAll}." + }, + "renounceRole(bytes32,address)": { + "details": "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." + }, + "revokeRole(bytes32,address)": { + "details": "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." + }, + "safeBatchTransferFrom(address,address,uint256[],uint256[],bytes)": { + "details": "See {IERC1155-safeBatchTransferFrom}." + }, + "safeTransferFrom(address,address,uint256,uint256,bytes)": { + "details": "See {IERC1155-safeTransferFrom}." + }, + "setApprovalForAll(address,bool)": { + "details": "See {IERC1155-setApprovalForAll}." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 419, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 422, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 3527, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 3797, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 651, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "_balances", + "offset": 0, + "slot": "101", + "type": "t_mapping(t_uint256,t_mapping(t_address,t_uint256))" + }, + { + "astId": 657, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "_operatorApprovals", + "offset": 0, + "slot": "102", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" + }, + { + "astId": 659, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "_uri", + "offset": 0, + "slot": "103", + "type": "t_string_storage" + }, + { + "astId": 1866, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "__gap", + "offset": 0, + "slot": "104", + "type": "t_array(t_uint256)47_storage" + }, + { + "astId": 39, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "_roles", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_bytes32,t_struct(RoleData)34_storage)" + }, + { + "astId": 338, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 6742, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "_owner", + "offset": 0, + "slot": "201", + "type": "t_address" + }, + { + "astId": 6744, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "_nftPort", + "offset": 0, + "slot": "202", + "type": "t_address" + }, + { + "astId": 6749, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "_rolesAddressesIndexed", + "offset": 0, + "slot": "203", + "type": "t_mapping(t_bytes32,t_array(t_address)dyn_storage)" + }, + { + "astId": 6753, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "_rolesFrozen", + "offset": 0, + "slot": "204", + "type": "t_mapping(t_bytes32,t_bool)" + }, + { + "astId": 577, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "_status", + "offset": 0, + "slot": "205", + "type": "t_uint256" + }, + { + "astId": 621, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "__gap", + "offset": 0, + "slot": "206", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 7328, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "metadataUpdatable", + "offset": 0, + "slot": "255", + "type": "t_bool" + }, + { + "astId": 7330, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "tokensBurnable", + "offset": 1, + "slot": "255", + "type": "t_bool" + }, + { + "astId": 7332, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "tokensTransferable", + "offset": 2, + "slot": "255", + "type": "t_bool" + }, + { + "astId": 7334, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "name", + "offset": 0, + "slot": "256", + "type": "t_string_storage" + }, + { + "astId": 7336, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "symbol", + "offset": 0, + "slot": "257", + "type": "t_string_storage" + }, + { + "astId": 7338, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "baseURI", + "offset": 0, + "slot": "258", + "type": "t_string_storage" + }, + { + "astId": 7340, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "royaltiesAddress", + "offset": 0, + "slot": "259", + "type": "t_address" + }, + { + "astId": 7342, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "royaltiesBasisPoints", + "offset": 0, + "slot": "260", + "type": "t_uint256" + }, + { + "astId": 7346, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "freezeTokenUris", + "offset": 0, + "slot": "261", + "type": "t_mapping(t_uint256,t_bool)" + }, + { + "astId": 7350, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "tokenSupply", + "offset": 0, + "slot": "262", + "type": "t_mapping(t_uint256,t_uint256)" + }, + { + "astId": 8151, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "_tokenURIs", + "offset": 0, + "slot": "263", + "type": "t_mapping(t_uint256,t_string_storage)" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "base": "t_address", + "encoding": "dynamic_array", + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)47_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[47]", + "numberOfBytes": "1504" + }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_bool)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_bytes32,t_array(t_address)dyn_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => address[])", + "numberOfBytes": "32", + "value": "t_array(t_address)dyn_storage" + }, + "t_mapping(t_bytes32,t_bool)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_bytes32,t_struct(RoleData)34_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32", + "value": "t_struct(RoleData)34_storage" + }, + "t_mapping(t_uint256,t_bool)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_uint256,t_mapping(t_address,t_uint256))": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => mapping(address => uint256))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_uint256)" + }, + "t_mapping(t_uint256,t_string_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => string)", + "numberOfBytes": "32", + "value": "t_string_storage" + }, + "t_mapping(t_uint256,t_uint256)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(RoleData)34_storage": { + "encoding": "inplace", + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "astId": 31, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "members", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 33, + "contract": "contracts/standalone/ERC1155NFTProductContract.sol:ERC1155NFTProductContract", + "label": "adminRole", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/deployments/polygon/ERC721NFTProductContract.json b/deployments/polygon/ERC721NFTProductContract.json new file mode 100644 index 0000000..935d773 --- /dev/null +++ b/deployments/polygon/ERC721NFTProductContract.json @@ -0,0 +1,1725 @@ +{ + "address": "0xecC5710806Fa406849C8A29c0906f5B61F8f6aA6", + "abi": [ + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bool", + "name": "tokensBurnable", + "type": "bool" + } + ], + "internalType": "struct Config.Deployment", + "name": "deploymentConfig", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "string", + "name": "baseURI", + "type": "string" + }, + { + "internalType": "bool", + "name": "metadataUpdatable", + "type": "bool" + }, + { + "internalType": "bool", + "name": "tokensTransferable", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "royaltiesBps", + "type": "uint256" + }, + { + "internalType": "address", + "name": "royaltiesAddress", + "type": "address" + } + ], + "internalType": "struct Config.Runtime", + "name": "runtimeConfig", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "addresses", + "type": "address[]" + }, + { + "internalType": "bool", + "name": "frozen", + "type": "bool" + } + ], + "internalType": "struct GranularRoles.RolesAddresses[]", + "name": "rolesAddresses", + "type": "tuple[]" + } + ], + "stateMutability": "nonpayable", + "type": "constructor" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "approved", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Approval", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "indexed": false, + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "ApprovalForAll", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "previousOwner", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "OwnershipTransferred", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "string", + "name": "_value", + "type": "string" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "_id", + "type": "uint256" + } + ], + "name": "PermanentURI", + "type": "event" + }, + { + "anonymous": false, + "inputs": [], + "name": "PermanentURIGlobal", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "previousAdminRole", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "bytes32", + "name": "newAdminRole", + "type": "bytes32" + } + ], + "name": "RoleAdminChanged", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleGranted", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "indexed": true, + "internalType": "address", + "name": "account", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "sender", + "type": "address" + } + ], + "name": "RoleRevoked", + "type": "event" + }, + { + "anonymous": false, + "inputs": [ + { + "indexed": true, + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "indexed": true, + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "indexed": true, + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "Transfer", + "type": "event" + }, + { + "inputs": [], + "name": "ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "BURN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "DEFAULT_ADMIN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "MINT_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "NAME", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ROYALTIES_BASIS", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "TRANSFER_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UPDATE_CONTRACT_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "UPDATE_TOKEN_ROLE", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "VERSION", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "approve", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "baseURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + } + ], + "name": "burn", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "contractURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "name": "freezeTokenUris", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "getApproved", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + } + ], + "name": "getRoleAdmin", + "outputs": [ + { + "internalType": "bytes32", + "name": "", + "type": "bytes32" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "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": [ + { + "components": [ + { + "internalType": "string", + "name": "name", + "type": "string" + }, + { + "internalType": "string", + "name": "symbol", + "type": "string" + }, + { + "internalType": "address", + "name": "owner", + "type": "address" + }, + { + "internalType": "bool", + "name": "tokensBurnable", + "type": "bool" + } + ], + "internalType": "struct Config.Deployment", + "name": "deploymentConfig", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "string", + "name": "baseURI", + "type": "string" + }, + { + "internalType": "bool", + "name": "metadataUpdatable", + "type": "bool" + }, + { + "internalType": "bool", + "name": "tokensTransferable", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "royaltiesBps", + "type": "uint256" + }, + { + "internalType": "address", + "name": "royaltiesAddress", + "type": "address" + } + ], + "internalType": "struct Config.Runtime", + "name": "runtimeConfig", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "addresses", + "type": "address[]" + }, + { + "internalType": "bool", + "name": "frozen", + "type": "bool" + } + ], + "internalType": "struct GranularRoles.RolesAddresses[]", + "name": "rolesAddresses", + "type": "tuple[]" + } + ], + "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": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "metadataUpdatable", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "caller", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "tokenURI", + "type": "string" + } + ], + "name": "mintToCaller", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "name", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "owner", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "ownerOf", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" + } + ], + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [], + "name": "revokeNFTPortPermissions", + "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": [], + "name": "royaltiesAddress", + "outputs": [ + { + "internalType": "address", + "name": "", + "type": "address" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "royaltiesBasisPoints", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "", + "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": "tokenId", + "type": "uint256" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + }, + { + "internalType": "bytes", + "name": "data", + "type": "bytes" + } + ], + "name": "safeTransferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "operator", + "type": "address" + }, + { + "internalType": "bool", + "name": "approved", + "type": "bool" + } + ], + "name": "setApprovalForAll", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "bytes4", + "name": "interfaceId", + "type": "bytes4" + } + ], + "name": "supportsInterface", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "symbol", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "tokenURI", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "tokensBurnable", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "tokensTransferable", + "outputs": [ + { + "internalType": "bool", + "name": "", + "type": "bool" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "totalSupply", + "outputs": [ + { + "internalType": "uint256", + "name": "", + "type": "uint256" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "_to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + } + ], + "name": "transferByOwner", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "from", + "type": "address" + }, + { + "internalType": "address", + "name": "to", + "type": "address" + }, + { + "internalType": "uint256", + "name": "tokenId", + "type": "uint256" + } + ], + "name": "transferFrom", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "address", + "name": "newOwner", + "type": "address" + } + ], + "name": "transferOwnership", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "components": [ + { + "internalType": "string", + "name": "baseURI", + "type": "string" + }, + { + "internalType": "bool", + "name": "metadataUpdatable", + "type": "bool" + }, + { + "internalType": "bool", + "name": "tokensTransferable", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "royaltiesBps", + "type": "uint256" + }, + { + "internalType": "address", + "name": "royaltiesAddress", + "type": "address" + } + ], + "internalType": "struct Config.Runtime", + "name": "newConfig", + "type": "tuple" + }, + { + "components": [ + { + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address[]", + "name": "addresses", + "type": "address[]" + }, + { + "internalType": "bool", + "name": "frozen", + "type": "bool" + } + ], + "internalType": "struct GranularRoles.RolesAddresses[]", + "name": "rolesAddresses", + "type": "tuple[]" + }, + { + "internalType": "bool", + "name": "isRevokeNFTPortPermissions", + "type": "bool" + } + ], + "name": "update", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + }, + { + "inputs": [ + { + "internalType": "uint256", + "name": "_tokenId", + "type": "uint256" + }, + { + "internalType": "string", + "name": "_tokenUri", + "type": "string" + }, + { + "internalType": "bool", + "name": "_isFreezeTokenUri", + "type": "bool" + } + ], + "name": "updateTokenUri", + "outputs": [], + "stateMutability": "nonpayable", + "type": "function" + } + ], + "transactionHash": "0x43632b01af4de5dc04c6f31601a4a7097296c2d165f0835aedef2d0ae828fc0e", + "receipt": { + "to": null, + "from": "0xd39Ec8F40acF251c092CE64A9db5EA428abC7E72", + "contractAddress": "0xecC5710806Fa406849C8A29c0906f5B61F8f6aA6", + "transactionIndex": 51, + "gasUsed": "3755764", + "logsBloom": "0x00000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000000000000000000000000000000800000000000000000400104000000000000000000000000000000080000000000000000000000000080000000000000000000000000000000000000000000000000000000000080000000000000000004200000000000000000000000000400000000000000000000000000000000004000000000000000000001000000040000080000000000010000100000000000000000000000000000000000000000000000000000000004000000000004100020", + "blockHash": "0x97a6368daae13ad4dd18fd84fcff1fd87bb829de4e72fe63651353163880b4d8", + "transactionHash": "0x43632b01af4de5dc04c6f31601a4a7097296c2d165f0835aedef2d0ae828fc0e", + "logs": [ + { + "transactionIndex": 51, + "blockNumber": 37903838, + "transactionHash": "0x43632b01af4de5dc04c6f31601a4a7097296c2d165f0835aedef2d0ae828fc0e", + "address": "0xecC5710806Fa406849C8A29c0906f5B61F8f6aA6", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 168, + "blockHash": "0x97a6368daae13ad4dd18fd84fcff1fd87bb829de4e72fe63651353163880b4d8" + }, + { + "transactionIndex": 51, + "blockNumber": 37903838, + "transactionHash": "0x43632b01af4de5dc04c6f31601a4a7097296c2d165f0835aedef2d0ae828fc0e", + "address": "0xecC5710806Fa406849C8A29c0906f5B61F8f6aA6", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 169, + "blockHash": "0x97a6368daae13ad4dd18fd84fcff1fd87bb829de4e72fe63651353163880b4d8" + }, + { + "transactionIndex": 51, + "blockNumber": 37903838, + "transactionHash": "0x43632b01af4de5dc04c6f31601a4a7097296c2d165f0835aedef2d0ae828fc0e", + "address": "0x0000000000000000000000000000000000001010", + "topics": [ + "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", + "0x0000000000000000000000000000000000000000000000000000000000001010", + "0x000000000000000000000000d39ec8f40acf251c092ce64a9db5ea428abc7e72", + "0x000000000000000000000000127685d6dd6683085da4b6a041efcef1681e5c9c" + ], + "data": "0x000000000000000000000000000000000000000000000000022d19a1d77a588800000000000000000000000000000000000000000000000026bbd1e20c825ada0000000000000000000000000000000000000000000008d8229852ade3daec33000000000000000000000000000000000000000000000000248eb840350802520000000000000000000000000000000000000000000008d824c56c4fbb5544bb", + "logIndex": 170, + "blockHash": "0x97a6368daae13ad4dd18fd84fcff1fd87bb829de4e72fe63651353163880b4d8" + } + ], + "blockNumber": 37903838, + "cumulativeGasUsed": "13030380", + "status": 1, + "byzantium": true + }, + "args": [ + { + "name": "NFTPort", + "symbol": "NFT", + "owner": "0xd39Ec8F40acF251c092CE64A9db5EA428abC7E72", + "tokensBurnable": true + }, + { + "baseURI": "ipfs://baseURI", + "metadataUpdatable": true, + "tokensTransferable": true, + "royaltiesBps": 250, + "royaltiesAddress": "0xd39Ec8F40acF251c092CE64A9db5EA428abC7E72" + }, + [] + ], + "numDeployments": 1, + "solcInputHash": "1e300b8e19558e2a4c02af65df638f3f", + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"tokensBurnable\",\"type\":\"bool\"}],\"internalType\":\"struct Config.Deployment\",\"name\":\"deploymentConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"metadataUpdatable\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"tokensTransferable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"royaltiesBps\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"royaltiesAddress\",\"type\":\"address\"}],\"internalType\":\"struct Config.Runtime\",\"name\":\"runtimeConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"frozen\",\"type\":\"bool\"}],\"internalType\":\"struct GranularRoles.RolesAddresses[]\",\"name\":\"rolesAddresses\",\"type\":\"tuple[]\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"string\",\"name\":\"_value\",\"type\":\"string\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"_id\",\"type\":\"uint256\"}],\"name\":\"PermanentURI\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[],\"name\":\"PermanentURIGlobal\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"BURN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"MINT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NAME\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTIES_BASIS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"TRANSFER_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPDATE_CONTRACT_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"UPDATE_TOKEN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"burn\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"contractURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"name\":\"freezeTokenUris\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"}],\"name\":\"getRoleAdmin\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"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\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"tokensBurnable\",\"type\":\"bool\"}],\"internalType\":\"struct Config.Deployment\",\"name\":\"deploymentConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"metadataUpdatable\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"tokensTransferable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"royaltiesBps\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"royaltiesAddress\",\"type\":\"address\"}],\"internalType\":\"struct Config.Runtime\",\"name\":\"runtimeConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"frozen\",\"type\":\"bool\"}],\"internalType\":\"struct GranularRoles.RolesAddresses[]\",\"name\":\"rolesAddresses\",\"type\":\"tuple[]\"}],\"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\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataUpdatable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"caller\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"tokenURI\",\"type\":\"string\"}],\"name\":\"mintToCaller\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"revokeNFTPortPermissions\",\"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\":[],\"name\":\"royaltiesAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"royaltiesBasisPoints\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"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\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokensBurnable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokensTransferable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"_to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"}],\"name\":\"transferByOwner\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"metadataUpdatable\",\"type\":\"bool\"},{\"internalType\":\"bool\",\"name\":\"tokensTransferable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"royaltiesBps\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"royaltiesAddress\",\"type\":\"address\"}],\"internalType\":\"struct Config.Runtime\",\"name\":\"newConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address[]\",\"name\":\"addresses\",\"type\":\"address[]\"},{\"internalType\":\"bool\",\"name\":\"frozen\",\"type\":\"bool\"}],\"internalType\":\"struct GranularRoles.RolesAddresses[]\",\"name\":\"rolesAddresses\",\"type\":\"tuple[]\"},{\"internalType\":\"bool\",\"name\":\"isRevokeNFTPortPermissions\",\"type\":\"bool\"}],\"name\":\"update\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"_tokenId\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"_tokenUri\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"_isFreezeTokenUri\",\"type\":\"bool\"}],\"name\":\"updateTokenUri\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"contractURI()\":{\"details\":\"OpenSea contract metadata, returns a base64 encoded JSON string containing royalties basis points and royalties address\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"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.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"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.\"},\"revokeRole(bytes32,address)\":{\"details\":\"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.\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"tokenURI(uint256)\":{\"details\":\"See {IERC721Metadata-tokenURI}.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/standalone/ERC721NFTProductContract.sol\":\"ERC721NFTProductContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlUpgradeable.sol\\\";\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../utils/StringsUpgradeable.sol\\\";\\nimport \\\"../utils/introspection/ERC165Upgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable {\\n function __AccessControl_init() internal onlyInitializing {\\n }\\n\\n function __AccessControl_init_unchained() internal onlyInitializing {\\n }\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n StringsUpgradeable.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n StringsUpgradeable.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x2ea9f206854c98b67dd228f8cad22bfe90ba7b1c2295315672f2e1e244623fc3\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControlUpgradeable {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0xb8f5302f12138c5561362e88a78d061573e6298b7a1a5afe84a1e2c8d4d5aeaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n * initialization step. This is essential to configure modules that are added through upgrades and that require\\n * initialization.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal onlyInitializing {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x8cc03c5ac17e8a7396e487cda41fc1f1dfdb91db7d528e6da84bee3b6dd7e167\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/ERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/ERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC721Upgradeable.sol\\\";\\nimport \\\"./IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"./extensions/IERC721MetadataUpgradeable.sol\\\";\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\nimport \\\"../../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../../utils/StringsUpgradeable.sol\\\";\\nimport \\\"../../utils/introspection/ERC165Upgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\n * {ERC721Enumerable}.\\n */\\ncontract ERC721Upgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable {\\n using AddressUpgradeable for address;\\n using StringsUpgradeable for uint256;\\n\\n // Token name\\n string private _name;\\n\\n // Token symbol\\n string private _symbol;\\n\\n // Mapping from token ID to owner address\\n mapping(uint256 => address) private _owners;\\n\\n // Mapping owner address to token count\\n mapping(address => uint256) private _balances;\\n\\n // Mapping from token ID to approved address\\n mapping(uint256 => address) private _tokenApprovals;\\n\\n // Mapping from owner to operator approvals\\n mapping(address => mapping(address => bool)) private _operatorApprovals;\\n\\n /**\\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n */\\n function __ERC721_init(string memory name_, string memory symbol_) internal onlyInitializing {\\n __ERC721_init_unchained(name_, symbol_);\\n }\\n\\n function __ERC721_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {\\n return\\n interfaceId == type(IERC721Upgradeable).interfaceId ||\\n interfaceId == type(IERC721MetadataUpgradeable).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721-balanceOf}.\\n */\\n function balanceOf(address owner) public view virtual override returns (uint256) {\\n require(owner != address(0), \\\"ERC721: address zero is not a valid owner\\\");\\n return _balances[owner];\\n }\\n\\n /**\\n * @dev See {IERC721-ownerOf}.\\n */\\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\n address owner = _owners[tokenId];\\n require(owner != address(0), \\\"ERC721: invalid token ID\\\");\\n return owner;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-symbol}.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n _requireMinted(tokenId);\\n\\n string memory baseURI = _baseURI();\\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \\\"\\\";\\n }\\n\\n /**\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\n * by default, can be overridden in child contracts.\\n */\\n function _baseURI() internal view virtual returns (string memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IERC721-approve}.\\n */\\n function approve(address to, uint256 tokenId) public virtual override {\\n address owner = ERC721Upgradeable.ownerOf(tokenId);\\n require(to != owner, \\\"ERC721: approval to current owner\\\");\\n\\n require(\\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\\n \\\"ERC721: approve caller is not token owner nor approved for all\\\"\\n );\\n\\n _approve(to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-getApproved}.\\n */\\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\\n _requireMinted(tokenId);\\n\\n return _tokenApprovals[tokenId];\\n }\\n\\n /**\\n * @dev See {IERC721-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual override {\\n _setApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC721-isApprovedForAll}.\\n */\\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\n return _operatorApprovals[owner][operator];\\n }\\n\\n /**\\n * @dev See {IERC721-transferFrom}.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) public virtual override {\\n //solhint-disable-next-line max-line-length\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner nor approved\\\");\\n\\n _transfer(from, to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) public virtual override {\\n safeTransferFrom(from, to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) public virtual override {\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: caller is not token owner nor approved\\\");\\n _safeTransfer(from, to, tokenId, data);\\n }\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * `data` is additional data, it has no specified format and it is sent in call to `to`.\\n *\\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\n * implement alternative mechanisms to perform token transfer, such as signature-based.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeTransfer(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) internal virtual {\\n _transfer(from, to, tokenId);\\n require(_checkOnERC721Received(from, to, tokenId, data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n }\\n\\n /**\\n * @dev Returns whether `tokenId` exists.\\n *\\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\n *\\n * Tokens start existing when they are minted (`_mint`),\\n * and stop existing when they are burned (`_burn`).\\n */\\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\\n return _owners[tokenId] != address(0);\\n }\\n\\n /**\\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\n address owner = ERC721Upgradeable.ownerOf(tokenId);\\n return (spender == owner || isApprovedForAll(owner, spender) || getApproved(tokenId) == spender);\\n }\\n\\n /**\\n * @dev Safely mints `tokenId` and transfers it to `to`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeMint(address to, uint256 tokenId) internal virtual {\\n _safeMint(to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n */\\n function _safeMint(\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) internal virtual {\\n _mint(to, tokenId);\\n require(\\n _checkOnERC721Received(address(0), to, tokenId, data),\\n \\\"ERC721: transfer to non ERC721Receiver implementer\\\"\\n );\\n }\\n\\n /**\\n * @dev Mints `tokenId` and transfers it to `to`.\\n *\\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - `to` cannot be the zero address.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _mint(address to, uint256 tokenId) internal virtual {\\n require(to != address(0), \\\"ERC721: mint to the zero address\\\");\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n _beforeTokenTransfer(address(0), to, tokenId);\\n\\n _balances[to] += 1;\\n _owners[tokenId] = to;\\n\\n emit Transfer(address(0), to, tokenId);\\n\\n _afterTokenTransfer(address(0), to, tokenId);\\n }\\n\\n /**\\n * @dev Destroys `tokenId`.\\n * The approval is cleared when the token is burned.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _burn(uint256 tokenId) internal virtual {\\n address owner = ERC721Upgradeable.ownerOf(tokenId);\\n\\n _beforeTokenTransfer(owner, address(0), tokenId);\\n\\n // Clear approvals\\n _approve(address(0), tokenId);\\n\\n _balances[owner] -= 1;\\n delete _owners[tokenId];\\n\\n emit Transfer(owner, address(0), tokenId);\\n\\n _afterTokenTransfer(owner, address(0), tokenId);\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from `from` to `to`.\\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 tokenId\\n ) internal virtual {\\n require(ERC721Upgradeable.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n require(to != address(0), \\\"ERC721: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, tokenId);\\n\\n // Clear approvals from the previous owner\\n _approve(address(0), tokenId);\\n\\n _balances[from] -= 1;\\n _balances[to] += 1;\\n _owners[tokenId] = to;\\n\\n emit Transfer(from, to, tokenId);\\n\\n _afterTokenTransfer(from, to, tokenId);\\n }\\n\\n /**\\n * @dev Approve `to` to operate on `tokenId`\\n *\\n * Emits an {Approval} event.\\n */\\n function _approve(address to, uint256 tokenId) internal virtual {\\n _tokenApprovals[tokenId] = to;\\n emit Approval(ERC721Upgradeable.ownerOf(tokenId), to, tokenId);\\n }\\n\\n /**\\n * @dev Approve `operator` to operate on all of `owner` tokens\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function _setApprovalForAll(\\n address owner,\\n address operator,\\n bool approved\\n ) internal virtual {\\n require(owner != operator, \\\"ERC721: approve to caller\\\");\\n _operatorApprovals[owner][operator] = approved;\\n emit ApprovalForAll(owner, operator, approved);\\n }\\n\\n /**\\n * @dev Reverts if the `tokenId` has not been minted yet.\\n */\\n function _requireMinted(uint256 tokenId) internal view virtual {\\n require(_exists(tokenId), \\\"ERC721: invalid token ID\\\");\\n }\\n\\n /**\\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\n * The call is not executed if the target address is not a contract.\\n *\\n * @param from address representing the previous owner of the given token ID\\n * @param to target address that will receive the tokens\\n * @param tokenId uint256 ID of the token to be transferred\\n * @param data bytes optional data to send along with the call\\n * @return bool whether the call correctly returned the expected magic value\\n */\\n function _checkOnERC721Received(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory data\\n ) private returns (bool) {\\n if (to.isContract()) {\\n try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, data) returns (bytes4 retval) {\\n return retval == IERC721ReceiverUpgradeable.onERC721Received.selector;\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n revert(\\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n } else {\\n /// @solidity memory-safe-assembly\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n } else {\\n return true;\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any token transfer. This includes minting\\n * and burning.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be\\n * transferred to `to`.\\n * - When `from` is zero, `tokenId` will be minted for `to`.\\n * - When `to` is zero, ``from``'s `tokenId` will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 tokenId\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 tokenId\\n ) internal virtual {}\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[44] private __gap;\\n}\\n\",\"keccak256\":\"0x5331c8909221d9f9f3851cfadd5959d0873413a2c27e30e0f2fa234158c1c6cf\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes calldata data\\n ) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool _approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x016298e66a5810253c6c905e61966bb31c8775c3f3517bf946ff56ee31d6c005\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/extensions/ERC721URIStorage.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../ERC721Upgradeable.sol\\\";\\nimport \\\"../../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev ERC721 token with storage based token URI management.\\n */\\nabstract contract ERC721URIStorageUpgradeable is Initializable, ERC721Upgradeable {\\n function __ERC721URIStorage_init() internal onlyInitializing {\\n }\\n\\n function __ERC721URIStorage_init_unchained() internal onlyInitializing {\\n }\\n using StringsUpgradeable for uint256;\\n\\n // Optional mapping for token URIs\\n mapping(uint256 => string) private _tokenURIs;\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n _requireMinted(tokenId);\\n\\n string memory _tokenURI = _tokenURIs[tokenId];\\n string memory base = _baseURI();\\n\\n // If there is no base URI, return the token URI.\\n if (bytes(base).length == 0) {\\n return _tokenURI;\\n }\\n // If both are set, concatenate the baseURI and tokenURI (via abi.encodePacked).\\n if (bytes(_tokenURI).length > 0) {\\n return string(abi.encodePacked(base, _tokenURI));\\n }\\n\\n return super.tokenURI(tokenId);\\n }\\n\\n /**\\n * @dev Sets `_tokenURI` as the tokenURI of `tokenId`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function _setTokenURI(uint256 tokenId, string memory _tokenURI) internal virtual {\\n require(_exists(tokenId), \\\"ERC721URIStorage: URI set of nonexistent token\\\");\\n _tokenURIs[tokenId] = _tokenURI;\\n }\\n\\n /**\\n * @dev See {ERC721-_burn}. This override additionally checks to see if a\\n * token-specific URI was set for the token, and if so, it deletes the token URI from\\n * the storage mapping.\\n */\\n function _burn(uint256 tokenId) internal virtual override {\\n super._burn(tokenId);\\n\\n if (bytes(_tokenURIs[tokenId]).length != 0) {\\n delete _tokenURIs[tokenId];\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0xbd5c6f8268a1d477f6a746ebedaf7fbcf412186f0c1c54ee104547cfb5e18edd\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC721Upgradeable.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721MetadataUpgradeable is IERC721Upgradeable {\\n /**\\n * @dev Returns the token collection name.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the token collection symbol.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n */\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary StringsUpgradeable {\\n bytes16 private constant _HEX_SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n // Inspired by OraclizeAPI's implementation - MIT licence\\n // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n if (value == 0) {\\n return \\\"0\\\";\\n }\\n uint256 temp = value;\\n uint256 digits;\\n while (temp != 0) {\\n digits++;\\n temp /= 10;\\n }\\n bytes memory buffer = new bytes(digits);\\n while (value != 0) {\\n digits -= 1;\\n buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\\n value /= 10;\\n }\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n if (value == 0) {\\n return \\\"0x00\\\";\\n }\\n uint256 temp = value;\\n uint256 length = 0;\\n while (temp != 0) {\\n length++;\\n temp >>= 8;\\n }\\n return toHexString(value, length);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _HEX_SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xea5339a7fff0ed42b45be56a88efdd0b2ddde9fa480dc99fef9a6a4c5b776863\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165Upgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\\n function __ERC165_init() internal onlyInitializing {\\n }\\n\\n function __ERC165_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165Upgradeable).interfaceId;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Interface for the NFT Royalty Standard.\\n *\\n * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal\\n * support for royalty payments across all NFT marketplaces and ecosystem participants.\\n *\\n * _Available since v4.5._\\n */\\ninterface IERC2981 is IERC165 {\\n /**\\n * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of\\n * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\\n */\\n function royaltyInfo(uint256 tokenId, uint256 salePrice)\\n external\\n view\\n returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0xa812eed728198acd2c30d06950a5bea8d68436e4f694dd892273266ec2f79f5b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/common/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC2981.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.\\n *\\n * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for\\n * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.\\n *\\n * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the\\n * fee is specified in basis points by default.\\n *\\n * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See\\n * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to\\n * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.\\n *\\n * _Available since v4.5._\\n */\\nabstract contract ERC2981 is IERC2981, ERC165 {\\n struct RoyaltyInfo {\\n address receiver;\\n uint96 royaltyFraction;\\n }\\n\\n RoyaltyInfo private _defaultRoyaltyInfo;\\n mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @inheritdoc IERC2981\\n */\\n function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {\\n RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];\\n\\n if (royalty.receiver == address(0)) {\\n royalty = _defaultRoyaltyInfo;\\n }\\n\\n uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();\\n\\n return (royalty.receiver, royaltyAmount);\\n }\\n\\n /**\\n * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a\\n * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an\\n * override.\\n */\\n function _feeDenominator() internal pure virtual returns (uint96) {\\n return 10000;\\n }\\n\\n /**\\n * @dev Sets the royalty information that all ids in this contract will default to.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: invalid receiver\\\");\\n\\n _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Removes default royalty information.\\n */\\n function _deleteDefaultRoyalty() internal virtual {\\n delete _defaultRoyaltyInfo;\\n }\\n\\n /**\\n * @dev Sets the royalty information for a specific token id, overriding the global default.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setTokenRoyalty(\\n uint256 tokenId,\\n address receiver,\\n uint96 feeNumerator\\n ) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: Invalid parameters\\\");\\n\\n _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Resets royalty information for the token id back to the global default.\\n */\\n function _resetTokenRoyalty(uint256 tokenId) internal virtual {\\n delete _tokenRoyaltyInfo[tokenId];\\n }\\n}\\n\",\"keccak256\":\"0x9bc4d7eb03c4e87fd5122e03cdff5f60fa360d76925980ad022b2c6fac9876f3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/lib/Base64.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.14;\\n\\n/// @title Base64\\n/// @notice Provides a function for encoding some bytes in base64\\n/// @author Brecht Devos \\nlibrary Base64 {\\n bytes internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\\\";\\n\\n /// @notice Encodes some bytes to the base64 representation\\n function encode(bytes memory data) internal pure returns (string memory) {\\n uint256 len = data.length;\\n if (len == 0) return \\\"\\\";\\n\\n // multiply by 4/3 rounded up\\n uint256 encodedLen = 4 * ((len + 2) / 3);\\n\\n // Add some extra buffer at the end\\n bytes memory result = new bytes(encodedLen + 32);\\n\\n bytes memory table = _TABLE;\\n\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let i := 0\\n } lt(i, len) {\\n // solhint-disable-previous-line no-empty-blocks\\n } {\\n i := add(i, 3)\\n let input := and(mload(add(data, i)), 0xffffff)\\n\\n let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n out := shl(8, out)\\n out := add(\\n out,\\n and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)\\n )\\n out := shl(8, out)\\n out := add(\\n out,\\n and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)\\n )\\n out := shl(8, out)\\n out := add(\\n out,\\n and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)\\n )\\n out := shl(224, out)\\n\\n mstore(resultPtr, out)\\n\\n resultPtr := add(resultPtr, 4)\\n }\\n\\n switch mod(len, 3)\\n case 1 {\\n mstore(sub(resultPtr, 2), shl(240, 0x3d3d))\\n }\\n case 2 {\\n mstore(sub(resultPtr, 1), shl(248, 0x3d))\\n }\\n\\n mstore(result, encodedLen)\\n }\\n\\n return string(result);\\n }\\n}\\n\",\"keccak256\":\"0x48822add7a355a6d6c04679ecba55383d0490eedd1c02915871c36f9e1683185\",\"license\":\"MIT\"},\"contracts/lib/Config.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nlibrary Config {\\n /// Fixed at deployment time\\n struct Deployment {\\n // Name of the NFT contract.\\n string name;\\n // Symbol of the NFT contract.\\n string symbol;\\n // The contract owner address. If you wish to own the contract, then set it as your wallet address.\\n // This is also the wallet that can manage the contract on NFT marketplaces.\\n address owner;\\n // If true, tokens may be burned by owner. Cannot be changed later.\\n bool tokensBurnable;\\n }\\n\\n /// Updatable by admins and owner\\n struct Runtime {\\n // Metadata base URI for tokens, NFTs minted in this contract will have metadata URI of `baseURI` + `tokenID`.\\n // Set this to reveal token metadata.\\n string baseURI;\\n // If true, the base URI of the NFTs minted in the specified contract can be updated after minting (token URIs\\n // are not frozen on the contract level). This is useful for revealing NFTs after the drop. If false, all the\\n // NFTs minted in this contract are frozen by default which means token URIs are non-updatable.\\n bool metadataUpdatable;\\n // If true, tokens may be transferred by owner. Default is true. Can be only changed to false.\\n bool tokensTransferable;\\n // Secondary market royalties in basis points (100 bps = 1%)\\n uint256 royaltiesBps;\\n // Address for royalties\\n address royaltiesAddress;\\n }\\n}\\n\",\"keccak256\":\"0x5d34e33120817203948d5ac07093553a3546ed02e6289345017fc06d057ea9be\",\"license\":\"MIT\"},\"contracts/lib/GranularRoles.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol\\\";\\n\\n/*\\n * Custom roles handling abstract contract.\\n * Used for fine-grained access controls to contracts.\\n * Supported roles are:\\n * - `ADMIN_ROLE`, is granted to the initializer and one other account specified during intialization\\n * - `MINT_ROLE`, is used for minting tokens\\n * - `UPDATE_CONTRACT_ROLE`, is used for updating the contract\\n * - `BURN_ROLE`, is used for burning tokens\\n * - `TRANSFER_ROLE`, is used for transferring tokens\\n * `ADMIN_ROLE` has all the access rights for all the roles.\\n *\\n * Each role besides the `ADMIN_ROLE` can have any amount of addresses and can be made immutable.\\n */\\nabstract contract GranularRoles is AccessControlUpgradeable {\\n // Roles list\\n // Admin role can have 2 addresses:\\n // one address same as (_owner) which can be changed\\n // one for NFTPort API access which can only be revoked\\n bytes32 public constant ADMIN_ROLE = keccak256(\\\"ADMIN_ROLE\\\");\\n // Following roles can have multiple addresses, can be changed by admin or update contract role\\n bytes32 public constant MINT_ROLE = keccak256(\\\"MINT_ROLE\\\");\\n bytes32 public constant UPDATE_CONTRACT_ROLE =\\n keccak256(\\\"UPDATE_CONTRACT_ROLE\\\");\\n bytes32 public constant UPDATE_TOKEN_ROLE = keccak256(\\\"UPDATE_TOKEN_ROLE\\\");\\n bytes32 public constant BURN_ROLE = keccak256(\\\"BURN_ROLE\\\");\\n bytes32 public constant TRANSFER_ROLE = keccak256(\\\"TRANSFER_ROLE\\\");\\n\\n /*\\n * Used for intializing and updating roles\\n * Each role can have any number of addresses attached to it and can be frozen separately,\\n * meaning any further updates to it are disabled.\\n * Cannot be used to update or initialize `ADMIN_ROLE`.\\n */\\n struct RolesAddresses {\\n bytes32 role;\\n address[] addresses;\\n bool frozen;\\n }\\n\\n // Contract owner address, this address can edit the contract on OpenSea and has `ADMIN_ROLE`\\n address internal _owner;\\n // Initialized as the address that initializes the contract.\\n address internal _nftPort;\\n\\n // Used to get roles enumeration\\n mapping(bytes32 => address[]) internal _rolesAddressesIndexed;\\n // Mapping from role to boolean that shows if role can be updated\\n mapping(bytes32 => bool) internal _rolesFrozen;\\n\\n // Event emitted when `transferOwnership` called by current owner.\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n /*\\n * Contract owner address\\n * @dev Required for easy integration with OpenSea, the owner address can edit the collection there\\n */\\n function owner() public view returns (address) {\\n return _owner;\\n }\\n\\n // Transfer contract ownership, only callable by the current owner\\n function transferOwnership(address newOwner) public {\\n require(newOwner != _owner, \\\"GranularRoles: already the owner\\\");\\n require(msg.sender == _owner, \\\"GranularRoles: not the owner\\\");\\n _revokeRole(ADMIN_ROLE, _owner);\\n address previousOwner = _owner;\\n _owner = newOwner;\\n _grantRole(ADMIN_ROLE, _owner);\\n emit OwnershipTransferred(previousOwner, newOwner);\\n }\\n\\n // Removes `ADMIN_ROLE` from the account that initialized the contract\\n function revokeNFTPortPermissions() public onlyRole(ADMIN_ROLE) {\\n _revokeRole(ADMIN_ROLE, _nftPort);\\n _nftPort = address(0);\\n }\\n\\n // Admin role has all access granted by default\\n function hasRole(bytes32 role, address account)\\n public\\n view\\n virtual\\n override\\n returns (bool)\\n {\\n // Contract owner has all access rights\\n if (account == _owner) return true;\\n // Anyone else cannot have DEFAULT_ADMIN_ROLE\\n if (role == DEFAULT_ADMIN_ROLE) return false;\\n // ADMIN_ROLE inherits any other roles\\n return\\n super.hasRole(ADMIN_ROLE, account) || super.hasRole(role, account);\\n }\\n\\n /**\\n * Initialize roles, should only be called once, for updating `_updateRoles` is used.\\n * Can only be used to set the `_owner` and `_nftport` addresses,\\n * or any amount of accounts for any supported role.\\n */\\n function _initRoles(address owner_, RolesAddresses[] memory rolesAddresses)\\n internal\\n {\\n require(owner_ != address(0), \\\"Contract must have an owner\\\");\\n _owner = owner_;\\n _nftPort = msg.sender;\\n _grantRole(ADMIN_ROLE, _owner);\\n _grantRole(ADMIN_ROLE, _nftPort);\\n\\n // Loop through all roles from the input\\n for (\\n uint256 roleIndex = 0;\\n roleIndex < rolesAddresses.length;\\n roleIndex++\\n ) {\\n bytes32 role = rolesAddresses[roleIndex].role;\\n // Check if the role is supported and is not `ADMIN_ROLE`\\n require(\\n _regularRoleValid(role),\\n string(\\n abi.encodePacked(\\n \\\"GranularRoles: invalid role \\\",\\n StringsUpgradeable.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n // Loop through all the addresses for the role being processed\\n // Grant the given role to all the specified addresses\\n // and add them to the roles enumaration `_rolesAddressesIndexed`\\n for (\\n uint256 addressIndex = 0;\\n addressIndex < rolesAddresses[roleIndex].addresses.length;\\n addressIndex++\\n ) {\\n _grantRole(\\n role,\\n rolesAddresses[roleIndex].addresses[addressIndex]\\n );\\n _rolesAddressesIndexed[role].push(\\n rolesAddresses[roleIndex].addresses[addressIndex]\\n );\\n }\\n // If the given role is frozen then further updates to it are disabled\\n if (rolesAddresses[roleIndex].frozen) {\\n _rolesFrozen[role] = true;\\n }\\n }\\n }\\n\\n /**\\n * Used for updating and/or freezing roles.\\n * Only callable by accounts with the `ADMIN_ROLE`\\n * and cannot be used to update `ADMIN_ROLE`\\n */\\n function _updateRoles(RolesAddresses[] memory rolesAddresses) internal {\\n if (rolesAddresses.length > 0) {\\n require(\\n hasRole(ADMIN_ROLE, msg.sender),\\n \\\"GranularRoles: not an admin\\\"\\n );\\n\\n // Loop through all roles from the input\\n for (\\n uint256 roleIndex = 0;\\n roleIndex < rolesAddresses.length;\\n roleIndex++\\n ) {\\n bytes32 role = rolesAddresses[roleIndex].role;\\n // Check if the role is supported and is not `ADMIN_ROLE`\\n require(\\n _regularRoleValid(role),\\n string(\\n abi.encodePacked(\\n \\\"GranularRoles: invalid role \\\",\\n StringsUpgradeable.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n // If given role is frozen then it cannot be updated\\n require(\\n !_rolesFrozen[role],\\n string(\\n abi.encodePacked(\\n \\\"GranularRoles: role \\\",\\n StringsUpgradeable.toHexString(uint256(role), 32),\\n \\\" is frozen\\\"\\n )\\n )\\n );\\n // Loop through all the addresses for the given role\\n // Remove all accounts from the role being processed to add new ones from the input\\n for (\\n uint256 addressIndex = 0;\\n addressIndex < _rolesAddressesIndexed[role].length;\\n addressIndex++\\n ) {\\n _revokeRole(\\n role,\\n _rolesAddressesIndexed[role][addressIndex]\\n );\\n }\\n delete _rolesAddressesIndexed[role];\\n // Loop through all the addresses for the given role from the input.\\n // Grant roles to given addresses for the role being processed\\n // and add the accounts to the role enumeration.\\n for (\\n uint256 addressIndex = 0;\\n addressIndex < rolesAddresses[roleIndex].addresses.length;\\n addressIndex++\\n ) {\\n _grantRole(\\n role,\\n rolesAddresses[roleIndex].addresses[addressIndex]\\n );\\n _rolesAddressesIndexed[role].push(\\n rolesAddresses[roleIndex].addresses[addressIndex]\\n );\\n }\\n if (rolesAddresses[roleIndex].frozen) {\\n _rolesFrozen[role] = true;\\n }\\n }\\n }\\n }\\n\\n // Checks if role is valid, does not contain the `ADMIN_ROLE`\\n function _regularRoleValid(bytes32 role) internal pure returns (bool) {\\n return\\n role == MINT_ROLE ||\\n role == UPDATE_CONTRACT_ROLE ||\\n role == UPDATE_TOKEN_ROLE ||\\n role == BURN_ROLE ||\\n role == TRANSFER_ROLE;\\n }\\n}\\n\",\"keccak256\":\"0x353e8fd619cc2dd340a8923d9fc763abbd410b4f47bd3da1e5611ac97a05e96b\",\"license\":\"MIT\"},\"contracts/lib/ITemplate.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/*\\n * Template interface, used by factory contracts to get the name and version of a contract,\\n * that extends this interface.\\n */\\ninterface ITemplate {\\n function NAME() external view returns (string memory);\\n\\n function VERSION() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xbf583f0046bf96a84fc2bc5cef21d433c838a7f701f7c93229d9faf026014e20\",\"license\":\"MIT\"},\"contracts/standalone/ERC721NFTProductContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../templates/ERC721NFTProduct.sol\\\";\\n\\ncontract ERC721NFTProductContract is ERC721NFTProduct {\\n constructor(\\n Config.Deployment memory deploymentConfig,\\n Config.Runtime memory runtimeConfig,\\n RolesAddresses[] memory rolesAddresses\\n ) initializer {\\n initialize(deploymentConfig, runtimeConfig, rolesAddresses);\\n }\\n}\",\"keccak256\":\"0x5f80f4332c1ef4e1acc3a2cc8b70897008f61cfdda4ea348ea9c21fc371a144d\",\"license\":\"MIT\"},\"contracts/templates/ERC721NFTProduct.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport {IERC2981} from \\\"@openzeppelin/contracts/token/common/ERC2981.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/ERC721URIStorageUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\n\\nimport \\\"../lib/Base64.sol\\\";\\nimport \\\"../lib/GranularRoles.sol\\\";\\nimport \\\"../lib/Config.sol\\\";\\nimport \\\"../lib/ITemplate.sol\\\";\\n\\n/*\\n * ERC-721 proxy contract, meaning it does not make use of a constructor but rather uses `initialize` with `initializer`\\n * modifier, see {Initializable}\\n *\\n * Minting and other write transactions only supported for accounts with relevant access rights.\\n */\\ncontract ERC721NFTProduct is\\n ERC721URIStorageUpgradeable,\\n GranularRoles,\\n ITemplate,\\n ReentrancyGuardUpgradeable\\n{\\n /*******************************\\n * Extensions, structs, events *\\n *******************************/\\n\\n using StringsUpgradeable for uint256;\\n\\n /*\\n * Event emitted to show opensea that metadata of a token is frozen,\\n * see https://docs.opensea.io/docs/metadata-standards\\n */\\n event PermanentURI(string _value, uint256 indexed _id);\\n // Event emitted to show that all tokens have their metadata frozen\\n event PermanentURIGlobal();\\n\\n /*************\\n * Constants *\\n *************/\\n\\n // Template name\\n string public constant NAME = \\\"ERC721NFTProduct\\\";\\n // Template version\\n uint256 public constant VERSION = 1_01_00;\\n // Basis for calculating royalties.\\n // This has to be 10k for royaltiesBps to be in basis points.\\n uint16 public constant ROYALTIES_BASIS = 10000;\\n\\n /********************\\n * Public variables *\\n ********************/\\n\\n // If true then tokens metadata can be updated\\n bool public metadataUpdatable;\\n // If true then tokens can be burned by their owners\\n bool public tokensBurnable;\\n // If true then tokens can be transferred by having the correct access rights {GranularRoles-TRANSFER_ROLE}\\n // if the token is owned by {GranularRoles-_owner} address\\n bool public tokensTransferable;\\n\\n // Mapping of individually frozen tokens\\n mapping(uint256 => bool) public freezeTokenUris;\\n\\n // Base URI of the tokens, token URIs are calculated as baseURI + tokenURI\\n string public baseURI;\\n\\n // Address where royalties will be transferred to\\n address public royaltiesAddress;\\n // Secondary market royalties in basis points (100 bps = 1%). Royalties use ERC2981 standard and support\\n // OpenSea standard.\\n uint256 public royaltiesBasisPoints;\\n\\n // Counter for the total number of tokens minted in this contract\\n uint256 public totalSupply;\\n\\n /***************************\\n * Contract initialization *\\n ***************************/\\n\\n constructor() initializer {\\n // solhint-disable-previous-line no-empty-blocks\\n }\\n\\n // Can only be called once, used because constructors cannot be used for proxy contracts\\n function initialize(\\n Config.Deployment memory deploymentConfig,\\n Config.Runtime memory runtimeConfig,\\n RolesAddresses[] memory rolesAddresses\\n ) public initializer {\\n // @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n __ERC721_init(deploymentConfig.name, deploymentConfig.symbol);\\n __ReentrancyGuard_init();\\n\\n _setRoyalties(\\n runtimeConfig.royaltiesAddress,\\n runtimeConfig.royaltiesBps\\n );\\n\\n metadataUpdatable = runtimeConfig.metadataUpdatable;\\n tokensBurnable = deploymentConfig.tokensBurnable;\\n tokensTransferable = runtimeConfig.tokensTransferable;\\n\\n baseURI = runtimeConfig.baseURI;\\n\\n _initRoles(deploymentConfig.owner, rolesAddresses);\\n }\\n\\n /*******************\\n * Write functions *\\n *******************/\\n\\n // Mint a token to input `caller` address\\n function mintToCaller(\\n address caller,\\n uint256 tokenId,\\n string memory tokenURI\\n ) public onlyRole(MINT_ROLE) nonReentrant returns (uint256) {\\n _safeMint(caller, tokenId);\\n totalSupply += 1;\\n\\n _setTokenURI(tokenId, tokenURI);\\n\\n return tokenId;\\n }\\n\\n /*\\n * Function to update token URIs for individual tokens,\\n * can be used to update and optionally freeze token URIs\\n *\\n * only callable if `metadataUpdatable` is true, the medatadata\\n * for the token has not been frozen previously and the caller has `UPDATE_TOKEN_ROLE` (or `ADMIN_ROLE`) role\\n */\\n function updateTokenUri(\\n uint256 _tokenId,\\n string memory _tokenUri,\\n bool _isFreezeTokenUri\\n ) public onlyRole(UPDATE_TOKEN_ROLE) {\\n require(_exists(_tokenId), \\\"Token: Token does not exist\\\");\\n require(metadataUpdatable, \\\"Token: Metadata is frozen\\\");\\n require(freezeTokenUris[_tokenId] != true, \\\"Token: Token is frozen\\\");\\n require(\\n _isFreezeTokenUri || (bytes(_tokenUri).length != 0),\\n \\\"Token: Token URI is missing\\\"\\n );\\n\\n if (bytes(_tokenUri).length != 0) {\\n _setTokenURI(_tokenId, _tokenUri);\\n }\\n\\n if (_isFreezeTokenUri) {\\n freezeTokenUris[_tokenId] = true;\\n emit PermanentURI(tokenURI(_tokenId), _tokenId);\\n }\\n }\\n\\n /*\\n * Function to transfer tokens owned by the `_owner` address.\\n *\\n * only callable if `tokensTransferable` is true, the token to be transferred\\n * is owned by `_owner` and the caller has `TRANSFER_ROLE` (or `ADMIN_ROLE`) role\\n */\\n function transferByOwner(address _to, uint256 _tokenId)\\n public\\n onlyRole(TRANSFER_ROLE)\\n {\\n require(tokensTransferable, \\\"Transfer: Transfers are disabled\\\");\\n _safeTransfer(_owner, _to, _tokenId, \\\"\\\");\\n }\\n\\n /*\\n * Function to burn tokens owned by the `_owner` address.\\n *\\n * only callable if `tokensBurnable` is true, the token to be burned\\n * is owned by `_owner` and the caller has `BURN_ROLE` (or `ADMIN_ROLE`) role\\n */\\n function burn(uint256 _tokenId) public onlyRole(BURN_ROLE) {\\n require(tokensBurnable, \\\"Burn: Burns are disabled\\\");\\n require(_exists(_tokenId), \\\"Burn: Token does not exist\\\");\\n require(\\n ERC721Upgradeable.ownerOf(_tokenId) == _owner,\\n \\\"Burn: not held by contract owner\\\"\\n );\\n\\n _burn(_tokenId);\\n totalSupply -= 1;\\n }\\n\\n /*\\n * Function to update the collection configuration.\\n *\\n * Only callable if `metadataUpdatable` is true, or `baseURI` is not updated.\\n * The ability to transfer tokens or update metadata can only be turned OFF with this, not vice-versa.\\n *\\n * This can also be used to revoke NFTPort access to the contract,\\n * meaning access rights for NFTPort account will be removed.\\n */\\n function update(\\n Config.Runtime calldata newConfig,\\n RolesAddresses[] memory rolesAddresses,\\n bool isRevokeNFTPortPermissions\\n ) public onlyRole(UPDATE_CONTRACT_ROLE) {\\n // If metadata is frozen, baseURI cannot be updated\\n require(\\n metadataUpdatable ||\\n (keccak256(abi.encodePacked(newConfig.baseURI)) ==\\n keccak256(abi.encodePacked(baseURI))),\\n \\\"Update: Metadata is frozen\\\"\\n );\\n\\n baseURI = newConfig.baseURI;\\n _setRoyalties(newConfig.royaltiesAddress, newConfig.royaltiesBps);\\n\\n if (!newConfig.tokensTransferable) {\\n tokensTransferable = false;\\n }\\n if (!newConfig.metadataUpdatable && metadataUpdatable) {\\n metadataUpdatable = false;\\n emit PermanentURIGlobal();\\n }\\n\\n _updateRoles(rolesAddresses);\\n\\n if (isRevokeNFTPortPermissions) {\\n revokeNFTPortPermissions();\\n }\\n }\\n\\n /******************\\n * View functions *\\n ******************/\\n\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(ERC721Upgradeable, AccessControlUpgradeable)\\n returns (bool)\\n {\\n return\\n ERC721Upgradeable.supportsInterface(interfaceId) ||\\n interfaceId == type(IERC2981).interfaceId;\\n }\\n\\n // @dev ERC2981 token royalty info\\n function royaltyInfo(uint256, uint256 salePrice)\\n external\\n view\\n returns (address, uint256)\\n {\\n return (\\n royaltiesAddress,\\n (royaltiesBasisPoints * salePrice) / ROYALTIES_BASIS\\n );\\n }\\n\\n /**\\n * @dev OpenSea contract metadata, returns a base64 encoded JSON string containing royalties basis points\\n * and royalties address\\n */\\n function contractURI() external view returns (string memory) {\\n string memory json = Base64.encode(\\n bytes(\\n string(\\n abi.encodePacked(\\n '{\\\"seller_fee_basis_points\\\": ', // solhint-disable-line quotes\\n royaltiesBasisPoints.toString(),\\n ', \\\"fee_recipient\\\": \\\"', // solhint-disable-line quotes\\n uint256(uint160(royaltiesAddress)).toHexString(20),\\n '\\\"}' // solhint-disable-line quotes\\n )\\n )\\n )\\n );\\n\\n string memory output = string(\\n abi.encodePacked(\\\"data:application/json;base64,\\\", json)\\n );\\n\\n return output;\\n }\\n\\n /*************\\n * Internals *\\n *************/\\n\\n function _baseURI()\\n internal\\n view\\n virtual\\n override(ERC721Upgradeable)\\n returns (string memory)\\n {\\n return baseURI;\\n }\\n\\n function _setRoyalties(address newAddress, uint newBps) internal {\\n require(newBps <= ROYALTIES_BASIS, \\\"Cannot set royalties to over 100%\\\");\\n\\n royaltiesAddress = newAddress;\\n royaltiesBasisPoints = newBps;\\n }\\n}\\n\",\"keccak256\":\"0xe8368b61c54117522cf860cb237a26192d54fd61216bae3ab3a8473c59dbc360\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b50604051620051c7380380620051c7833981016040819052620000349162001064565b600054610100900460ff1615808015620000555750600054600160ff909116105b8062000085575062000072306200024e60201b620017c61760201c565b15801562000085575060005460ff166001145b620000dd5760405162461bcd60e51b815260206004820152602e60248201526000805160206200514783398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000101576000805461ff0019166101001790555b801562000137576000805461ff001916905560405160018152600080516020620051878339815191529060200160405180910390a15b50600054610100900460ff1615808015620001595750600054600160ff909116105b8062000189575062000176306200024e60201b620017c61760201c565b15801562000189575060005460ff166001145b620001dd5760405162461bcd60e51b815260206004820152602e60248201526000805160206200514783398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000d4565b6000805460ff19166001179055801562000201576000805461ff0019166101001790555b6200020e8484846200025d565b801562000244576000805461ff001916905560405160018152600080516020620051878339815191529060200160405180910390a15b50505050620013ea565b6001600160a01b03163b151590565b600054610100900460ff16158080156200027e5750600054600160ff909116105b80620002ae57506200029b306200024e60201b620017c61760201c565b158015620002ae575060005460ff166001145b620003025760405162461bcd60e51b815260206004820152602e60248201526000805160206200514783398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000d4565b6000805460ff19166001179055801562000326576000805461ff0019166101001790555b8351602085015162000339919062000408565b6200034362000474565b6200035d83608001518460600151620004dc60201b60201c565b60208301516101318054606087015160408701511515620100000262ff0000199115156101000261ff00199515159590951661ffff19909316929092179390931792909216919091179055825161013390620003ba908262001203565b506040840151620003cc908362000562565b801562000402576000805461ff001916905560405160018152600080516020620051878339815191529060200160405180910390a15b50505050565b600054610100900460ff16620004645760405162461bcd60e51b815260206004820152602b60248201526000805160206200516783398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d4565b62000470828262000831565b5050565b600054610100900460ff16620004d05760405162461bcd60e51b815260206004820152602b60248201526000805160206200516783398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d4565b620004da620008aa565b565b6127108111156200053a5760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f742073657420726f79616c7469657320746f206f766572203130306044820152602560f81b6064820152608401620000d4565b61013480546001600160a01b0319166001600160a01b03939093169290921790915561013555565b6001600160a01b038216620005ba5760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206d757374206861766520616e206f776e657200000000006044820152606401620000d4565b60fb80546001600160a01b0384166001600160a01b0319918216811790925560fc8054909116331790556200060090600080516020620051a7833981519152906200090d565b60fc546200062890600080516020620051a7833981519152906001600160a01b03166200090d565b60005b81518110156200082c5760008282815181106200064c576200064c620012cf565b60200260200101516000015190506200066b816200099760201b60201c565b62000681826020620017d562000a6e821b17811c565b604051602001620006939190620012e5565b60405160208183030381529060405290620006c35760405162461bcd60e51b8152600401620000d491906200132c565b5060005b838381518110620006dc57620006dc620012cf565b60200260200101516020015151811015620007d4576200073f828585815181106200070b576200070b620012cf565b60200260200101516020015183815181106200072b576200072b620012cf565b60200260200101516200090d60201b60201c565b600082815260fd602052604090208451859085908110620007645762000764620012cf565b6020026020010151602001518281518110620007845762000784620012cf565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b0390921691909117905580620007cb8162001377565b915050620006c7565b50828281518110620007ea57620007ea620012cf565b602002602001015160400151156200081657600081815260fe60205260409020805460ff191660011790555b5080620008238162001377565b9150506200062b565b505050565b600054610100900460ff166200088d5760405162461bcd60e51b815260206004820152602b60248201526000805160206200516783398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d4565b60656200089b838262001203565b5060666200082c828262001203565b600054610100900460ff16620009065760405162461bcd60e51b815260206004820152602b60248201526000805160206200516783398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d4565b600160ff55565b62000919828262000c2e565b6200047057600082815260c9602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620009533390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b60007f154c00819833dac601ee5ddded6fda79d9d8b506b911b3dbd54cdb95fe6c3686821480620009e757507f9b16859c0d694afa65b1b6551542db11ea12d6208b6a17dc922f10f2d74440f582145b8062000a1257507f852fd44a27d33057a8c3d90859d4e4c9f54309d4d66d1d968e063befba9198e682145b8062000a3d57507fe97b137254058bd94f28d2f3eb79e2d34074ffb488d042e3bc958e0a57d2fa2282145b8062000a6857507f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c82145b92915050565b6060600062000a7f83600262001393565b62000a8c906002620013b5565b6001600160401b0381111562000aa65762000aa662000ccf565b6040519080825280601f01601f19166020018201604052801562000ad1576020820181803683370190505b509050600360fc1b8160008151811062000aef5762000aef620012cf565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811062000b215762000b21620012cf565b60200101906001600160f81b031916908160001a905350600062000b4784600262001393565b62000b54906001620013b5565b90505b600181111562000bd6576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811062000b8c5762000b8c620012cf565b1a60f81b82828151811062000ba55762000ba5620012cf565b60200101906001600160f81b031916908160001a90535060049490941c9362000bce81620013d0565b905062000b57565b50831562000c275760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401620000d4565b9392505050565b60fb546000906001600160a01b039081169083160362000c515750600162000a68565b8262000c605750600062000a68565b62000c86600080516020620051a78339815191528362000ca460201b620019701760201c565b8062000c27575062000c27838362000ca460201b620019701760201c565b600091825260c9602090815260408084206001600160a01b0393909316845291905290205460ff1690565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b038111828210171562000d0a5762000d0a62000ccf565b60405290565b604051608081016001600160401b038111828210171562000d0a5762000d0a62000ccf565b604051601f8201601f191681016001600160401b038111828210171562000d605762000d6062000ccf565b604052919050565b60005b8381101562000d8557818101518382015260200162000d6b565b83811115620004025750506000910152565b600082601f83011262000da957600080fd5b81516001600160401b0381111562000dc55762000dc562000ccf565b62000dda601f8201601f191660200162000d35565b81815284602083860101111562000df057600080fd5b62000e0382602083016020870162000d68565b949350505050565b80516001600160a01b038116811462000e2357600080fd5b919050565b8051801515811462000e2357600080fd5b600060a0828403121562000e4c57600080fd5b60405160a081016001600160401b03808211838310171562000e725762000e7262000ccf565b81604052829350845191508082111562000e8b57600080fd5b5062000e9a8582860162000d97565b82525062000eab6020840162000e28565b602082015262000ebe6040840162000e28565b60408201526060830151606082015262000edb6080840162000e0b565b60808201525092915050565b60006001600160401b0382111562000f035762000f0362000ccf565b5060051b60200190565b600082601f83011262000f1f57600080fd5b8151602062000f3862000f328362000ee7565b62000d35565b82815260059290921b8401810191818101908684111562000f5857600080fd5b8286015b84811015620010595780516001600160401b038082111562000f7e5760008081fd5b908801906060828b03601f190181131562000f995760008081fd5b62000fa362000ce5565b8784015181526040808501518481111562000fbe5760008081fd5b85019350603f84018d1362000fd35760008081fd5b8884015162000fe662000f328262000ee7565b81815260059190911b85018201908a8101908f831115620010075760008081fd5b958301955b828710156200103057620010208762000e0b565b8252958b0195908b01906200100c565b848c01525062001044905085840162000e28565b90820152865250505091830191830162000f5c565b509695505050505050565b6000806000606084860312156200107a57600080fd5b83516001600160401b03808211156200109257600080fd5b9085019060808288031215620010a757600080fd5b620010b162000d10565b825182811115620010c157600080fd5b620010cf8982860162000d97565b825250602083015182811115620010e557600080fd5b620010f38982860162000d97565b602083015250620011076040840162000e0b565b60408201526200111a6060840162000e28565b606082015260208701519095509150808211156200113757600080fd5b620011458783880162000e39565b935060408601519150808211156200115c57600080fd5b506200116b8682870162000f0d565b9150509250925092565b600181811c908216806200118a57607f821691505b602082108103620011ab57634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200082c57600081815260208120601f850160051c81016020861015620011da5750805b601f850160051c820191505b81811015620011fb57828155600101620011e6565b505050505050565b81516001600160401b038111156200121f576200121f62000ccf565b620012378162001230845462001175565b84620011b1565b602080601f8311600181146200126f5760008415620012565750858301515b600019600386901b1c1916600185901b178555620011fb565b600085815260208120601f198616915b82811015620012a0578886015182559484019460019091019084016200127f565b5085821015620012bf5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052603260045260246000fd5b7f4772616e756c6172526f6c65733a20696e76616c696420726f6c6520000000008152600082516200131f81601c85016020870162000d68565b91909101601c0192915050565b60208152600082518060208401526200134d81604085016020870162000d68565b601f01601f19169190910160400192915050565b634e487b7160e01b600052601160045260246000fd5b6000600182016200138c576200138c62001361565b5060010190565b6000816000190483118215151615620013b057620013b062001361565b500290565b60008219821115620013cb57620013cb62001361565b500190565b600081620013e257620013e262001361565b506000190190565b613d4d80620013fa6000396000f3fe608060405234801561001057600080fd5b50600436106102955760003560e01c80637afdcdbb11610167578063b88d4fde116100ce578063e8a3d48511610087578063e8a3d48514610663578063e985e9c51461066b578063e9a9c850146106a7578063f153c2e5146106ce578063f2fde38b146106d6578063ffa1ad74146106e957600080fd5b8063b88d4fde146105dc578063b930908f146105ef578063c87b56dd14610616578063d547741f14610629578063de374d9d1461063c578063e3d520721461065057600080fd5b8063a217fddf11610120578063a217fddf1461054e578063a22cb46514610556578063a2f551ec14610569578063a3f4df7e1461057c578063a53a84b6146105ab578063b29c097a146105b557600080fd5b80637afdcdbb146104cf5780638d010db3146104e25780638da5cb5b1461050657806391d148541461051757806395d89b411461052a5780639da5b0a51461053257600080fd5b80632c23b9651161020b57806342966c68116101c457806342966c681461046b5780634e6f9dd61461047e5780636352211e1461048c5780636c0360eb1461049f57806370a08231146104a757806375b238fc146104ba57600080fd5b80632c23b965146103e45780632e628b611461040b5780632f2ff15d1461041e578063328825351461043157806336568abe1461044557806342842e0e1461045857600080fd5b8063206b60f91161025d578063206b60f91461032f57806321e92d491461035657806323b872dd14610369578063248a9ca31461037c57806325d22c8e1461039f5780632a55205a146103b257600080fd5b806301ffc9a71461029a57806306fdde03146102c2578063081812fc146102d7578063095ea7b31461030257806318160ddd14610317575b600080fd5b6102ad6102a8366004612e22565b6106f2565b60405190151581526020015b60405180910390f35b6102ca61071e565b6040516102b99190612e97565b6102ea6102e5366004612eaa565b6107b0565b6040516001600160a01b0390911681526020016102b9565b610315610310366004612edf565b6107d7565b005b6103216101365481565b6040519081526020016102b9565b6103217f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c81565b610315610364366004612edf565b6108f1565b610315610377366004612f09565b61099d565b61032161038a366004612eaa565b600090815260c9602052604090206001015490565b6103156103ad36600461325f565b6109ce565b6103c56103c036600461335a565b610b70565b604080516001600160a01b0390931683526020830191909152016102b9565b6103217f9b16859c0d694afa65b1b6551542db11ea12d6208b6a17dc922f10f2d74440f581565b61031561041936600461337c565b610bae565b61031561042c3660046133f7565b610d59565b610134546102ea906001600160a01b031681565b6103156104533660046133f7565b610d7e565b610315610466366004612f09565b610dfc565b610315610479366004612eaa565b610e17565b610131546102ad9060ff1681565b6102ea61049a366004612eaa565b610f8e565b6102ca610fee565b6103216104b5366004613423565b61107d565b610321600080516020613cf883398151915281565b6103216104dd36600461343e565b611103565b6102ad6104f0366004612eaa565b6101326020526000908152604090205460ff1681565b60fb546001600160a01b03166102ea565b6102ad6105253660046133f7565b6111c1565b6102ca61121e565b61053b61271081565b60405161ffff90911681526020016102b9565b610321600081565b61031561056436600461348a565b61122d565b6103156105773660046134b4565b611238565b6102ca6040518060400160405280601081526020016f115490cdcc8c539195141c9bd91d58dd60821b81525081565b6103216101355481565b6103217f852fd44a27d33057a8c3d90859d4e4c9f54309d4d66d1d968e063befba9198e681565b6103156105ea3660046134f2565b611445565b6103217fe97b137254058bd94f28d2f3eb79e2d34074ffb488d042e3bc958e0a57d2fa2281565b6102ca610624366004612eaa565b611477565b6103156106373660046133f7565b61157a565b610131546102ad9062010000900460ff1681565b610131546102ad90610100900460ff1681565b6102ca61159f565b6102ad61067936600461356d565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b6103217f154c00819833dac601ee5ddded6fda79d9d8b506b911b3dbd54cdb95fe6c368681565b61031561161b565b6103156106e4366004613423565b61166b565b61032161277481565b60006106fd8261199b565b8061071857506001600160e01b0319821663152a902d60e11b145b92915050565b60606065805461072d90613597565b80601f016020809104026020016040519081016040528092919081815260200182805461075990613597565b80156107a65780601f1061077b576101008083540402835291602001916107a6565b820191906000526020600020905b81548152906001019060200180831161078957829003601f168201915b5050505050905090565b60006107bb826119eb565b506000908152606960205260409020546001600160a01b031690565b60006107e282610f8e565b9050806001600160a01b0316836001600160a01b0316036108545760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061087057506108708133610679565b6108e25760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161084b565b6108ec8383611a4d565b505050565b7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c61091b81611abb565b6101315462010000900460ff166109745760405162461bcd60e51b815260206004820181905260248201527f5472616e736665723a205472616e7366657273206172652064697361626c6564604482015260640161084b565b60fb546040805160208101909152600081526108ec916001600160a01b03169085908590611ac5565b6109a73382611af8565b6109c35760405162461bcd60e51b815260040161084b906135d1565b6108ec838383611b76565b600054610100900460ff16158080156109ee5750600054600160ff909116105b80610a085750303b158015610a08575060005460ff166001145b610a6b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161084b565b6000805460ff191660011790558015610a8e576000805461ff0019166101001790555b610aa084600001518560200151611d12565b610aa8611d43565b610aba83608001518460600151611d74565b60208301516101318054606087015160408701511515620100000262ff0000199115156101000261ff00199515159590951661ffff19909316929092179390931792909216919091179055825161013390610b15908261366d565b50610b24846040015183611df8565b8015610b6a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610134546101355460009182916001600160a01b039091169061271090610b98908690613742565b610ba29190613777565b915091505b9250929050565b7f9b16859c0d694afa65b1b6551542db11ea12d6208b6a17dc922f10f2d74440f5610bd881611abb565b6101315460ff1680610c435750610133604051602001610bf8919061378b565b60408051601f198184030181529190528051602090910120610c1a8580613801565b604051602001610c2b929190613847565b60405160208183030381529060405280519060200120145b610c8f5760405162461bcd60e51b815260206004820152601a60248201527f5570646174653a204d657461646174612069732066726f7a656e000000000000604482015260640161084b565b610c998480613801565b61013391610ca8919083613857565b50610cc6610cbc60a0860160808701613423565b8560600135611d74565b610cd66060850160408601613917565b610ce857610131805462ff0000191690555b610cf86040850160208601613917565b158015610d0857506101315460ff165b15610d4257610131805460ff191690556040517fb59f45df38ec0d34114b1248c38a29cdbccbf3e745ae3ef310ac66199a4ceccf90600090a15b610d4b8361207c565b8115610b6a57610b6a61161b565b600082815260c96020526040902060010154610d7481611abb565b6108ec8383612366565b6001600160a01b0381163314610dee5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161084b565b610df882826123ec565b5050565b6108ec83838360405180602001604052806000815250611445565b7fe97b137254058bd94f28d2f3eb79e2d34074ffb488d042e3bc958e0a57d2fa22610e4181611abb565b61013154610100900460ff16610e995760405162461bcd60e51b815260206004820152601860248201527f4275726e3a204275726e73206172652064697361626c65640000000000000000604482015260640161084b565b6000828152606760205260409020546001600160a01b0316610efd5760405162461bcd60e51b815260206004820152601a60248201527f4275726e3a20546f6b656e20646f6573206e6f74206578697374000000000000604482015260640161084b565b60fb546001600160a01b0316610f1283610f8e565b6001600160a01b031614610f685760405162461bcd60e51b815260206004820181905260248201527f4275726e3a206e6f742068656c6420627920636f6e7472616374206f776e6572604482015260640161084b565b610f7182612453565b60016101366000828254610f859190613932565b90915550505050565b6000818152606760205260408120546001600160a01b0316806107185760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161084b565b6101338054610ffc90613597565b80601f016020809104026020016040519081016040528092919081815260200182805461102890613597565b80156110755780601f1061104a57610100808354040283529160200191611075565b820191906000526020600020905b81548152906001019060200180831161105857829003601f168201915b505050505081565b60006001600160a01b0382166110e75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161084b565b506001600160a01b031660009081526068602052604090205490565b60007f154c00819833dac601ee5ddded6fda79d9d8b506b911b3dbd54cdb95fe6c368661112f81611abb565b600260ff54036111815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161084b565b600260ff556111908585612493565b600161013660008282546111a49190613949565b909155506111b4905084846124ad565b5050600160ff5550919050565b60fb546000906001600160a01b03908116908316036111e257506001610718565b826111ef57506000610718565b611207600080516020613cf883398151915283611970565b8061121757506112178383611970565b9392505050565b60606066805461072d90613597565b610df8338383612540565b7f852fd44a27d33057a8c3d90859d4e4c9f54309d4d66d1d968e063befba9198e661126281611abb565b6000848152606760205260409020546001600160a01b03166112c65760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e3a20546f6b656e20646f6573206e6f742065786973740000000000604482015260640161084b565b6101315460ff166113195760405162461bcd60e51b815260206004820152601960248201527f546f6b656e3a204d657461646174612069732066726f7a656e00000000000000604482015260640161084b565b6000848152610132602052604090205460ff1615156001036113765760405162461bcd60e51b81526020600482015260166024820152752a37b5b2b71d102a37b5b2b71034b990333937bd32b760511b604482015260640161084b565b81806113825750825115155b6113ce5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e3a20546f6b656e20555249206973206d697373696e670000000000604482015260640161084b565b8251156113df576113df84846124ad565b8115610b6a57600084815261013260205260409020805460ff19166001179055837fa109ba539900bf1b633f956d63c96fc89b814c7287f7aa50a9216d0b5565720761142a82611477565b6040516114379190612e97565b60405180910390a250505050565b61144f3383611af8565b61146b5760405162461bcd60e51b815260040161084b906135d1565b610b6a84848484611ac5565b6060611482826119eb565b6000828152609760205260408120805461149b90613597565b80601f01602080910402602001604051908101604052809291908181526020018280546114c790613597565b80156115145780601f106114e957610100808354040283529160200191611514565b820191906000526020600020905b8154815290600101906020018083116114f757829003601f168201915b50505050509050600061152561260e565b90508051600003611537575092915050565b815115611569578082604051602001611551929190613961565b60405160208183030381529060405292505050919050565b6115728461261e565b949350505050565b600082815260c9602052604090206001015461159581611abb565b6108ec83836123ec565b606060006115ef6115b261013554612684565b610134546115ca906001600160a01b031660146117d5565b6040516020016115db929190613990565b604051602081830303815290604052612784565b90506000816040516020016116049190613a17565b60408051601f198184030181529190529392505050565b600080516020613cf883398151915261163381611abb565b60fc5461165890600080516020613cf8833981519152906001600160a01b03166123ec565b5060fc80546001600160a01b0319169055565b60fb546001600160a01b03908116908216036116c95760405162461bcd60e51b815260206004820181905260248201527f4772616e756c6172526f6c65733a20616c726561647920746865206f776e6572604482015260640161084b565b60fb546001600160a01b031633146117235760405162461bcd60e51b815260206004820152601c60248201527f4772616e756c6172526f6c65733a206e6f7420746865206f776e657200000000604482015260640161084b565b60fb5461174890600080516020613cf8833981519152906001600160a01b03166123ec565b60fb80546001600160a01b038381166001600160a01b031983168117909355169061178290600080516020613cf883398151915290612366565b816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600160a01b03163b151590565b606060006117e4836002613742565b6117ef906002613949565b6001600160401b0381111561180657611806612f45565b6040519080825280601f01601f191660200182016040528015611830576020820181803683370190505b509050600360fc1b8160008151811061184b5761184b613a5c565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061187a5761187a613a5c565b60200101906001600160f81b031916908160001a905350600061189e846002613742565b6118a9906001613949565b90505b6001811115611921576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106118dd576118dd613a5c565b1a60f81b8282815181106118f3576118f3613a5c565b60200101906001600160f81b031916908160001a90535060049490941c9361191a81613a72565b90506118ac565b5083156112175760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161084b565b600091825260c9602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60006001600160e01b031982166380ac58cd60e01b14806119cc57506001600160e01b03198216635b5e139f60e01b145b8061071857506301ffc9a760e01b6001600160e01b0319831614610718565b6000818152606760205260409020546001600160a01b0316611a4a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161084b565b50565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a8282610f8e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611a4a81336128ed565b611ad0848484611b76565b611adc84848484612951565b610b6a5760405162461bcd60e51b815260040161084b90613a89565b600080611b0483610f8e565b9050806001600160a01b0316846001600160a01b03161480611b4b57506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b806115725750836001600160a01b0316611b64846107b0565b6001600160a01b031614949350505050565b826001600160a01b0316611b8982610f8e565b6001600160a01b031614611bed5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161084b565b6001600160a01b038216611c4f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161084b565b611c5a600082611a4d565b6001600160a01b0383166000908152606860205260408120805460019290611c83908490613932565b90915550506001600160a01b0382166000908152606860205260408120805460019290611cb1908490613949565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600054610100900460ff16611d395760405162461bcd60e51b815260040161084b90613adb565b610df88282612a52565b600054610100900460ff16611d6a5760405162461bcd60e51b815260040161084b90613adb565b611d72612a92565b565b612710811115611dd05760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f742073657420726f79616c7469657320746f206f766572203130306044820152602560f81b606482015260840161084b565b61013480546001600160a01b0319166001600160a01b03939093169290921790915561013555565b6001600160a01b038216611e4e5760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206d757374206861766520616e206f776e65720000000000604482015260640161084b565b60fb80546001600160a01b0384166001600160a01b0319918216811790925560fc805490911633179055611e9190600080516020613cf883398151915290612366565b60fc54611eb690600080516020613cf8833981519152906001600160a01b0316612366565b60005b81518110156108ec576000828281518110611ed657611ed6613a5c565b6020026020010151600001519050611eed81612ac0565b611ef88260206117d5565b604051602001611f089190613b26565b60405160208183030381529060405290611f355760405162461bcd60e51b815260040161084b9190612e97565b5060005b838381518110611f4b57611f4b613a5c565b6020026020010151602001515181101561202b57611f9f82858581518110611f7557611f75613a5c565b6020026020010151602001518381518110611f9257611f92613a5c565b6020026020010151612366565b600082815260fd602052604090208451859085908110611fc157611fc1613a5c565b6020026020010151602001518281518110611fde57611fde613a5c565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558061202381613b6b565b915050611f39565b5082828151811061203e5761203e613a5c565b6020026020010151604001511561206957600081815260fe60205260409020805460ff191660011790555b508061207481613b6b565b915050611eb9565b805115611a4a5761209b600080516020613cf8833981519152336111c1565b6120e75760405162461bcd60e51b815260206004820152601b60248201527f4772616e756c6172526f6c65733a206e6f7420616e2061646d696e0000000000604482015260640161084b565b60005b8151811015610df857600082828151811061210757612107613a5c565b602002602001015160000151905061211e81612ac0565b6121298260206117d5565b6040516020016121399190613b26565b604051602081830303815290604052906121665760405162461bcd60e51b815260040161084b9190612e97565b50600081815260fe602090815260409091205460ff1615906121899083906117d5565b6040516020016121999190613b84565b604051602081830303815290604052906121c65760405162461bcd60e51b815260040161084b9190612e97565b5060005b600082815260fd602052604090205481101561223257600082815260fd6020526040902080546122209184918490811061220657612206613a5c565b6000918252602090912001546001600160a01b03166123ec565b8061222a81613b6b565b9150506121ca565b50600081815260fd6020526040812061224a91612d9f565b60005b83838151811061225f5761225f613a5c565b602002602001015160200151518110156123155761228982858581518110611f7557611f75613a5c565b600082815260fd6020526040902084518590859081106122ab576122ab613a5c565b60200260200101516020015182815181106122c8576122c8613a5c565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558061230d81613b6b565b91505061224d565b5082828151811061232857612328613a5c565b6020026020010151604001511561235357600081815260fe60205260409020805460ff191660011790555b508061235e81613b6b565b9150506120ea565b61237082826111c1565b610df857600082815260c9602090815260408083206001600160a01b03851684529091529020805460ff191660011790556123a83390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6123f682826111c1565b15610df857600082815260c9602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61245c81612b8f565b6000818152609760205260409020805461247590613597565b159050611a4a576000818152609760205260408120611a4a91612dbd565b610df8828260405180602001604052806000815250612c2a565b6000828152606760205260409020546001600160a01b03166125285760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b606482015260840161084b565b60008281526097602052604090206108ec828261366d565b816001600160a01b0316836001600160a01b0316036125a15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161084b565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060610133805461072d90613597565b6060612629826119eb565b600061263361260e565b905060008151116126535760405180602001604052806000815250611217565b8061265d84612684565b60405160200161266e929190613961565b6040516020818303038152906040529392505050565b6060816000036126ab5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126d557806126bf81613b6b565b91506126ce9050600a83613777565b91506126af565b6000816001600160401b038111156126ef576126ef612f45565b6040519080825280601f01601f191660200182016040528015612719576020820181803683370190505b5090505b84156115725761272e600183613932565b915061273b600a86613bd4565b612746906030613949565b60f81b81838151811061275b5761275b613a5c565b60200101906001600160f81b031916908160001a90535061277d600a86613777565b945061271d565b805160609060008190036127a8575050604080516020810190915260008152919050565b600060036127b7836002613949565b6127c19190613777565b6127cc906004613742565b905060006127db826020613949565b6001600160401b038111156127f2576127f2612f45565b6040519080825280601f01601f19166020018201604052801561281c576020820181803683370190505b5090506000604051806060016040528060408152602001613cb8604091399050600181016020830160005b868110156128a8576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612847565b5060038606600181146128c257600281146128d3576128df565b613d3d60f01b6001198301526128df565b603d60f81b6000198301525b505050918152949350505050565b6128f782826111c1565b610df85761290f816001600160a01b031660146117d5565b61291a8360206117d5565b60405160200161292b929190613be8565b60408051601f198184030181529082905262461bcd60e51b825261084b91600401612e97565b60006001600160a01b0384163b15612a4757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612995903390899088908890600401613c5d565b6020604051808303816000875af19250505080156129d0575060408051601f3d908101601f191682019092526129cd91810190613c9a565b60015b612a2d573d8080156129fe576040519150601f19603f3d011682016040523d82523d6000602084013e612a03565b606091505b508051600003612a255760405162461bcd60e51b815260040161084b90613a89565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611572565b506001949350505050565b600054610100900460ff16612a795760405162461bcd60e51b815260040161084b90613adb565b6065612a85838261366d565b5060666108ec828261366d565b600054610100900460ff16612ab95760405162461bcd60e51b815260040161084b90613adb565b600160ff55565b60007f154c00819833dac601ee5ddded6fda79d9d8b506b911b3dbd54cdb95fe6c3686821480612b0f57507f9b16859c0d694afa65b1b6551542db11ea12d6208b6a17dc922f10f2d74440f582145b80612b3957507f852fd44a27d33057a8c3d90859d4e4c9f54309d4d66d1d968e063befba9198e682145b80612b6357507fe97b137254058bd94f28d2f3eb79e2d34074ffb488d042e3bc958e0a57d2fa2282145b806107185750507f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c1490565b6000612b9a82610f8e565b9050612ba7600083611a4d565b6001600160a01b0381166000908152606860205260408120805460019290612bd0908490613932565b909155505060008281526067602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b612c348383612c5d565b612c416000848484612951565b6108ec5760405162461bcd60e51b815260040161084b90613a89565b6001600160a01b038216612cb35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161084b565b6000818152606760205260409020546001600160a01b031615612d185760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161084b565b6001600160a01b0382166000908152606860205260408120805460019290612d41908490613949565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5080546000825590600052602060002090810190611a4a9190612df3565b508054612dc990613597565b6000825580601f10612dd9575050565b601f016020900490600052602060002090810190611a4a91905b5b80821115612e085760008155600101612df4565b5090565b6001600160e01b031981168114611a4a57600080fd5b600060208284031215612e3457600080fd5b813561121781612e0c565b60005b83811015612e5a578181015183820152602001612e42565b83811115610b6a5750506000910152565b60008151808452612e83816020860160208601612e3f565b601f01601f19169290920160200192915050565b6020815260006112176020830184612e6b565b600060208284031215612ebc57600080fd5b5035919050565b80356001600160a01b0381168114612eda57600080fd5b919050565b60008060408385031215612ef257600080fd5b612efb83612ec3565b946020939093013593505050565b600080600060608486031215612f1e57600080fd5b612f2784612ec3565b9250612f3560208501612ec3565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715612f7d57612f7d612f45565b60405290565b604051608081016001600160401b0381118282101715612f7d57612f7d612f45565b604051601f8201601f191681016001600160401b0381118282101715612fcd57612fcd612f45565b604052919050565b60006001600160401b03831115612fee57612fee612f45565b613001601f8401601f1916602001612fa5565b905082815283838301111561301557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261303d57600080fd5b61121783833560208501612fd5565b80358015158114612eda57600080fd5b600060a0828403121561306e57600080fd5b60405160a081016001600160401b03828210818311171561309157613091612f45565b8160405282935084359150808211156130a957600080fd5b506130b68582860161302c565b8252506130c56020840161304c565b60208201526130d66040840161304c565b6040820152606083013560608201526130f160808401612ec3565b60808201525092915050565b60006001600160401b0382111561311657613116612f45565b5060051b60200190565b600082601f83011261313157600080fd5b81356020613146613141836130fd565b612fa5565b82815260059290921b8401810191818101908684111561316557600080fd5b8286015b848110156132545780356001600160401b03808211156131895760008081fd5b908801906060828b03601f19018113156131a35760008081fd5b6131ab612f5b565b878401358152604080850135848111156131c55760008081fd5b85019350603f84018d136131d95760008081fd5b888401356131e9613141826130fd565b81815260059190911b85018201908a8101908f8311156132095760008081fd5b958301955b8287101561322e5761321f87612ec3565b8252958b0195908b019061320e565b848c015250613240905085840161304c565b908201528652505050918301918301613169565b509695505050505050565b60008060006060848603121561327457600080fd5b83356001600160401b038082111561328b57600080fd5b908501906080828803121561329f57600080fd5b6132a7612f83565b8235828111156132b657600080fd5b6132c28982860161302c565b8252506020830135828111156132d757600080fd5b6132e38982860161302c565b6020830152506132f560408401612ec3565b60408201526133066060840161304c565b60608201529450602086013591508082111561332157600080fd5b61332d8783880161305c565b9350604086013591508082111561334357600080fd5b5061335086828701613120565b9150509250925092565b6000806040838503121561336d57600080fd5b50508035926020909101359150565b60008060006060848603121561339157600080fd5b83356001600160401b03808211156133a857600080fd5b9085019060a082880312156133bc57600080fd5b909350602085013590808211156133d257600080fd5b506133df86828701613120565b9250506133ee6040850161304c565b90509250925092565b6000806040838503121561340a57600080fd5b8235915061341a60208401612ec3565b90509250929050565b60006020828403121561343557600080fd5b61121782612ec3565b60008060006060848603121561345357600080fd5b61345c84612ec3565b92506020840135915060408401356001600160401b0381111561347e57600080fd5b6133508682870161302c565b6000806040838503121561349d57600080fd5b6134a683612ec3565b915061341a6020840161304c565b6000806000606084860312156134c957600080fd5b8335925060208401356001600160401b038111156134e657600080fd5b6133df8682870161302c565b6000806000806080858703121561350857600080fd5b61351185612ec3565b935061351f60208601612ec3565b92506040850135915060608501356001600160401b0381111561354157600080fd5b8501601f8101871361355257600080fd5b61356187823560208401612fd5565b91505092959194509250565b6000806040838503121561358057600080fd5b61358983612ec3565b915061341a60208401612ec3565b600181811c908216806135ab57607f821691505b6020821081036135cb57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b601f8211156108ec57600081815260208120601f850160051c810160208610156136465750805b601f850160051c820191505b8181101561366557828155600101613652565b505050505050565b81516001600160401b0381111561368657613686612f45565b61369a816136948454613597565b8461361f565b602080601f8311600181146136cf57600084156136b75750858301515b600019600386901b1c1916600185901b178555613665565b600085815260208120601f198616915b828110156136fe578886015182559484019460019091019084016136df565b508582101561371c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561375c5761375c61372c565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261378657613786613761565b500490565b600080835461379981613597565b600182811680156137b157600181146137c6576137f5565b60ff19841687528215158302870194506137f5565b8760005260208060002060005b858110156137ec5781548a8201529084019082016137d3565b50505082870194505b50929695505050505050565b6000808335601e1984360301811261381857600080fd5b8301803591506001600160401b0382111561383257600080fd5b602001915036819003821315610ba757600080fd5b8183823760009101908152919050565b6001600160401b0383111561386e5761386e612f45565b6138828361387c8354613597565b8361361f565b6000601f8411600181146138b6576000851561389e5750838201355b600019600387901b1c1916600186901b178355613910565b600083815260209020601f19861690835b828110156138e757868501358255602094850194600190920191016138c7565b50868210156139045760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60006020828403121561392957600080fd5b6112178261304c565b6000828210156139445761394461372c565b500390565b6000821982111561395c5761395c61372c565b500190565b60008351613973818460208801612e3f565b835190830190613987818360208801612e3f565b01949350505050565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a20000000008152600083516139c881601c850160208801612e3f565b731610113332b2afb932b1b4b834b2b73a111d101160611b601c9184019182015283516139fc816030840160208801612e3f565b61227d60f01b60309290910191820152603201949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613a4f81601d850160208701612e3f565b91909101601d0192915050565b634e487b7160e01b600052603260045260246000fd5b600081613a8157613a8161372c565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b7f4772616e756c6172526f6c65733a20696e76616c696420726f6c652000000000815260008251613b5e81601c850160208701612e3f565b91909101601c0192915050565b600060018201613b7d57613b7d61372c565b5060010190565b73023b930b73ab630b92937b632b99d103937b632960651b815260008251613bb3816014850160208701612e3f565b691034b990333937bd32b760b11b6014939091019283015250601e01919050565b600082613be357613be3613761565b500690565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613c20816017850160208801612e3f565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613c51816028840160208801612e3f565b01602801949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613c9090830184612e6b565b9695505050505050565b600060208284031215613cac57600080fd5b815161121781612e0c56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220e77c9fd401d9ef21ceb51454db33aa87174a38c3950f5b07cfd1205efd791c6264736f6c634300080f0033496e697469616c697a61626c653a20636f6e747261637420697320616c726561496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420697f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775", + "deployedBytecode": "0x608060405234801561001057600080fd5b50600436106102955760003560e01c80637afdcdbb11610167578063b88d4fde116100ce578063e8a3d48511610087578063e8a3d48514610663578063e985e9c51461066b578063e9a9c850146106a7578063f153c2e5146106ce578063f2fde38b146106d6578063ffa1ad74146106e957600080fd5b8063b88d4fde146105dc578063b930908f146105ef578063c87b56dd14610616578063d547741f14610629578063de374d9d1461063c578063e3d520721461065057600080fd5b8063a217fddf11610120578063a217fddf1461054e578063a22cb46514610556578063a2f551ec14610569578063a3f4df7e1461057c578063a53a84b6146105ab578063b29c097a146105b557600080fd5b80637afdcdbb146104cf5780638d010db3146104e25780638da5cb5b1461050657806391d148541461051757806395d89b411461052a5780639da5b0a51461053257600080fd5b80632c23b9651161020b57806342966c68116101c457806342966c681461046b5780634e6f9dd61461047e5780636352211e1461048c5780636c0360eb1461049f57806370a08231146104a757806375b238fc146104ba57600080fd5b80632c23b965146103e45780632e628b611461040b5780632f2ff15d1461041e578063328825351461043157806336568abe1461044557806342842e0e1461045857600080fd5b8063206b60f91161025d578063206b60f91461032f57806321e92d491461035657806323b872dd14610369578063248a9ca31461037c57806325d22c8e1461039f5780632a55205a146103b257600080fd5b806301ffc9a71461029a57806306fdde03146102c2578063081812fc146102d7578063095ea7b31461030257806318160ddd14610317575b600080fd5b6102ad6102a8366004612e22565b6106f2565b60405190151581526020015b60405180910390f35b6102ca61071e565b6040516102b99190612e97565b6102ea6102e5366004612eaa565b6107b0565b6040516001600160a01b0390911681526020016102b9565b610315610310366004612edf565b6107d7565b005b6103216101365481565b6040519081526020016102b9565b6103217f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c81565b610315610364366004612edf565b6108f1565b610315610377366004612f09565b61099d565b61032161038a366004612eaa565b600090815260c9602052604090206001015490565b6103156103ad36600461325f565b6109ce565b6103c56103c036600461335a565b610b70565b604080516001600160a01b0390931683526020830191909152016102b9565b6103217f9b16859c0d694afa65b1b6551542db11ea12d6208b6a17dc922f10f2d74440f581565b61031561041936600461337c565b610bae565b61031561042c3660046133f7565b610d59565b610134546102ea906001600160a01b031681565b6103156104533660046133f7565b610d7e565b610315610466366004612f09565b610dfc565b610315610479366004612eaa565b610e17565b610131546102ad9060ff1681565b6102ea61049a366004612eaa565b610f8e565b6102ca610fee565b6103216104b5366004613423565b61107d565b610321600080516020613cf883398151915281565b6103216104dd36600461343e565b611103565b6102ad6104f0366004612eaa565b6101326020526000908152604090205460ff1681565b60fb546001600160a01b03166102ea565b6102ad6105253660046133f7565b6111c1565b6102ca61121e565b61053b61271081565b60405161ffff90911681526020016102b9565b610321600081565b61031561056436600461348a565b61122d565b6103156105773660046134b4565b611238565b6102ca6040518060400160405280601081526020016f115490cdcc8c539195141c9bd91d58dd60821b81525081565b6103216101355481565b6103217f852fd44a27d33057a8c3d90859d4e4c9f54309d4d66d1d968e063befba9198e681565b6103156105ea3660046134f2565b611445565b6103217fe97b137254058bd94f28d2f3eb79e2d34074ffb488d042e3bc958e0a57d2fa2281565b6102ca610624366004612eaa565b611477565b6103156106373660046133f7565b61157a565b610131546102ad9062010000900460ff1681565b610131546102ad90610100900460ff1681565b6102ca61159f565b6102ad61067936600461356d565b6001600160a01b039182166000908152606a6020908152604080832093909416825291909152205460ff1690565b6103217f154c00819833dac601ee5ddded6fda79d9d8b506b911b3dbd54cdb95fe6c368681565b61031561161b565b6103156106e4366004613423565b61166b565b61032161277481565b60006106fd8261199b565b8061071857506001600160e01b0319821663152a902d60e11b145b92915050565b60606065805461072d90613597565b80601f016020809104026020016040519081016040528092919081815260200182805461075990613597565b80156107a65780601f1061077b576101008083540402835291602001916107a6565b820191906000526020600020905b81548152906001019060200180831161078957829003601f168201915b5050505050905090565b60006107bb826119eb565b506000908152606960205260409020546001600160a01b031690565b60006107e282610f8e565b9050806001600160a01b0316836001600160a01b0316036108545760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b60648201526084015b60405180910390fd5b336001600160a01b038216148061087057506108708133610679565b6108e25760405162461bcd60e51b815260206004820152603e60248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f7420746f60448201527f6b656e206f776e6572206e6f7220617070726f76656420666f7220616c6c0000606482015260840161084b565b6108ec8383611a4d565b505050565b7f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c61091b81611abb565b6101315462010000900460ff166109745760405162461bcd60e51b815260206004820181905260248201527f5472616e736665723a205472616e7366657273206172652064697361626c6564604482015260640161084b565b60fb546040805160208101909152600081526108ec916001600160a01b03169085908590611ac5565b6109a73382611af8565b6109c35760405162461bcd60e51b815260040161084b906135d1565b6108ec838383611b76565b600054610100900460ff16158080156109ee5750600054600160ff909116105b80610a085750303b158015610a08575060005460ff166001145b610a6b5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161084b565b6000805460ff191660011790558015610a8e576000805461ff0019166101001790555b610aa084600001518560200151611d12565b610aa8611d43565b610aba83608001518460600151611d74565b60208301516101318054606087015160408701511515620100000262ff0000199115156101000261ff00199515159590951661ffff19909316929092179390931792909216919091179055825161013390610b15908261366d565b50610b24846040015183611df8565b8015610b6a576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a15b50505050565b610134546101355460009182916001600160a01b039091169061271090610b98908690613742565b610ba29190613777565b915091505b9250929050565b7f9b16859c0d694afa65b1b6551542db11ea12d6208b6a17dc922f10f2d74440f5610bd881611abb565b6101315460ff1680610c435750610133604051602001610bf8919061378b565b60408051601f198184030181529190528051602090910120610c1a8580613801565b604051602001610c2b929190613847565b60405160208183030381529060405280519060200120145b610c8f5760405162461bcd60e51b815260206004820152601a60248201527f5570646174653a204d657461646174612069732066726f7a656e000000000000604482015260640161084b565b610c998480613801565b61013391610ca8919083613857565b50610cc6610cbc60a0860160808701613423565b8560600135611d74565b610cd66060850160408601613917565b610ce857610131805462ff0000191690555b610cf86040850160208601613917565b158015610d0857506101315460ff165b15610d4257610131805460ff191690556040517fb59f45df38ec0d34114b1248c38a29cdbccbf3e745ae3ef310ac66199a4ceccf90600090a15b610d4b8361207c565b8115610b6a57610b6a61161b565b600082815260c96020526040902060010154610d7481611abb565b6108ec8383612366565b6001600160a01b0381163314610dee5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161084b565b610df882826123ec565b5050565b6108ec83838360405180602001604052806000815250611445565b7fe97b137254058bd94f28d2f3eb79e2d34074ffb488d042e3bc958e0a57d2fa22610e4181611abb565b61013154610100900460ff16610e995760405162461bcd60e51b815260206004820152601860248201527f4275726e3a204275726e73206172652064697361626c65640000000000000000604482015260640161084b565b6000828152606760205260409020546001600160a01b0316610efd5760405162461bcd60e51b815260206004820152601a60248201527f4275726e3a20546f6b656e20646f6573206e6f74206578697374000000000000604482015260640161084b565b60fb546001600160a01b0316610f1283610f8e565b6001600160a01b031614610f685760405162461bcd60e51b815260206004820181905260248201527f4275726e3a206e6f742068656c6420627920636f6e7472616374206f776e6572604482015260640161084b565b610f7182612453565b60016101366000828254610f859190613932565b90915550505050565b6000818152606760205260408120546001600160a01b0316806107185760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161084b565b6101338054610ffc90613597565b80601f016020809104026020016040519081016040528092919081815260200182805461102890613597565b80156110755780601f1061104a57610100808354040283529160200191611075565b820191906000526020600020905b81548152906001019060200180831161105857829003601f168201915b505050505081565b60006001600160a01b0382166110e75760405162461bcd60e51b815260206004820152602960248201527f4552433732313a2061646472657373207a65726f206973206e6f7420612076616044820152683634b21037bbb732b960b91b606482015260840161084b565b506001600160a01b031660009081526068602052604090205490565b60007f154c00819833dac601ee5ddded6fda79d9d8b506b911b3dbd54cdb95fe6c368661112f81611abb565b600260ff54036111815760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c00604482015260640161084b565b600260ff556111908585612493565b600161013660008282546111a49190613949565b909155506111b4905084846124ad565b5050600160ff5550919050565b60fb546000906001600160a01b03908116908316036111e257506001610718565b826111ef57506000610718565b611207600080516020613cf883398151915283611970565b8061121757506112178383611970565b9392505050565b60606066805461072d90613597565b610df8338383612540565b7f852fd44a27d33057a8c3d90859d4e4c9f54309d4d66d1d968e063befba9198e661126281611abb565b6000848152606760205260409020546001600160a01b03166112c65760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e3a20546f6b656e20646f6573206e6f742065786973740000000000604482015260640161084b565b6101315460ff166113195760405162461bcd60e51b815260206004820152601960248201527f546f6b656e3a204d657461646174612069732066726f7a656e00000000000000604482015260640161084b565b6000848152610132602052604090205460ff1615156001036113765760405162461bcd60e51b81526020600482015260166024820152752a37b5b2b71d102a37b5b2b71034b990333937bd32b760511b604482015260640161084b565b81806113825750825115155b6113ce5760405162461bcd60e51b815260206004820152601b60248201527f546f6b656e3a20546f6b656e20555249206973206d697373696e670000000000604482015260640161084b565b8251156113df576113df84846124ad565b8115610b6a57600084815261013260205260409020805460ff19166001179055837fa109ba539900bf1b633f956d63c96fc89b814c7287f7aa50a9216d0b5565720761142a82611477565b6040516114379190612e97565b60405180910390a250505050565b61144f3383611af8565b61146b5760405162461bcd60e51b815260040161084b906135d1565b610b6a84848484611ac5565b6060611482826119eb565b6000828152609760205260408120805461149b90613597565b80601f01602080910402602001604051908101604052809291908181526020018280546114c790613597565b80156115145780601f106114e957610100808354040283529160200191611514565b820191906000526020600020905b8154815290600101906020018083116114f757829003601f168201915b50505050509050600061152561260e565b90508051600003611537575092915050565b815115611569578082604051602001611551929190613961565b60405160208183030381529060405292505050919050565b6115728461261e565b949350505050565b600082815260c9602052604090206001015461159581611abb565b6108ec83836123ec565b606060006115ef6115b261013554612684565b610134546115ca906001600160a01b031660146117d5565b6040516020016115db929190613990565b604051602081830303815290604052612784565b90506000816040516020016116049190613a17565b60408051601f198184030181529190529392505050565b600080516020613cf883398151915261163381611abb565b60fc5461165890600080516020613cf8833981519152906001600160a01b03166123ec565b5060fc80546001600160a01b0319169055565b60fb546001600160a01b03908116908216036116c95760405162461bcd60e51b815260206004820181905260248201527f4772616e756c6172526f6c65733a20616c726561647920746865206f776e6572604482015260640161084b565b60fb546001600160a01b031633146117235760405162461bcd60e51b815260206004820152601c60248201527f4772616e756c6172526f6c65733a206e6f7420746865206f776e657200000000604482015260640161084b565b60fb5461174890600080516020613cf8833981519152906001600160a01b03166123ec565b60fb80546001600160a01b038381166001600160a01b031983168117909355169061178290600080516020613cf883398151915290612366565b816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6001600160a01b03163b151590565b606060006117e4836002613742565b6117ef906002613949565b6001600160401b0381111561180657611806612f45565b6040519080825280601f01601f191660200182016040528015611830576020820181803683370190505b509050600360fc1b8160008151811061184b5761184b613a5c565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061187a5761187a613a5c565b60200101906001600160f81b031916908160001a905350600061189e846002613742565b6118a9906001613949565b90505b6001811115611921576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106118dd576118dd613a5c565b1a60f81b8282815181106118f3576118f3613a5c565b60200101906001600160f81b031916908160001a90535060049490941c9361191a81613a72565b90506118ac565b5083156112175760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161084b565b600091825260c9602090815260408084206001600160a01b0393909316845291905290205460ff1690565b60006001600160e01b031982166380ac58cd60e01b14806119cc57506001600160e01b03198216635b5e139f60e01b145b8061071857506301ffc9a760e01b6001600160e01b0319831614610718565b6000818152606760205260409020546001600160a01b0316611a4a5760405162461bcd60e51b8152602060048201526018602482015277115490cdcc8c4e881a5b9d985b1a59081d1bdad95b88125160421b604482015260640161084b565b50565b600081815260696020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a8282610f8e565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b611a4a81336128ed565b611ad0848484611b76565b611adc84848484612951565b610b6a5760405162461bcd60e51b815260040161084b90613a89565b600080611b0483610f8e565b9050806001600160a01b0316846001600160a01b03161480611b4b57506001600160a01b038082166000908152606a602090815260408083209388168352929052205460ff165b806115725750836001600160a01b0316611b64846107b0565b6001600160a01b031614949350505050565b826001600160a01b0316611b8982610f8e565b6001600160a01b031614611bed5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161084b565b6001600160a01b038216611c4f5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161084b565b611c5a600082611a4d565b6001600160a01b0383166000908152606860205260408120805460019290611c83908490613932565b90915550506001600160a01b0382166000908152606860205260408120805460019290611cb1908490613949565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b600054610100900460ff16611d395760405162461bcd60e51b815260040161084b90613adb565b610df88282612a52565b600054610100900460ff16611d6a5760405162461bcd60e51b815260040161084b90613adb565b611d72612a92565b565b612710811115611dd05760405162461bcd60e51b815260206004820152602160248201527f43616e6e6f742073657420726f79616c7469657320746f206f766572203130306044820152602560f81b606482015260840161084b565b61013480546001600160a01b0319166001600160a01b03939093169290921790915561013555565b6001600160a01b038216611e4e5760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206d757374206861766520616e206f776e65720000000000604482015260640161084b565b60fb80546001600160a01b0384166001600160a01b0319918216811790925560fc805490911633179055611e9190600080516020613cf883398151915290612366565b60fc54611eb690600080516020613cf8833981519152906001600160a01b0316612366565b60005b81518110156108ec576000828281518110611ed657611ed6613a5c565b6020026020010151600001519050611eed81612ac0565b611ef88260206117d5565b604051602001611f089190613b26565b60405160208183030381529060405290611f355760405162461bcd60e51b815260040161084b9190612e97565b5060005b838381518110611f4b57611f4b613a5c565b6020026020010151602001515181101561202b57611f9f82858581518110611f7557611f75613a5c565b6020026020010151602001518381518110611f9257611f92613a5c565b6020026020010151612366565b600082815260fd602052604090208451859085908110611fc157611fc1613a5c565b6020026020010151602001518281518110611fde57611fde613a5c565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558061202381613b6b565b915050611f39565b5082828151811061203e5761203e613a5c565b6020026020010151604001511561206957600081815260fe60205260409020805460ff191660011790555b508061207481613b6b565b915050611eb9565b805115611a4a5761209b600080516020613cf8833981519152336111c1565b6120e75760405162461bcd60e51b815260206004820152601b60248201527f4772616e756c6172526f6c65733a206e6f7420616e2061646d696e0000000000604482015260640161084b565b60005b8151811015610df857600082828151811061210757612107613a5c565b602002602001015160000151905061211e81612ac0565b6121298260206117d5565b6040516020016121399190613b26565b604051602081830303815290604052906121665760405162461bcd60e51b815260040161084b9190612e97565b50600081815260fe602090815260409091205460ff1615906121899083906117d5565b6040516020016121999190613b84565b604051602081830303815290604052906121c65760405162461bcd60e51b815260040161084b9190612e97565b5060005b600082815260fd602052604090205481101561223257600082815260fd6020526040902080546122209184918490811061220657612206613a5c565b6000918252602090912001546001600160a01b03166123ec565b8061222a81613b6b565b9150506121ca565b50600081815260fd6020526040812061224a91612d9f565b60005b83838151811061225f5761225f613a5c565b602002602001015160200151518110156123155761228982858581518110611f7557611f75613a5c565b600082815260fd6020526040902084518590859081106122ab576122ab613a5c565b60200260200101516020015182815181106122c8576122c8613a5c565b60209081029190910181015182546001810184556000938452919092200180546001600160a01b0319166001600160a01b039092169190911790558061230d81613b6b565b91505061224d565b5082828151811061232857612328613a5c565b6020026020010151604001511561235357600081815260fe60205260409020805460ff191660011790555b508061235e81613b6b565b9150506120ea565b61237082826111c1565b610df857600082815260c9602090815260408083206001600160a01b03851684529091529020805460ff191660011790556123a83390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b6123f682826111c1565b15610df857600082815260c9602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b61245c81612b8f565b6000818152609760205260409020805461247590613597565b159050611a4a576000818152609760205260408120611a4a91612dbd565b610df8828260405180602001604052806000815250612c2a565b6000828152606760205260409020546001600160a01b03166125285760405162461bcd60e51b815260206004820152602e60248201527f45524337323155524953746f726167653a2055524920736574206f66206e6f6e60448201526d32bc34b9ba32b73a103a37b5b2b760911b606482015260840161084b565b60008281526097602052604090206108ec828261366d565b816001600160a01b0316836001600160a01b0316036125a15760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161084b565b6001600160a01b038381166000818152606a6020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6060610133805461072d90613597565b6060612629826119eb565b600061263361260e565b905060008151116126535760405180602001604052806000815250611217565b8061265d84612684565b60405160200161266e929190613961565b6040516020818303038152906040529392505050565b6060816000036126ab5750506040805180820190915260018152600360fc1b602082015290565b8160005b81156126d557806126bf81613b6b565b91506126ce9050600a83613777565b91506126af565b6000816001600160401b038111156126ef576126ef612f45565b6040519080825280601f01601f191660200182016040528015612719576020820181803683370190505b5090505b84156115725761272e600183613932565b915061273b600a86613bd4565b612746906030613949565b60f81b81838151811061275b5761275b613a5c565b60200101906001600160f81b031916908160001a90535061277d600a86613777565b945061271d565b805160609060008190036127a8575050604080516020810190915260008152919050565b600060036127b7836002613949565b6127c19190613777565b6127cc906004613742565b905060006127db826020613949565b6001600160401b038111156127f2576127f2612f45565b6040519080825280601f01601f19166020018201604052801561281c576020820181803683370190505b5090506000604051806060016040528060408152602001613cb8604091399050600181016020830160005b868110156128a8576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612847565b5060038606600181146128c257600281146128d3576128df565b613d3d60f01b6001198301526128df565b603d60f81b6000198301525b505050918152949350505050565b6128f782826111c1565b610df85761290f816001600160a01b031660146117d5565b61291a8360206117d5565b60405160200161292b929190613be8565b60408051601f198184030181529082905262461bcd60e51b825261084b91600401612e97565b60006001600160a01b0384163b15612a4757604051630a85bd0160e11b81526001600160a01b0385169063150b7a0290612995903390899088908890600401613c5d565b6020604051808303816000875af19250505080156129d0575060408051601f3d908101601f191682019092526129cd91810190613c9a565b60015b612a2d573d8080156129fe576040519150601f19603f3d011682016040523d82523d6000602084013e612a03565b606091505b508051600003612a255760405162461bcd60e51b815260040161084b90613a89565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611572565b506001949350505050565b600054610100900460ff16612a795760405162461bcd60e51b815260040161084b90613adb565b6065612a85838261366d565b5060666108ec828261366d565b600054610100900460ff16612ab95760405162461bcd60e51b815260040161084b90613adb565b600160ff55565b60007f154c00819833dac601ee5ddded6fda79d9d8b506b911b3dbd54cdb95fe6c3686821480612b0f57507f9b16859c0d694afa65b1b6551542db11ea12d6208b6a17dc922f10f2d74440f582145b80612b3957507f852fd44a27d33057a8c3d90859d4e4c9f54309d4d66d1d968e063befba9198e682145b80612b6357507fe97b137254058bd94f28d2f3eb79e2d34074ffb488d042e3bc958e0a57d2fa2282145b806107185750507f8502233096d909befbda0999bb8ea2f3a6be3c138b9fbf003752a4c8bce86f6c1490565b6000612b9a82610f8e565b9050612ba7600083611a4d565b6001600160a01b0381166000908152606860205260408120805460019290612bd0908490613932565b909155505060008281526067602052604080822080546001600160a01b0319169055518391906001600160a01b038416907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908390a45050565b612c348383612c5d565b612c416000848484612951565b6108ec5760405162461bcd60e51b815260040161084b90613a89565b6001600160a01b038216612cb35760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161084b565b6000818152606760205260409020546001600160a01b031615612d185760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161084b565b6001600160a01b0382166000908152606860205260408120805460019290612d41908490613949565b909155505060008181526067602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b5080546000825590600052602060002090810190611a4a9190612df3565b508054612dc990613597565b6000825580601f10612dd9575050565b601f016020900490600052602060002090810190611a4a91905b5b80821115612e085760008155600101612df4565b5090565b6001600160e01b031981168114611a4a57600080fd5b600060208284031215612e3457600080fd5b813561121781612e0c565b60005b83811015612e5a578181015183820152602001612e42565b83811115610b6a5750506000910152565b60008151808452612e83816020860160208601612e3f565b601f01601f19169290920160200192915050565b6020815260006112176020830184612e6b565b600060208284031215612ebc57600080fd5b5035919050565b80356001600160a01b0381168114612eda57600080fd5b919050565b60008060408385031215612ef257600080fd5b612efb83612ec3565b946020939093013593505050565b600080600060608486031215612f1e57600080fd5b612f2784612ec3565b9250612f3560208501612ec3565b9150604084013590509250925092565b634e487b7160e01b600052604160045260246000fd5b604051606081016001600160401b0381118282101715612f7d57612f7d612f45565b60405290565b604051608081016001600160401b0381118282101715612f7d57612f7d612f45565b604051601f8201601f191681016001600160401b0381118282101715612fcd57612fcd612f45565b604052919050565b60006001600160401b03831115612fee57612fee612f45565b613001601f8401601f1916602001612fa5565b905082815283838301111561301557600080fd5b828260208301376000602084830101529392505050565b600082601f83011261303d57600080fd5b61121783833560208501612fd5565b80358015158114612eda57600080fd5b600060a0828403121561306e57600080fd5b60405160a081016001600160401b03828210818311171561309157613091612f45565b8160405282935084359150808211156130a957600080fd5b506130b68582860161302c565b8252506130c56020840161304c565b60208201526130d66040840161304c565b6040820152606083013560608201526130f160808401612ec3565b60808201525092915050565b60006001600160401b0382111561311657613116612f45565b5060051b60200190565b600082601f83011261313157600080fd5b81356020613146613141836130fd565b612fa5565b82815260059290921b8401810191818101908684111561316557600080fd5b8286015b848110156132545780356001600160401b03808211156131895760008081fd5b908801906060828b03601f19018113156131a35760008081fd5b6131ab612f5b565b878401358152604080850135848111156131c55760008081fd5b85019350603f84018d136131d95760008081fd5b888401356131e9613141826130fd565b81815260059190911b85018201908a8101908f8311156132095760008081fd5b958301955b8287101561322e5761321f87612ec3565b8252958b0195908b019061320e565b848c015250613240905085840161304c565b908201528652505050918301918301613169565b509695505050505050565b60008060006060848603121561327457600080fd5b83356001600160401b038082111561328b57600080fd5b908501906080828803121561329f57600080fd5b6132a7612f83565b8235828111156132b657600080fd5b6132c28982860161302c565b8252506020830135828111156132d757600080fd5b6132e38982860161302c565b6020830152506132f560408401612ec3565b60408201526133066060840161304c565b60608201529450602086013591508082111561332157600080fd5b61332d8783880161305c565b9350604086013591508082111561334357600080fd5b5061335086828701613120565b9150509250925092565b6000806040838503121561336d57600080fd5b50508035926020909101359150565b60008060006060848603121561339157600080fd5b83356001600160401b03808211156133a857600080fd5b9085019060a082880312156133bc57600080fd5b909350602085013590808211156133d257600080fd5b506133df86828701613120565b9250506133ee6040850161304c565b90509250925092565b6000806040838503121561340a57600080fd5b8235915061341a60208401612ec3565b90509250929050565b60006020828403121561343557600080fd5b61121782612ec3565b60008060006060848603121561345357600080fd5b61345c84612ec3565b92506020840135915060408401356001600160401b0381111561347e57600080fd5b6133508682870161302c565b6000806040838503121561349d57600080fd5b6134a683612ec3565b915061341a6020840161304c565b6000806000606084860312156134c957600080fd5b8335925060208401356001600160401b038111156134e657600080fd5b6133df8682870161302c565b6000806000806080858703121561350857600080fd5b61351185612ec3565b935061351f60208601612ec3565b92506040850135915060608501356001600160401b0381111561354157600080fd5b8501601f8101871361355257600080fd5b61356187823560208401612fd5565b91505092959194509250565b6000806040838503121561358057600080fd5b61358983612ec3565b915061341a60208401612ec3565b600181811c908216806135ab57607f821691505b6020821081036135cb57634e487b7160e01b600052602260045260246000fd5b50919050565b6020808252602e908201527f4552433732313a2063616c6c6572206973206e6f7420746f6b656e206f776e6560408201526d1c881b9bdc88185c1c1c9bdd995960921b606082015260800190565b601f8211156108ec57600081815260208120601f850160051c810160208610156136465750805b601f850160051c820191505b8181101561366557828155600101613652565b505050505050565b81516001600160401b0381111561368657613686612f45565b61369a816136948454613597565b8461361f565b602080601f8311600181146136cf57600084156136b75750858301515b600019600386901b1c1916600185901b178555613665565b600085815260208120601f198616915b828110156136fe578886015182559484019460019091019084016136df565b508582101561371c5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b634e487b7160e01b600052601160045260246000fd5b600081600019048311821515161561375c5761375c61372c565b500290565b634e487b7160e01b600052601260045260246000fd5b60008261378657613786613761565b500490565b600080835461379981613597565b600182811680156137b157600181146137c6576137f5565b60ff19841687528215158302870194506137f5565b8760005260208060002060005b858110156137ec5781548a8201529084019082016137d3565b50505082870194505b50929695505050505050565b6000808335601e1984360301811261381857600080fd5b8301803591506001600160401b0382111561383257600080fd5b602001915036819003821315610ba757600080fd5b8183823760009101908152919050565b6001600160401b0383111561386e5761386e612f45565b6138828361387c8354613597565b8361361f565b6000601f8411600181146138b6576000851561389e5750838201355b600019600387901b1c1916600186901b178355613910565b600083815260209020601f19861690835b828110156138e757868501358255602094850194600190920191016138c7565b50868210156139045760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b60006020828403121561392957600080fd5b6112178261304c565b6000828210156139445761394461372c565b500390565b6000821982111561395c5761395c61372c565b500190565b60008351613973818460208801612e3f565b835190830190613987818360208801612e3f565b01949350505050565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a20000000008152600083516139c881601c850160208801612e3f565b731610113332b2afb932b1b4b834b2b73a111d101160611b601c9184019182015283516139fc816030840160208801612e3f565b61227d60f01b60309290910191820152603201949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613a4f81601d850160208701612e3f565b91909101601d0192915050565b634e487b7160e01b600052603260045260246000fd5b600081613a8157613a8161372c565b506000190190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b7f4772616e756c6172526f6c65733a20696e76616c696420726f6c652000000000815260008251613b5e81601c850160208701612e3f565b91909101601c0192915050565b600060018201613b7d57613b7d61372c565b5060010190565b73023b930b73ab630b92937b632b99d103937b632960651b815260008251613bb3816014850160208701612e3f565b691034b990333937bd32b760b11b6014939091019283015250601e01919050565b600082613be357613be3613761565b500690565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351613c20816017850160208801612e3f565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613c51816028840160208801612e3f565b01602801949350505050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613c9090830184612e6b565b9695505050505050565b600060208284031215613cac57600080fd5b815161121781612e0c56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220e77c9fd401d9ef21ceb51454db33aa87174a38c3950f5b07cfd1205efd791c6264736f6c634300080f0033", + "devdoc": { + "kind": "dev", + "methods": { + "approve(address,uint256)": { + "details": "See {IERC721-approve}." + }, + "balanceOf(address)": { + "details": "See {IERC721-balanceOf}." + }, + "contractURI()": { + "details": "OpenSea contract metadata, returns a base64 encoded JSON string containing royalties basis points and royalties address" + }, + "getApproved(uint256)": { + "details": "See {IERC721-getApproved}." + }, + "getRoleAdmin(bytes32)": { + "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." + }, + "grantRole(bytes32,address)": { + "details": "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." + }, + "hasRole(bytes32,address)": { + "details": "Returns `true` if `account` has been granted `role`." + }, + "isApprovedForAll(address,address)": { + "details": "See {IERC721-isApprovedForAll}." + }, + "name()": { + "details": "See {IERC721Metadata-name}." + }, + "ownerOf(uint256)": { + "details": "See {IERC721-ownerOf}." + }, + "renounceRole(bytes32,address)": { + "details": "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." + }, + "revokeRole(bytes32,address)": { + "details": "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." + }, + "safeTransferFrom(address,address,uint256)": { + "details": "See {IERC721-safeTransferFrom}." + }, + "safeTransferFrom(address,address,uint256,bytes)": { + "details": "See {IERC721-safeTransferFrom}." + }, + "setApprovalForAll(address,bool)": { + "details": "See {IERC721-setApprovalForAll}." + }, + "symbol()": { + "details": "See {IERC721Metadata-symbol}." + }, + "tokenURI(uint256)": { + "details": "See {IERC721Metadata-tokenURI}." + }, + "transferFrom(address,address,uint256)": { + "details": "See {IERC721-transferFrom}." + } + }, + "version": 1 + }, + "userdoc": { + "kind": "user", + "methods": {}, + "version": 1 + }, + "storageLayout": { + "storage": [ + { + "astId": 419, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "_initialized", + "offset": 0, + "slot": "0", + "type": "t_uint8" + }, + { + "astId": 422, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 3527, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 3797, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 2074, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "_name", + "offset": 0, + "slot": "101", + "type": "t_string_storage" + }, + { + "astId": 2076, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "_symbol", + "offset": 0, + "slot": "102", + "type": "t_string_storage" + }, + { + "astId": 2080, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "_owners", + "offset": 0, + "slot": "103", + "type": "t_mapping(t_uint256,t_address)" + }, + { + "astId": 2084, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "_balances", + "offset": 0, + "slot": "104", + "type": "t_mapping(t_address,t_uint256)" + }, + { + "astId": 2088, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "_tokenApprovals", + "offset": 0, + "slot": "105", + "type": "t_mapping(t_uint256,t_address)" + }, + { + "astId": 2094, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "_operatorApprovals", + "offset": 0, + "slot": "106", + "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" + }, + { + "astId": 2936, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "__gap", + "offset": 0, + "slot": "107", + "type": "t_array(t_uint256)44_storage" + }, + { + "astId": 3099, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "_tokenURIs", + "offset": 0, + "slot": "151", + "type": "t_mapping(t_uint256,t_string_storage)" + }, + { + "astId": 3215, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 39, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "_roles", + "offset": 0, + "slot": "201", + "type": "t_mapping(t_bytes32,t_struct(RoleData)34_storage)" + }, + { + "astId": 338, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "__gap", + "offset": 0, + "slot": "202", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 6742, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "_owner", + "offset": 0, + "slot": "251", + "type": "t_address" + }, + { + "astId": 6744, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "_nftPort", + "offset": 0, + "slot": "252", + "type": "t_address" + }, + { + "astId": 6749, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "_rolesAddressesIndexed", + "offset": 0, + "slot": "253", + "type": "t_mapping(t_bytes32,t_array(t_address)dyn_storage)" + }, + { + "astId": 6753, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "_rolesFrozen", + "offset": 0, + "slot": "254", + "type": "t_mapping(t_bytes32,t_bool)" + }, + { + "astId": 577, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "_status", + "offset": 0, + "slot": "255", + "type": "t_uint256" + }, + { + "astId": 621, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "__gap", + "offset": 0, + "slot": "256", + "type": "t_array(t_uint256)49_storage" + }, + { + "astId": 8229, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "metadataUpdatable", + "offset": 0, + "slot": "305", + "type": "t_bool" + }, + { + "astId": 8231, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "tokensBurnable", + "offset": 1, + "slot": "305", + "type": "t_bool" + }, + { + "astId": 8233, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "tokensTransferable", + "offset": 2, + "slot": "305", + "type": "t_bool" + }, + { + "astId": 8237, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "freezeTokenUris", + "offset": 0, + "slot": "306", + "type": "t_mapping(t_uint256,t_bool)" + }, + { + "astId": 8239, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "baseURI", + "offset": 0, + "slot": "307", + "type": "t_string_storage" + }, + { + "astId": 8241, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "royaltiesAddress", + "offset": 0, + "slot": "308", + "type": "t_address" + }, + { + "astId": 8243, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "royaltiesBasisPoints", + "offset": 0, + "slot": "309", + "type": "t_uint256" + }, + { + "astId": 8245, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "totalSupply", + "offset": 0, + "slot": "310", + "type": "t_uint256" + } + ], + "types": { + "t_address": { + "encoding": "inplace", + "label": "address", + "numberOfBytes": "20" + }, + "t_array(t_address)dyn_storage": { + "base": "t_address", + "encoding": "dynamic_array", + "label": "address[]", + "numberOfBytes": "32" + }, + "t_array(t_uint256)44_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[44]", + "numberOfBytes": "1408" + }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, + "t_bool": { + "encoding": "inplace", + "label": "bool", + "numberOfBytes": "1" + }, + "t_bytes32": { + "encoding": "inplace", + "label": "bytes32", + "numberOfBytes": "32" + }, + "t_mapping(t_address,t_bool)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_address,t_mapping(t_address,t_bool))": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => mapping(address => bool))", + "numberOfBytes": "32", + "value": "t_mapping(t_address,t_bool)" + }, + "t_mapping(t_address,t_uint256)": { + "encoding": "mapping", + "key": "t_address", + "label": "mapping(address => uint256)", + "numberOfBytes": "32", + "value": "t_uint256" + }, + "t_mapping(t_bytes32,t_array(t_address)dyn_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => address[])", + "numberOfBytes": "32", + "value": "t_array(t_address)dyn_storage" + }, + "t_mapping(t_bytes32,t_bool)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_bytes32,t_struct(RoleData)34_storage)": { + "encoding": "mapping", + "key": "t_bytes32", + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", + "numberOfBytes": "32", + "value": "t_struct(RoleData)34_storage" + }, + "t_mapping(t_uint256,t_address)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => address)", + "numberOfBytes": "32", + "value": "t_address" + }, + "t_mapping(t_uint256,t_bool)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => bool)", + "numberOfBytes": "32", + "value": "t_bool" + }, + "t_mapping(t_uint256,t_string_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => string)", + "numberOfBytes": "32", + "value": "t_string_storage" + }, + "t_string_storage": { + "encoding": "bytes", + "label": "string", + "numberOfBytes": "32" + }, + "t_struct(RoleData)34_storage": { + "encoding": "inplace", + "label": "struct AccessControlUpgradeable.RoleData", + "members": [ + { + "astId": 31, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "members", + "offset": 0, + "slot": "0", + "type": "t_mapping(t_address,t_bool)" + }, + { + "astId": 33, + "contract": "contracts/standalone/ERC721NFTProductContract.sol:ERC721NFTProductContract", + "label": "adminRole", + "offset": 0, + "slot": "1", + "type": "t_bytes32" + } + ], + "numberOfBytes": "64" + }, + "t_uint256": { + "encoding": "inplace", + "label": "uint256", + "numberOfBytes": "32" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" + } + } + } +} \ No newline at end of file diff --git a/deployments/polygon/NFTCollectionContract.json b/deployments/polygon/NFTCollectionContract.json index febc746..0ab2e23 100644 --- a/deployments/polygon/NFTCollectionContract.json +++ b/deployments/polygon/NFTCollectionContract.json @@ -1,5 +1,5 @@ { - "address": "0x387a294a2B92387cf46714FaA537F1F81d50c210", + "address": "0xD03404D44b778B1df1B1f0B94094AF1b17790d3D", "abi": [ { "inputs": [ @@ -27,7 +27,7 @@ }, { "internalType": "uint256", - "name": "mintPrice", + "name": "reservedSupply", "type": "uint256" }, { @@ -54,7 +54,27 @@ }, { "internalType": "bool", - "name": "metadataUpdatable", + "name": "metadataFrozen", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "publicMintPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "publicMintPriceFrozen", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "presaleMintPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "presaleMintPriceFrozen", "type": "bool" }, { @@ -96,6 +116,66 @@ "stateMutability": "nonpayable", "type": "constructor" }, + { + "inputs": [], + "name": "ApprovalCallerNotOwnerNorApproved", + "type": "error" + }, + { + "inputs": [], + "name": "ApprovalQueryForNonexistentToken", + "type": "error" + }, + { + "inputs": [], + "name": "ApprovalToCurrentOwner", + "type": "error" + }, + { + "inputs": [], + "name": "ApproveToCaller", + "type": "error" + }, + { + "inputs": [], + "name": "BalanceQueryForZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "MintToZeroAddress", + "type": "error" + }, + { + "inputs": [], + "name": "MintZeroQuantity", + "type": "error" + }, + { + "inputs": [], + "name": "OwnerQueryForNonexistentToken", + "type": "error" + }, + { + "inputs": [], + "name": "TransferCallerNotOwnerNorApproved", + "type": "error" + }, + { + "inputs": [], + "name": "TransferFromIncorrectOwner", + "type": "error" + }, + { + "inputs": [], + "name": "TransferToNonERC721ReceiverImplementer", + "type": "error" + }, + { + "inputs": [], + "name": "TransferToZeroAddress", + "type": "error" + }, { "anonymous": false, "inputs": [ @@ -146,6 +226,19 @@ "name": "ApprovalForAll", "type": "event" }, + { + "anonymous": false, + "inputs": [ + { + "indexed": false, + "internalType": "uint8", + "name": "version", + "type": "uint8" + } + ], + "name": "Initialized", + "type": "event" + }, { "anonymous": false, "inputs": [ @@ -291,6 +384,32 @@ "stateMutability": "view", "type": "function" }, + { + "inputs": [], + "name": "NAME", + "outputs": [ + { + "internalType": "string", + "name": "", + "type": "string" + } + ], + "stateMutability": "view", + "type": "function" + }, + { + "inputs": [], + "name": "ROYALTIES_BASIS", + "outputs": [ + { + "internalType": "uint16", + "name": "", + "type": "uint16" + } + ], + "stateMutability": "view", + "type": "function" + }, { "inputs": [], "name": "VERSION", @@ -323,14 +442,8 @@ "type": "function" }, { - "inputs": [ - { - "internalType": "address", - "name": "owner", - "type": "address" - } - ], - "name": "balanceOf", + "inputs": [], + "name": "availableSupply", "outputs": [ { "internalType": "uint256", @@ -342,13 +455,19 @@ "type": "function" }, { - "inputs": [], - "name": "baseURI", + "inputs": [ + { + "internalType": "address", + "name": "owner", + "type": "address" + } + ], + "name": "balanceOf", "outputs": [ { - "internalType": "string", + "internalType": "uint256", "name": "", - "type": "string" + "type": "uint256" } ], "stateMutability": "view", @@ -421,7 +540,7 @@ }, { "internalType": "uint256", - "name": "mintPrice", + "name": "reservedSupply", "type": "uint256" }, { @@ -448,7 +567,27 @@ }, { "internalType": "bool", - "name": "metadataUpdatable", + "name": "metadataFrozen", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "publicMintPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "publicMintPriceFrozen", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "presaleMintPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "presaleMintPriceFrozen", "type": "bool" }, { @@ -582,7 +721,7 @@ }, { "internalType": "uint256", - "name": "mintPrice", + "name": "reservedSupply", "type": "uint256" }, { @@ -609,7 +748,27 @@ }, { "internalType": "bool", - "name": "metadataUpdatable", + "name": "metadataFrozen", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "publicMintPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "publicMintPriceFrozen", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "presaleMintPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "presaleMintPriceFrozen", "type": "bool" }, { @@ -701,32 +860,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "maxSupply", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, - { - "inputs": [], - "name": "metadataUpdatable", - "outputs": [ - { - "internalType": "bool", - "name": "", - "type": "bool" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -740,19 +873,6 @@ "stateMutability": "payable", "type": "function" }, - { - "inputs": [], - "name": "mintPrice", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "mintingActive", @@ -811,19 +931,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "prerevealTokenURI", - "outputs": [ - { - "internalType": "string", - "name": "", - "type": "string" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "presaleActive", @@ -837,19 +944,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "presaleMerkleRoot", - "outputs": [ - { - "internalType": "bytes32", - "name": "", - "type": "bytes32" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -869,47 +963,52 @@ "type": "function" }, { - "inputs": [], - "name": "presaleMintStart", - "outputs": [ + "inputs": [ { - "internalType": "uint256", - "name": "", - "type": "uint256" + "internalType": "bytes32", + "name": "role", + "type": "bytes32" + }, + { + "internalType": "address", + "name": "account", + "type": "address" } ], - "stateMutability": "view", + "name": "renounceRole", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [], - "name": "publicMintStart", - "outputs": [ + "inputs": [ + { + "internalType": "address", + "name": "to", + "type": "address" + }, { "internalType": "uint256", - "name": "", + "name": "amount", "type": "uint256" } ], - "stateMutability": "view", + "name": "reserveMint", + "outputs": [], + "stateMutability": "nonpayable", "type": "function" }, { - "inputs": [ - { - "internalType": "bytes32", - "name": "role", - "type": "bytes32" - }, + "inputs": [], + "name": "reserveRemaining", + "outputs": [ { - "internalType": "address", - "name": "account", - "type": "address" + "internalType": "uint256", + "name": "", + "type": "uint256" } ], - "name": "renounceRole", - "outputs": [], - "stateMutability": "nonpayable", + "stateMutability": "view", "type": "function" }, { @@ -1079,19 +1178,6 @@ "stateMutability": "view", "type": "function" }, - { - "inputs": [], - "name": "tokensPerMint", - "outputs": [ - { - "internalType": "uint256", - "name": "", - "type": "uint256" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [], "name": "totalSupply", @@ -1154,19 +1240,6 @@ "stateMutability": "nonpayable", "type": "function" }, - { - "inputs": [], - "name": "treasuryAddress", - "outputs": [ - { - "internalType": "address", - "name": "", - "type": "address" - } - ], - "stateMutability": "view", - "type": "function" - }, { "inputs": [ { @@ -1178,7 +1251,27 @@ }, { "internalType": "bool", - "name": "metadataUpdatable", + "name": "metadataFrozen", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "publicMintPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "publicMintPriceFrozen", + "type": "bool" + }, + { + "internalType": "uint256", + "name": "presaleMintPrice", + "type": "uint256" + }, + { + "internalType": "bool", + "name": "presaleMintPriceFrozen", "type": "bool" }, { @@ -1230,94 +1323,134 @@ "type": "function" } ], - "transactionHash": "0x07e2b40aeb89650c1c4ee28e0bbab85ab4a2db4a48ff2cd5f2a0e8518124fcf4", + "transactionHash": "0x0cb5f2ea7bd415fc5453612a64207d222a355591d08776cb04917132fc461b8f", "receipt": { "to": null, - "from": "0xE7D7696C8f11278124f39fB7cDd39fD9442D5026", - "contractAddress": "0x387a294a2B92387cf46714FaA537F1F81d50c210", - "transactionIndex": 45, - "gasUsed": "3723231", - "logsBloom": "0x00000004000000002000000000000000000000000000000000000000000000000000000000000000000000000000000000008000000000000000000000000000000008000000000000000000000000800000000020000000000100000000000000000000020002000000000000000800000000000000000880000000000000000000000000000000000000000000004000000000000010000000000000000040200000000000000000100000000000000000000000000000001000000000004000000000000000000001000000000000000000000000000100100000000020000000000000000000000000008000000000000000100000000000040000100000", - "blockHash": "0xc94b5054c8429f7ab8240d3645a37cd54193615048bf3adf2d4cd329805cd01b", - "transactionHash": "0x07e2b40aeb89650c1c4ee28e0bbab85ab4a2db4a48ff2cd5f2a0e8518124fcf4", + "from": "0xd39Ec8F40acF251c092CE64A9db5EA428abC7E72", + "contractAddress": "0xD03404D44b778B1df1B1f0B94094AF1b17790d3D", + "transactionIndex": 117, + "gasUsed": "4102459", + "logsBloom": "0x00000004000000000000000000000000000000000000000000800000000000000000000000000000400020000000000000008000000000200000000000000000000000000000000000000000000000800001000020000000400100000000000000000000020000000000080000000800000000000100000880000000000000400000004000000000000000000000004000000000000080000000000000000004200000000000000000000000000400000000000000000000001020000000004000000000000000000001000000040000000000000000000100100000000020000000000000000000000000000000000000000000000000000000000000100000", + "blockHash": "0xc6b57a76b00dabfe6ecf3966e538de5de80d58c79d34566d64e4055f7f01fc1f", + "transactionHash": "0x0cb5f2ea7bd415fc5453612a64207d222a355591d08776cb04917132fc461b8f", "logs": [ { - "transactionIndex": 45, - "blockNumber": 26301051, - "transactionHash": "0x07e2b40aeb89650c1c4ee28e0bbab85ab4a2db4a48ff2cd5f2a0e8518124fcf4", - "address": "0x387a294a2B92387cf46714FaA537F1F81d50c210", + "transactionIndex": 117, + "blockNumber": 37895617, + "transactionHash": "0x0cb5f2ea7bd415fc5453612a64207d222a355591d08776cb04917132fc461b8f", + "address": "0xD03404D44b778B1df1B1f0B94094AF1b17790d3D", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 472, + "blockHash": "0xc6b57a76b00dabfe6ecf3966e538de5de80d58c79d34566d64e4055f7f01fc1f" + }, + { + "transactionIndex": 117, + "blockNumber": 37895617, + "transactionHash": "0x0cb5f2ea7bd415fc5453612a64207d222a355591d08776cb04917132fc461b8f", + "address": "0xD03404D44b778B1df1B1f0B94094AF1b17790d3D", "topics": [ "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", "0xa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775", - "0x000000000000000000000000e7d7696c8f11278124f39fb7cdd39fd9442d5026", - "0x000000000000000000000000e7d7696c8f11278124f39fb7cdd39fd9442d5026" + "0x000000000000000000000000d39ec8f40acf251c092ce64a9db5ea428abc7e72", + "0x000000000000000000000000d39ec8f40acf251c092ce64a9db5ea428abc7e72" ], "data": "0x", - "logIndex": 155, - "blockHash": "0xc94b5054c8429f7ab8240d3645a37cd54193615048bf3adf2d4cd329805cd01b" + "logIndex": 473, + "blockHash": "0xc6b57a76b00dabfe6ecf3966e538de5de80d58c79d34566d64e4055f7f01fc1f" }, { - "transactionIndex": 45, - "blockNumber": 26301051, - "transactionHash": "0x07e2b40aeb89650c1c4ee28e0bbab85ab4a2db4a48ff2cd5f2a0e8518124fcf4", - "address": "0x387a294a2B92387cf46714FaA537F1F81d50c210", + "transactionIndex": 117, + "blockNumber": 37895617, + "transactionHash": "0x0cb5f2ea7bd415fc5453612a64207d222a355591d08776cb04917132fc461b8f", + "address": "0xD03404D44b778B1df1B1f0B94094AF1b17790d3D", "topics": [ "0x2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d", "0x0000000000000000000000000000000000000000000000000000000000000000", - "0x000000000000000000000000e7d7696c8f11278124f39fb7cdd39fd9442d5026", - "0x000000000000000000000000e7d7696c8f11278124f39fb7cdd39fd9442d5026" + "0x000000000000000000000000d39ec8f40acf251c092ce64a9db5ea428abc7e72", + "0x000000000000000000000000d39ec8f40acf251c092ce64a9db5ea428abc7e72" ], "data": "0x", - "logIndex": 156, - "blockHash": "0xc94b5054c8429f7ab8240d3645a37cd54193615048bf3adf2d4cd329805cd01b" + "logIndex": 474, + "blockHash": "0xc6b57a76b00dabfe6ecf3966e538de5de80d58c79d34566d64e4055f7f01fc1f" + }, + { + "transactionIndex": 117, + "blockNumber": 37895617, + "transactionHash": "0x0cb5f2ea7bd415fc5453612a64207d222a355591d08776cb04917132fc461b8f", + "address": "0xD03404D44b778B1df1B1f0B94094AF1b17790d3D", + "topics": [ + "0x8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0", + "0x0000000000000000000000000000000000000000000000000000000000000000", + "0x000000000000000000000000d39ec8f40acf251c092ce64a9db5ea428abc7e72" + ], + "data": "0x", + "logIndex": 475, + "blockHash": "0xc6b57a76b00dabfe6ecf3966e538de5de80d58c79d34566d64e4055f7f01fc1f" + }, + { + "transactionIndex": 117, + "blockNumber": 37895617, + "transactionHash": "0x0cb5f2ea7bd415fc5453612a64207d222a355591d08776cb04917132fc461b8f", + "address": "0xD03404D44b778B1df1B1f0B94094AF1b17790d3D", + "topics": [ + "0x7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498" + ], + "data": "0x0000000000000000000000000000000000000000000000000000000000000001", + "logIndex": 476, + "blockHash": "0xc6b57a76b00dabfe6ecf3966e538de5de80d58c79d34566d64e4055f7f01fc1f" }, { - "transactionIndex": 45, - "blockNumber": 26301051, - "transactionHash": "0x07e2b40aeb89650c1c4ee28e0bbab85ab4a2db4a48ff2cd5f2a0e8518124fcf4", + "transactionIndex": 117, + "blockNumber": 37895617, + "transactionHash": "0x0cb5f2ea7bd415fc5453612a64207d222a355591d08776cb04917132fc461b8f", "address": "0x0000000000000000000000000000000000001010", "topics": [ "0x4dfe1bbbcf077ddc3e01291eea2d5c70c2b422b415d95645b9adcfd678cb1d63", "0x0000000000000000000000000000000000000000000000000000000000001010", - "0x000000000000000000000000e7d7696c8f11278124f39fb7cdd39fd9442d5026", - "0x000000000000000000000000b79fad4ca981472442f53d16365fdf0305ffd8e9" + "0x000000000000000000000000d39ec8f40acf251c092ce64a9db5ea428abc7e72", + "0x000000000000000000000000eedba2484aaf940f37cd3cd21a5d7c4a7dafbfc0" ], - "data": "0x000000000000000000000000000000000000000000000000019a0e065d376bce000000000000000000000000000000000000000000000001077c28eb0d0ca0c200000000000000000000000000000000000000000001517ea57aa9e2e34130d300000000000000000000000000000000000000000000000105e21ae4afd534f400000000000000000000000000000000000000000001517ea714b7e940789ca1", - "logIndex": 157, - "blockHash": "0xc94b5054c8429f7ab8240d3645a37cd54193615048bf3adf2d4cd329805cd01b" + "data": "0x00000000000000000000000000000000000000000000000001bf46de2b824f8400000000000000000000000000000000000000000000000029a2241af62c00000000000000000000000000000000000000000000000002be63511dbeb8285ddc00000000000000000000000000000000000000000000000027e2dd3ccaa9b07c0000000000000000000000000000000000000000000002be6510649ce3aaad60", + "logIndex": 477, + "blockHash": "0xc6b57a76b00dabfe6ecf3966e538de5de80d58c79d34566d64e4055f7f01fc1f" } ], - "blockNumber": 26301051, - "cumulativeGasUsed": "10492980", + "blockNumber": 37895617, + "cumulativeGasUsed": "23578612", "status": 1, "byzantium": true }, "args": [ { - "owner": "0xE7D7696C8f11278124f39fB7cDd39fD9442D5026", + "owner": "0xd39Ec8F40acF251c092CE64A9db5EA428abC7E72", "name": "NFTCollection", "symbol": "NFT", "maxSupply": 1000, + "reservedSupply": 0, "tokensPerMint": 10, - "mintPrice": "10000000000000000", - "treasuryAddress": "0xE7D7696C8f11278124f39fB7cDd39fD9442D5026" + "treasuryAddress": "0xd39Ec8F40acF251c092CE64A9db5EA428abC7E72" }, { "baseURI": "", "prerevealTokenURI": "", "publicMintStart": 0, + "publicMintPrice": "10000000000000000", "presaleMintStart": 0, + "presaleMintPrice": "10000000000000000", "presaleMerkleRoot": "0x0000000000000000000000000000000000000000000000000000000000000000", - "metadataUpdatable": true, + "metadataFrozen": false, "royaltiesBps": 250, - "royaltiesAddress": "0xE7D7696C8f11278124f39fB7cDd39fD9442D5026" + "royaltiesAddress": "0xd39Ec8F40acF251c092CE64A9db5EA428abC7E72" } ], - "numDeployments": 6, - "solcInputHash": "f3a51e4785acd4437dfd3cbe121b42b7", - "metadata": "{\"compiler\":{\"version\":\"0.8.11+commit.d7f03943\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"mintPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensPerMint\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"treasuryAddress\",\"type\":\"address\"}],\"internalType\":\"struct NFTCollection.DeploymentConfig\",\"name\":\"deploymentConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"metadataUpdatable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"publicMintStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"presaleMintStart\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"prerevealTokenURI\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"presaleMerkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"royaltiesBps\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"royaltiesAddress\",\"type\":\"address\"}],\"internalType\":\"struct NFTCollection.RuntimeConfig\",\"name\":\"runtimeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"baseURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"contractURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"mintPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensPerMint\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"treasuryAddress\",\"type\":\"address\"}],\"internalType\":\"struct NFTCollection.DeploymentConfig\",\"name\":\"deploymentConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"metadataUpdatable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"publicMintStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"presaleMintStart\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"prerevealTokenURI\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"presaleMerkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"royaltiesBps\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"royaltiesAddress\",\"type\":\"address\"}],\"internalType\":\"struct NFTCollection.RuntimeConfig\",\"name\":\"runtimeConfig\",\"type\":\"tuple\"}],\"internalType\":\"struct NFTCollection.ContractInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"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\":\"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\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"mintPrice\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensPerMint\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"treasuryAddress\",\"type\":\"address\"}],\"internalType\":\"struct NFTCollection.DeploymentConfig\",\"name\":\"deploymentConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"metadataUpdatable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"publicMintStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"presaleMintStart\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"prerevealTokenURI\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"presaleMerkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"royaltiesBps\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"royaltiesAddress\",\"type\":\"address\"}],\"internalType\":\"struct NFTCollection.RuntimeConfig\",\"name\":\"runtimeConfig\",\"type\":\"tuple\"}],\"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\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"proof\",\"type\":\"bytes32[]\"}],\"name\":\"isWhitelisted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"maxSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"metadataUpdatable\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mintPrice\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mintingActive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"prerevealTokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"presaleActive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"presaleMerkleRoot\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"proof\",\"type\":\"bytes32[]\"}],\"name\":\"presaleMint\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"presaleMintStart\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"publicMintStart\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"revokeRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salePrice\",\"type\":\"uint256\"}],\"name\":\"royaltyInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"tokensPerMint\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferAdminRights\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"treasuryAddress\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"metadataUpdatable\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"publicMintStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"presaleMintStart\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"prerevealTokenURI\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"presaleMerkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"royaltiesBps\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"royaltiesAddress\",\"type\":\"address\"}],\"internalType\":\"struct NFTCollection.RuntimeConfig\",\"name\":\"newConfig\",\"type\":\"tuple\"}],\"name\":\"updateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"contractURI()\":{\"details\":\"OpenSea contract metadata\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"getInfo()\":{\"details\":\"Convenience helper\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"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.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"Need name() to support setting it in the initializer instead of constructor\"},\"owner()\":{\"details\":\"Required for easy integration with OpenSea\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"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`.\"},\"revokeRole(bytes32,address)\":{\"details\":\"Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role.\"},\"royaltyInfo(uint256,uint256)\":{\"details\":\"ERC2981 token royalty info\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"Need symbol() to support setting it in the initializer instead of constructor\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"},\"updateConfig((string,bool,uint256,uint256,string,bytes32,uint256,address))\":{\"details\":\"Callable by admin roles only\"},\"withdrawFees()\":{\"details\":\"Callable by admin roles only\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"ADMIN_ROLE()\":{\"notice\":\"Admin role\"},\"VERSION()\":{\"notice\":\"Contract version, semver-style uint X_YY_ZZ\"},\"getInfo()\":{\"notice\":\"Get full contract information\"},\"initialize((string,string,address,uint256,uint256,uint256,address),(string,bool,uint256,uint256,string,bytes32,uint256,address))\":{\"notice\":\"Contract initializer\"},\"isWhitelisted(address,bytes32[])\":{\"notice\":\"Check if the wallet is whitelisted for the presale\"},\"mint(uint256)\":{\"notice\":\"Mint tokens\"},\"mintingActive()\":{\"notice\":\"Check if public minting is active\"},\"owner()\":{\"notice\":\"Contract owner address\"},\"presaleActive()\":{\"notice\":\"Check if presale minting is active\"},\"presaleMint(uint256,bytes32[])\":{\"notice\":\"Mint tokens if the wallet has been whitelisted\"},\"tokenURI(uint256)\":{\"notice\":\"Get the token metadata URI\"},\"totalSupply()\":{\"notice\":\"The number of currently minted tokens\"},\"transferAdminRights(address)\":{\"notice\":\"Transfer contract ownership\"},\"transferOwnership(address)\":{\"notice\":\"Transfer contract ownership\"},\"updateConfig((string,bool,uint256,uint256,string,bytes32,uint256,address))\":{\"notice\":\"Update contract configuration\"},\"withdrawFees()\":{\"notice\":\"Withdraw minting fees to the treasury address\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/deployables/NFTCollectionContract.sol\":\"NFTCollectionContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts/access/AccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControl.sol\\\";\\nimport \\\"../utils/Context.sol\\\";\\nimport \\\"../utils/Strings.sol\\\";\\nimport \\\"../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControl is Context, IAccessControl, ERC165 {\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role, _msgSender());\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControl).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n Strings.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n Strings.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n}\\n\",\"keccak256\":\"0x4a1a0ba12bf1a33f10d9fe226278cf59675c0b929d29e4da99658a079b27fb84\",\"license\":\"MIT\"},\"@openzeppelin/contracts/access/IAccessControl.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControl {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0x59ce320a585d7e1f163cd70390a0ef2ff9cec832e2aa544293a00692465a7a57\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (interfaces/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/IERC165.sol\\\";\\n\",\"keccak256\":\"0xd04b0f06e0666f29cf7cccc82894de541e19bb30a765b107b1e40bb7fe5f7d7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (interfaces/IERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Interface for the NFT Royalty Standard.\\n *\\n * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal\\n * support for royalty payments across all NFT marketplaces and ecosystem participants.\\n *\\n * _Available since v4.5._\\n */\\ninterface IERC2981 is IERC165 {\\n /**\\n * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of\\n * exchange. The royalty amount is denominated and should be payed in that same unit of exchange.\\n */\\n function royaltyInfo(uint256 tokenId, uint256 salePrice)\\n external\\n view\\n returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0x0117c84d8584216a032bbfc24a21077e672609fa4e788624aace97dd97ceec9b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/Address.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To initialize the implementation contract, you can either invoke the\\n * initializer manually, or you can include a constructor to automatically mark it as initialized when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() initializer {}\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n */\\n bool private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Modifier to protect an initializer function from being invoked twice.\\n */\\n modifier initializer() {\\n // If the contract is initializing we ignore whether _initialized is set in order to support multiple\\n // inheritance patterns, but we only do this in the context of a constructor, because in other contexts the\\n // contract may have been reentered.\\n require(_initializing ? _isConstructor() : !_initialized, \\\"Initializable: contract is already initialized\\\");\\n\\n bool isTopLevelCall = !_initializing;\\n if (isTopLevelCall) {\\n _initializing = true;\\n _initialized = true;\\n }\\n\\n _;\\n\\n if (isTopLevelCall) {\\n _initializing = false;\\n }\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} modifier, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n function _isConstructor() private view returns (bool) {\\n return !Address.isContract(address(this));\\n }\\n}\\n\",\"keccak256\":\"0x4823752b07b8ea4ca971b217e39457930e7cb103c2c91e2a29729e5ca907e4f0\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/ERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/ERC721/ERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC721.sol\\\";\\nimport \\\"./IERC721Receiver.sol\\\";\\nimport \\\"./extensions/IERC721Metadata.sol\\\";\\nimport \\\"../../utils/Address.sol\\\";\\nimport \\\"../../utils/Context.sol\\\";\\nimport \\\"../../utils/Strings.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\n * the Metadata extension, but not including the Enumerable extension, which is available separately as\\n * {ERC721Enumerable}.\\n */\\ncontract ERC721 is Context, ERC165, IERC721, IERC721Metadata {\\n using Address for address;\\n using Strings for uint256;\\n\\n // Token name\\n string private _name;\\n\\n // Token symbol\\n string private _symbol;\\n\\n // Mapping from token ID to owner address\\n mapping(uint256 => address) private _owners;\\n\\n // Mapping owner address to token count\\n mapping(address => uint256) private _balances;\\n\\n // Mapping from token ID to approved address\\n mapping(uint256 => address) private _tokenApprovals;\\n\\n // Mapping from owner to operator approvals\\n mapping(address => mapping(address => bool)) private _operatorApprovals;\\n\\n /**\\n * @dev Initializes the contract by setting a `name` and a `symbol` to the token collection.\\n */\\n constructor(string memory name_, string memory symbol_) {\\n _name = name_;\\n _symbol = symbol_;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165, IERC165) returns (bool) {\\n return\\n interfaceId == type(IERC721).interfaceId ||\\n interfaceId == type(IERC721Metadata).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721-balanceOf}.\\n */\\n function balanceOf(address owner) public view virtual override returns (uint256) {\\n require(owner != address(0), \\\"ERC721: balance query for the zero address\\\");\\n return _balances[owner];\\n }\\n\\n /**\\n * @dev See {IERC721-ownerOf}.\\n */\\n function ownerOf(uint256 tokenId) public view virtual override returns (address) {\\n address owner = _owners[tokenId];\\n require(owner != address(0), \\\"ERC721: owner query for nonexistent token\\\");\\n return owner;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-symbol}.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n require(_exists(tokenId), \\\"ERC721Metadata: URI query for nonexistent token\\\");\\n\\n string memory baseURI = _baseURI();\\n return bytes(baseURI).length > 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : \\\"\\\";\\n }\\n\\n /**\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\n * by default, can be overriden in child contracts.\\n */\\n function _baseURI() internal view virtual returns (string memory) {\\n return \\\"\\\";\\n }\\n\\n /**\\n * @dev See {IERC721-approve}.\\n */\\n function approve(address to, uint256 tokenId) public virtual override {\\n address owner = ERC721.ownerOf(tokenId);\\n require(to != owner, \\\"ERC721: approval to current owner\\\");\\n\\n require(\\n _msgSender() == owner || isApprovedForAll(owner, _msgSender()),\\n \\\"ERC721: approve caller is not owner nor approved for all\\\"\\n );\\n\\n _approve(to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-getApproved}.\\n */\\n function getApproved(uint256 tokenId) public view virtual override returns (address) {\\n require(_exists(tokenId), \\\"ERC721: approved query for nonexistent token\\\");\\n\\n return _tokenApprovals[tokenId];\\n }\\n\\n /**\\n * @dev See {IERC721-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual override {\\n _setApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC721-isApprovedForAll}.\\n */\\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\n return _operatorApprovals[owner][operator];\\n }\\n\\n /**\\n * @dev See {IERC721-transferFrom}.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) public virtual override {\\n //solhint-disable-next-line max-line-length\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: transfer caller is not owner nor approved\\\");\\n\\n _transfer(from, to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) public virtual override {\\n safeTransferFrom(from, to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory _data\\n ) public virtual override {\\n require(_isApprovedOrOwner(_msgSender(), tokenId), \\\"ERC721: transfer caller is not owner nor approved\\\");\\n _safeTransfer(from, to, tokenId, _data);\\n }\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * `_data` is additional data, it has no specified format and it is sent in call to `to`.\\n *\\n * This internal function is equivalent to {safeTransferFrom}, and can be used to e.g.\\n * implement alternative mechanisms to perform token transfer, such as signature-based.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeTransfer(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory _data\\n ) internal virtual {\\n _transfer(from, to, tokenId);\\n require(_checkOnERC721Received(from, to, tokenId, _data), \\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n }\\n\\n /**\\n * @dev Returns whether `tokenId` exists.\\n *\\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\n *\\n * Tokens start existing when they are minted (`_mint`),\\n * and stop existing when they are burned (`_burn`).\\n */\\n function _exists(uint256 tokenId) internal view virtual returns (bool) {\\n return _owners[tokenId] != address(0);\\n }\\n\\n /**\\n * @dev Returns whether `spender` is allowed to manage `tokenId`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function _isApprovedOrOwner(address spender, uint256 tokenId) internal view virtual returns (bool) {\\n require(_exists(tokenId), \\\"ERC721: operator query for nonexistent token\\\");\\n address owner = ERC721.ownerOf(tokenId);\\n return (spender == owner || getApproved(tokenId) == spender || isApprovedForAll(owner, spender));\\n }\\n\\n /**\\n * @dev Safely mints `tokenId` and transfers it to `to`.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeMint(address to, uint256 tokenId) internal virtual {\\n _safeMint(to, tokenId, \\\"\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-ERC721-_safeMint-address-uint256-}[`_safeMint`], with an additional `data` parameter which is\\n * forwarded in {IERC721Receiver-onERC721Received} to contract recipients.\\n */\\n function _safeMint(\\n address to,\\n uint256 tokenId,\\n bytes memory _data\\n ) internal virtual {\\n _mint(to, tokenId);\\n require(\\n _checkOnERC721Received(address(0), to, tokenId, _data),\\n \\\"ERC721: transfer to non ERC721Receiver implementer\\\"\\n );\\n }\\n\\n /**\\n * @dev Mints `tokenId` and transfers it to `to`.\\n *\\n * WARNING: Usage of this method is discouraged, use {_safeMint} whenever possible\\n *\\n * Requirements:\\n *\\n * - `tokenId` must not exist.\\n * - `to` cannot be the zero address.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _mint(address to, uint256 tokenId) internal virtual {\\n require(to != address(0), \\\"ERC721: mint to the zero address\\\");\\n require(!_exists(tokenId), \\\"ERC721: token already minted\\\");\\n\\n _beforeTokenTransfer(address(0), to, tokenId);\\n\\n _balances[to] += 1;\\n _owners[tokenId] = to;\\n\\n emit Transfer(address(0), to, tokenId);\\n\\n _afterTokenTransfer(address(0), to, tokenId);\\n }\\n\\n /**\\n * @dev Destroys `tokenId`.\\n * The approval is cleared when the token is burned.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _burn(uint256 tokenId) internal virtual {\\n address owner = ERC721.ownerOf(tokenId);\\n\\n _beforeTokenTransfer(owner, address(0), tokenId);\\n\\n // Clear approvals\\n _approve(address(0), tokenId);\\n\\n _balances[owner] -= 1;\\n delete _owners[tokenId];\\n\\n emit Transfer(owner, address(0), tokenId);\\n\\n _afterTokenTransfer(owner, address(0), tokenId);\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from `from` to `to`.\\n * As opposed to {transferFrom}, this imposes no restrictions on msg.sender.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 tokenId\\n ) internal virtual {\\n require(ERC721.ownerOf(tokenId) == from, \\\"ERC721: transfer from incorrect owner\\\");\\n require(to != address(0), \\\"ERC721: transfer to the zero address\\\");\\n\\n _beforeTokenTransfer(from, to, tokenId);\\n\\n // Clear approvals from the previous owner\\n _approve(address(0), tokenId);\\n\\n _balances[from] -= 1;\\n _balances[to] += 1;\\n _owners[tokenId] = to;\\n\\n emit Transfer(from, to, tokenId);\\n\\n _afterTokenTransfer(from, to, tokenId);\\n }\\n\\n /**\\n * @dev Approve `to` to operate on `tokenId`\\n *\\n * Emits a {Approval} event.\\n */\\n function _approve(address to, uint256 tokenId) internal virtual {\\n _tokenApprovals[tokenId] = to;\\n emit Approval(ERC721.ownerOf(tokenId), to, tokenId);\\n }\\n\\n /**\\n * @dev Approve `operator` to operate on all of `owner` tokens\\n *\\n * Emits a {ApprovalForAll} event.\\n */\\n function _setApprovalForAll(\\n address owner,\\n address operator,\\n bool approved\\n ) internal virtual {\\n require(owner != operator, \\\"ERC721: approve to caller\\\");\\n _operatorApprovals[owner][operator] = approved;\\n emit ApprovalForAll(owner, operator, approved);\\n }\\n\\n /**\\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target address.\\n * The call is not executed if the target address is not a contract.\\n *\\n * @param from address representing the previous owner of the given token ID\\n * @param to target address that will receive the tokens\\n * @param tokenId uint256 ID of the token to be transferred\\n * @param _data bytes optional data to send along with the call\\n * @return bool whether the call correctly returned the expected magic value\\n */\\n function _checkOnERC721Received(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory _data\\n ) private returns (bool) {\\n if (to.isContract()) {\\n try IERC721Receiver(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {\\n return retval == IERC721Receiver.onERC721Received.selector;\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n revert(\\\"ERC721: transfer to non ERC721Receiver implementer\\\");\\n } else {\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n } else {\\n return true;\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before any token transfer. This includes minting\\n * and burning.\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, ``from``'s `tokenId` will be\\n * transferred to `to`.\\n * - When `from` is zero, `tokenId` will be minted for `to`.\\n * - When `to` is zero, ``from``'s `tokenId` will be burned.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _beforeTokenTransfer(\\n address from,\\n address to,\\n uint256 tokenId\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after any transfer of tokens. This includes\\n * minting and burning.\\n *\\n * Calling conditions:\\n *\\n * - when `from` and `to` are both non-zero.\\n * - `from` and `to` are never both zero.\\n *\\n * To learn more about hooks, head to xref:ROOT:extending-contracts.adoc#using-hooks[Using Hooks].\\n */\\n function _afterTokenTransfer(\\n address from,\\n address to,\\n uint256 tokenId\\n ) internal virtual {}\\n}\\n\",\"keccak256\":\"0x11b84bb56dc112a6590bfe3e0efa118aa1b5891132342200d04c4ef544cb93de\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721 is IERC165 {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool _approved) external;\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes calldata data\\n ) external;\\n}\\n\",\"keccak256\":\"0x516a22876c1fab47f49b1bc22b4614491cd05338af8bd2e7b382da090a079990\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/IERC721Receiver.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721Receiver {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xd5fa74b4fb323776fa4a8158800fec9d5ac0fec0d6dd046dd93798632ada265f\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/ERC721/extensions/IERC721Metadata.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC721.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721Metadata is IERC721 {\\n /**\\n * @dev Returns the token collection name.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the token collection symbol.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n */\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x75b829ff2f26c14355d1cba20e16fe7b29ca58eb5fef665ede48bc0f9c6c74b9\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/common/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (token/common/ERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC2981.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.\\n *\\n * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for\\n * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.\\n *\\n * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the\\n * fee is specified in basis points by default.\\n *\\n * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See\\n * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to\\n * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.\\n *\\n * _Available since v4.5._\\n */\\nabstract contract ERC2981 is IERC2981, ERC165 {\\n struct RoyaltyInfo {\\n address receiver;\\n uint96 royaltyFraction;\\n }\\n\\n RoyaltyInfo private _defaultRoyaltyInfo;\\n mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @inheritdoc IERC2981\\n */\\n function royaltyInfo(uint256 _tokenId, uint256 _salePrice)\\n external\\n view\\n virtual\\n override\\n returns (address, uint256)\\n {\\n RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];\\n\\n if (royalty.receiver == address(0)) {\\n royalty = _defaultRoyaltyInfo;\\n }\\n\\n uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();\\n\\n return (royalty.receiver, royaltyAmount);\\n }\\n\\n /**\\n * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a\\n * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an\\n * override.\\n */\\n function _feeDenominator() internal pure virtual returns (uint96) {\\n return 10000;\\n }\\n\\n /**\\n * @dev Sets the royalty information that all ids in this contract will default to.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: invalid receiver\\\");\\n\\n _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Removes default royalty information.\\n */\\n function _deleteDefaultRoyalty() internal virtual {\\n delete _defaultRoyaltyInfo;\\n }\\n\\n /**\\n * @dev Sets the royalty information for a specific token id, overriding the global default.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must be already minted.\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setTokenRoyalty(\\n uint256 tokenId,\\n address receiver,\\n uint96 feeNumerator\\n ) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: Invalid parameters\\\");\\n\\n _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Resets royalty information for the token id back to the global default.\\n */\\n function _resetTokenRoyalty(uint256 tokenId) internal virtual {\\n delete _tokenRoyaltyInfo[tokenId];\\n }\\n}\\n\",\"keccak256\":\"0x73a07d6155bb2549828bf1ce4dce2300b5d78c958acb922e61a3341ea4279c97\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x2ccf9d2313a313d41a791505f2b5abfdc62191b5d4334f7f7a82691c088a1c87\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Context.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract Context {\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n}\\n\",\"keccak256\":\"0xe2e337e6dde9ef6b680e07338c493ebea1b5fd09b43424112868e9cc1706bca7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _HEX_SYMBOLS = \\\"0123456789abcdef\\\";\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n // Inspired by OraclizeAPI's implementation - MIT licence\\n // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n if (value == 0) {\\n return \\\"0\\\";\\n }\\n uint256 temp = value;\\n uint256 digits;\\n while (temp != 0) {\\n digits++;\\n temp /= 10;\\n }\\n bytes memory buffer = new bytes(digits);\\n while (value != 0) {\\n digits -= 1;\\n buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\\n value /= 10;\\n }\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n if (value == 0) {\\n return \\\"0x00\\\";\\n }\\n uint256 temp = value;\\n uint256 length = 0;\\n while (temp != 0) {\\n length++;\\n temp >>= 8;\\n }\\n return toHexString(value, length);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _HEX_SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n}\\n\",\"keccak256\":\"0x32c202bd28995dd20c4347b7c6467a6d3241c74c8ad3edcbb610cd9205916c45\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.5.0) (utils/cryptography/MerkleProof.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev These functions deal with verification of Merkle Trees proofs.\\n *\\n * The proofs can be generated using the JavaScript library\\n * https://github.com/miguelmota/merkletreejs[merkletreejs].\\n * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.\\n *\\n * See `test/utils/cryptography/MerkleProof.test.js` for some examples.\\n */\\nlibrary MerkleProof {\\n /**\\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n * defined by `root`. For this, a `proof` must be provided, containing\\n * sibling hashes on the branch from the leaf to the root of the tree. Each\\n * pair of leaves and each pair of pre-images are assumed to be sorted.\\n */\\n function verify(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProof(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Returns the rebuilt hash obtained by traversing a Merklee tree up\\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n * hash matches the root of the tree. When processing the proof, the pairs\\n * of leafs & pre-images are assumed to be sorted.\\n *\\n * _Available since v4.4._\\n */\\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n bytes32 proofElement = proof[i];\\n if (computedHash <= proofElement) {\\n // Hash(current computed hash + current element of the proof)\\n computedHash = _efficientHash(computedHash, proofElement);\\n } else {\\n // Hash(current element of the proof + current computed hash)\\n computedHash = _efficientHash(proofElement, computedHash);\\n }\\n }\\n return computedHash;\\n }\\n\\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\\n assembly {\\n mstore(0x00, a)\\n mstore(0x20, b)\\n value := keccak256(0x00, 0x40)\\n }\\n }\\n}\\n\",\"keccak256\":\"0xea64fbaccbf9d8c235cf6838240ddcebb97f9fc383660289e9dff32e4fb85f7a\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/deployables/NFTCollectionContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../templates/NFTCollection.sol\\\";\\n\\ncontract NFTCollectionContract is NFTCollection {\\n constructor(\\n DeploymentConfig memory deploymentConfig,\\n RuntimeConfig memory runtimeConfig\\n ) {\\n _preventInitialization = false;\\n initialize(deploymentConfig, runtimeConfig);\\n }\\n}\\n\",\"keccak256\":\"0xf420a54c2e02d5d36de44dc5ee171690fdeb46378cca80844223b519a1d5ac10\",\"license\":\"MIT\"},\"contracts/lib/Base64.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.4;\\n\\n/// @title Base64\\n/// @notice Provides a function for encoding some bytes in base64\\n/// @author Brecht Devos \\nlibrary Base64 {\\n bytes internal constant TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\\\";\\n\\n /// @notice Encodes some bytes to the base64 representation\\n function encode(bytes memory data) internal pure returns (string memory) {\\n uint256 len = data.length;\\n if (len == 0) return \\\"\\\";\\n\\n // multiply by 4/3 rounded up\\n uint256 encodedLen = 4 * ((len + 2) / 3);\\n\\n // Add some extra buffer at the end\\n bytes memory result = new bytes(encodedLen + 32);\\n\\n bytes memory table = TABLE;\\n\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let i := 0\\n } lt(i, len) {\\n\\n } {\\n i := add(i, 3)\\n let input := and(mload(add(data, i)), 0xffffff)\\n\\n let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n out := shl(8, out)\\n out := add(\\n out,\\n and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)\\n )\\n out := shl(8, out)\\n out := add(\\n out,\\n and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)\\n )\\n out := shl(8, out)\\n out := add(\\n out,\\n and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)\\n )\\n out := shl(224, out)\\n\\n mstore(resultPtr, out)\\n\\n resultPtr := add(resultPtr, 4)\\n }\\n\\n switch mod(len, 3)\\n case 1 {\\n mstore(sub(resultPtr, 2), shl(240, 0x3d3d))\\n }\\n case 2 {\\n mstore(sub(resultPtr, 1), shl(248, 0x3d))\\n }\\n\\n mstore(result, encodedLen)\\n }\\n\\n return string(result);\\n }\\n}\\n\",\"keccak256\":\"0xf07ba0116b91bfccdd8ce9b9615bc8249d818ac0c25c72cc53fea3aa69569c4c\",\"license\":\"MIT\"},\"contracts/lib/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport {IERC2981} from \\\"@openzeppelin/contracts/token/common/ERC2981.sol\\\";\\n\\nabstract contract ERC2981 is IERC165, IERC2981 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n virtual\\n override\\n returns (bool)\\n {\\n return interfaceId == type(IERC2981).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xa8b81ee9a467d26b366547a235506bce4f9f37b8966ea60d2abc56d4631833c4\",\"license\":\"MIT\"},\"contracts/templates/NFTCollection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Strings.sol\\\";\\nimport \\\"@openzeppelin/contracts/token/ERC721/ERC721.sol\\\";\\nimport \\\"@openzeppelin/contracts/access/AccessControl.sol\\\";\\nimport \\\"@openzeppelin/contracts/proxy/utils/Initializable.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\\\";\\n\\nimport \\\"../lib/ERC2981.sol\\\";\\nimport \\\"../lib/Base64.sol\\\";\\n\\ncontract NFTCollection is ERC721, ERC2981, AccessControl, Initializable {\\n using Address for address payable;\\n using Strings for uint256;\\n\\n /// Fixed at deployment time\\n struct DeploymentConfig {\\n /// Name of the NFT contract.\\n string name;\\n /// Symbol of the NFT contract.\\n string symbol;\\n /// The contract owner address. If you wish to own the contract, then set it as your wallet address.\\n /// This is also the wallet that can manage the contract on NFT marketplaces. Use `transferOwnership()`\\n /// to update the contract owner.\\n address owner;\\n /// The maximum number of tokens that can be minted in this collection.\\n uint256 maxSupply;\\n /// Minting price per token.\\n uint256 mintPrice;\\n /// The maximum number of tokens the user can mint per transaction.\\n uint256 tokensPerMint;\\n /// Treasury address is the address where minting fees can be withdrawn to.\\n /// Use `withdrawFees()` to transfer the entire contract balance to the treasury address.\\n address payable treasuryAddress;\\n }\\n\\n /// Updatable by admins and owner\\n struct RuntimeConfig {\\n /// Metadata base URI for tokens, NFTs minted in this contract will have metadata URI of `baseURI` + `tokenID`.\\n /// Set this to reveal token metadata.\\n string baseURI;\\n /// If true, the base URI of the NFTs minted in the specified contract can be updated after minting (token URIs\\n /// are not frozen on the contract level). This is useful for revealing NFTs after the drop. If false, all the\\n /// NFTs minted in this contract are frozen by default which means token URIs are non-updatable.\\n bool metadataUpdatable;\\n /// Starting timestamp for public minting.\\n uint256 publicMintStart;\\n /// Starting timestamp for whitelisted/presale minting.\\n uint256 presaleMintStart;\\n /// Pre-reveal token URI for placholder metadata. This will be returned for all token IDs until a `baseURI`\\n /// has been set.\\n string prerevealTokenURI;\\n /// Root of the Merkle tree of whitelisted addresses. This is used to check if a wallet has been whitelisted\\n /// for presale minting.\\n bytes32 presaleMerkleRoot;\\n /// Secondary market royalties in basis points (100 bps = 1%)\\n uint256 royaltiesBps;\\n /// Address for royalties\\n address royaltiesAddress;\\n }\\n\\n struct ContractInfo {\\n uint256 version;\\n DeploymentConfig deploymentConfig;\\n RuntimeConfig runtimeConfig;\\n }\\n\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n /*************\\n * Constants *\\n *************/\\n\\n /// Contract version, semver-style uint X_YY_ZZ\\n uint256 public constant VERSION = 1_01_00;\\n\\n /// Admin role\\n bytes32 public constant ADMIN_ROLE = keccak256(\\\"ADMIN_ROLE\\\");\\n\\n // Basis for calculating royalties.\\n // This has to be 10k for royaltiesBps to be in basis points.\\n uint16 constant ROYALTIES_BASIS = 10000;\\n\\n /********************\\n * Public variables *\\n ********************/\\n\\n /// The number of currently minted tokens\\n /// @dev Managed by the contract\\n uint256 public totalSupply;\\n\\n /***************************\\n * Contract initialization *\\n ***************************/\\n\\n constructor() ERC721(\\\"\\\", \\\"\\\") {\\n _preventInitialization = true;\\n }\\n\\n /// Contract initializer\\n function initialize(\\n DeploymentConfig memory deploymentConfig,\\n RuntimeConfig memory runtimeConfig\\n ) public initializer {\\n require(!_preventInitialization, \\\"Cannot be initialized\\\");\\n _validateDeploymentConfig(deploymentConfig);\\n\\n _grantRole(ADMIN_ROLE, msg.sender);\\n _grantRole(ADMIN_ROLE, deploymentConfig.owner);\\n _grantRole(DEFAULT_ADMIN_ROLE, deploymentConfig.owner);\\n\\n _deploymentConfig = deploymentConfig;\\n _runtimeConfig = runtimeConfig;\\n }\\n\\n /****************\\n * User actions *\\n ****************/\\n\\n /// Mint tokens\\n function mint(uint256 amount) external payable {\\n require(mintingActive(), \\\"Minting has not started yet\\\");\\n\\n _mintTokens(msg.sender, amount);\\n }\\n\\n /// Mint tokens if the wallet has been whitelisted\\n function presaleMint(uint256 amount, bytes32[] calldata proof)\\n external\\n payable\\n {\\n require(presaleActive(), \\\"Presale has not started yet\\\");\\n require(\\n isWhitelisted(msg.sender, proof),\\n \\\"Not whitelisted for presale\\\"\\n );\\n\\n _presaleMinted[msg.sender] = true;\\n _mintTokens(msg.sender, amount);\\n }\\n\\n /******************\\n * View functions *\\n ******************/\\n\\n /// Check if public minting is active\\n function mintingActive() public view returns (bool) {\\n return block.timestamp > _runtimeConfig.publicMintStart;\\n }\\n\\n /// Check if presale minting is active\\n function presaleActive() public view returns (bool) {\\n return block.timestamp > _runtimeConfig.presaleMintStart;\\n }\\n\\n /// Check if the wallet is whitelisted for the presale\\n function isWhitelisted(address wallet, bytes32[] calldata proof)\\n public\\n view\\n returns (bool)\\n {\\n require(!_presaleMinted[wallet], \\\"Already minted\\\");\\n\\n bytes32 leaf = keccak256(abi.encodePacked(wallet));\\n\\n return\\n MerkleProof.verify(proof, _runtimeConfig.presaleMerkleRoot, leaf);\\n }\\n\\n /// Contract owner address\\n /// @dev Required for easy integration with OpenSea\\n function owner() public view returns (address) {\\n return _deploymentConfig.owner;\\n }\\n\\n /*******************\\n * Access controls *\\n *******************/\\n\\n /// Transfer contract ownership\\n function transferOwnership(address newOwner)\\n external\\n onlyRole(DEFAULT_ADMIN_ROLE)\\n {\\n require(newOwner != _deploymentConfig.owner, \\\"Already the owner\\\");\\n\\n _revokeRole(ADMIN_ROLE, _deploymentConfig.owner);\\n _revokeRole(DEFAULT_ADMIN_ROLE, _deploymentConfig.owner);\\n\\n address previousOwner = _deploymentConfig.owner;\\n _deploymentConfig.owner = newOwner;\\n\\n _grantRole(ADMIN_ROLE, _deploymentConfig.owner);\\n _grantRole(DEFAULT_ADMIN_ROLE, _deploymentConfig.owner);\\n\\n emit OwnershipTransferred(previousOwner, newOwner);\\n }\\n\\n /// Transfer contract ownership\\n function transferAdminRights(address to) external onlyRole(ADMIN_ROLE) {\\n require(!hasRole(ADMIN_ROLE, to), \\\"Already an admin\\\");\\n require(msg.sender != _deploymentConfig.owner, \\\"Use transferOwnership\\\");\\n\\n _revokeRole(ADMIN_ROLE, msg.sender);\\n _grantRole(ADMIN_ROLE, to);\\n }\\n\\n /*****************\\n * Admin actions *\\n *****************/\\n\\n /// Get full contract information\\n /// @dev Convenience helper\\n function getInfo() external view returns (ContractInfo memory info) {\\n info.version = VERSION;\\n info.deploymentConfig = _deploymentConfig;\\n info.runtimeConfig = _runtimeConfig;\\n }\\n\\n /// Update contract configuration\\n /// @dev Callable by admin roles only\\n function updateConfig(RuntimeConfig calldata newConfig)\\n external\\n onlyRole(ADMIN_ROLE)\\n {\\n _validateRuntimeConfig(newConfig);\\n _runtimeConfig = newConfig;\\n }\\n\\n /// Withdraw minting fees to the treasury address\\n /// @dev Callable by admin roles only\\n function withdrawFees() external onlyRole(ADMIN_ROLE) {\\n _deploymentConfig.treasuryAddress.sendValue(address(this).balance);\\n }\\n\\n /*************\\n * Internals *\\n *************/\\n\\n /// Contract configuration\\n RuntimeConfig internal _runtimeConfig;\\n DeploymentConfig internal _deploymentConfig;\\n\\n /// Flag for disabling initalization for template contracts\\n bool internal _preventInitialization;\\n\\n /// Mapping for tracking presale mint status\\n mapping(address => bool) internal _presaleMinted;\\n\\n /// @dev Internal function for performing token mints\\n function _mintTokens(address to, uint256 amount) internal {\\n require(amount <= _deploymentConfig.tokensPerMint, \\\"Amount too large\\\");\\n require(\\n msg.value >= amount * _deploymentConfig.mintPrice,\\n \\\"Payment too small\\\"\\n );\\n\\n uint256 newSupply = totalSupply + amount;\\n require(\\n newSupply <= _deploymentConfig.maxSupply,\\n \\\"Maximum supply reached\\\"\\n );\\n\\n // Update totalSupply only once with the total minted amount\\n totalSupply = newSupply;\\n // Mint the required amount of tokens,\\n // starting with the highest token ID\\n for (uint256 i = 1; i <= amount; i++) {\\n _safeMint(to, totalSupply - i);\\n }\\n }\\n\\n /// Validate deployment config\\n function _validateDeploymentConfig(DeploymentConfig memory config)\\n internal\\n pure\\n {\\n require(config.maxSupply > 0, \\\"Maximum supply must be non-zero\\\");\\n require(config.tokensPerMint > 0, \\\"Tokens per mint must be non-zero\\\");\\n require(\\n config.treasuryAddress != address(0),\\n \\\"Treasury address cannot be the null address\\\"\\n );\\n require(config.owner != address(0), \\\"Contract must have an owner\\\");\\n }\\n\\n /// Validate a runtime configuration change\\n function _validateRuntimeConfig(RuntimeConfig calldata config)\\n internal\\n view\\n {\\n // Can't set royalties to more than 100%\\n require(config.royaltiesBps <= ROYALTIES_BASIS, \\\"Royalties too high\\\");\\n\\n // If metadata is updatable, we don't have any other limitations\\n if (_runtimeConfig.metadataUpdatable) return;\\n\\n // If it isn't, has we can't allow the flag to change anymore\\n require(\\n _runtimeConfig.metadataUpdatable == config.metadataUpdatable,\\n \\\"Cannot unfreeze metadata\\\"\\n );\\n\\n // We also can't allow base URI to change\\n require(\\n keccak256(abi.encodePacked(_runtimeConfig.baseURI)) ==\\n keccak256(abi.encodePacked(config.baseURI)),\\n \\\"Metadata is frozen\\\"\\n );\\n }\\n\\n /// @dev See {IERC165-supportsInterface}.\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(ERC721, AccessControl, ERC2981)\\n returns (bool)\\n {\\n return\\n ERC721.supportsInterface(interfaceId) ||\\n AccessControl.supportsInterface(interfaceId) ||\\n ERC2981.supportsInterface(interfaceId);\\n }\\n\\n /// Get the token metadata URI\\n function tokenURI(uint256 tokenId)\\n public\\n view\\n override\\n returns (string memory)\\n {\\n require(_exists(tokenId), \\\"Token does not exist\\\");\\n\\n return\\n bytes(_runtimeConfig.baseURI).length > 0\\n ? string(\\n abi.encodePacked(_runtimeConfig.baseURI, tokenId.toString())\\n )\\n : _runtimeConfig.prerevealTokenURI;\\n }\\n\\n /// @dev Need name() to support setting it in the initializer instead of constructor\\n function name() public view override returns (string memory) {\\n return _deploymentConfig.name;\\n }\\n\\n /// @dev Need symbol() to support setting it in the initializer instead of constructor\\n function symbol() public view override returns (string memory) {\\n return _deploymentConfig.symbol;\\n }\\n\\n /// @dev ERC2981 token royalty info\\n function royaltyInfo(uint256, uint256 salePrice)\\n external\\n view\\n returns (address receiver, uint256 royaltyAmount)\\n {\\n receiver = _runtimeConfig.royaltiesAddress;\\n royaltyAmount =\\n (_runtimeConfig.royaltiesBps * salePrice) /\\n ROYALTIES_BASIS;\\n }\\n\\n /// @dev OpenSea contract metadata\\n function contractURI() external view returns (string memory) {\\n string memory json = Base64.encode(\\n bytes(\\n string(\\n abi.encodePacked(\\n '{\\\"seller_fee_basis_points\\\": ',\\n _runtimeConfig.royaltiesBps.toString(),\\n ', \\\"fee_recipient\\\": \\\"',\\n uint256(uint160(_runtimeConfig.royaltiesAddress))\\n .toHexString(20),\\n '\\\"}'\\n )\\n )\\n )\\n );\\n\\n string memory output = string(\\n abi.encodePacked(\\\"data:application/json;base64,\\\", json)\\n );\\n\\n return output;\\n }\\n\\n /***********************\\n * Convenience getters *\\n ***********************/\\n\\n function maxSupply() public view returns (uint256) {\\n return _deploymentConfig.maxSupply;\\n }\\n\\n function mintPrice() public view returns (uint256) {\\n return _deploymentConfig.mintPrice;\\n }\\n\\n function tokensPerMint() public view returns (uint256) {\\n return _deploymentConfig.tokensPerMint;\\n }\\n\\n function treasuryAddress() public view returns (address) {\\n return _deploymentConfig.treasuryAddress;\\n }\\n\\n function publicMintStart() public view returns (uint256) {\\n return _runtimeConfig.publicMintStart;\\n }\\n\\n function presaleMintStart() public view returns (uint256) {\\n return _runtimeConfig.presaleMintStart;\\n }\\n\\n function presaleMerkleRoot() public view returns (bytes32) {\\n return _runtimeConfig.presaleMerkleRoot;\\n }\\n\\n function baseURI() public view returns (string memory) {\\n return _runtimeConfig.baseURI;\\n }\\n\\n function metadataUpdatable() public view returns (bool) {\\n return _runtimeConfig.metadataUpdatable;\\n }\\n\\n function prerevealTokenURI() public view returns (string memory) {\\n return _runtimeConfig.prerevealTokenURI;\\n }\\n}\\n\",\"keccak256\":\"0xaf71f510aa2f507cfb6998b4a82d0c6fda602ded8760e87e78b3127e6139a282\",\"license\":\"MIT\"}},\"version\":1}", - "bytecode": "0x60806040523480156200001157600080fd5b50604051620045bb380380620045bb833981016040819052620000349162000860565b604080516020808201808452600080845284519283019094528382528251929391926200006392919062000596565b5080516200007990600190602084019062000596565b50506018805460ff19169055506200009282826200009a565b5050620009a5565b600754610100900460ff16620000b75760075460ff1615620000c1565b620000c162000349565b6200012a5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b600754610100900460ff161580156200014d576007805461ffff19166101011790555b60185460ff1615620001a25760405162461bcd60e51b815260206004820152601560248201527f43616e6e6f7420626520696e697469616c697a65640000000000000000000000604482015260640162000121565b620001ad8362000367565b620001c86000805160206200459b83398151915233620004e2565b620001ed6000805160206200459b8339815191528460400151620004e260201b60201c565b60408301516200020090600090620004e2565b8251805184916011916200021c91839160209091019062000596565b50602082810151805162000237926001850192019062000596565b5060408201516002820180546001600160a01b03199081166001600160a01b0393841617909155606084015160038401556080840151600484015560a0840151600584015560c090930151600690920180549093169116179055815180518391600991620002ad91839160209091019062000596565b5060208281015160018301805460ff1916911515919091179055604083015160028301556060830151600383015560808301518051620002f4926004850192019062000596565b5060a0820151600582015560c0820151600682015560e090910151600790910180546001600160a01b0319166001600160a01b03909216919091179055801562000344576007805461ff00191690555b505050565b600062000361306200058760201b6200194c1760201c565b15905090565b6000816060015111620003bd5760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20737570706c79206d757374206265206e6f6e2d7a65726f00604482015260640162000121565b60008160a0015111620004135760405162461bcd60e51b815260206004820181905260248201527f546f6b656e7320706572206d696e74206d757374206265206e6f6e2d7a65726f604482015260640162000121565b60c08101516001600160a01b0316620004835760405162461bcd60e51b815260206004820152602b60248201527f547265617375727920616464726573732063616e6e6f7420626520746865206e60448201526a756c6c206164647265737360a81b606482015260840162000121565b60408101516001600160a01b0316620004df5760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206d757374206861766520616e206f776e65720000000000604482015260640162000121565b50565b60008281526006602090815260408083206001600160a01b038516845290915290205460ff16620005835760008281526006602090815260408083206001600160a01b03851684529091529020805460ff19166001179055620005423390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45b5050565b6001600160a01b03163b151590565b828054620005a49062000968565b90600052602060002090601f016020900481019282620005c8576000855562000613565b82601f10620005e357805160ff191683800117855562000613565b8280016001018555821562000613579182015b8281111562000613578251825591602001919060010190620005f6565b506200062192915062000625565b5090565b5b8082111562000621576000815560010162000626565b634e487b7160e01b600052604160045260246000fd5b60405161010081016001600160401b03811182821017156200067857620006786200063c565b60405290565b60405160e081016001600160401b03811182821017156200067857620006786200063c565b604051601f8201601f191681016001600160401b0381118282101715620006ce57620006ce6200063c565b604052919050565b600082601f830112620006e857600080fd5b81516001600160401b038111156200070457620007046200063c565b60206200071a601f8301601f19168201620006a3565b82815285828487010111156200072f57600080fd5b60005b838110156200074f57858101830151828201840152820162000732565b83811115620007615760008385840101525b5095945050505050565b80516001600160a01b03811681146200078357600080fd5b919050565b805180151581146200078357600080fd5b60006101008284031215620007ad57600080fd5b620007b762000652565b82519091506001600160401b0380821115620007d257600080fd5b620007e085838601620006d6565b8352620007f06020850162000788565b6020840152604084015160408401526060840151606084015260808401519150808211156200081e57600080fd5b506200082d84828501620006d6565b60808301525060a082015160a082015260c082015160c08201526200085560e083016200076b565b60e082015292915050565b600080604083850312156200087457600080fd5b82516001600160401b03808211156200088c57600080fd5b9084019060e08287031215620008a157600080fd5b620008ab6200067e565b825182811115620008bb57600080fd5b620008c988828601620006d6565b825250602083015182811115620008df57600080fd5b620008ed88828601620006d6565b60208301525062000901604084016200076b565b6040820152606083015160608201526080830151608082015260a083015160a08201526200093260c084016200076b565b60c082015260208601519094509150808211156200094f57600080fd5b506200095e8582860162000799565b9150509250929050565b600181811c908216806200097d57607f821691505b602082108114156200099f57634e487b7160e01b600052602260045260246000fd5b50919050565b613be680620009b56000396000f3fe60806040526004361061027d5760003560e01c806370a082311161014f578063b88d4fde116100c1578063e8a3d4851161007a578063e8a3d48514610740578063e985e9c514610755578063f2fde38b1461079e578063f4ad0f97146107be578063fa0440b6146107d3578063ffa1ad74146107f357600080fd5b8063b88d4fde1461069a578063c5f956af146106ba578063c87b56dd146106d8578063d547741f146106f8578063d5abeb0114610718578063e3e1e8ef1461072d57600080fd5b806391d148541161011357806391d14854146105fd57806395d89b411461061d578063a0712d6814610632578063a217fddf14610645578063a22cb4651461065a578063b5106add1461067a57600080fd5b806370a082311461056857806375b238fc14610588578063877bb1ae146105aa5780638cfec4c0146105ca5780638da5cb5b146105df57600080fd5b806331f9c919116101f357806353135ca0116101ac57806353135ca0146104c55780635a23dd99146104dc5780635a9b0b89146104fc5780636352211e1461051e5780636817c76c1461053e5780636c0360eb1461055357600080fd5b806331f9c9191461042c57806336568abe1461044357806342842e0e146104635780634653124b14610483578063476343ee146104985780634e6f9dd6146104ad57600080fd5b806318160ddd1161024557806318160ddd1461035257806322212e2b1461036857806323b872dd1461037d578063248a9ca31461039d5780632a55205a146103cd5780632f2ff15d1461040c57600080fd5b806301ffc9a71461028257806306fdde03146102b75780630807b9e2146102d9578063081812fc146102f8578063095ea7b314610330575b600080fd5b34801561028e57600080fd5b506102a261029d366004612cd1565b610809565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102cc610844565b6040516102ae9190612d46565b3480156102e557600080fd5b506016545b6040519081526020016102ae565b34801561030457600080fd5b50610318610313366004612d59565b6108d9565b6040516001600160a01b0390911681526020016102ae565b34801561033c57600080fd5b5061035061034b366004612d97565b610973565b005b34801561035e57600080fd5b506102ea60085481565b34801561037457600080fd5b50600e546102ea565b34801561038957600080fd5b50610350610398366004612dc3565b610a89565b3480156103a957600080fd5b506102ea6103b8366004612d59565b60009081526006602052604090206001015490565b3480156103d957600080fd5b506103ed6103e8366004612e04565b610aba565b604080516001600160a01b0390931683526020830191909152016102ae565b34801561041857600080fd5b50610350610427366004612e26565b610af1565b34801561043857600080fd5b50600b5442116102a2565b34801561044f57600080fd5b5061035061045e366004612e26565b610b17565b34801561046f57600080fd5b5061035061047e366004612dc3565b610b95565b34801561048f57600080fd5b50600c546102ea565b3480156104a457600080fd5b50610350610bb0565b3480156104b957600080fd5b50600a5460ff166102a2565b3480156104d157600080fd5b50600c5442116102a2565b3480156104e857600080fd5b506102a26104f7366004612ea1565b610be2565b34801561050857600080fd5b50610511610cc0565b6040516102ae9190612f78565b34801561052a57600080fd5b50610318610539366004612d59565b610fd7565b34801561054a57600080fd5b506015546102ea565b34801561055f57600080fd5b506102cc61104e565b34801561057457600080fd5b506102ea610583366004613029565b611060565b34801561059457600080fd5b506102ea600080516020613b9183398151915281565b3480156105b657600080fd5b506103506105c5366004613046565b6110e7565b3480156105d657600080fd5b50600b546102ea565b3480156105eb57600080fd5b506013546001600160a01b0316610318565b34801561060957600080fd5b506102a2610618366004612e26565b61111c565b34801561062957600080fd5b506102cc611147565b610350610640366004612d59565b611159565b34801561065157600080fd5b506102ea600081565b34801561066657600080fd5b5061035061067536600461309a565b6111b4565b34801561068657600080fd5b50610350610695366004613029565b6111bf565b3480156106a657600080fd5b506103506106b536600461319e565b6112b3565b3480156106c657600080fd5b506017546001600160a01b0316610318565b3480156106e457600080fd5b506102cc6106f3366004612d59565b6112e5565b34801561070457600080fd5b50610350610713366004612e26565b61141d565b34801561072457600080fd5b506014546102ea565b61035061073b36600461321d565b611443565b34801561074c57600080fd5b506102cc61150f565b34801561076157600080fd5b506102a261077036600461324f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107aa57600080fd5b506103506107b9366004613029565b61158c565b3480156107ca57600080fd5b506102cc6116be565b3480156107df57600080fd5b506103506107ee366004613356565b6116d0565b3480156107ff57600080fd5b506102ea61277481565b60006108148261195b565b806108235750610823826119ab565b8061083e575063152a902d60e11b6001600160e01b03198316145b92915050565b6060601160000180546108569061344b565b80601f01602080910402602001604051908101604052809291908181526020018280546108829061344b565b80156108cf5780601f106108a4576101008083540402835291602001916108cf565b820191906000526020600020905b8154815290600101906020018083116108b257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109575760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061097e82610fd7565b9050806001600160a01b0316836001600160a01b031614156109ec5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161094e565b336001600160a01b0382161480610a085750610a088133610770565b610a7a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161094e565b610a8483836119e0565b505050565b610a933382611a4e565b610aaf5760405162461bcd60e51b815260040161094e90613486565b610a84838383611b45565b601054600f546001600160a01b039091169060009061271090610ade9085906134ed565b610ae89190613522565b90509250929050565b600082815260066020526040902060010154610b0d8133611ce1565b610a848383611d45565b6001600160a01b0381163314610b875760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161094e565b610b918282611dcb565b5050565b610a84838383604051806020016040528060008152506112b3565b600080516020613b91833981519152610bc98133611ce1565b601754610bdf906001600160a01b031647611e32565b50565b6001600160a01b03831660009081526019602052604081205460ff1615610c3c5760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b604482015260640161094e565b6040516bffffffffffffffffffffffff19606086901b166020820152600090603401604051602081830303815290604052805190602001209050610cb784848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050611f4b565b95945050505050565b610cc8612b5e565b61277481526040805160e081019091526011805482908290610ce99061344b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d159061344b565b8015610d625780601f10610d3757610100808354040283529160200191610d62565b820191906000526020600020905b815481529060010190602001808311610d4557829003601f168201915b50505050508152602001600182018054610d7b9061344b565b80601f0160208091040260200160405190810160405280929190818152602001828054610da79061344b565b8015610df45780601f10610dc957610100808354040283529160200191610df4565b820191906000526020600020905b815481529060010190602001808311610dd757829003601f168201915b505050918352505060028201546001600160a01b039081166020808401919091526003840154604080850191909152600485015460608501526005850154608085015260069094015490911660a090920191909152830191909152805161010081019091526009805482908290610e6a9061344b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e969061344b565b8015610ee35780601f10610eb857610100808354040283529160200191610ee3565b820191906000526020600020905b815481529060010190602001808311610ec657829003601f168201915b5050509183525050600182015460ff16151560208201526002820154604082015260038201546060820152600482018054608090920191610f239061344b565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4f9061344b565b8015610f9c5780601f10610f7157610100808354040283529160200191610f9c565b820191906000526020600020905b815481529060010190602001808311610f7f57829003601f168201915b50505091835250506005820154602082015260068201546040808301919091526007909201546001600160a01b031660609091015282015290565b6000818152600260205260408120546001600160a01b03168061083e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161094e565b6060600960000180546108569061344b565b60006001600160a01b0382166110cb5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161094e565b506001600160a01b031660009081526003602052604090205490565b600080516020613b918339815191526111008133611ce1565b61110982611f61565b81600961111682826136a4565b50505050565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060601160010180546108569061344b565b600b5442116111aa5760405162461bcd60e51b815260206004820152601b60248201527f4d696e74696e6720686173206e6f742073746172746564207965740000000000604482015260640161094e565b610bdf33826120bc565b610b913383836121e7565b600080516020613b918339815191526111d88133611ce1565b6111f0600080516020613b918339815191528361111c565b156112305760405162461bcd60e51b815260206004820152601060248201526f20b63932b0b23c9030b71030b236b4b760811b604482015260640161094e565b6013546001600160a01b03163314156112835760405162461bcd60e51b81526020600482015260156024820152740557365207472616e736665724f776e65727368697605c1b604482015260640161094e565b61129b600080516020613b9183398151915233611dcb565b610b91600080516020613b9183398151915283611d45565b6112bd3383611a4e565b6112d95760405162461bcd60e51b815260040161094e90613486565b611116848484846122b6565b6000818152600260205260409020546060906001600160a01b03166113435760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015260640161094e565b6000600960000180546113559061344b565b9050116113ec57600d80546113699061344b565b80601f01602080910402602001604051908101604052809291908181526020018280546113959061344b565b80156113e25780601f106113b7576101008083540402835291602001916113e2565b820191906000526020600020905b8154815290600101906020018083116113c557829003601f168201915b505050505061083e565b60096113f7836122e9565b60405160200161140892919061387a565b60405160208183030381529060405292915050565b6000828152600660205260409020600101546114398133611ce1565b610a848383611dcb565b600c5442116114945760405162461bcd60e51b815260206004820152601b60248201527f50726573616c6520686173206e6f742073746172746564207965740000000000604482015260640161094e565b61149f338383610be2565b6114eb5760405162461bcd60e51b815260206004820152601b60248201527f4e6f742077686974656c697374656420666f722070726573616c650000000000604482015260640161094e565b336000818152601960205260409020805460ff19166001179055610a8490846120bc565b606060006115606115246009600601546122e9565b60105461153b906001600160a01b031660146123e6565b60405160200161154c92919061389f565b604051602081830303815290604052612588565b90506000816040516020016115759190613926565b60408051601f198184030181529190529392505050565b60006115988133611ce1565b6013546001600160a01b03838116911614156115ea5760405162461bcd60e51b815260206004820152601160248201527020b63932b0b23c903a34329037bbb732b960791b604482015260640161094e565b60135461160f90600080516020613b91833981519152906001600160a01b0316611dcb565b601354611627906000906001600160a01b0316611dcb565b601380546001600160a01b038481166001600160a01b031983168117909355169061166190600080516020613b9183398151915290611d45565b601354611679906000906001600160a01b0316611d45565b826001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b6060600960040180546108569061344b565b600754610100900460ff166116eb5760075460ff16156116ef565b303b155b6117525760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161094e565b600754610100900460ff16158015611774576007805461ffff19166101011790555b60185460ff16156117bf5760405162461bcd60e51b815260206004820152601560248201527410d85b9b9bdd081899481a5b9a5d1a585b1a5e9959605a1b604482015260640161094e565b6117c8836126ed565b6117e0600080516020613b9183398151915233611d45565b6117fc600080516020613b918339815191528460400151611d45565b61180d6000801b8460400151611d45565b825180518491601191611827918391602090910190612c22565b5060208281015180516118409260018501920190612c22565b5060408201516002820180546001600160a01b03199081166001600160a01b0393841617909155606084015160038401556080840151600484015560a0840151600584015560c0909301516006909201805490931691161790558151805183916009916118b4918391602090910190612c22565b5060208281015160018301805460ff19169115159190911790556040830151600283015560608301516003830155608083015180516118f99260048501920190612c22565b5060a0820151600582015560c0820151600682015560e090910151600790910180546001600160a01b0319166001600160a01b039092169190911790558015610a84576007805461ff0019169055505050565b6001600160a01b03163b151590565b60006001600160e01b031982166380ac58cd60e01b148061198c57506001600160e01b03198216635b5e139f60e01b145b8061083e57506301ffc9a760e01b6001600160e01b031983161461083e565b60006001600160e01b03198216637965db0b60e01b148061083e575063152a902d60e11b6001600160e01b031983161461083e565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a1582610fd7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611ac75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161094e565b6000611ad283610fd7565b9050806001600160a01b0316846001600160a01b03161480611b0d5750836001600160a01b0316611b02846108d9565b6001600160a01b0316145b80611b3d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611b5882610fd7565b6001600160a01b031614611bbc5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161094e565b6001600160a01b038216611c1e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161094e565b611c296000826119e0565b6001600160a01b0383166000908152600360205260408120805460019290611c5290849061396b565b90915550506001600160a01b0382166000908152600360205260408120805460019290611c80908490613982565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611ceb828261111c565b610b9157611d03816001600160a01b031660146123e6565b611d0e8360206123e6565b604051602001611d1f92919061399a565b60408051601f198184030181529082905262461bcd60e51b825261094e91600401612d46565b611d4f828261111c565b610b915760008281526006602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611d873390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611dd5828261111c565b15610b915760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b80471015611e825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161094e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ecf576040519150601f19603f3d011682016040523d82523d6000602084013e611ed4565b606091505b5050905080610a845760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161094e565b600082611f58858461285d565b14949350505050565b61271060c08201351115611fac5760405162461bcd60e51b81526020600482015260126024820152710a4def2c2d8e8d2cae640e8dede40d0d2ced60731b604482015260640161094e565b600a5460ff1615611fba5750565b611fca6040820160208301613a0f565b600a5460ff161515901515146120225760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420756e667265657a65206d657461646174610000000000000000604482015260640161094e565b61202c8180613536565b60405160200161203d929190613a2c565b60408051601f19818403018152908290528051602091820120916120649160099101613a3c565b6040516020818303038152906040528051906020012014610bdf5760405162461bcd60e51b815260206004820152601260248201527126b2ba30b230ba309034b990333937bd32b760711b604482015260640161094e565b6016548111156121015760405162461bcd60e51b815260206004820152601060248201526f416d6f756e7420746f6f206c6172676560801b604482015260640161094e565b60155461210e90826134ed565b3410156121515760405162461bcd60e51b815260206004820152601160248201527014185e5b595b9d081d1bdbc81cdb585b1b607a1b604482015260640161094e565b6000816008546121619190613982565b6014549091508111156121af5760405162461bcd60e51b815260206004820152601660248201527513585e1a5b5d5b481cdd5c1c1b1e481c995858da195960521b604482015260640161094e565b600881905560015b828111611116576121d584826008546121d0919061396b565b6128d1565b806121df81613a48565b9150506121b7565b816001600160a01b0316836001600160a01b031614156122495760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161094e565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6122c1848484611b45565b6122cd848484846128eb565b6111165760405162461bcd60e51b815260040161094e90613a63565b60608161230d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612337578061232181613a48565b91506123309050600a83613522565b9150612311565b6000816001600160401b03811115612351576123516130c8565b6040519080825280601f01601f19166020018201604052801561237b576020820181803683370190505b5090505b8415611b3d5761239060018361396b565b915061239d600a86613ab5565b6123a8906030613982565b60f81b8183815181106123bd576123bd613ac9565b60200101906001600160f81b031916908160001a9053506123df600a86613522565b945061237f565b606060006123f58360026134ed565b612400906002613982565b6001600160401b03811115612417576124176130c8565b6040519080825280601f01601f191660200182016040528015612441576020820181803683370190505b509050600360fc1b8160008151811061245c5761245c613ac9565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061248b5761248b613ac9565b60200101906001600160f81b031916908160001a90535060006124af8460026134ed565b6124ba906001613982565b90505b6001811115612532576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106124ee576124ee613ac9565b1a60f81b82828151811061250457612504613ac9565b60200101906001600160f81b031916908160001a90535060049490941c9361252b81613adf565b90506124bd565b5083156125815760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161094e565b9392505050565b8051606090806125a8575050604080516020810190915260008152919050565b600060036125b7836002613982565b6125c19190613522565b6125cc9060046134ed565b905060006125db826020613982565b6001600160401b038111156125f2576125f26130c8565b6040519080825280601f01601f19166020018201604052801561261c576020820181803683370190505b5090506000604051806060016040528060408152602001613b51604091399050600181016020830160005b868110156126a8576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612647565b5060038606600181146126c257600281146126d3576126df565b613d3d60f01b6001198301526126df565b603d60f81b6000198301525b505050918152949350505050565b60008160600151116127415760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20737570706c79206d757374206265206e6f6e2d7a65726f00604482015260640161094e565b60008160a00151116127955760405162461bcd60e51b815260206004820181905260248201527f546f6b656e7320706572206d696e74206d757374206265206e6f6e2d7a65726f604482015260640161094e565b60c08101516001600160a01b03166128035760405162461bcd60e51b815260206004820152602b60248201527f547265617375727920616464726573732063616e6e6f7420626520746865206e60448201526a756c6c206164647265737360a81b606482015260840161094e565b60408101516001600160a01b0316610bdf5760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206d757374206861766520616e206f776e65720000000000604482015260640161094e565b600081815b84518110156128c957600085828151811061287f5761287f613ac9565b602002602001015190508083116128a557600083815260208290526040902092506128b6565b600081815260208490526040902092505b50806128c181613a48565b915050612862565b509392505050565b610b918282604051806020016040528060008152506129e9565b60006001600160a01b0384163b156129de57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061292f903390899088908890600401613af6565b6020604051808303816000875af192505050801561296a575060408051601f3d908101601f1916820190925261296791810190613b33565b60015b6129c4573d808015612998576040519150601f19603f3d011682016040523d82523d6000602084013e61299d565b606091505b5080516129bc5760405162461bcd60e51b815260040161094e90613a63565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b3d565b506001949350505050565b6129f38383612a1c565b612a0060008484846128eb565b610a845760405162461bcd60e51b815260040161094e90613a63565b6001600160a01b038216612a725760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161094e565b6000818152600260205260409020546001600160a01b031615612ad75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161094e565b6001600160a01b0382166000908152600360205260408120805460019290612b00908490613982565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604051806060016040528060008152602001612bc26040518060e00160405280606081526020016060815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b031681525090565b8152602001612c1d60405180610100016040528060608152602001600015158152602001600081526020016000815260200160608152602001600080191681526020016000815260200160006001600160a01b031681525090565b905290565b828054612c2e9061344b565b90600052602060002090601f016020900481019282612c505760008555612c96565b82601f10612c6957805160ff1916838001178555612c96565b82800160010185558215612c96579182015b82811115612c96578251825591602001919060010190612c7b565b50612ca2929150612ca6565b5090565b5b80821115612ca25760008155600101612ca7565b6001600160e01b031981168114610bdf57600080fd5b600060208284031215612ce357600080fd5b813561258181612cbb565b60005b83811015612d09578181015183820152602001612cf1565b838111156111165750506000910152565b60008151808452612d32816020860160208601612cee565b601f01601f19169290920160200192915050565b6020815260006125816020830184612d1a565b600060208284031215612d6b57600080fd5b5035919050565b6001600160a01b0381168114610bdf57600080fd5b8035612d9281612d72565b919050565b60008060408385031215612daa57600080fd5b8235612db581612d72565b946020939093013593505050565b600080600060608486031215612dd857600080fd5b8335612de381612d72565b92506020840135612df381612d72565b929592945050506040919091013590565b60008060408385031215612e1757600080fd5b50508035926020909101359150565b60008060408385031215612e3957600080fd5b823591506020830135612e4b81612d72565b809150509250929050565b60008083601f840112612e6857600080fd5b5081356001600160401b03811115612e7f57600080fd5b6020830191508360208260051b8501011115612e9a57600080fd5b9250929050565b600080600060408486031215612eb657600080fd5b8335612ec181612d72565b925060208401356001600160401b03811115612edc57600080fd5b612ee886828701612e56565b9497909650939450505050565b60006101008251818552612f0b82860182612d1a565b915050602083015115156020850152604083015160408501526060830151606085015260808301518482036080860152612f458282612d1a565b60a0858101519087015260c0808601519087015260e0948501516001600160a01b03169490950193909352509192915050565b60208152815160208201526000602083015160606040840152805160e06080850152612fa8610160850182612d1a565b90506020820151607f198583030160a0860152612fc58282612d1a565b6040848101516001600160a01b0390811660c08981019190915260608088015160e08b015260808801516101008b015260a08801516101208b015296015116610140880152870151868203601f1901948701949094529150610cb790508183612ef5565b60006020828403121561303b57600080fd5b813561258181612d72565b60006020828403121561305857600080fd5b81356001600160401b0381111561306e57600080fd5b8201610100818503121561258157600080fd5b8015158114610bdf57600080fd5b8035612d9281613081565b600080604083850312156130ad57600080fd5b82356130b881612d72565b91506020830135612e4b81613081565b634e487b7160e01b600052604160045260246000fd5b60405161010081016001600160401b0381118282101715613101576131016130c8565b60405290565b60405160e081016001600160401b0381118282101715613101576131016130c8565b60006001600160401b0380841115613143576131436130c8565b604051601f8501601f19908116603f0116810190828211818310171561316b5761316b6130c8565b8160405280935085815286868601111561318457600080fd5b858560208301376000602087830101525050509392505050565b600080600080608085870312156131b457600080fd5b84356131bf81612d72565b935060208501356131cf81612d72565b92506040850135915060608501356001600160401b038111156131f157600080fd5b8501601f8101871361320257600080fd5b61321187823560208401613129565b91505092959194509250565b60008060006040848603121561323257600080fd5b8335925060208401356001600160401b03811115612edc57600080fd5b6000806040838503121561326257600080fd5b823561326d81612d72565b91506020830135612e4b81612d72565b600082601f83011261328e57600080fd5b61258183833560208501613129565b600061010082840312156132b057600080fd5b6132b86130de565b905081356001600160401b03808211156132d157600080fd5b6132dd8583860161327d565b83526132eb6020850161308f565b60208401526040840135604084015260608401356060840152608084013591508082111561331857600080fd5b506133258482850161327d565b60808301525060a082013560a082015260c082013560c082015261334b60e08301612d87565b60e082015292915050565b6000806040838503121561336957600080fd5b82356001600160401b038082111561338057600080fd5b9084019060e0828703121561339457600080fd5b61339c613107565b8235828111156133ab57600080fd5b6133b78882860161327d565b8252506020830135828111156133cc57600080fd5b6133d88882860161327d565b6020830152506133ea60408401612d87565b6040820152606083013560608201526080830135608082015260a083013560a082015261341960c08401612d87565b60c08201529350602085013591508082111561343457600080fd5b506134418582860161329d565b9150509250929050565b600181811c9082168061345f57607f821691505b6020821081141561348057634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613507576135076134d7565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826135315761353161350c565b500490565b6000808335601e1984360301811261354d57600080fd5b8301803591506001600160401b0382111561356757600080fd5b602001915036819003821315612e9a57600080fd5b601f821115610a8457600081815260208120601f850160051c810160208610156135a35750805b601f850160051c820191505b818110156135c2578281556001016135af565b505050505050565b6001600160401b038311156135e1576135e16130c8565b6135f5836135ef835461344b565b8361357c565b6000601f84116001811461362957600085156136115750838201355b600019600387901b1c1916600186901b178355613683565b600083815260209020601f19861690835b8281101561365a578685013582556020948501946001909201910161363a565b50868210156136775760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b6000813561083e81613081565b6000813561083e81612d72565b6136ae8283613536565b6001600160401b038111156136c5576136c56130c8565b6136d9816136d3855461344b565b8561357c565b6000601f82116001811461370d57600083156136f55750838201355b600019600385901b1c1916600184901b178555613767565b600085815260209020601f19841690835b8281101561373e578685013582556020948501946001909201910161371e565b508482101561375b5760001960f88660031b161c19848701351681555b505060018360011b0185555b5050505061379361377a6020840161368a565b6001830160ff1981541660ff8315151681178255505050565b60408201356002820155606082013560038201556137b46080830183613536565b6137c28183600486016135ca565b505060a0820135600582015560c08201356006820155610b916137e760e08401613697565b6007830180546001600160a01b0319166001600160a01b0392909216919091179055565b600081546138188161344b565b60018281168015613830576001811461384157613870565b60ff19841687528287019450613870565b8560005260208060002060005b858110156138675781548a82015290840190820161384e565b50505082870194505b5050505092915050565b6000613886828561380b565b8351613896818360208801612cee565b01949350505050565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a20000000008152600083516138d781601c850160208801612cee565b731610113332b2afb932b1b4b834b2b73a111d101160611b601c91840191820152835161390b816030840160208801612cee565b61227d60f01b60309290910191820152603201949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161395e81601d850160208701612cee565b91909101601d0192915050565b60008282101561397d5761397d6134d7565b500390565b60008219821115613995576139956134d7565b500190565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516139d2816017850160208801612cee565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613a03816028840160208801612cee565b01602801949350505050565b600060208284031215613a2157600080fd5b813561258181613081565b8183823760009101908152919050565b6000612581828461380b565b6000600019821415613a5c57613a5c6134d7565b5060010190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082613ac457613ac461350c565b500690565b634e487b7160e01b600052603260045260246000fd5b600081613aee57613aee6134d7565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613b2990830184612d1a565b9695505050505050565b600060208284031215613b4557600080fd5b815161258181612cbb56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a26469706673582212202e87d85bd9df02566ad03b421d7d5f548b207d8e3c5ff8be1686a93c03b67ac164736f6c634300080b0033a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775", - "deployedBytecode": "0x60806040526004361061027d5760003560e01c806370a082311161014f578063b88d4fde116100c1578063e8a3d4851161007a578063e8a3d48514610740578063e985e9c514610755578063f2fde38b1461079e578063f4ad0f97146107be578063fa0440b6146107d3578063ffa1ad74146107f357600080fd5b8063b88d4fde1461069a578063c5f956af146106ba578063c87b56dd146106d8578063d547741f146106f8578063d5abeb0114610718578063e3e1e8ef1461072d57600080fd5b806391d148541161011357806391d14854146105fd57806395d89b411461061d578063a0712d6814610632578063a217fddf14610645578063a22cb4651461065a578063b5106add1461067a57600080fd5b806370a082311461056857806375b238fc14610588578063877bb1ae146105aa5780638cfec4c0146105ca5780638da5cb5b146105df57600080fd5b806331f9c919116101f357806353135ca0116101ac57806353135ca0146104c55780635a23dd99146104dc5780635a9b0b89146104fc5780636352211e1461051e5780636817c76c1461053e5780636c0360eb1461055357600080fd5b806331f9c9191461042c57806336568abe1461044357806342842e0e146104635780634653124b14610483578063476343ee146104985780634e6f9dd6146104ad57600080fd5b806318160ddd1161024557806318160ddd1461035257806322212e2b1461036857806323b872dd1461037d578063248a9ca31461039d5780632a55205a146103cd5780632f2ff15d1461040c57600080fd5b806301ffc9a71461028257806306fdde03146102b75780630807b9e2146102d9578063081812fc146102f8578063095ea7b314610330575b600080fd5b34801561028e57600080fd5b506102a261029d366004612cd1565b610809565b60405190151581526020015b60405180910390f35b3480156102c357600080fd5b506102cc610844565b6040516102ae9190612d46565b3480156102e557600080fd5b506016545b6040519081526020016102ae565b34801561030457600080fd5b50610318610313366004612d59565b6108d9565b6040516001600160a01b0390911681526020016102ae565b34801561033c57600080fd5b5061035061034b366004612d97565b610973565b005b34801561035e57600080fd5b506102ea60085481565b34801561037457600080fd5b50600e546102ea565b34801561038957600080fd5b50610350610398366004612dc3565b610a89565b3480156103a957600080fd5b506102ea6103b8366004612d59565b60009081526006602052604090206001015490565b3480156103d957600080fd5b506103ed6103e8366004612e04565b610aba565b604080516001600160a01b0390931683526020830191909152016102ae565b34801561041857600080fd5b50610350610427366004612e26565b610af1565b34801561043857600080fd5b50600b5442116102a2565b34801561044f57600080fd5b5061035061045e366004612e26565b610b17565b34801561046f57600080fd5b5061035061047e366004612dc3565b610b95565b34801561048f57600080fd5b50600c546102ea565b3480156104a457600080fd5b50610350610bb0565b3480156104b957600080fd5b50600a5460ff166102a2565b3480156104d157600080fd5b50600c5442116102a2565b3480156104e857600080fd5b506102a26104f7366004612ea1565b610be2565b34801561050857600080fd5b50610511610cc0565b6040516102ae9190612f78565b34801561052a57600080fd5b50610318610539366004612d59565b610fd7565b34801561054a57600080fd5b506015546102ea565b34801561055f57600080fd5b506102cc61104e565b34801561057457600080fd5b506102ea610583366004613029565b611060565b34801561059457600080fd5b506102ea600080516020613b9183398151915281565b3480156105b657600080fd5b506103506105c5366004613046565b6110e7565b3480156105d657600080fd5b50600b546102ea565b3480156105eb57600080fd5b506013546001600160a01b0316610318565b34801561060957600080fd5b506102a2610618366004612e26565b61111c565b34801561062957600080fd5b506102cc611147565b610350610640366004612d59565b611159565b34801561065157600080fd5b506102ea600081565b34801561066657600080fd5b5061035061067536600461309a565b6111b4565b34801561068657600080fd5b50610350610695366004613029565b6111bf565b3480156106a657600080fd5b506103506106b536600461319e565b6112b3565b3480156106c657600080fd5b506017546001600160a01b0316610318565b3480156106e457600080fd5b506102cc6106f3366004612d59565b6112e5565b34801561070457600080fd5b50610350610713366004612e26565b61141d565b34801561072457600080fd5b506014546102ea565b61035061073b36600461321d565b611443565b34801561074c57600080fd5b506102cc61150f565b34801561076157600080fd5b506102a261077036600461324f565b6001600160a01b03918216600090815260056020908152604080832093909416825291909152205460ff1690565b3480156107aa57600080fd5b506103506107b9366004613029565b61158c565b3480156107ca57600080fd5b506102cc6116be565b3480156107df57600080fd5b506103506107ee366004613356565b6116d0565b3480156107ff57600080fd5b506102ea61277481565b60006108148261195b565b806108235750610823826119ab565b8061083e575063152a902d60e11b6001600160e01b03198316145b92915050565b6060601160000180546108569061344b565b80601f01602080910402602001604051908101604052809291908181526020018280546108829061344b565b80156108cf5780601f106108a4576101008083540402835291602001916108cf565b820191906000526020600020905b8154815290600101906020018083116108b257829003601f168201915b5050505050905090565b6000818152600260205260408120546001600160a01b03166109575760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a20617070726f76656420717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b60648201526084015b60405180910390fd5b506000908152600460205260409020546001600160a01b031690565b600061097e82610fd7565b9050806001600160a01b0316836001600160a01b031614156109ec5760405162461bcd60e51b815260206004820152602160248201527f4552433732313a20617070726f76616c20746f2063757272656e74206f776e656044820152603960f91b606482015260840161094e565b336001600160a01b0382161480610a085750610a088133610770565b610a7a5760405162461bcd60e51b815260206004820152603860248201527f4552433732313a20617070726f76652063616c6c6572206973206e6f74206f7760448201527f6e6572206e6f7220617070726f76656420666f7220616c6c0000000000000000606482015260840161094e565b610a8483836119e0565b505050565b610a933382611a4e565b610aaf5760405162461bcd60e51b815260040161094e90613486565b610a84838383611b45565b601054600f546001600160a01b039091169060009061271090610ade9085906134ed565b610ae89190613522565b90509250929050565b600082815260066020526040902060010154610b0d8133611ce1565b610a848383611d45565b6001600160a01b0381163314610b875760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b606482015260840161094e565b610b918282611dcb565b5050565b610a84838383604051806020016040528060008152506112b3565b600080516020613b91833981519152610bc98133611ce1565b601754610bdf906001600160a01b031647611e32565b50565b6001600160a01b03831660009081526019602052604081205460ff1615610c3c5760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b604482015260640161094e565b6040516bffffffffffffffffffffffff19606086901b166020820152600090603401604051602081830303815290604052805190602001209050610cb784848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050600e549150849050611f4b565b95945050505050565b610cc8612b5e565b61277481526040805160e081019091526011805482908290610ce99061344b565b80601f0160208091040260200160405190810160405280929190818152602001828054610d159061344b565b8015610d625780601f10610d3757610100808354040283529160200191610d62565b820191906000526020600020905b815481529060010190602001808311610d4557829003601f168201915b50505050508152602001600182018054610d7b9061344b565b80601f0160208091040260200160405190810160405280929190818152602001828054610da79061344b565b8015610df45780601f10610dc957610100808354040283529160200191610df4565b820191906000526020600020905b815481529060010190602001808311610dd757829003601f168201915b505050918352505060028201546001600160a01b039081166020808401919091526003840154604080850191909152600485015460608501526005850154608085015260069094015490911660a090920191909152830191909152805161010081019091526009805482908290610e6a9061344b565b80601f0160208091040260200160405190810160405280929190818152602001828054610e969061344b565b8015610ee35780601f10610eb857610100808354040283529160200191610ee3565b820191906000526020600020905b815481529060010190602001808311610ec657829003601f168201915b5050509183525050600182015460ff16151560208201526002820154604082015260038201546060820152600482018054608090920191610f239061344b565b80601f0160208091040260200160405190810160405280929190818152602001828054610f4f9061344b565b8015610f9c5780601f10610f7157610100808354040283529160200191610f9c565b820191906000526020600020905b815481529060010190602001808311610f7f57829003601f168201915b50505091835250506005820154602082015260068201546040808301919091526007909201546001600160a01b031660609091015282015290565b6000818152600260205260408120546001600160a01b03168061083e5760405162461bcd60e51b815260206004820152602960248201527f4552433732313a206f776e657220717565727920666f72206e6f6e657869737460448201526832b73a103a37b5b2b760b91b606482015260840161094e565b6060600960000180546108569061344b565b60006001600160a01b0382166110cb5760405162461bcd60e51b815260206004820152602a60248201527f4552433732313a2062616c616e636520717565727920666f7220746865207a65604482015269726f206164647265737360b01b606482015260840161094e565b506001600160a01b031660009081526003602052604090205490565b600080516020613b918339815191526111008133611ce1565b61110982611f61565b81600961111682826136a4565b50505050565b60009182526006602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060601160010180546108569061344b565b600b5442116111aa5760405162461bcd60e51b815260206004820152601b60248201527f4d696e74696e6720686173206e6f742073746172746564207965740000000000604482015260640161094e565b610bdf33826120bc565b610b913383836121e7565b600080516020613b918339815191526111d88133611ce1565b6111f0600080516020613b918339815191528361111c565b156112305760405162461bcd60e51b815260206004820152601060248201526f20b63932b0b23c9030b71030b236b4b760811b604482015260640161094e565b6013546001600160a01b03163314156112835760405162461bcd60e51b81526020600482015260156024820152740557365207472616e736665724f776e65727368697605c1b604482015260640161094e565b61129b600080516020613b9183398151915233611dcb565b610b91600080516020613b9183398151915283611d45565b6112bd3383611a4e565b6112d95760405162461bcd60e51b815260040161094e90613486565b611116848484846122b6565b6000818152600260205260409020546060906001600160a01b03166113435760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b604482015260640161094e565b6000600960000180546113559061344b565b9050116113ec57600d80546113699061344b565b80601f01602080910402602001604051908101604052809291908181526020018280546113959061344b565b80156113e25780601f106113b7576101008083540402835291602001916113e2565b820191906000526020600020905b8154815290600101906020018083116113c557829003601f168201915b505050505061083e565b60096113f7836122e9565b60405160200161140892919061387a565b60405160208183030381529060405292915050565b6000828152600660205260409020600101546114398133611ce1565b610a848383611dcb565b600c5442116114945760405162461bcd60e51b815260206004820152601b60248201527f50726573616c6520686173206e6f742073746172746564207965740000000000604482015260640161094e565b61149f338383610be2565b6114eb5760405162461bcd60e51b815260206004820152601b60248201527f4e6f742077686974656c697374656420666f722070726573616c650000000000604482015260640161094e565b336000818152601960205260409020805460ff19166001179055610a8490846120bc565b606060006115606115246009600601546122e9565b60105461153b906001600160a01b031660146123e6565b60405160200161154c92919061389f565b604051602081830303815290604052612588565b90506000816040516020016115759190613926565b60408051601f198184030181529190529392505050565b60006115988133611ce1565b6013546001600160a01b03838116911614156115ea5760405162461bcd60e51b815260206004820152601160248201527020b63932b0b23c903a34329037bbb732b960791b604482015260640161094e565b60135461160f90600080516020613b91833981519152906001600160a01b0316611dcb565b601354611627906000906001600160a01b0316611dcb565b601380546001600160a01b038481166001600160a01b031983168117909355169061166190600080516020613b9183398151915290611d45565b601354611679906000906001600160a01b0316611d45565b826001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a3505050565b6060600960040180546108569061344b565b600754610100900460ff166116eb5760075460ff16156116ef565b303b155b6117525760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b606482015260840161094e565b600754610100900460ff16158015611774576007805461ffff19166101011790555b60185460ff16156117bf5760405162461bcd60e51b815260206004820152601560248201527410d85b9b9bdd081899481a5b9a5d1a585b1a5e9959605a1b604482015260640161094e565b6117c8836126ed565b6117e0600080516020613b9183398151915233611d45565b6117fc600080516020613b918339815191528460400151611d45565b61180d6000801b8460400151611d45565b825180518491601191611827918391602090910190612c22565b5060208281015180516118409260018501920190612c22565b5060408201516002820180546001600160a01b03199081166001600160a01b0393841617909155606084015160038401556080840151600484015560a0840151600584015560c0909301516006909201805490931691161790558151805183916009916118b4918391602090910190612c22565b5060208281015160018301805460ff19169115159190911790556040830151600283015560608301516003830155608083015180516118f99260048501920190612c22565b5060a0820151600582015560c0820151600682015560e090910151600790910180546001600160a01b0319166001600160a01b039092169190911790558015610a84576007805461ff0019169055505050565b6001600160a01b03163b151590565b60006001600160e01b031982166380ac58cd60e01b148061198c57506001600160e01b03198216635b5e139f60e01b145b8061083e57506301ffc9a760e01b6001600160e01b031983161461083e565b60006001600160e01b03198216637965db0b60e01b148061083e575063152a902d60e11b6001600160e01b031983161461083e565b600081815260046020526040902080546001600160a01b0319166001600160a01b0384169081179091558190611a1582610fd7565b6001600160a01b03167f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92560405160405180910390a45050565b6000818152600260205260408120546001600160a01b0316611ac75760405162461bcd60e51b815260206004820152602c60248201527f4552433732313a206f70657261746f7220717565727920666f72206e6f6e657860448201526b34b9ba32b73a103a37b5b2b760a11b606482015260840161094e565b6000611ad283610fd7565b9050806001600160a01b0316846001600160a01b03161480611b0d5750836001600160a01b0316611b02846108d9565b6001600160a01b0316145b80611b3d57506001600160a01b0380821660009081526005602090815260408083209388168352929052205460ff165b949350505050565b826001600160a01b0316611b5882610fd7565b6001600160a01b031614611bbc5760405162461bcd60e51b815260206004820152602560248201527f4552433732313a207472616e736665722066726f6d20696e636f72726563742060448201526437bbb732b960d91b606482015260840161094e565b6001600160a01b038216611c1e5760405162461bcd60e51b8152602060048201526024808201527f4552433732313a207472616e7366657220746f20746865207a65726f206164646044820152637265737360e01b606482015260840161094e565b611c296000826119e0565b6001600160a01b0383166000908152600360205260408120805460019290611c5290849061396b565b90915550506001600160a01b0382166000908152600360205260408120805460019290611c80908490613982565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b0386811691821790925591518493918716917fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef91a4505050565b611ceb828261111c565b610b9157611d03816001600160a01b031660146123e6565b611d0e8360206123e6565b604051602001611d1f92919061399a565b60408051601f198184030181529082905262461bcd60e51b825261094e91600401612d46565b611d4f828261111c565b610b915760008281526006602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611d873390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611dd5828261111c565b15610b915760008281526006602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b80471015611e825760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e6365000000604482015260640161094e565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611ecf576040519150601f19603f3d011682016040523d82523d6000602084013e611ed4565b606091505b5050905080610a845760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d61792068617665207265766572746564000000000000606482015260840161094e565b600082611f58858461285d565b14949350505050565b61271060c08201351115611fac5760405162461bcd60e51b81526020600482015260126024820152710a4def2c2d8e8d2cae640e8dede40d0d2ced60731b604482015260640161094e565b600a5460ff1615611fba5750565b611fca6040820160208301613a0f565b600a5460ff161515901515146120225760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420756e667265657a65206d657461646174610000000000000000604482015260640161094e565b61202c8180613536565b60405160200161203d929190613a2c565b60408051601f19818403018152908290528051602091820120916120649160099101613a3c565b6040516020818303038152906040528051906020012014610bdf5760405162461bcd60e51b815260206004820152601260248201527126b2ba30b230ba309034b990333937bd32b760711b604482015260640161094e565b6016548111156121015760405162461bcd60e51b815260206004820152601060248201526f416d6f756e7420746f6f206c6172676560801b604482015260640161094e565b60155461210e90826134ed565b3410156121515760405162461bcd60e51b815260206004820152601160248201527014185e5b595b9d081d1bdbc81cdb585b1b607a1b604482015260640161094e565b6000816008546121619190613982565b6014549091508111156121af5760405162461bcd60e51b815260206004820152601660248201527513585e1a5b5d5b481cdd5c1c1b1e481c995858da195960521b604482015260640161094e565b600881905560015b828111611116576121d584826008546121d0919061396b565b6128d1565b806121df81613a48565b9150506121b7565b816001600160a01b0316836001600160a01b031614156122495760405162461bcd60e51b815260206004820152601960248201527f4552433732313a20617070726f766520746f2063616c6c657200000000000000604482015260640161094e565b6001600160a01b03838116600081815260056020908152604080832094871680845294825291829020805460ff191686151590811790915591519182527f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a3505050565b6122c1848484611b45565b6122cd848484846128eb565b6111165760405162461bcd60e51b815260040161094e90613a63565b60608161230d5750506040805180820190915260018152600360fc1b602082015290565b8160005b8115612337578061232181613a48565b91506123309050600a83613522565b9150612311565b6000816001600160401b03811115612351576123516130c8565b6040519080825280601f01601f19166020018201604052801561237b576020820181803683370190505b5090505b8415611b3d5761239060018361396b565b915061239d600a86613ab5565b6123a8906030613982565b60f81b8183815181106123bd576123bd613ac9565b60200101906001600160f81b031916908160001a9053506123df600a86613522565b945061237f565b606060006123f58360026134ed565b612400906002613982565b6001600160401b03811115612417576124176130c8565b6040519080825280601f01601f191660200182016040528015612441576020820181803683370190505b509050600360fc1b8160008151811061245c5761245c613ac9565b60200101906001600160f81b031916908160001a905350600f60fb1b8160018151811061248b5761248b613ac9565b60200101906001600160f81b031916908160001a90535060006124af8460026134ed565b6124ba906001613982565b90505b6001811115612532576f181899199a1a9b1b9c1cb0b131b232b360811b85600f16601081106124ee576124ee613ac9565b1a60f81b82828151811061250457612504613ac9565b60200101906001600160f81b031916908160001a90535060049490941c9361252b81613adf565b90506124bd565b5083156125815760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e74604482015260640161094e565b9392505050565b8051606090806125a8575050604080516020810190915260008152919050565b600060036125b7836002613982565b6125c19190613522565b6125cc9060046134ed565b905060006125db826020613982565b6001600160401b038111156125f2576125f26130c8565b6040519080825280601f01601f19166020018201604052801561261c576020820181803683370190505b5090506000604051806060016040528060408152602001613b51604091399050600181016020830160005b868110156126a8576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612647565b5060038606600181146126c257600281146126d3576126df565b613d3d60f01b6001198301526126df565b603d60f81b6000198301525b505050918152949350505050565b60008160600151116127415760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20737570706c79206d757374206265206e6f6e2d7a65726f00604482015260640161094e565b60008160a00151116127955760405162461bcd60e51b815260206004820181905260248201527f546f6b656e7320706572206d696e74206d757374206265206e6f6e2d7a65726f604482015260640161094e565b60c08101516001600160a01b03166128035760405162461bcd60e51b815260206004820152602b60248201527f547265617375727920616464726573732063616e6e6f7420626520746865206e60448201526a756c6c206164647265737360a81b606482015260840161094e565b60408101516001600160a01b0316610bdf5760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206d757374206861766520616e206f776e65720000000000604482015260640161094e565b600081815b84518110156128c957600085828151811061287f5761287f613ac9565b602002602001015190508083116128a557600083815260208290526040902092506128b6565b600081815260208490526040902092505b50806128c181613a48565b915050612862565b509392505050565b610b918282604051806020016040528060008152506129e9565b60006001600160a01b0384163b156129de57604051630a85bd0160e11b81526001600160a01b0385169063150b7a029061292f903390899088908890600401613af6565b6020604051808303816000875af192505050801561296a575060408051601f3d908101601f1916820190925261296791810190613b33565b60015b6129c4573d808015612998576040519150601f19603f3d011682016040523d82523d6000602084013e61299d565b606091505b5080516129bc5760405162461bcd60e51b815260040161094e90613a63565b805181602001fd5b6001600160e01b031916630a85bd0160e11b149050611b3d565b506001949350505050565b6129f38383612a1c565b612a0060008484846128eb565b610a845760405162461bcd60e51b815260040161094e90613a63565b6001600160a01b038216612a725760405162461bcd60e51b815260206004820181905260248201527f4552433732313a206d696e7420746f20746865207a65726f2061646472657373604482015260640161094e565b6000818152600260205260409020546001600160a01b031615612ad75760405162461bcd60e51b815260206004820152601c60248201527f4552433732313a20746f6b656e20616c7265616479206d696e74656400000000604482015260640161094e565b6001600160a01b0382166000908152600360205260408120805460019290612b00908490613982565b909155505060008181526002602052604080822080546001600160a01b0319166001600160a01b03861690811790915590518392907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a45050565b604051806060016040528060008152602001612bc26040518060e00160405280606081526020016060815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b031681525090565b8152602001612c1d60405180610100016040528060608152602001600015158152602001600081526020016000815260200160608152602001600080191681526020016000815260200160006001600160a01b031681525090565b905290565b828054612c2e9061344b565b90600052602060002090601f016020900481019282612c505760008555612c96565b82601f10612c6957805160ff1916838001178555612c96565b82800160010185558215612c96579182015b82811115612c96578251825591602001919060010190612c7b565b50612ca2929150612ca6565b5090565b5b80821115612ca25760008155600101612ca7565b6001600160e01b031981168114610bdf57600080fd5b600060208284031215612ce357600080fd5b813561258181612cbb565b60005b83811015612d09578181015183820152602001612cf1565b838111156111165750506000910152565b60008151808452612d32816020860160208601612cee565b601f01601f19169290920160200192915050565b6020815260006125816020830184612d1a565b600060208284031215612d6b57600080fd5b5035919050565b6001600160a01b0381168114610bdf57600080fd5b8035612d9281612d72565b919050565b60008060408385031215612daa57600080fd5b8235612db581612d72565b946020939093013593505050565b600080600060608486031215612dd857600080fd5b8335612de381612d72565b92506020840135612df381612d72565b929592945050506040919091013590565b60008060408385031215612e1757600080fd5b50508035926020909101359150565b60008060408385031215612e3957600080fd5b823591506020830135612e4b81612d72565b809150509250929050565b60008083601f840112612e6857600080fd5b5081356001600160401b03811115612e7f57600080fd5b6020830191508360208260051b8501011115612e9a57600080fd5b9250929050565b600080600060408486031215612eb657600080fd5b8335612ec181612d72565b925060208401356001600160401b03811115612edc57600080fd5b612ee886828701612e56565b9497909650939450505050565b60006101008251818552612f0b82860182612d1a565b915050602083015115156020850152604083015160408501526060830151606085015260808301518482036080860152612f458282612d1a565b60a0858101519087015260c0808601519087015260e0948501516001600160a01b03169490950193909352509192915050565b60208152815160208201526000602083015160606040840152805160e06080850152612fa8610160850182612d1a565b90506020820151607f198583030160a0860152612fc58282612d1a565b6040848101516001600160a01b0390811660c08981019190915260608088015160e08b015260808801516101008b015260a08801516101208b015296015116610140880152870151868203601f1901948701949094529150610cb790508183612ef5565b60006020828403121561303b57600080fd5b813561258181612d72565b60006020828403121561305857600080fd5b81356001600160401b0381111561306e57600080fd5b8201610100818503121561258157600080fd5b8015158114610bdf57600080fd5b8035612d9281613081565b600080604083850312156130ad57600080fd5b82356130b881612d72565b91506020830135612e4b81613081565b634e487b7160e01b600052604160045260246000fd5b60405161010081016001600160401b0381118282101715613101576131016130c8565b60405290565b60405160e081016001600160401b0381118282101715613101576131016130c8565b60006001600160401b0380841115613143576131436130c8565b604051601f8501601f19908116603f0116810190828211818310171561316b5761316b6130c8565b8160405280935085815286868601111561318457600080fd5b858560208301376000602087830101525050509392505050565b600080600080608085870312156131b457600080fd5b84356131bf81612d72565b935060208501356131cf81612d72565b92506040850135915060608501356001600160401b038111156131f157600080fd5b8501601f8101871361320257600080fd5b61321187823560208401613129565b91505092959194509250565b60008060006040848603121561323257600080fd5b8335925060208401356001600160401b03811115612edc57600080fd5b6000806040838503121561326257600080fd5b823561326d81612d72565b91506020830135612e4b81612d72565b600082601f83011261328e57600080fd5b61258183833560208501613129565b600061010082840312156132b057600080fd5b6132b86130de565b905081356001600160401b03808211156132d157600080fd5b6132dd8583860161327d565b83526132eb6020850161308f565b60208401526040840135604084015260608401356060840152608084013591508082111561331857600080fd5b506133258482850161327d565b60808301525060a082013560a082015260c082013560c082015261334b60e08301612d87565b60e082015292915050565b6000806040838503121561336957600080fd5b82356001600160401b038082111561338057600080fd5b9084019060e0828703121561339457600080fd5b61339c613107565b8235828111156133ab57600080fd5b6133b78882860161327d565b8252506020830135828111156133cc57600080fd5b6133d88882860161327d565b6020830152506133ea60408401612d87565b6040820152606083013560608201526080830135608082015260a083013560a082015261341960c08401612d87565b60c08201529350602085013591508082111561343457600080fd5b506134418582860161329d565b9150509250929050565b600181811c9082168061345f57607f821691505b6020821081141561348057634e487b7160e01b600052602260045260246000fd5b50919050565b60208082526031908201527f4552433732313a207472616e736665722063616c6c6572206973206e6f74206f6040820152701ddb995c881b9bdc88185c1c1c9bdd9959607a1b606082015260800190565b634e487b7160e01b600052601160045260246000fd5b6000816000190483118215151615613507576135076134d7565b500290565b634e487b7160e01b600052601260045260246000fd5b6000826135315761353161350c565b500490565b6000808335601e1984360301811261354d57600080fd5b8301803591506001600160401b0382111561356757600080fd5b602001915036819003821315612e9a57600080fd5b601f821115610a8457600081815260208120601f850160051c810160208610156135a35750805b601f850160051c820191505b818110156135c2578281556001016135af565b505050505050565b6001600160401b038311156135e1576135e16130c8565b6135f5836135ef835461344b565b8361357c565b6000601f84116001811461362957600085156136115750838201355b600019600387901b1c1916600186901b178355613683565b600083815260209020601f19861690835b8281101561365a578685013582556020948501946001909201910161363a565b50868210156136775760001960f88860031b161c19848701351681555b505060018560011b0183555b5050505050565b6000813561083e81613081565b6000813561083e81612d72565b6136ae8283613536565b6001600160401b038111156136c5576136c56130c8565b6136d9816136d3855461344b565b8561357c565b6000601f82116001811461370d57600083156136f55750838201355b600019600385901b1c1916600184901b178555613767565b600085815260209020601f19841690835b8281101561373e578685013582556020948501946001909201910161371e565b508482101561375b5760001960f88660031b161c19848701351681555b505060018360011b0185555b5050505061379361377a6020840161368a565b6001830160ff1981541660ff8315151681178255505050565b60408201356002820155606082013560038201556137b46080830183613536565b6137c28183600486016135ca565b505060a0820135600582015560c08201356006820155610b916137e760e08401613697565b6007830180546001600160a01b0319166001600160a01b0392909216919091179055565b600081546138188161344b565b60018281168015613830576001811461384157613870565b60ff19841687528287019450613870565b8560005260208060002060005b858110156138675781548a82015290840190820161384e565b50505082870194505b5050505092915050565b6000613886828561380b565b8351613896818360208801612cee565b01949350505050565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a20000000008152600083516138d781601c850160208801612cee565b731610113332b2afb932b1b4b834b2b73a111d101160611b601c91840191820152835161390b816030840160208801612cee565b61227d60f01b60309290910191820152603201949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c00000081526000825161395e81601d850160208701612cee565b91909101601d0192915050565b60008282101561397d5761397d6134d7565b500390565b60008219821115613995576139956134d7565b500190565b7f416363657373436f6e74726f6c3a206163636f756e74200000000000000000008152600083516139d2816017850160208801612cee565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351613a03816028840160208801612cee565b01602801949350505050565b600060208284031215613a2157600080fd5b813561258181613081565b8183823760009101908152919050565b6000612581828461380b565b6000600019821415613a5c57613a5c6134d7565b5060010190565b60208082526032908201527f4552433732313a207472616e7366657220746f206e6f6e20455243373231526560408201527131b2b4bb32b91034b6b83632b6b2b73a32b960711b606082015260800190565b600082613ac457613ac461350c565b500690565b634e487b7160e01b600052603260045260246000fd5b600081613aee57613aee6134d7565b506000190190565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613b2990830184612d1a565b9695505050505050565b600060208284031215613b4557600080fd5b815161258181612cbb56fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a26469706673582212202e87d85bd9df02566ad03b421d7d5f548b207d8e3c5ff8be1686a93c03b67ac164736f6c634300080b0033", + "numDeployments": 1, + "solcInputHash": "1e300b8e19558e2a4c02af65df638f3f", + "metadata": "{\"compiler\":{\"version\":\"0.8.15+commit.e14f2714\"},\"language\":\"Solidity\",\"output\":{\"abi\":[{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reservedSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensPerMint\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"treasuryAddress\",\"type\":\"address\"}],\"internalType\":\"struct NFTCollection.DeploymentConfig\",\"name\":\"deploymentConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"metadataFrozen\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"publicMintPrice\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"publicMintPriceFrozen\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"presaleMintPrice\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"presaleMintPriceFrozen\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"publicMintStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"presaleMintStart\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"prerevealTokenURI\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"presaleMerkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"royaltiesBps\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"royaltiesAddress\",\"type\":\"address\"}],\"internalType\":\"struct NFTCollection.RuntimeConfig\",\"name\":\"runtimeConfig\",\"type\":\"tuple\"}],\"stateMutability\":\"nonpayable\",\"type\":\"constructor\"},{\"inputs\":[],\"name\":\"ApprovalCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApprovalToCurrentOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"ApproveToCaller\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"BalanceQueryForZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintToZeroAddress\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"MintZeroQuantity\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"OwnerQueryForNonexistentToken\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferCallerNotOwnerNorApproved\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferFromIncorrectOwner\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToNonERC721ReceiverImplementer\",\"type\":\"error\"},{\"inputs\":[],\"name\":\"TransferToZeroAddress\",\"type\":\"error\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"approved\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Approval\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"indexed\":false,\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"ApprovalForAll\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":false,\"internalType\":\"uint8\",\"name\":\"version\",\"type\":\"uint8\"}],\"name\":\"Initialized\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"previousOwner\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"OwnershipTransferred\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"previousAdminRole\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"newAdminRole\",\"type\":\"bytes32\"}],\"name\":\"RoleAdminChanged\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleGranted\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"sender\",\"type\":\"address\"}],\"name\":\"RoleRevoked\",\"type\":\"event\"},{\"anonymous\":false,\"inputs\":[{\"indexed\":true,\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"indexed\":true,\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"Transfer\",\"type\":\"event\"},{\"inputs\":[],\"name\":\"ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"DEFAULT_ADMIN_ROLE\",\"outputs\":[{\"internalType\":\"bytes32\",\"name\":\"\",\"type\":\"bytes32\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"NAME\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"ROYALTIES_BASIS\",\"outputs\":[{\"internalType\":\"uint16\",\"name\":\"\",\"type\":\"uint16\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"VERSION\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"approve\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"availableSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"}],\"name\":\"balanceOf\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"contractURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"getApproved\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"getInfo\",\"outputs\":[{\"components\":[{\"internalType\":\"uint256\",\"name\":\"version\",\"type\":\"uint256\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reservedSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensPerMint\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"treasuryAddress\",\"type\":\"address\"}],\"internalType\":\"struct NFTCollection.DeploymentConfig\",\"name\":\"deploymentConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"metadataFrozen\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"publicMintPrice\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"publicMintPriceFrozen\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"presaleMintPrice\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"presaleMintPriceFrozen\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"publicMintStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"presaleMintStart\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"prerevealTokenURI\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"presaleMerkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"royaltiesBps\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"royaltiesAddress\",\"type\":\"address\"}],\"internalType\":\"struct NFTCollection.RuntimeConfig\",\"name\":\"runtimeConfig\",\"type\":\"tuple\"}],\"internalType\":\"struct NFTCollection.ContractInfo\",\"name\":\"info\",\"type\":\"tuple\"}],\"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\":\"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\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"name\",\"type\":\"string\"},{\"internalType\":\"string\",\"name\":\"symbol\",\"type\":\"string\"},{\"internalType\":\"address\",\"name\":\"owner\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"maxSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"reservedSupply\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"tokensPerMint\",\"type\":\"uint256\"},{\"internalType\":\"address payable\",\"name\":\"treasuryAddress\",\"type\":\"address\"}],\"internalType\":\"struct NFTCollection.DeploymentConfig\",\"name\":\"deploymentConfig\",\"type\":\"tuple\"},{\"components\":[{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"metadataFrozen\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"publicMintPrice\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"publicMintPriceFrozen\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"presaleMintPrice\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"presaleMintPriceFrozen\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"publicMintStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"presaleMintStart\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"prerevealTokenURI\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"presaleMerkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"royaltiesBps\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"royaltiesAddress\",\"type\":\"address\"}],\"internalType\":\"struct NFTCollection.RuntimeConfig\",\"name\":\"runtimeConfig\",\"type\":\"tuple\"}],\"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\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"wallet\",\"type\":\"address\"},{\"internalType\":\"bytes32[]\",\"name\":\"proof\",\"type\":\"bytes32[]\"}],\"name\":\"isWhitelisted\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"mint\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"mintingActive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"name\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"owner\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"ownerOf\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"\",\"type\":\"address\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"presaleActive\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"},{\"internalType\":\"bytes32[]\",\"name\":\"proof\",\"type\":\"bytes32[]\"}],\"name\":\"presaleMint\",\"outputs\":[],\"stateMutability\":\"payable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes32\",\"name\":\"role\",\"type\":\"bytes32\"},{\"internalType\":\"address\",\"name\":\"account\",\"type\":\"address\"}],\"name\":\"renounceRole\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"amount\",\"type\":\"uint256\"}],\"name\":\"reserveMint\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"reserveRemaining\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"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\":\"\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"salePrice\",\"type\":\"uint256\"}],\"name\":\"royaltyInfo\",\"outputs\":[{\"internalType\":\"address\",\"name\":\"receiver\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"royaltyAmount\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"},{\"internalType\":\"bytes\",\"name\":\"_data\",\"type\":\"bytes\"}],\"name\":\"safeTransferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"operator\",\"type\":\"address\"},{\"internalType\":\"bool\",\"name\":\"approved\",\"type\":\"bool\"}],\"name\":\"setApprovalForAll\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"bytes4\",\"name\":\"interfaceId\",\"type\":\"bytes4\"}],\"name\":\"supportsInterface\",\"outputs\":[{\"internalType\":\"bool\",\"name\":\"\",\"type\":\"bool\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"symbol\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"tokenURI\",\"outputs\":[{\"internalType\":\"string\",\"name\":\"\",\"type\":\"string\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"totalSupply\",\"outputs\":[{\"internalType\":\"uint256\",\"name\":\"\",\"type\":\"uint256\"}],\"stateMutability\":\"view\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"}],\"name\":\"transferAdminRights\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"from\",\"type\":\"address\"},{\"internalType\":\"address\",\"name\":\"to\",\"type\":\"address\"},{\"internalType\":\"uint256\",\"name\":\"tokenId\",\"type\":\"uint256\"}],\"name\":\"transferFrom\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"internalType\":\"address\",\"name\":\"newOwner\",\"type\":\"address\"}],\"name\":\"transferOwnership\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[{\"components\":[{\"internalType\":\"string\",\"name\":\"baseURI\",\"type\":\"string\"},{\"internalType\":\"bool\",\"name\":\"metadataFrozen\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"publicMintPrice\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"publicMintPriceFrozen\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"presaleMintPrice\",\"type\":\"uint256\"},{\"internalType\":\"bool\",\"name\":\"presaleMintPriceFrozen\",\"type\":\"bool\"},{\"internalType\":\"uint256\",\"name\":\"publicMintStart\",\"type\":\"uint256\"},{\"internalType\":\"uint256\",\"name\":\"presaleMintStart\",\"type\":\"uint256\"},{\"internalType\":\"string\",\"name\":\"prerevealTokenURI\",\"type\":\"string\"},{\"internalType\":\"bytes32\",\"name\":\"presaleMerkleRoot\",\"type\":\"bytes32\"},{\"internalType\":\"uint256\",\"name\":\"royaltiesBps\",\"type\":\"uint256\"},{\"internalType\":\"address\",\"name\":\"royaltiesAddress\",\"type\":\"address\"}],\"internalType\":\"struct NFTCollection.RuntimeConfig\",\"name\":\"newConfig\",\"type\":\"tuple\"}],\"name\":\"updateConfig\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"},{\"inputs\":[],\"name\":\"withdrawFees\",\"outputs\":[],\"stateMutability\":\"nonpayable\",\"type\":\"function\"}],\"devdoc\":{\"kind\":\"dev\",\"methods\":{\"approve(address,uint256)\":{\"details\":\"See {IERC721-approve}.\"},\"balanceOf(address)\":{\"details\":\"See {IERC721-balanceOf}.\"},\"contractURI()\":{\"details\":\"OpenSea contract metadata, returns a base64 encoded JSON string containing royalties basis points and royalties address\"},\"getApproved(uint256)\":{\"details\":\"See {IERC721-getApproved}.\"},\"getInfo()\":{\"details\":\"Convenience helper\"},\"getRoleAdmin(bytes32)\":{\"details\":\"Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}.\"},\"grantRole(bytes32,address)\":{\"details\":\"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.\"},\"hasRole(bytes32,address)\":{\"details\":\"Returns `true` if `account` has been granted `role`.\"},\"isApprovedForAll(address,address)\":{\"details\":\"See {IERC721-isApprovedForAll}.\"},\"name()\":{\"details\":\"See {IERC721Metadata-name}.\"},\"owner()\":{\"details\":\"Required for easy integration with OpenSea, the owner address can edit the collection there\"},\"ownerOf(uint256)\":{\"details\":\"See {IERC721-ownerOf}.\"},\"renounceRole(bytes32,address)\":{\"details\":\"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.\"},\"revokeRole(bytes32,address)\":{\"details\":\"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.\"},\"royaltyInfo(uint256,uint256)\":{\"details\":\"ERC2981 token royalty info\"},\"safeTransferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"safeTransferFrom(address,address,uint256,bytes)\":{\"details\":\"See {IERC721-safeTransferFrom}.\"},\"setApprovalForAll(address,bool)\":{\"details\":\"See {IERC721-setApprovalForAll}.\"},\"supportsInterface(bytes4)\":{\"details\":\"See {IERC165-supportsInterface}.\"},\"symbol()\":{\"details\":\"See {IERC721Metadata-symbol}.\"},\"totalSupply()\":{\"details\":\"Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.\"},\"transferFrom(address,address,uint256)\":{\"details\":\"See {IERC721-transferFrom}.\"},\"updateConfig((string,bool,uint256,bool,uint256,bool,uint256,uint256,string,bytes32,uint256,address))\":{\"details\":\"Callable by admin roles only\"},\"withdrawFees()\":{\"details\":\"Callable by admin roles only\"}},\"version\":1},\"userdoc\":{\"kind\":\"user\",\"methods\":{\"ADMIN_ROLE()\":{\"notice\":\"Admin role, on contract initialization given to the deployer.\"},\"NAME()\":{\"notice\":\"Contract name\"},\"VERSION()\":{\"notice\":\"Contract version, semver-style uint X_YY_ZZ\"},\"availableSupply()\":{\"notice\":\"Get the number of tokens still available for minting\"},\"getInfo()\":{\"notice\":\"Get full contract information\"},\"initialize((string,string,address,uint256,uint256,uint256,address),(string,bool,uint256,bool,uint256,bool,uint256,uint256,string,bytes32,uint256,address))\":{\"notice\":\"Contract initializer\"},\"isWhitelisted(address,bytes32[])\":{\"notice\":\"Check if the wallet is whitelisted for the presale\"},\"mint(uint256)\":{\"notice\":\"Public mint function, can be called by any address if `DeploymentConfig.publicMintStart` is before the current block timestamp\"},\"mintingActive()\":{\"notice\":\"Check if public minting is active\"},\"owner()\":{\"notice\":\"Contract owner address\"},\"presaleActive()\":{\"notice\":\"Check if presale minting is active\"},\"presaleMint(uint256,bytes32[])\":{\"notice\":\"Mint tokens if the wallet has been whitelisted, can be called if `DeploymentConfig.presaleMintStart` is before the current block timestamp\"},\"reserveMint(address,uint256)\":{\"notice\":\"Mint a token from the reserve\"},\"reserveRemaining()\":{\"notice\":\"The number of tokens remaining in the reserve\"},\"tokenURI(uint256)\":{\"notice\":\"Get the token metadata URI\"},\"transferAdminRights(address)\":{\"notice\":\"Transfer contract admin rights, changes `ADMIN_ROLE` from sender address to input `to` address input `to` address cannot already have `ADMIN_ROLE` access rights\"},\"transferOwnership(address)\":{\"notice\":\"Transfer contract ownership\"},\"updateConfig((string,bool,uint256,bool,uint256,bool,uint256,uint256,string,bytes32,uint256,address))\":{\"notice\":\"Update contract configuration\"},\"withdrawFees()\":{\"notice\":\"Withdraw minting fees to the treasury address\"}},\"version\":1}},\"settings\":{\"compilationTarget\":{\"contracts/standalone/NFTCollectionContract.sol\":\"NFTCollectionContract\"},\"evmVersion\":\"london\",\"libraries\":{},\"metadata\":{\"bytecodeHash\":\"ipfs\",\"useLiteralContent\":true},\"optimizer\":{\"enabled\":true,\"runs\":200},\"remappings\":[]},\"sources\":{\"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (access/AccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IAccessControlUpgradeable.sol\\\";\\nimport \\\"../utils/ContextUpgradeable.sol\\\";\\nimport \\\"../utils/StringsUpgradeable.sol\\\";\\nimport \\\"../utils/introspection/ERC165Upgradeable.sol\\\";\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that allows children to implement role-based access\\n * control mechanisms. This is a lightweight version that doesn't allow enumerating role\\n * members except through off-chain means by accessing the contract event logs. Some\\n * applications may benefit from on-chain enumerability, for those cases see\\n * {AccessControlEnumerable}.\\n *\\n * Roles are referred to by their `bytes32` identifier. These should be exposed\\n * in the external API and be unique. The best way to achieve this is by\\n * using `public constant` hash digests:\\n *\\n * ```\\n * bytes32 public constant MY_ROLE = keccak256(\\\"MY_ROLE\\\");\\n * ```\\n *\\n * Roles can be used to represent a set of permissions. To restrict access to a\\n * function call, use {hasRole}:\\n *\\n * ```\\n * function foo() public {\\n * require(hasRole(MY_ROLE, msg.sender));\\n * ...\\n * }\\n * ```\\n *\\n * Roles can be granted and revoked dynamically via the {grantRole} and\\n * {revokeRole} functions. Each role has an associated admin role, and only\\n * accounts that have a role's admin role can call {grantRole} and {revokeRole}.\\n *\\n * By default, the admin role for all roles is `DEFAULT_ADMIN_ROLE`, which means\\n * that only accounts with this role will be able to grant or revoke other\\n * roles. More complex role relationships can be created by using\\n * {_setRoleAdmin}.\\n *\\n * WARNING: The `DEFAULT_ADMIN_ROLE` is also its own admin: it has permission to\\n * grant and revoke this role. Extra precautions should be taken to secure\\n * accounts that have been granted it.\\n */\\nabstract contract AccessControlUpgradeable is Initializable, ContextUpgradeable, IAccessControlUpgradeable, ERC165Upgradeable {\\n function __AccessControl_init() internal onlyInitializing {\\n }\\n\\n function __AccessControl_init_unchained() internal onlyInitializing {\\n }\\n struct RoleData {\\n mapping(address => bool) members;\\n bytes32 adminRole;\\n }\\n\\n mapping(bytes32 => RoleData) private _roles;\\n\\n bytes32 public constant DEFAULT_ADMIN_ROLE = 0x00;\\n\\n /**\\n * @dev Modifier that checks that an account has a specific role. Reverts\\n * with a standardized message including the required role.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n *\\n * _Available since v4.1._\\n */\\n modifier onlyRole(bytes32 role) {\\n _checkRole(role);\\n _;\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IAccessControlUpgradeable).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) public view virtual override returns (bool) {\\n return _roles[role].members[account];\\n }\\n\\n /**\\n * @dev Revert with a standard message if `_msgSender()` is missing `role`.\\n * Overriding this function changes the behavior of the {onlyRole} modifier.\\n *\\n * Format of the revert message is described in {_checkRole}.\\n *\\n * _Available since v4.6._\\n */\\n function _checkRole(bytes32 role) internal view virtual {\\n _checkRole(role, _msgSender());\\n }\\n\\n /**\\n * @dev Revert with a standard message if `account` is missing `role`.\\n *\\n * The format of the revert reason is given by the following regular expression:\\n *\\n * /^AccessControl: account (0x[0-9a-f]{40}) is missing role (0x[0-9a-f]{64})$/\\n */\\n function _checkRole(bytes32 role, address account) internal view virtual {\\n if (!hasRole(role, account)) {\\n revert(\\n string(\\n abi.encodePacked(\\n \\\"AccessControl: account \\\",\\n StringsUpgradeable.toHexString(uint160(account), 20),\\n \\\" is missing role \\\",\\n StringsUpgradeable.toHexString(uint256(role), 32)\\n )\\n )\\n );\\n }\\n }\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) public view virtual override returns (bytes32) {\\n return _roles[role].adminRole;\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function grantRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function revokeRole(bytes32 role, address account) public virtual override onlyRole(getRoleAdmin(role)) {\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been revoked `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function renounceRole(bytes32 role, address account) public virtual override {\\n require(account == _msgSender(), \\\"AccessControl: can only renounce roles for self\\\");\\n\\n _revokeRole(role, account);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event. Note that unlike {grantRole}, this function doesn't perform any\\n * checks on the calling account.\\n *\\n * May emit a {RoleGranted} event.\\n *\\n * [WARNING]\\n * ====\\n * This function should only be called from the constructor when setting\\n * up the initial roles for the system.\\n *\\n * Using this function in any other way is effectively circumventing the admin\\n * system imposed by {AccessControl}.\\n * ====\\n *\\n * NOTE: This function is deprecated in favor of {_grantRole}.\\n */\\n function _setupRole(bytes32 role, address account) internal virtual {\\n _grantRole(role, account);\\n }\\n\\n /**\\n * @dev Sets `adminRole` as ``role``'s admin role.\\n *\\n * Emits a {RoleAdminChanged} event.\\n */\\n function _setRoleAdmin(bytes32 role, bytes32 adminRole) internal virtual {\\n bytes32 previousAdminRole = getRoleAdmin(role);\\n _roles[role].adminRole = adminRole;\\n emit RoleAdminChanged(role, previousAdminRole, adminRole);\\n }\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleGranted} event.\\n */\\n function _grantRole(bytes32 role, address account) internal virtual {\\n if (!hasRole(role, account)) {\\n _roles[role].members[account] = true;\\n emit RoleGranted(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * Internal function without access restriction.\\n *\\n * May emit a {RoleRevoked} event.\\n */\\n function _revokeRole(bytes32 role, address account) internal virtual {\\n if (hasRole(role, account)) {\\n _roles[role].members[account] = false;\\n emit RoleRevoked(role, account, _msgSender());\\n }\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x2ea9f206854c98b67dd228f8cad22bfe90ba7b1c2295315672f2e1e244623fc3\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/access/IAccessControlUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (access/IAccessControl.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev External interface of AccessControl declared to support ERC165 detection.\\n */\\ninterface IAccessControlUpgradeable {\\n /**\\n * @dev Emitted when `newAdminRole` is set as ``role``'s admin role, replacing `previousAdminRole`\\n *\\n * `DEFAULT_ADMIN_ROLE` is the starting admin for all roles, despite\\n * {RoleAdminChanged} not being emitted signaling this.\\n *\\n * _Available since v3.1._\\n */\\n event RoleAdminChanged(bytes32 indexed role, bytes32 indexed previousAdminRole, bytes32 indexed newAdminRole);\\n\\n /**\\n * @dev Emitted when `account` is granted `role`.\\n *\\n * `sender` is the account that originated the contract call, an admin role\\n * bearer except when using {AccessControl-_setupRole}.\\n */\\n event RoleGranted(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Emitted when `account` is revoked `role`.\\n *\\n * `sender` is the account that originated the contract call:\\n * - if using `revokeRole`, it is the admin role bearer\\n * - if using `renounceRole`, it is the role bearer (i.e. `account`)\\n */\\n event RoleRevoked(bytes32 indexed role, address indexed account, address indexed sender);\\n\\n /**\\n * @dev Returns `true` if `account` has been granted `role`.\\n */\\n function hasRole(bytes32 role, address account) external view returns (bool);\\n\\n /**\\n * @dev Returns the admin role that controls `role`. See {grantRole} and\\n * {revokeRole}.\\n *\\n * To change a role's admin, use {AccessControl-_setRoleAdmin}.\\n */\\n function getRoleAdmin(bytes32 role) external view returns (bytes32);\\n\\n /**\\n * @dev Grants `role` to `account`.\\n *\\n * If `account` had not been already granted `role`, emits a {RoleGranted}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function grantRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from `account`.\\n *\\n * If `account` had been granted `role`, emits a {RoleRevoked} event.\\n *\\n * Requirements:\\n *\\n * - the caller must have ``role``'s admin role.\\n */\\n function revokeRole(bytes32 role, address account) external;\\n\\n /**\\n * @dev Revokes `role` from the calling account.\\n *\\n * Roles are often managed via {grantRole} and {revokeRole}: this function's\\n * purpose is to provide a mechanism for accounts to lose their privileges\\n * if they are compromised (such as when a trusted device is misplaced).\\n *\\n * If the calling account had been granted `role`, emits a {RoleRevoked}\\n * event.\\n *\\n * Requirements:\\n *\\n * - the caller must be `account`.\\n */\\n function renounceRole(bytes32 role, address account) external;\\n}\\n\",\"keccak256\":\"0xb8f5302f12138c5561362e88a78d061573e6298b7a1a5afe84a1e2c8d4d5aeaa\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (proxy/utils/Initializable.sol)\\n\\npragma solidity ^0.8.2;\\n\\nimport \\\"../../utils/AddressUpgradeable.sol\\\";\\n\\n/**\\n * @dev This is a base contract to aid in writing upgradeable contracts, or any kind of contract that will be deployed\\n * behind a proxy. Since proxied contracts do not make use of a constructor, it's common to move constructor logic to an\\n * external initializer function, usually called `initialize`. It then becomes necessary to protect this initializer\\n * function so it can only be called once. The {initializer} modifier provided by this contract will have this effect.\\n *\\n * The initialization functions use a version number. Once a version number is used, it is consumed and cannot be\\n * reused. This mechanism prevents re-execution of each \\\"step\\\" but allows the creation of new initialization steps in\\n * case an upgrade adds a module that needs to be initialized.\\n *\\n * For example:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * contract MyToken is ERC20Upgradeable {\\n * function initialize() initializer public {\\n * __ERC20_init(\\\"MyToken\\\", \\\"MTK\\\");\\n * }\\n * }\\n * contract MyTokenV2 is MyToken, ERC20PermitUpgradeable {\\n * function initializeV2() reinitializer(2) public {\\n * __ERC20Permit_init(\\\"MyToken\\\");\\n * }\\n * }\\n * ```\\n *\\n * TIP: To avoid leaving the proxy in an uninitialized state, the initializer function should be called as early as\\n * possible by providing the encoded function call as the `_data` argument to {ERC1967Proxy-constructor}.\\n *\\n * CAUTION: When used with inheritance, manual care must be taken to not invoke a parent initializer twice, or to ensure\\n * that all initializers are idempotent. This is not verified automatically as constructors are by Solidity.\\n *\\n * [CAUTION]\\n * ====\\n * Avoid leaving a contract uninitialized.\\n *\\n * An uninitialized contract can be taken over by an attacker. This applies to both a proxy and its implementation\\n * contract, which may impact the proxy. To prevent the implementation contract from being used, you should invoke\\n * the {_disableInitializers} function in the constructor to automatically lock it when it is deployed:\\n *\\n * [.hljs-theme-light.nopadding]\\n * ```\\n * /// @custom:oz-upgrades-unsafe-allow constructor\\n * constructor() {\\n * _disableInitializers();\\n * }\\n * ```\\n * ====\\n */\\nabstract contract Initializable {\\n /**\\n * @dev Indicates that the contract has been initialized.\\n * @custom:oz-retyped-from bool\\n */\\n uint8 private _initialized;\\n\\n /**\\n * @dev Indicates that the contract is in the process of being initialized.\\n */\\n bool private _initializing;\\n\\n /**\\n * @dev Triggered when the contract has been initialized or reinitialized.\\n */\\n event Initialized(uint8 version);\\n\\n /**\\n * @dev A modifier that defines a protected initializer function that can be invoked at most once. In its scope,\\n * `onlyInitializing` functions can be used to initialize parent contracts. Equivalent to `reinitializer(1)`.\\n */\\n modifier initializer() {\\n bool isTopLevelCall = !_initializing;\\n require(\\n (isTopLevelCall && _initialized < 1) || (!AddressUpgradeable.isContract(address(this)) && _initialized == 1),\\n \\\"Initializable: contract is already initialized\\\"\\n );\\n _initialized = 1;\\n if (isTopLevelCall) {\\n _initializing = true;\\n }\\n _;\\n if (isTopLevelCall) {\\n _initializing = false;\\n emit Initialized(1);\\n }\\n }\\n\\n /**\\n * @dev A modifier that defines a protected reinitializer function that can be invoked at most once, and only if the\\n * contract hasn't been initialized to a greater version before. In its scope, `onlyInitializing` functions can be\\n * used to initialize parent contracts.\\n *\\n * `initializer` is equivalent to `reinitializer(1)`, so a reinitializer may be used after the original\\n * initialization step. This is essential to configure modules that are added through upgrades and that require\\n * initialization.\\n *\\n * Note that versions can jump in increments greater than 1; this implies that if multiple reinitializers coexist in\\n * a contract, executing them in the right order is up to the developer or operator.\\n */\\n modifier reinitializer(uint8 version) {\\n require(!_initializing && _initialized < version, \\\"Initializable: contract is already initialized\\\");\\n _initialized = version;\\n _initializing = true;\\n _;\\n _initializing = false;\\n emit Initialized(version);\\n }\\n\\n /**\\n * @dev Modifier to protect an initialization function so that it can only be invoked by functions with the\\n * {initializer} and {reinitializer} modifiers, directly or indirectly.\\n */\\n modifier onlyInitializing() {\\n require(_initializing, \\\"Initializable: contract is not initializing\\\");\\n _;\\n }\\n\\n /**\\n * @dev Locks the contract, preventing any future reinitialization. This cannot be part of an initializer call.\\n * Calling this in the constructor of a contract will prevent that contract from being initialized or reinitialized\\n * to any version. It is recommended to use this to lock implementation contracts that are designed to be called\\n * through proxies.\\n */\\n function _disableInitializers() internal virtual {\\n require(!_initializing, \\\"Initializable: contract is initializing\\\");\\n if (_initialized < type(uint8).max) {\\n _initialized = type(uint8).max;\\n emit Initialized(type(uint8).max);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x0203dcadc5737d9ef2c211d6fa15d18ebc3b30dfa51903b64870b01a062b0b4e\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (security/ReentrancyGuard.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Contract module that helps prevent reentrant calls to a function.\\n *\\n * Inheriting from `ReentrancyGuard` will make the {nonReentrant} modifier\\n * available, which can be applied to functions to make sure there are no nested\\n * (reentrant) calls to them.\\n *\\n * Note that because there is a single `nonReentrant` guard, functions marked as\\n * `nonReentrant` may not call one another. This can be worked around by making\\n * those functions `private`, and then adding `external` `nonReentrant` entry\\n * points to them.\\n *\\n * TIP: If you would like to learn more about reentrancy and alternative ways\\n * to protect against it, check out our blog post\\n * https://blog.openzeppelin.com/reentrancy-after-istanbul/[Reentrancy After Istanbul].\\n */\\nabstract contract ReentrancyGuardUpgradeable is Initializable {\\n // Booleans are more expensive than uint256 or any type that takes up a full\\n // word because each write operation emits an extra SLOAD to first read the\\n // slot's contents, replace the bits taken up by the boolean, and then write\\n // back. This is the compiler's defense against contract upgrades and\\n // pointer aliasing, and it cannot be disabled.\\n\\n // The values being non-zero value makes deployment a bit more expensive,\\n // but in exchange the refund on every call to nonReentrant will be lower in\\n // amount. Since refunds are capped to a percentage of the total\\n // transaction's gas, it is best to keep them low in cases like this one, to\\n // increase the likelihood of the full refund coming into effect.\\n uint256 private constant _NOT_ENTERED = 1;\\n uint256 private constant _ENTERED = 2;\\n\\n uint256 private _status;\\n\\n function __ReentrancyGuard_init() internal onlyInitializing {\\n __ReentrancyGuard_init_unchained();\\n }\\n\\n function __ReentrancyGuard_init_unchained() internal onlyInitializing {\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev Prevents a contract from calling itself, directly or indirectly.\\n * Calling a `nonReentrant` function from another `nonReentrant`\\n * function is not supported. It is possible to prevent this from happening\\n * by making the `nonReentrant` function external, and making it call a\\n * `private` function that does the actual work.\\n */\\n modifier nonReentrant() {\\n // On the first call to nonReentrant, _notEntered will be true\\n require(_status != _ENTERED, \\\"ReentrancyGuard: reentrant call\\\");\\n\\n // Any calls to nonReentrant after this point will fail\\n _status = _ENTERED;\\n\\n _;\\n\\n // By storing the original value once again, a refund is triggered (see\\n // https://eips.ethereum.org/EIPS/eip-2200)\\n _status = _NOT_ENTERED;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[49] private __gap;\\n}\\n\",\"keccak256\":\"0x8cc03c5ac17e8a7396e487cda41fc1f1dfdb91db7d528e6da84bee3b6dd7e167\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (token/ERC721/IERC721Receiver.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @title ERC721 token receiver interface\\n * @dev Interface for any contract that wants to support safeTransfers\\n * from ERC721 asset contracts.\\n */\\ninterface IERC721ReceiverUpgradeable {\\n /**\\n * @dev Whenever an {IERC721} `tokenId` token is transferred to this contract via {IERC721-safeTransferFrom}\\n * by `operator` from `from`, this function is called.\\n *\\n * It must return its Solidity selector to confirm the token transfer.\\n * If any other value is returned or the interface is not implemented by the recipient, the transfer will be reverted.\\n *\\n * The selector can be obtained in Solidity with `IERC721Receiver.onERC721Received.selector`.\\n */\\n function onERC721Received(\\n address operator,\\n address from,\\n uint256 tokenId,\\n bytes calldata data\\n ) external returns (bytes4);\\n}\\n\",\"keccak256\":\"0xbb2ed8106d94aeae6858e2551a1e7174df73994b77b13ebd120ccaaef80155f5\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/ERC721/IERC721.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../utils/introspection/IERC165Upgradeable.sol\\\";\\n\\n/**\\n * @dev Required interface of an ERC721 compliant contract.\\n */\\ninterface IERC721Upgradeable is IERC165Upgradeable {\\n /**\\n * @dev Emitted when `tokenId` token is transferred from `from` to `to`.\\n */\\n event Transfer(address indexed from, address indexed to, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables `approved` to manage the `tokenId` token.\\n */\\n event Approval(address indexed owner, address indexed approved, uint256 indexed tokenId);\\n\\n /**\\n * @dev Emitted when `owner` enables or disables (`approved`) `operator` to manage all of its assets.\\n */\\n event ApprovalForAll(address indexed owner, address indexed operator, bool approved);\\n\\n /**\\n * @dev Returns the number of tokens in ``owner``'s account.\\n */\\n function balanceOf(address owner) external view returns (uint256 balance);\\n\\n /**\\n * @dev Returns the owner of the `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function ownerOf(uint256 tokenId) external view returns (address owner);\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes calldata data\\n ) external;\\n\\n /**\\n * @dev Safely transfers `tokenId` token from `from` to `to`, checking first that contract recipients\\n * are aware of the ERC721 protocol to prevent tokens from being forever locked.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must exist and be owned by `from`.\\n * - If the caller is not `from`, it must have been allowed to move this token by either {approve} or {setApprovalForAll}.\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called upon a safe transfer.\\n *\\n * Emits a {Transfer} event.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) external;\\n\\n /**\\n * @dev Transfers `tokenId` token from `from` to `to`.\\n *\\n * WARNING: Usage of this method is discouraged, use {safeTransferFrom} whenever possible.\\n *\\n * Requirements:\\n *\\n * - `from` cannot be the zero address.\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n * - If the caller is not `from`, it must be approved to move this token by either {approve} or {setApprovalForAll}.\\n *\\n * Emits a {Transfer} event.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) external;\\n\\n /**\\n * @dev Gives permission to `to` to transfer `tokenId` token to another account.\\n * The approval is cleared when the token is transferred.\\n *\\n * Only a single account can be approved at a time, so approving the zero address clears previous approvals.\\n *\\n * Requirements:\\n *\\n * - The caller must own the token or be an approved operator.\\n * - `tokenId` must exist.\\n *\\n * Emits an {Approval} event.\\n */\\n function approve(address to, uint256 tokenId) external;\\n\\n /**\\n * @dev Approve or remove `operator` as an operator for the caller.\\n * Operators can call {transferFrom} or {safeTransferFrom} for any token owned by the caller.\\n *\\n * Requirements:\\n *\\n * - The `operator` cannot be the caller.\\n *\\n * Emits an {ApprovalForAll} event.\\n */\\n function setApprovalForAll(address operator, bool _approved) external;\\n\\n /**\\n * @dev Returns the account approved for `tokenId` token.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n */\\n function getApproved(uint256 tokenId) external view returns (address operator);\\n\\n /**\\n * @dev Returns if the `operator` is allowed to manage all of the assets of `owner`.\\n *\\n * See {setApprovalForAll}\\n */\\n function isApprovedForAll(address owner, address operator) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x016298e66a5810253c6c905e61966bb31c8775c3f3517bf946ff56ee31d6c005\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (token/ERC721/extensions/IERC721Metadata.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../IERC721Upgradeable.sol\\\";\\n\\n/**\\n * @title ERC-721 Non-Fungible Token Standard, optional metadata extension\\n * @dev See https://eips.ethereum.org/EIPS/eip-721\\n */\\ninterface IERC721MetadataUpgradeable is IERC721Upgradeable {\\n /**\\n * @dev Returns the token collection name.\\n */\\n function name() external view returns (string memory);\\n\\n /**\\n * @dev Returns the token collection symbol.\\n */\\n function symbol() external view returns (string memory);\\n\\n /**\\n * @dev Returns the Uniform Resource Identifier (URI) for `tokenId` token.\\n */\\n function tokenURI(uint256 tokenId) external view returns (string memory);\\n}\\n\",\"keccak256\":\"0x95a471796eb5f030fdc438660bebec121ad5d063763e64d92376ffb4b5ce8b70\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary AddressUpgradeable {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0x611aa3f23e59cfdd1863c536776407b3e33d695152a266fa7cfb34440a29a8a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/Context.sol)\\n\\npragma solidity ^0.8.0;\\nimport \\\"../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Provides information about the current execution context, including the\\n * sender of the transaction and its data. While these are generally available\\n * via msg.sender and msg.data, they should not be accessed in such a direct\\n * manner, since when dealing with meta-transactions the account sending and\\n * paying for execution may not be the actual sender (as far as an application\\n * is concerned).\\n *\\n * This contract is only required for intermediate, library-like contracts.\\n */\\nabstract contract ContextUpgradeable is Initializable {\\n function __Context_init() internal onlyInitializing {\\n }\\n\\n function __Context_init_unchained() internal onlyInitializing {\\n }\\n function _msgSender() internal view virtual returns (address) {\\n return msg.sender;\\n }\\n\\n function _msgData() internal view virtual returns (bytes calldata) {\\n return msg.data;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x963ea7f0b48b032eef72fe3a7582edf78408d6f834115b9feadd673a4d5bd149\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary StringsUpgradeable {\\n bytes16 private constant _HEX_SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n // Inspired by OraclizeAPI's implementation - MIT licence\\n // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n if (value == 0) {\\n return \\\"0\\\";\\n }\\n uint256 temp = value;\\n uint256 digits;\\n while (temp != 0) {\\n digits++;\\n temp /= 10;\\n }\\n bytes memory buffer = new bytes(digits);\\n while (value != 0) {\\n digits -= 1;\\n buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\\n value /= 10;\\n }\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n if (value == 0) {\\n return \\\"0x00\\\";\\n }\\n uint256 temp = value;\\n uint256 length = 0;\\n while (temp != 0) {\\n length++;\\n temp >>= 8;\\n }\\n return toHexString(value, length);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _HEX_SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xea5339a7fff0ed42b45be56a88efdd0b2ddde9fa480dc99fef9a6a4c5b776863\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165Upgradeable.sol\\\";\\nimport \\\"../../proxy/utils/Initializable.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165Upgradeable is Initializable, IERC165Upgradeable {\\n function __ERC165_init() internal onlyInitializing {\\n }\\n\\n function __ERC165_init_unchained() internal onlyInitializing {\\n }\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165Upgradeable).interfaceId;\\n }\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[50] private __gap;\\n}\\n\",\"keccak256\":\"0x9a3b990bd56d139df3e454a9edf1c64668530b5a77fc32eb063bc206f958274a\",\"license\":\"MIT\"},\"@openzeppelin/contracts-upgradeable/utils/introspection/IERC165Upgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165Upgradeable {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0xc6cef87559d0aeffdf0a99803de655938a7779ec0a3cd5d4383483ad85565a09\",\"license\":\"MIT\"},\"@openzeppelin/contracts/interfaces/IERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.6.0) (interfaces/IERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../utils/introspection/IERC165.sol\\\";\\n\\n/**\\n * @dev Interface for the NFT Royalty Standard.\\n *\\n * A standardized way to retrieve royalty payment information for non-fungible tokens (NFTs) to enable universal\\n * support for royalty payments across all NFT marketplaces and ecosystem participants.\\n *\\n * _Available since v4.5._\\n */\\ninterface IERC2981 is IERC165 {\\n /**\\n * @dev Returns how much royalty is owed and to whom, based on a sale price that may be denominated in any unit of\\n * exchange. The royalty amount is denominated and should be paid in that same unit of exchange.\\n */\\n function royaltyInfo(uint256 tokenId, uint256 salePrice)\\n external\\n view\\n returns (address receiver, uint256 royaltyAmount);\\n}\\n\",\"keccak256\":\"0xa812eed728198acd2c30d06950a5bea8d68436e4f694dd892273266ec2f79f5b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/token/common/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (token/common/ERC2981.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"../../interfaces/IERC2981.sol\\\";\\nimport \\\"../../utils/introspection/ERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the NFT Royalty Standard, a standardized way to retrieve royalty payment information.\\n *\\n * Royalty information can be specified globally for all token ids via {_setDefaultRoyalty}, and/or individually for\\n * specific token ids via {_setTokenRoyalty}. The latter takes precedence over the first.\\n *\\n * Royalty is specified as a fraction of sale price. {_feeDenominator} is overridable but defaults to 10000, meaning the\\n * fee is specified in basis points by default.\\n *\\n * IMPORTANT: ERC-2981 only specifies a way to signal royalty information and does not enforce its payment. See\\n * https://eips.ethereum.org/EIPS/eip-2981#optional-royalty-payments[Rationale] in the EIP. Marketplaces are expected to\\n * voluntarily pay royalties together with sales, but note that this standard is not yet widely supported.\\n *\\n * _Available since v4.5._\\n */\\nabstract contract ERC2981 is IERC2981, ERC165 {\\n struct RoyaltyInfo {\\n address receiver;\\n uint96 royaltyFraction;\\n }\\n\\n RoyaltyInfo private _defaultRoyaltyInfo;\\n mapping(uint256 => RoyaltyInfo) private _tokenRoyaltyInfo;\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(IERC165, ERC165) returns (bool) {\\n return interfaceId == type(IERC2981).interfaceId || super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @inheritdoc IERC2981\\n */\\n function royaltyInfo(uint256 _tokenId, uint256 _salePrice) public view virtual override returns (address, uint256) {\\n RoyaltyInfo memory royalty = _tokenRoyaltyInfo[_tokenId];\\n\\n if (royalty.receiver == address(0)) {\\n royalty = _defaultRoyaltyInfo;\\n }\\n\\n uint256 royaltyAmount = (_salePrice * royalty.royaltyFraction) / _feeDenominator();\\n\\n return (royalty.receiver, royaltyAmount);\\n }\\n\\n /**\\n * @dev The denominator with which to interpret the fee set in {_setTokenRoyalty} and {_setDefaultRoyalty} as a\\n * fraction of the sale price. Defaults to 10000 so fees are expressed in basis points, but may be customized by an\\n * override.\\n */\\n function _feeDenominator() internal pure virtual returns (uint96) {\\n return 10000;\\n }\\n\\n /**\\n * @dev Sets the royalty information that all ids in this contract will default to.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setDefaultRoyalty(address receiver, uint96 feeNumerator) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: invalid receiver\\\");\\n\\n _defaultRoyaltyInfo = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Removes default royalty information.\\n */\\n function _deleteDefaultRoyalty() internal virtual {\\n delete _defaultRoyaltyInfo;\\n }\\n\\n /**\\n * @dev Sets the royalty information for a specific token id, overriding the global default.\\n *\\n * Requirements:\\n *\\n * - `receiver` cannot be the zero address.\\n * - `feeNumerator` cannot be greater than the fee denominator.\\n */\\n function _setTokenRoyalty(\\n uint256 tokenId,\\n address receiver,\\n uint96 feeNumerator\\n ) internal virtual {\\n require(feeNumerator <= _feeDenominator(), \\\"ERC2981: royalty fee will exceed salePrice\\\");\\n require(receiver != address(0), \\\"ERC2981: Invalid parameters\\\");\\n\\n _tokenRoyaltyInfo[tokenId] = RoyaltyInfo(receiver, feeNumerator);\\n }\\n\\n /**\\n * @dev Resets royalty information for the token id back to the global default.\\n */\\n function _resetTokenRoyalty(uint256 tokenId) internal virtual {\\n delete _tokenRoyaltyInfo[tokenId];\\n }\\n}\\n\",\"keccak256\":\"0x9bc4d7eb03c4e87fd5122e03cdff5f60fa360d76925980ad022b2c6fac9876f3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Address.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Address.sol)\\n\\npragma solidity ^0.8.1;\\n\\n/**\\n * @dev Collection of functions related to the address type\\n */\\nlibrary Address {\\n /**\\n * @dev Returns true if `account` is a contract.\\n *\\n * [IMPORTANT]\\n * ====\\n * It is unsafe to assume that an address for which this function returns\\n * false is an externally-owned account (EOA) and not a contract.\\n *\\n * Among others, `isContract` will return false for the following\\n * types of addresses:\\n *\\n * - an externally-owned account\\n * - a contract in construction\\n * - an address where a contract will be created\\n * - an address where a contract lived, but was destroyed\\n * ====\\n *\\n * [IMPORTANT]\\n * ====\\n * You shouldn't rely on `isContract` to protect against flash loan attacks!\\n *\\n * Preventing calls from contracts is highly discouraged. It breaks composability, breaks support for smart wallets\\n * like Gnosis Safe, and does not provide security since it can be circumvented by calling from a contract\\n * constructor.\\n * ====\\n */\\n function isContract(address account) internal view returns (bool) {\\n // This method relies on extcodesize/address.code.length, which returns 0\\n // for contracts in construction, since the code is only stored at the end\\n // of the constructor execution.\\n\\n return account.code.length > 0;\\n }\\n\\n /**\\n * @dev Replacement for Solidity's `transfer`: sends `amount` wei to\\n * `recipient`, forwarding all available gas and reverting on errors.\\n *\\n * https://eips.ethereum.org/EIPS/eip-1884[EIP1884] increases the gas cost\\n * of certain opcodes, possibly making contracts go over the 2300 gas limit\\n * imposed by `transfer`, making them unable to receive funds via\\n * `transfer`. {sendValue} removes this limitation.\\n *\\n * https://diligence.consensys.net/posts/2019/09/stop-using-soliditys-transfer-now/[Learn more].\\n *\\n * IMPORTANT: because control is transferred to `recipient`, care must be\\n * taken to not create reentrancy vulnerabilities. Consider using\\n * {ReentrancyGuard} or the\\n * https://solidity.readthedocs.io/en/v0.5.11/security-considerations.html#use-the-checks-effects-interactions-pattern[checks-effects-interactions pattern].\\n */\\n function sendValue(address payable recipient, uint256 amount) internal {\\n require(address(this).balance >= amount, \\\"Address: insufficient balance\\\");\\n\\n (bool success, ) = recipient.call{value: amount}(\\\"\\\");\\n require(success, \\\"Address: unable to send value, recipient may have reverted\\\");\\n }\\n\\n /**\\n * @dev Performs a Solidity function call using a low level `call`. A\\n * plain `call` is an unsafe replacement for a function call: use this\\n * function instead.\\n *\\n * If `target` reverts with a revert reason, it is bubbled up by this\\n * function (like regular Solidity function calls).\\n *\\n * Returns the raw returned data. To convert to the expected return value,\\n * use https://solidity.readthedocs.io/en/latest/units-and-global-variables.html?highlight=abi.decode#abi-encoding-and-decoding-functions[`abi.decode`].\\n *\\n * Requirements:\\n *\\n * - `target` must be a contract.\\n * - calling `target` with `data` must not revert.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionCall(target, data, \\\"Address: low-level call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`], but with\\n * `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, 0, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but also transferring `value` wei to `target`.\\n *\\n * Requirements:\\n *\\n * - the calling contract must have an ETH balance of at least `value`.\\n * - the called Solidity function must be `payable`.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value\\n ) internal returns (bytes memory) {\\n return functionCallWithValue(target, data, value, \\\"Address: low-level call with value failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCallWithValue-address-bytes-uint256-}[`functionCallWithValue`], but\\n * with `errorMessage` as a fallback revert reason when `target` reverts.\\n *\\n * _Available since v3.1._\\n */\\n function functionCallWithValue(\\n address target,\\n bytes memory data,\\n uint256 value,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(address(this).balance >= value, \\\"Address: insufficient balance for call\\\");\\n require(isContract(target), \\\"Address: call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.call{value: value}(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(address target, bytes memory data) internal view returns (bytes memory) {\\n return functionStaticCall(target, data, \\\"Address: low-level static call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a static call.\\n *\\n * _Available since v3.3._\\n */\\n function functionStaticCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal view returns (bytes memory) {\\n require(isContract(target), \\\"Address: static call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.staticcall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(address target, bytes memory data) internal returns (bytes memory) {\\n return functionDelegateCall(target, data, \\\"Address: low-level delegate call failed\\\");\\n }\\n\\n /**\\n * @dev Same as {xref-Address-functionCall-address-bytes-string-}[`functionCall`],\\n * but performing a delegate call.\\n *\\n * _Available since v3.4._\\n */\\n function functionDelegateCall(\\n address target,\\n bytes memory data,\\n string memory errorMessage\\n ) internal returns (bytes memory) {\\n require(isContract(target), \\\"Address: delegate call to non-contract\\\");\\n\\n (bool success, bytes memory returndata) = target.delegatecall(data);\\n return verifyCallResult(success, returndata, errorMessage);\\n }\\n\\n /**\\n * @dev Tool to verifies that a low level call was successful, and revert if it wasn't, either by bubbling the\\n * revert reason using the provided one.\\n *\\n * _Available since v4.3._\\n */\\n function verifyCallResult(\\n bool success,\\n bytes memory returndata,\\n string memory errorMessage\\n ) internal pure returns (bytes memory) {\\n if (success) {\\n return returndata;\\n } else {\\n // Look for revert reason and bubble it up if present\\n if (returndata.length > 0) {\\n // The easiest way to bubble the revert reason is using memory via assembly\\n /// @solidity memory-safe-assembly\\n assembly {\\n let returndata_size := mload(returndata)\\n revert(add(32, returndata), returndata_size)\\n }\\n } else {\\n revert(errorMessage);\\n }\\n }\\n }\\n}\\n\",\"keccak256\":\"0xd6153ce99bcdcce22b124f755e72553295be6abcd63804cfdffceb188b8bef10\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/Strings.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/Strings.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev String operations.\\n */\\nlibrary Strings {\\n bytes16 private constant _HEX_SYMBOLS = \\\"0123456789abcdef\\\";\\n uint8 private constant _ADDRESS_LENGTH = 20;\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` decimal representation.\\n */\\n function toString(uint256 value) internal pure returns (string memory) {\\n // Inspired by OraclizeAPI's implementation - MIT licence\\n // https://github.com/oraclize/ethereum-api/blob/b42146b063c7d6ee1358846c198246239e9360e8/oraclizeAPI_0.4.25.sol\\n\\n if (value == 0) {\\n return \\\"0\\\";\\n }\\n uint256 temp = value;\\n uint256 digits;\\n while (temp != 0) {\\n digits++;\\n temp /= 10;\\n }\\n bytes memory buffer = new bytes(digits);\\n while (value != 0) {\\n digits -= 1;\\n buffer[digits] = bytes1(uint8(48 + uint256(value % 10)));\\n value /= 10;\\n }\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation.\\n */\\n function toHexString(uint256 value) internal pure returns (string memory) {\\n if (value == 0) {\\n return \\\"0x00\\\";\\n }\\n uint256 temp = value;\\n uint256 length = 0;\\n while (temp != 0) {\\n length++;\\n temp >>= 8;\\n }\\n return toHexString(value, length);\\n }\\n\\n /**\\n * @dev Converts a `uint256` to its ASCII `string` hexadecimal representation with fixed length.\\n */\\n function toHexString(uint256 value, uint256 length) internal pure returns (string memory) {\\n bytes memory buffer = new bytes(2 * length + 2);\\n buffer[0] = \\\"0\\\";\\n buffer[1] = \\\"x\\\";\\n for (uint256 i = 2 * length + 1; i > 1; --i) {\\n buffer[i] = _HEX_SYMBOLS[value & 0xf];\\n value >>= 4;\\n }\\n require(value == 0, \\\"Strings: hex length insufficient\\\");\\n return string(buffer);\\n }\\n\\n /**\\n * @dev Converts an `address` with fixed length of 20 bytes to its not checksummed ASCII `string` hexadecimal representation.\\n */\\n function toHexString(address addr) internal pure returns (string memory) {\\n return toHexString(uint256(uint160(addr)), _ADDRESS_LENGTH);\\n }\\n}\\n\",\"keccak256\":\"0xaf159a8b1923ad2a26d516089bceca9bdeaeacd04be50983ea00ba63070f08a3\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts (last updated v4.7.0) (utils/cryptography/MerkleProof.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev These functions deal with verification of Merkle Tree proofs.\\n *\\n * The proofs can be generated using the JavaScript library\\n * https://github.com/miguelmota/merkletreejs[merkletreejs].\\n * Note: the hashing algorithm should be keccak256 and pair sorting should be enabled.\\n *\\n * See `test/utils/cryptography/MerkleProof.test.js` for some examples.\\n *\\n * WARNING: You should avoid using leaf values that are 64 bytes long prior to\\n * hashing, or use a hash function other than keccak256 for hashing leaves.\\n * This is because the concatenation of a sorted pair of internal nodes in\\n * the merkle tree could be reinterpreted as a leaf value.\\n */\\nlibrary MerkleProof {\\n /**\\n * @dev Returns true if a `leaf` can be proved to be a part of a Merkle tree\\n * defined by `root`. For this, a `proof` must be provided, containing\\n * sibling hashes on the branch from the leaf to the root of the tree. Each\\n * pair of leaves and each pair of pre-images are assumed to be sorted.\\n */\\n function verify(\\n bytes32[] memory proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProof(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {verify}\\n *\\n * _Available since v4.7._\\n */\\n function verifyCalldata(\\n bytes32[] calldata proof,\\n bytes32 root,\\n bytes32 leaf\\n ) internal pure returns (bool) {\\n return processProofCalldata(proof, leaf) == root;\\n }\\n\\n /**\\n * @dev Returns the rebuilt hash obtained by traversing a Merkle tree up\\n * from `leaf` using `proof`. A `proof` is valid if and only if the rebuilt\\n * hash matches the root of the tree. When processing the proof, the pairs\\n * of leafs & pre-images are assumed to be sorted.\\n *\\n * _Available since v4.4._\\n */\\n function processProof(bytes32[] memory proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Calldata version of {processProof}\\n *\\n * _Available since v4.7._\\n */\\n function processProofCalldata(bytes32[] calldata proof, bytes32 leaf) internal pure returns (bytes32) {\\n bytes32 computedHash = leaf;\\n for (uint256 i = 0; i < proof.length; i++) {\\n computedHash = _hashPair(computedHash, proof[i]);\\n }\\n return computedHash;\\n }\\n\\n /**\\n * @dev Returns true if the `leaves` can be proved to be a part of a Merkle tree defined by\\n * `root`, according to `proof` and `proofFlags` as described in {processMultiProof}.\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerify(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProof(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Calldata version of {multiProofVerify}\\n *\\n * _Available since v4.7._\\n */\\n function multiProofVerifyCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32 root,\\n bytes32[] memory leaves\\n ) internal pure returns (bool) {\\n return processMultiProofCalldata(proof, proofFlags, leaves) == root;\\n }\\n\\n /**\\n * @dev Returns the root of a tree reconstructed from `leaves` and the sibling nodes in `proof`,\\n * consuming from one or the other at each step according to the instructions given by\\n * `proofFlags`.\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProof(\\n bytes32[] memory proof,\\n bool[] memory proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n /**\\n * @dev Calldata version of {processMultiProof}\\n *\\n * _Available since v4.7._\\n */\\n function processMultiProofCalldata(\\n bytes32[] calldata proof,\\n bool[] calldata proofFlags,\\n bytes32[] memory leaves\\n ) internal pure returns (bytes32 merkleRoot) {\\n // This function rebuild the root hash by traversing the tree up from the leaves. The root is rebuilt by\\n // consuming and producing values on a queue. The queue starts with the `leaves` array, then goes onto the\\n // `hashes` array. At the end of the process, the last hash in the `hashes` array should contain the root of\\n // the merkle tree.\\n uint256 leavesLen = leaves.length;\\n uint256 totalHashes = proofFlags.length;\\n\\n // Check proof validity.\\n require(leavesLen + proof.length - 1 == totalHashes, \\\"MerkleProof: invalid multiproof\\\");\\n\\n // The xxxPos values are \\\"pointers\\\" to the next value to consume in each array. All accesses are done using\\n // `xxx[xxxPos++]`, which return the current value and increment the pointer, thus mimicking a queue's \\\"pop\\\".\\n bytes32[] memory hashes = new bytes32[](totalHashes);\\n uint256 leafPos = 0;\\n uint256 hashPos = 0;\\n uint256 proofPos = 0;\\n // At each step, we compute the next hash using two values:\\n // - a value from the \\\"main queue\\\". If not all leaves have been consumed, we get the next leaf, otherwise we\\n // get the next hash.\\n // - depending on the flag, either another value for the \\\"main queue\\\" (merging branches) or an element from the\\n // `proof` array.\\n for (uint256 i = 0; i < totalHashes; i++) {\\n bytes32 a = leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++];\\n bytes32 b = proofFlags[i] ? leafPos < leavesLen ? leaves[leafPos++] : hashes[hashPos++] : proof[proofPos++];\\n hashes[i] = _hashPair(a, b);\\n }\\n\\n if (totalHashes > 0) {\\n return hashes[totalHashes - 1];\\n } else if (leavesLen > 0) {\\n return leaves[0];\\n } else {\\n return proof[0];\\n }\\n }\\n\\n function _hashPair(bytes32 a, bytes32 b) private pure returns (bytes32) {\\n return a < b ? _efficientHash(a, b) : _efficientHash(b, a);\\n }\\n\\n function _efficientHash(bytes32 a, bytes32 b) private pure returns (bytes32 value) {\\n /// @solidity memory-safe-assembly\\n assembly {\\n mstore(0x00, a)\\n mstore(0x20, b)\\n value := keccak256(0x00, 0x40)\\n }\\n }\\n}\\n\",\"keccak256\":\"0x596ed72a251d391b814a4aa19d7acb02ebdcc92ba27d3fff74a6f0c158b12ab7\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/ERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/ERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\nimport \\\"./IERC165.sol\\\";\\n\\n/**\\n * @dev Implementation of the {IERC165} interface.\\n *\\n * Contracts that want to implement ERC165 should inherit from this contract and override {supportsInterface} to check\\n * for the additional interface id that will be supported. For example:\\n *\\n * ```solidity\\n * function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n * return interfaceId == type(MyInterface).interfaceId || super.supportsInterface(interfaceId);\\n * }\\n * ```\\n *\\n * Alternatively, {ERC165Storage} provides an easier to use but more expensive implementation.\\n */\\nabstract contract ERC165 is IERC165 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override returns (bool) {\\n return interfaceId == type(IERC165).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xd10975de010d89fd1c78dc5e8a9a7e7f496198085c151648f20cba166b32582b\",\"license\":\"MIT\"},\"@openzeppelin/contracts/utils/introspection/IERC165.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// OpenZeppelin Contracts v4.4.1 (utils/introspection/IERC165.sol)\\n\\npragma solidity ^0.8.0;\\n\\n/**\\n * @dev Interface of the ERC165 standard, as defined in the\\n * https://eips.ethereum.org/EIPS/eip-165[EIP].\\n *\\n * Implementers can declare support of contract interfaces, which can then be\\n * queried by others ({ERC165Checker}).\\n *\\n * For an implementation, see {ERC165}.\\n */\\ninterface IERC165 {\\n /**\\n * @dev Returns true if this contract implements the interface defined by\\n * `interfaceId`. See the corresponding\\n * https://eips.ethereum.org/EIPS/eip-165#how-interfaces-are-identified[EIP section]\\n * to learn more about how these ids are created.\\n *\\n * This function call must use less than 30 000 gas.\\n */\\n function supportsInterface(bytes4 interfaceId) external view returns (bool);\\n}\\n\",\"keccak256\":\"0x447a5f3ddc18419d41ff92b3773fb86471b1db25773e07f877f548918a185bf1\",\"license\":\"MIT\"},\"contracts/lib/Base64.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity >=0.8.14;\\n\\n/// @title Base64\\n/// @notice Provides a function for encoding some bytes in base64\\n/// @author Brecht Devos \\nlibrary Base64 {\\n bytes internal constant _TABLE =\\n \\\"ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/\\\";\\n\\n /// @notice Encodes some bytes to the base64 representation\\n function encode(bytes memory data) internal pure returns (string memory) {\\n uint256 len = data.length;\\n if (len == 0) return \\\"\\\";\\n\\n // multiply by 4/3 rounded up\\n uint256 encodedLen = 4 * ((len + 2) / 3);\\n\\n // Add some extra buffer at the end\\n bytes memory result = new bytes(encodedLen + 32);\\n\\n bytes memory table = _TABLE;\\n\\n // solhint-disable-next-line no-inline-assembly\\n assembly {\\n let tablePtr := add(table, 1)\\n let resultPtr := add(result, 32)\\n\\n for {\\n let i := 0\\n } lt(i, len) {\\n // solhint-disable-previous-line no-empty-blocks\\n } {\\n i := add(i, 3)\\n let input := and(mload(add(data, i)), 0xffffff)\\n\\n let out := mload(add(tablePtr, and(shr(18, input), 0x3F)))\\n out := shl(8, out)\\n out := add(\\n out,\\n and(mload(add(tablePtr, and(shr(12, input), 0x3F))), 0xFF)\\n )\\n out := shl(8, out)\\n out := add(\\n out,\\n and(mload(add(tablePtr, and(shr(6, input), 0x3F))), 0xFF)\\n )\\n out := shl(8, out)\\n out := add(\\n out,\\n and(mload(add(tablePtr, and(input, 0x3F))), 0xFF)\\n )\\n out := shl(224, out)\\n\\n mstore(resultPtr, out)\\n\\n resultPtr := add(resultPtr, 4)\\n }\\n\\n switch mod(len, 3)\\n case 1 {\\n mstore(sub(resultPtr, 2), shl(240, 0x3d3d))\\n }\\n case 2 {\\n mstore(sub(resultPtr, 1), shl(248, 0x3d))\\n }\\n\\n mstore(result, encodedLen)\\n }\\n\\n return string(result);\\n }\\n}\\n\",\"keccak256\":\"0x48822add7a355a6d6c04679ecba55383d0490eedd1c02915871c36f9e1683185\",\"license\":\"MIT\"},\"contracts/lib/ERC2981.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"@openzeppelin/contracts/utils/introspection/IERC165.sol\\\";\\nimport {IERC2981} from \\\"@openzeppelin/contracts/token/common/ERC2981.sol\\\";\\n\\nabstract contract ERC2981 is IERC165, IERC2981 {\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n virtual\\n override\\n returns (bool)\\n {\\n return interfaceId == type(IERC2981).interfaceId;\\n }\\n}\\n\",\"keccak256\":\"0xa8b81ee9a467d26b366547a235506bce4f9f37b8966ea60d2abc56d4631833c4\",\"license\":\"MIT\"},\"contracts/lib/ITemplate.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\n/*\\n * Template interface, used by factory contracts to get the name and version of a contract,\\n * that extends this interface.\\n */\\ninterface ITemplate {\\n function NAME() external view returns (string memory);\\n\\n function VERSION() external view returns (uint256);\\n}\\n\",\"keccak256\":\"0xbf583f0046bf96a84fc2bc5cef21d433c838a7f701f7c93229d9faf026014e20\",\"license\":\"MIT\"},\"contracts/standalone/NFTCollectionContract.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"../templates/NFTCollection.sol\\\";\\n\\ncontract NFTCollectionContract is NFTCollection {\\n constructor(\\n DeploymentConfig memory deploymentConfig,\\n RuntimeConfig memory runtimeConfig\\n ) initializer {\\n initialize(deploymentConfig, runtimeConfig);\\n }\\n}\\n\",\"keccak256\":\"0x36da6de956baa19bcaee01ae9958331af49f4c3f20cdd09f9f7b585bf73545af\",\"license\":\"MIT\"},\"contracts/templates/NFTCollection.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\npragma solidity ^0.8.0;\\n\\nimport \\\"erc721a-upgradeable/contracts/ERC721AUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Address.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/Strings.sol\\\";\\nimport \\\"@openzeppelin/contracts/utils/cryptography/MerkleProof.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/access/AccessControlUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/security/ReentrancyGuardUpgradeable.sol\\\";\\n\\nimport \\\"../lib/ERC2981.sol\\\";\\nimport \\\"../lib/Base64.sol\\\";\\nimport \\\"../lib/ITemplate.sol\\\";\\n\\n/**\\n * @title NFTCollection\\n * @notice Implements https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\n * the Metadata extension.\\n *\\n * Uses ERC721A, with token IDs starting from 0 and increasing sequentially.\\n * This is a template contract, meaning it cannot be initialized or used directly.\\n * The only function of this contract is to store the code that proxies delegate their logic to.\\n */\\ncontract NFTCollection is\\n ERC721AUpgradeable,\\n AccessControlUpgradeable,\\n ERC2981,\\n ITemplate,\\n ReentrancyGuardUpgradeable\\n{\\n using Address for address payable;\\n using Strings for uint256;\\n\\n /// Fixed at deployment time\\n struct DeploymentConfig {\\n // Name of the NFT contract.\\n string name;\\n // Symbol of the NFT contract.\\n string symbol;\\n // The contract owner address. If you wish to own the contract, then set it as your wallet address.\\n // This is also the wallet that can manage the contract on NFT marketplaces. Use `transferOwnership()`\\n // to update the contract owner. Owner gets `ADMIN_ROLE` and `DEFAULT_ADMIN_ROLE`, see {AccessControl}.\\n // The only part of `DeploymentConfig`, that can be updated after deployment.\\n address owner;\\n // The maximum number of tokens that can be minted in this collection.\\n uint256 maxSupply;\\n // The number of free token mints reserved for the contract owner\\n uint256 reservedSupply;\\n // The maximum number of tokens the user can mint per transaction.\\n uint256 tokensPerMint;\\n // Treasury address is the address where minting fees can be withdrawn to.\\n // Use `withdrawFees()` to transfer the entire contract balance to the treasury address.\\n address payable treasuryAddress;\\n }\\n\\n /// Updatable by admins and owner with `updateConfig`\\n struct RuntimeConfig {\\n // Metadata base URI for tokens, NFTs minted in this contract will have metadata URI of `baseURI` + `tokenID`.\\n // Set this to reveal token metadata.\\n string baseURI;\\n // If false, the base URI of the NFTs minted in the specified contract can be updated after minting (token URIs\\n // are not frozen on the contract level). This is useful for revealing NFTs after the drop. If true, all the\\n // NFTs minted in this contract are frozen by default which means token URIs are non-updatable.\\n bool metadataFrozen;\\n // Minting price per token for public minting\\n uint256 publicMintPrice;\\n // Flag for freezing the public mint price\\n bool publicMintPriceFrozen;\\n // Minting price per token for presale minting\\n uint256 presaleMintPrice;\\n // Flag for freezing the presale mint price\\n bool presaleMintPriceFrozen;\\n // Starting timestamp for public minting.\\n uint256 publicMintStart;\\n // Starting timestamp for whitelisted/presale minting,\\n // both public and presale minting can be active at the same time.\\n uint256 presaleMintStart;\\n // Pre-reveal token URI for placeholder metadata. This will be returned for all token IDs until a `baseURI`\\n // has been set.\\n string prerevealTokenURI;\\n // Root of the Merkle tree of whitelisted addresses. This is used to check if a wallet has been whitelisted\\n // for presale minting.\\n bytes32 presaleMerkleRoot;\\n // Secondary market royalties in basis points (100 bps = 1%). Royalties use ERC2981 standard and support\\n // OpenSea standard.\\n uint256 royaltiesBps;\\n // Address for royalties\\n address royaltiesAddress;\\n }\\n\\n // Used in `getInfo()` to get full contract info\\n struct ContractInfo {\\n // semver-style contract version from `VERSION`\\n uint256 version;\\n // Contract config that is fixed on deployment\\n DeploymentConfig deploymentConfig;\\n // Updatable runtime config\\n RuntimeConfig runtimeConfig;\\n }\\n\\n // Event emitted when `transferOwnership` called by current owner.\\n event OwnershipTransferred(\\n address indexed previousOwner,\\n address indexed newOwner\\n );\\n\\n /*************\\n * Constants *\\n *************/\\n\\n /// Contract name\\n string public constant NAME = \\\"NFTCollection\\\";\\n\\n /// Contract version, semver-style uint X_YY_ZZ\\n uint256 public constant VERSION = 1_05_00;\\n\\n /// Admin role, on contract initialization given to the deployer.\\n // Can be updated with `transferOwnership`\\n bytes32 public constant ADMIN_ROLE = keccak256(\\\"ADMIN_ROLE\\\");\\n\\n // Basis for calculating royalties.\\n // This has to be 10k for royaltiesBps to be in basis points.\\n uint16 public constant ROYALTIES_BASIS = 10000;\\n\\n /********************\\n * Public variables *\\n ********************/\\n\\n /// The number of tokens remaining in the reserve\\n /// @dev Managed by the contract\\n uint256 public reserveRemaining;\\n\\n /***************************\\n * Contract initialization *\\n ***************************/\\n\\n constructor() initializer {}\\n\\n /// Contract initializer\\n // https://eips.ethereum.org/EIPS/eip-1167\\n function initialize(\\n DeploymentConfig memory deploymentConfig,\\n RuntimeConfig memory runtimeConfig\\n ) public initializer {\\n __ERC721A_init(_deploymentConfig.name, _deploymentConfig.symbol);\\n __ReentrancyGuard_init();\\n\\n _validateDeploymentConfig(deploymentConfig);\\n _validateRuntimeConfig(runtimeConfig);\\n\\n // template intializer gets ADMIN_ROLE to call contract write functions\\n _grantRole(ADMIN_ROLE, msg.sender);\\n // grants `DEFAULT_ADMIN_ROLE` and `ADMIN_ROLE` to `deploymentConfig.owner`\\n _transferOwnership(deploymentConfig.owner);\\n\\n _deploymentConfig = deploymentConfig;\\n _runtimeConfig = runtimeConfig;\\n\\n reserveRemaining = deploymentConfig.reservedSupply;\\n }\\n\\n /****************\\n * User actions *\\n ****************/\\n\\n /// Public mint function, can be called by any address\\n /// if `DeploymentConfig.publicMintStart` is before the current block timestamp\\n function mint(uint256 amount)\\n external\\n payable\\n paymentProvided(amount * _runtimeConfig.publicMintPrice)\\n nonReentrant\\n {\\n require(mintingActive(), \\\"Minting has not started yet\\\");\\n\\n _mintTokens(msg.sender, amount);\\n }\\n\\n /// Mint tokens if the wallet has been whitelisted, can be called\\n /// if `DeploymentConfig.presaleMintStart` is before the current block timestamp\\n function presaleMint(uint256 amount, bytes32[] calldata proof)\\n external\\n payable\\n paymentProvided(amount * _runtimeConfig.presaleMintPrice)\\n nonReentrant\\n {\\n require(presaleActive(), \\\"Presale has not started yet\\\");\\n require(\\n isWhitelisted(msg.sender, proof),\\n \\\"Not whitelisted for presale\\\"\\n );\\n\\n // Each presale whitelisted address can only mint once, up to `DeploymentConfig.tokensPerMint` tokens\\n _presaleMinted[msg.sender] = true;\\n _mintTokens(msg.sender, amount);\\n }\\n\\n /******************\\n * View functions *\\n ******************/\\n\\n /// Check if public minting is active\\n function mintingActive() public view returns (bool) {\\n // We need to rely on block.timestamp since it's\\n // easier to configure across different chains\\n // solhint-disable-next-line not-rely-on-time\\n return block.timestamp > _runtimeConfig.publicMintStart;\\n }\\n\\n /// Check if presale minting is active\\n function presaleActive() public view returns (bool) {\\n // We need to rely on block.timestamp since it's\\n // easier to configure across different chains\\n // solhint-disable-next-line not-rely-on-time\\n return block.timestamp > _runtimeConfig.presaleMintStart;\\n }\\n\\n /// Get the number of tokens still available for minting\\n function availableSupply() public view returns (uint256) {\\n return _deploymentConfig.maxSupply - totalSupply() - reserveRemaining;\\n }\\n\\n /// Check if the wallet is whitelisted for the presale\\n function isWhitelisted(address wallet, bytes32[] calldata proof)\\n public\\n view\\n returns (bool)\\n {\\n // Each wallet can only call `presaleMint` once\\n require(!_presaleMinted[wallet], \\\"Already minted\\\");\\n\\n // Used for checking if wallet is part of the merkle tree\\n bytes32 leaf = keccak256(abi.encodePacked(wallet));\\n\\n // Checks if `leaf` is part of the merkle tree\\n return\\n MerkleProof.verify(proof, _runtimeConfig.presaleMerkleRoot, leaf);\\n }\\n\\n /// Contract owner address\\n /// @dev Required for easy integration with OpenSea, the owner address can edit the collection there\\n function owner() public view returns (address) {\\n return _deploymentConfig.owner;\\n }\\n\\n /*******************\\n * Access controls *\\n *******************/\\n\\n /// Transfer contract ownership\\n function transferOwnership(address newOwner)\\n external\\n onlyRole(DEFAULT_ADMIN_ROLE)\\n {\\n require(newOwner != _deploymentConfig.owner, \\\"Already the owner\\\");\\n _transferOwnership(newOwner);\\n }\\n\\n /// Transfer contract admin rights, changes `ADMIN_ROLE` from sender address to input `to` address\\n /// input `to` address cannot already have `ADMIN_ROLE` access rights\\n function transferAdminRights(address to) external onlyRole(ADMIN_ROLE) {\\n require(!hasRole(ADMIN_ROLE, to), \\\"Already an admin\\\");\\n require(msg.sender != _deploymentConfig.owner, \\\"Use transferOwnership\\\");\\n\\n _revokeRole(ADMIN_ROLE, msg.sender);\\n _grantRole(ADMIN_ROLE, to);\\n }\\n\\n /*****************\\n * Admin actions *\\n *****************/\\n\\n /// Mint a token from the reserve\\n function reserveMint(address to, uint256 amount)\\n external\\n onlyRole(ADMIN_ROLE)\\n {\\n require(amount <= reserveRemaining, \\\"Not enough reserved\\\");\\n // if `reserveRemaining` ends up as 0, then further reserve mints are disabled, since `_mintTokens`\\n // expects `amount` to be greater than 0\\n reserveRemaining -= amount;\\n _mintTokens(to, amount);\\n }\\n\\n /// Get full contract information\\n /// @dev Convenience helper\\n function getInfo() external view returns (ContractInfo memory info) {\\n info.version = VERSION;\\n info.deploymentConfig = _deploymentConfig;\\n info.runtimeConfig = _runtimeConfig;\\n }\\n\\n /// Update contract configuration\\n /// @dev Callable by admin roles only\\n function updateConfig(RuntimeConfig calldata newConfig)\\n external\\n onlyRole(ADMIN_ROLE)\\n {\\n _validateRuntimeConfig(newConfig);\\n _runtimeConfig = newConfig;\\n }\\n\\n /// Withdraw minting fees to the treasury address\\n /// @dev Callable by admin roles only\\n function withdrawFees() external onlyRole(ADMIN_ROLE) {\\n _deploymentConfig.treasuryAddress.sendValue(address(this).balance);\\n }\\n\\n /*************\\n * Internals *\\n *************/\\n\\n /// Contract runtime configuration, updatable after deployment\\n RuntimeConfig internal _runtimeConfig;\\n /// Contract deployment configuration, immutable after deployment, except for `owner` field\\n DeploymentConfig internal _deploymentConfig;\\n\\n /// Mapping for tracking presale mint status, each whitelisted address can only presale mint once\\n /// up to `DeploymentConfig.tokensPerMint` tokens\\n mapping(address => bool) internal _presaleMinted;\\n\\n /// @dev Internal function for performing token mints\\n function _mintTokens(address to, uint256 amount) internal {\\n require(amount <= _deploymentConfig.tokensPerMint, \\\"Amount too large\\\");\\n require(amount <= availableSupply(), \\\"Not enough tokens left\\\");\\n\\n _safeMint(to, amount);\\n }\\n\\n /// Validate deployment config\\n function _validateDeploymentConfig(DeploymentConfig memory config)\\n internal\\n pure\\n {\\n require(config.maxSupply > 0, \\\"Maximum supply must be non-zero\\\");\\n require(config.tokensPerMint > 0, \\\"Tokens per mint must be non-zero\\\");\\n require(\\n config.tokensPerMint <= config.maxSupply,\\n \\\"Tokens per mint must be less than max supply\\\"\\n );\\n require(\\n config.treasuryAddress != address(0),\\n \\\"Treasury address cannot be null\\\"\\n );\\n require(config.owner != address(0), \\\"Contract must have an owner\\\");\\n require(\\n config.reservedSupply <= config.maxSupply,\\n \\\"Reserve greater than supply\\\"\\n );\\n }\\n\\n /// Validate a runtime configuration change\\n function _validateRuntimeConfig(RuntimeConfig memory config) internal view {\\n // Can't set royalties to more than 100%\\n require(config.royaltiesBps <= ROYALTIES_BASIS, \\\"Royalties too high\\\");\\n\\n // Validate mint price changes\\n _validatePropertyChange(\\n abi.encodePacked(_runtimeConfig.publicMintPrice),\\n _runtimeConfig.publicMintPriceFrozen,\\n abi.encodePacked(config.publicMintPrice),\\n config.publicMintPriceFrozen\\n );\\n\\n _validatePropertyChange(\\n abi.encodePacked(_runtimeConfig.presaleMintPrice),\\n _runtimeConfig.presaleMintPriceFrozen,\\n abi.encodePacked(config.presaleMintPrice),\\n config.presaleMintPriceFrozen\\n );\\n\\n // Validate metadata changes\\n _validatePropertyChange(\\n abi.encodePacked(_runtimeConfig.baseURI),\\n _runtimeConfig.metadataFrozen,\\n abi.encodePacked(config.baseURI),\\n config.metadataFrozen\\n );\\n }\\n\\n /// Validate a change in a variable with a corresponding *Frozen flag.\\n /// @dev Variable value is passed in as bytes to generalize across different types.\\n function _validatePropertyChange(\\n bytes memory prevValue,\\n bool prevFrozen,\\n bytes memory nextValue,\\n bool nextFrozen\\n ) internal pure {\\n // If the variable wasn't previously frozen, any nextValue and nextFrozen are valid\\n if (!prevFrozen) return;\\n // Otherwise the variable has to stay frozen\\n require(nextFrozen, \\\"Cannot unfreeze variable\\\");\\n // And its value is not allowed to change\\n require(\\n keccak256(prevValue) == keccak256(nextValue),\\n \\\"Cannot change frozen variable\\\"\\n );\\n }\\n\\n /// Internal function without any checks for performing the ownership transfer\\n /// Removes current `_deploymentConfig.owner` from `ADMIN_ROLE` and `DEFAULT_ADMIN_ROLE` roles and grants these\\n /// roles to input `newOwner` address. Changes `_deploymentConfig.owner` to input `newOwner` address\\n /// emits an `OwnershipTransferred` event on success\\n function _transferOwnership(address newOwner) internal {\\n address previousOwner = _deploymentConfig.owner;\\n _revokeRole(ADMIN_ROLE, previousOwner);\\n _revokeRole(DEFAULT_ADMIN_ROLE, previousOwner);\\n\\n _deploymentConfig.owner = newOwner;\\n _grantRole(ADMIN_ROLE, newOwner);\\n _grantRole(DEFAULT_ADMIN_ROLE, newOwner);\\n\\n emit OwnershipTransferred(previousOwner, newOwner);\\n }\\n\\n /// @dev See {IERC165-supportsInterface}.\\n function supportsInterface(bytes4 interfaceId)\\n public\\n view\\n override(ERC721AUpgradeable, AccessControlUpgradeable, ERC2981)\\n returns (bool)\\n {\\n return\\n ERC721AUpgradeable.supportsInterface(interfaceId) ||\\n AccessControlUpgradeable.supportsInterface(interfaceId) ||\\n ERC2981.supportsInterface(interfaceId);\\n }\\n\\n /// Get the token metadata URI\\n function tokenURI(uint256 tokenId)\\n public\\n view\\n override\\n returns (string memory)\\n {\\n require(_exists(tokenId), \\\"Token does not exist\\\");\\n\\n // If `_runtimeConfig.baseURI` is empty then `_runtimeConfig.prerevealTokenURI` is returned\\n // otherwise `_runtimeConfig.baseURI` + `tokenId` returned\\n return\\n bytes(_runtimeConfig.baseURI).length > 0\\n ? string(\\n abi.encodePacked(_runtimeConfig.baseURI, tokenId.toString())\\n )\\n : _runtimeConfig.prerevealTokenURI;\\n }\\n\\n /// @dev ERC2981 token royalty info\\n function royaltyInfo(uint256, uint256 salePrice)\\n external\\n view\\n returns (address receiver, uint256 royaltyAmount)\\n {\\n receiver = _runtimeConfig.royaltiesAddress;\\n royaltyAmount =\\n (_runtimeConfig.royaltiesBps * salePrice) /\\n ROYALTIES_BASIS;\\n }\\n\\n /**\\n * @dev OpenSea contract metadata, returns a base64 encoded JSON string containing royalties basis points\\n * and royalties address\\n */\\n function contractURI() external view returns (string memory) {\\n string memory json = Base64.encode(\\n bytes(\\n string(\\n abi.encodePacked(\\n '{\\\"seller_fee_basis_points\\\": ', // solhint-disable-line quotes\\n _runtimeConfig.royaltiesBps.toString(),\\n ', \\\"fee_recipient\\\": \\\"', // solhint-disable-line quotes\\n uint256(uint160(_runtimeConfig.royaltiesAddress))\\n .toHexString(20),\\n '\\\"}' // solhint-disable-line quotes\\n )\\n )\\n )\\n );\\n\\n string memory output = string(\\n abi.encodePacked(\\\"data:application/json;base64,\\\", json)\\n );\\n\\n return output;\\n }\\n\\n /// Check if enough payment was provided\\n modifier paymentProvided(uint256 payment) {\\n require(msg.value >= payment, \\\"Payment too small\\\");\\n\\n _;\\n\\n // If the user overpaid, we refund the excess\\n if (msg.value > payment) {\\n uint256 excessPayment = msg.value - payment;\\n payable(msg.sender).sendValue(excessPayment);\\n }\\n }\\n}\\n\",\"keccak256\":\"0x16eadd02adda8ef7a63fb96cedc1c30d46445d9921a2f0298b4d67632fe58f56\",\"license\":\"MIT\"},\"erc721a-upgradeable/contracts/ERC721AUpgradeable.sol\":{\"content\":\"// SPDX-License-Identifier: MIT\\n// Creator: Chiru Labs\\n\\npragma solidity ^0.8.4;\\n\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/IERC721ReceiverUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/token/ERC721/extensions/IERC721MetadataUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/AddressUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/ContextUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/StringsUpgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/utils/introspection/ERC165Upgradeable.sol\\\";\\nimport \\\"@openzeppelin/contracts-upgradeable/proxy/utils/Initializable.sol\\\";\\n\\nerror ApprovalCallerNotOwnerNorApproved();\\nerror ApprovalQueryForNonexistentToken();\\nerror ApproveToCaller();\\nerror ApprovalToCurrentOwner();\\nerror BalanceQueryForZeroAddress();\\nerror MintToZeroAddress();\\nerror MintZeroQuantity();\\nerror OwnerQueryForNonexistentToken();\\nerror TransferCallerNotOwnerNorApproved();\\nerror TransferFromIncorrectOwner();\\nerror TransferToNonERC721ReceiverImplementer();\\nerror TransferToZeroAddress();\\nerror URIQueryForNonexistentToken();\\n\\n/**\\n * @dev Implementation of https://eips.ethereum.org/EIPS/eip-721[ERC721] Non-Fungible Token Standard, including\\n * the Metadata extension. Built to optimize for lower gas during batch mints.\\n *\\n * Assumes serials are sequentially minted starting at _startTokenId() (defaults to 0, e.g. 0, 1, 2, 3..).\\n *\\n * Assumes that an owner cannot have more than 2**64 - 1 (max value of uint64) of supply.\\n *\\n * Assumes that the maximum token id cannot exceed 2**256 - 1 (max value of uint256).\\n */\\ncontract ERC721AUpgradeable is Initializable, ContextUpgradeable, ERC165Upgradeable, IERC721Upgradeable, IERC721MetadataUpgradeable {\\n using AddressUpgradeable for address;\\n using StringsUpgradeable for uint256;\\n\\n // Compiler will pack this into a single 256bit word.\\n struct TokenOwnership {\\n // The address of the owner.\\n address addr;\\n // Keeps track of the start time of ownership with minimal overhead for tokenomics.\\n uint64 startTimestamp;\\n // Whether the token has been burned.\\n bool burned;\\n }\\n\\n // Compiler will pack this into a single 256bit word.\\n struct AddressData {\\n // Realistically, 2**64-1 is more than enough.\\n uint64 balance;\\n // Keeps track of mint count with minimal overhead for tokenomics.\\n uint64 numberMinted;\\n // Keeps track of burn count with minimal overhead for tokenomics.\\n uint64 numberBurned;\\n // For miscellaneous variable(s) pertaining to the address\\n // (e.g. number of whitelist mint slots used).\\n // If there are multiple variables, please pack them into a uint64.\\n uint64 aux;\\n }\\n\\n // The tokenId of the next token to be minted.\\n uint256 internal _currentIndex;\\n\\n // The number of tokens burned.\\n uint256 internal _burnCounter;\\n\\n // Token name\\n string private _name;\\n\\n // Token symbol\\n string private _symbol;\\n\\n // Mapping from token ID to ownership details\\n // An empty struct value does not necessarily mean the token is unowned. See _ownershipOf implementation for details.\\n mapping(uint256 => TokenOwnership) internal _ownerships;\\n\\n // Mapping owner address to address data\\n mapping(address => AddressData) private _addressData;\\n\\n // Mapping from token ID to approved address\\n mapping(uint256 => address) private _tokenApprovals;\\n\\n // Mapping from owner to operator approvals\\n mapping(address => mapping(address => bool)) private _operatorApprovals;\\n\\n function __ERC721A_init(string memory name_, string memory symbol_) internal onlyInitializing {\\n __ERC721A_init_unchained(name_, symbol_);\\n }\\n\\n function __ERC721A_init_unchained(string memory name_, string memory symbol_) internal onlyInitializing {\\n _name = name_;\\n _symbol = symbol_;\\n _currentIndex = _startTokenId();\\n }\\n\\n /**\\n * To change the starting tokenId, please override this function.\\n */\\n function _startTokenId() internal view virtual returns (uint256) {\\n return 0;\\n }\\n\\n /**\\n * @dev Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens.\\n */\\n function totalSupply() public view returns (uint256) {\\n // Counter underflow is impossible as _burnCounter cannot be incremented\\n // more than _currentIndex - _startTokenId() times\\n unchecked {\\n return _currentIndex - _burnCounter - _startTokenId();\\n }\\n }\\n\\n /**\\n * Returns the total amount of tokens minted in the contract.\\n */\\n function _totalMinted() internal view returns (uint256) {\\n // Counter underflow is impossible as _currentIndex does not decrement,\\n // and it is initialized to _startTokenId()\\n unchecked {\\n return _currentIndex - _startTokenId();\\n }\\n }\\n\\n /**\\n * @dev See {IERC165-supportsInterface}.\\n */\\n function supportsInterface(bytes4 interfaceId) public view virtual override(ERC165Upgradeable, IERC165Upgradeable) returns (bool) {\\n return\\n interfaceId == type(IERC721Upgradeable).interfaceId ||\\n interfaceId == type(IERC721MetadataUpgradeable).interfaceId ||\\n super.supportsInterface(interfaceId);\\n }\\n\\n /**\\n * @dev See {IERC721-balanceOf}.\\n */\\n function balanceOf(address owner) public view override returns (uint256) {\\n if (owner == address(0)) revert BalanceQueryForZeroAddress();\\n return uint256(_addressData[owner].balance);\\n }\\n\\n /**\\n * Returns the number of tokens minted by `owner`.\\n */\\n function _numberMinted(address owner) internal view returns (uint256) {\\n return uint256(_addressData[owner].numberMinted);\\n }\\n\\n /**\\n * Returns the number of tokens burned by or on behalf of `owner`.\\n */\\n function _numberBurned(address owner) internal view returns (uint256) {\\n return uint256(_addressData[owner].numberBurned);\\n }\\n\\n /**\\n * Returns the auxillary data for `owner`. (e.g. number of whitelist mint slots used).\\n */\\n function _getAux(address owner) internal view returns (uint64) {\\n return _addressData[owner].aux;\\n }\\n\\n /**\\n * Sets the auxillary data for `owner`. (e.g. number of whitelist mint slots used).\\n * If there are multiple variables, please pack them into a uint64.\\n */\\n function _setAux(address owner, uint64 aux) internal {\\n _addressData[owner].aux = aux;\\n }\\n\\n /**\\n * Gas spent here starts off proportional to the maximum mint batch size.\\n * It gradually moves to O(1) as tokens get transferred around in the collection over time.\\n */\\n function _ownershipOf(uint256 tokenId) internal view returns (TokenOwnership memory) {\\n uint256 curr = tokenId;\\n\\n unchecked {\\n if (_startTokenId() <= curr && curr < _currentIndex) {\\n TokenOwnership memory ownership = _ownerships[curr];\\n if (!ownership.burned) {\\n if (ownership.addr != address(0)) {\\n return ownership;\\n }\\n // Invariant:\\n // There will always be an ownership that has an address and is not burned\\n // before an ownership that does not have an address and is not burned.\\n // Hence, curr will not underflow.\\n while (true) {\\n curr--;\\n ownership = _ownerships[curr];\\n if (ownership.addr != address(0)) {\\n return ownership;\\n }\\n }\\n }\\n }\\n }\\n revert OwnerQueryForNonexistentToken();\\n }\\n\\n /**\\n * @dev See {IERC721-ownerOf}.\\n */\\n function ownerOf(uint256 tokenId) public view override returns (address) {\\n return _ownershipOf(tokenId).addr;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-name}.\\n */\\n function name() public view virtual override returns (string memory) {\\n return _name;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-symbol}.\\n */\\n function symbol() public view virtual override returns (string memory) {\\n return _symbol;\\n }\\n\\n /**\\n * @dev See {IERC721Metadata-tokenURI}.\\n */\\n function tokenURI(uint256 tokenId) public view virtual override returns (string memory) {\\n if (!_exists(tokenId)) revert URIQueryForNonexistentToken();\\n\\n string memory baseURI = _baseURI();\\n return bytes(baseURI).length != 0 ? string(abi.encodePacked(baseURI, tokenId.toString())) : '';\\n }\\n\\n /**\\n * @dev Base URI for computing {tokenURI}. If set, the resulting URI for each\\n * token will be the concatenation of the `baseURI` and the `tokenId`. Empty\\n * by default, can be overriden in child contracts.\\n */\\n function _baseURI() internal view virtual returns (string memory) {\\n return '';\\n }\\n\\n /**\\n * @dev See {IERC721-approve}.\\n */\\n function approve(address to, uint256 tokenId) public override {\\n address owner = ERC721AUpgradeable.ownerOf(tokenId);\\n if (to == owner) revert ApprovalToCurrentOwner();\\n\\n if (_msgSender() != owner && !isApprovedForAll(owner, _msgSender())) {\\n revert ApprovalCallerNotOwnerNorApproved();\\n }\\n\\n _approve(to, tokenId, owner);\\n }\\n\\n /**\\n * @dev See {IERC721-getApproved}.\\n */\\n function getApproved(uint256 tokenId) public view override returns (address) {\\n if (!_exists(tokenId)) revert ApprovalQueryForNonexistentToken();\\n\\n return _tokenApprovals[tokenId];\\n }\\n\\n /**\\n * @dev See {IERC721-setApprovalForAll}.\\n */\\n function setApprovalForAll(address operator, bool approved) public virtual override {\\n if (operator == _msgSender()) revert ApproveToCaller();\\n\\n _operatorApprovals[_msgSender()][operator] = approved;\\n emit ApprovalForAll(_msgSender(), operator, approved);\\n }\\n\\n /**\\n * @dev See {IERC721-isApprovedForAll}.\\n */\\n function isApprovedForAll(address owner, address operator) public view virtual override returns (bool) {\\n return _operatorApprovals[owner][operator];\\n }\\n\\n /**\\n * @dev See {IERC721-transferFrom}.\\n */\\n function transferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) public virtual override {\\n _transfer(from, to, tokenId);\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId\\n ) public virtual override {\\n safeTransferFrom(from, to, tokenId, '');\\n }\\n\\n /**\\n * @dev See {IERC721-safeTransferFrom}.\\n */\\n function safeTransferFrom(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory _data\\n ) public virtual override {\\n _transfer(from, to, tokenId);\\n if (to.isContract() && !_checkContractOnERC721Received(from, to, tokenId, _data)) {\\n revert TransferToNonERC721ReceiverImplementer();\\n }\\n }\\n\\n /**\\n * @dev Returns whether `tokenId` exists.\\n *\\n * Tokens can be managed by their owner or approved accounts via {approve} or {setApprovalForAll}.\\n *\\n * Tokens start existing when they are minted (`_mint`),\\n */\\n function _exists(uint256 tokenId) internal view returns (bool) {\\n return _startTokenId() <= tokenId && tokenId < _currentIndex && !_ownerships[tokenId].burned;\\n }\\n\\n function _safeMint(address to, uint256 quantity) internal {\\n _safeMint(to, quantity, '');\\n }\\n\\n /**\\n * @dev Safely mints `quantity` tokens and transfers them to `to`.\\n *\\n * Requirements:\\n *\\n * - If `to` refers to a smart contract, it must implement {IERC721Receiver-onERC721Received}, which is called for each safe transfer.\\n * - `quantity` must be greater than 0.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _safeMint(\\n address to,\\n uint256 quantity,\\n bytes memory _data\\n ) internal {\\n _mint(to, quantity, _data, true);\\n }\\n\\n /**\\n * @dev Mints `quantity` tokens and transfers them to `to`.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `quantity` must be greater than 0.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _mint(\\n address to,\\n uint256 quantity,\\n bytes memory _data,\\n bool safe\\n ) internal {\\n uint256 startTokenId = _currentIndex;\\n if (to == address(0)) revert MintToZeroAddress();\\n if (quantity == 0) revert MintZeroQuantity();\\n\\n _beforeTokenTransfers(address(0), to, startTokenId, quantity);\\n\\n // Overflows are incredibly unrealistic.\\n // balance or numberMinted overflow if current value of either + quantity > 1.8e19 (2**64) - 1\\n // updatedIndex overflows if _currentIndex + quantity > 1.2e77 (2**256) - 1\\n unchecked {\\n _addressData[to].balance += uint64(quantity);\\n _addressData[to].numberMinted += uint64(quantity);\\n\\n _ownerships[startTokenId].addr = to;\\n _ownerships[startTokenId].startTimestamp = uint64(block.timestamp);\\n\\n uint256 updatedIndex = startTokenId;\\n uint256 end = updatedIndex + quantity;\\n\\n if (safe && to.isContract()) {\\n do {\\n emit Transfer(address(0), to, updatedIndex);\\n if (!_checkContractOnERC721Received(address(0), to, updatedIndex++, _data)) {\\n revert TransferToNonERC721ReceiverImplementer();\\n }\\n } while (updatedIndex != end);\\n // Reentrancy protection\\n if (_currentIndex != startTokenId) revert();\\n } else {\\n do {\\n emit Transfer(address(0), to, updatedIndex++);\\n } while (updatedIndex != end);\\n }\\n _currentIndex = updatedIndex;\\n }\\n _afterTokenTransfers(address(0), to, startTokenId, quantity);\\n }\\n\\n /**\\n * @dev Transfers `tokenId` from `from` to `to`.\\n *\\n * Requirements:\\n *\\n * - `to` cannot be the zero address.\\n * - `tokenId` token must be owned by `from`.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _transfer(\\n address from,\\n address to,\\n uint256 tokenId\\n ) private {\\n TokenOwnership memory prevOwnership = _ownershipOf(tokenId);\\n\\n if (prevOwnership.addr != from) revert TransferFromIncorrectOwner();\\n\\n bool isApprovedOrOwner = (_msgSender() == from ||\\n isApprovedForAll(from, _msgSender()) ||\\n getApproved(tokenId) == _msgSender());\\n\\n if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();\\n if (to == address(0)) revert TransferToZeroAddress();\\n\\n _beforeTokenTransfers(from, to, tokenId, 1);\\n\\n // Clear approvals from the previous owner\\n _approve(address(0), tokenId, from);\\n\\n // Underflow of the sender's balance is impossible because we check for\\n // ownership above and the recipient's balance can't realistically overflow.\\n // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.\\n unchecked {\\n _addressData[from].balance -= 1;\\n _addressData[to].balance += 1;\\n\\n TokenOwnership storage currSlot = _ownerships[tokenId];\\n currSlot.addr = to;\\n currSlot.startTimestamp = uint64(block.timestamp);\\n\\n // If the ownership slot of tokenId+1 is not explicitly set, that means the transfer initiator owns it.\\n // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.\\n uint256 nextTokenId = tokenId + 1;\\n TokenOwnership storage nextSlot = _ownerships[nextTokenId];\\n if (nextSlot.addr == address(0)) {\\n // This will suffice for checking _exists(nextTokenId),\\n // as a burned slot cannot contain the zero address.\\n if (nextTokenId != _currentIndex) {\\n nextSlot.addr = from;\\n nextSlot.startTimestamp = prevOwnership.startTimestamp;\\n }\\n }\\n }\\n\\n emit Transfer(from, to, tokenId);\\n _afterTokenTransfers(from, to, tokenId, 1);\\n }\\n\\n /**\\n * @dev This is equivalent to _burn(tokenId, false)\\n */\\n function _burn(uint256 tokenId) internal virtual {\\n _burn(tokenId, false);\\n }\\n\\n /**\\n * @dev Destroys `tokenId`.\\n * The approval is cleared when the token is burned.\\n *\\n * Requirements:\\n *\\n * - `tokenId` must exist.\\n *\\n * Emits a {Transfer} event.\\n */\\n function _burn(uint256 tokenId, bool approvalCheck) internal virtual {\\n TokenOwnership memory prevOwnership = _ownershipOf(tokenId);\\n\\n address from = prevOwnership.addr;\\n\\n if (approvalCheck) {\\n bool isApprovedOrOwner = (_msgSender() == from ||\\n isApprovedForAll(from, _msgSender()) ||\\n getApproved(tokenId) == _msgSender());\\n\\n if (!isApprovedOrOwner) revert TransferCallerNotOwnerNorApproved();\\n }\\n\\n _beforeTokenTransfers(from, address(0), tokenId, 1);\\n\\n // Clear approvals from the previous owner\\n _approve(address(0), tokenId, from);\\n\\n // Underflow of the sender's balance is impossible because we check for\\n // ownership above and the recipient's balance can't realistically overflow.\\n // Counter overflow is incredibly unrealistic as tokenId would have to be 2**256.\\n unchecked {\\n AddressData storage addressData = _addressData[from];\\n addressData.balance -= 1;\\n addressData.numberBurned += 1;\\n\\n // Keep track of who burned the token, and the timestamp of burning.\\n TokenOwnership storage currSlot = _ownerships[tokenId];\\n currSlot.addr = from;\\n currSlot.startTimestamp = uint64(block.timestamp);\\n currSlot.burned = true;\\n\\n // If the ownership slot of tokenId+1 is not explicitly set, that means the burn initiator owns it.\\n // Set the slot of tokenId+1 explicitly in storage to maintain correctness for ownerOf(tokenId+1) calls.\\n uint256 nextTokenId = tokenId + 1;\\n TokenOwnership storage nextSlot = _ownerships[nextTokenId];\\n if (nextSlot.addr == address(0)) {\\n // This will suffice for checking _exists(nextTokenId),\\n // as a burned slot cannot contain the zero address.\\n if (nextTokenId != _currentIndex) {\\n nextSlot.addr = from;\\n nextSlot.startTimestamp = prevOwnership.startTimestamp;\\n }\\n }\\n }\\n\\n emit Transfer(from, address(0), tokenId);\\n _afterTokenTransfers(from, address(0), tokenId, 1);\\n\\n // Overflow not possible, as _burnCounter cannot be exceed _currentIndex times.\\n unchecked {\\n _burnCounter++;\\n }\\n }\\n\\n /**\\n * @dev Approve `to` to operate on `tokenId`\\n *\\n * Emits a {Approval} event.\\n */\\n function _approve(\\n address to,\\n uint256 tokenId,\\n address owner\\n ) private {\\n _tokenApprovals[tokenId] = to;\\n emit Approval(owner, to, tokenId);\\n }\\n\\n /**\\n * @dev Internal function to invoke {IERC721Receiver-onERC721Received} on a target contract.\\n *\\n * @param from address representing the previous owner of the given token ID\\n * @param to target address that will receive the tokens\\n * @param tokenId uint256 ID of the token to be transferred\\n * @param _data bytes optional data to send along with the call\\n * @return bool whether the call correctly returned the expected magic value\\n */\\n function _checkContractOnERC721Received(\\n address from,\\n address to,\\n uint256 tokenId,\\n bytes memory _data\\n ) private returns (bool) {\\n try IERC721ReceiverUpgradeable(to).onERC721Received(_msgSender(), from, tokenId, _data) returns (bytes4 retval) {\\n return retval == IERC721ReceiverUpgradeable(to).onERC721Received.selector;\\n } catch (bytes memory reason) {\\n if (reason.length == 0) {\\n revert TransferToNonERC721ReceiverImplementer();\\n } else {\\n assembly {\\n revert(add(32, reason), mload(reason))\\n }\\n }\\n }\\n }\\n\\n /**\\n * @dev Hook that is called before a set of serially-ordered token ids are about to be transferred. This includes minting.\\n * And also called before burning one token.\\n *\\n * startTokenId - the first token id to be transferred\\n * quantity - the amount to be transferred\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, `from`'s `tokenId` will be\\n * transferred to `to`.\\n * - When `from` is zero, `tokenId` will be minted for `to`.\\n * - When `to` is zero, `tokenId` will be burned by `from`.\\n * - `from` and `to` are never both zero.\\n */\\n function _beforeTokenTransfers(\\n address from,\\n address to,\\n uint256 startTokenId,\\n uint256 quantity\\n ) internal virtual {}\\n\\n /**\\n * @dev Hook that is called after a set of serially-ordered token ids have been transferred. This includes\\n * minting.\\n * And also called after one token has been burned.\\n *\\n * startTokenId - the first token id to be transferred\\n * quantity - the amount to be transferred\\n *\\n * Calling conditions:\\n *\\n * - When `from` and `to` are both non-zero, `from`'s `tokenId` has been\\n * transferred to `to`.\\n * - When `from` is zero, `tokenId` has been minted for `to`.\\n * - When `to` is zero, `tokenId` has been burned by `from`.\\n * - `from` and `to` are never both zero.\\n */\\n function _afterTokenTransfers(\\n address from,\\n address to,\\n uint256 startTokenId,\\n uint256 quantity\\n ) internal virtual {}\\n\\n /**\\n * @dev This empty reserved space is put in place to allow future versions to add new\\n * variables without shifting down storage in the inheritance chain.\\n * See https://docs.openzeppelin.com/contracts/4.x/upgradeable#storage_gaps\\n */\\n uint256[42] private __gap;\\n}\\n\",\"keccak256\":\"0x261da8ec505b55cf307604eefd0f0e6e374860ca4730efad50b87e43f7660b66\",\"license\":\"MIT\"}},\"version\":1}", + "bytecode": "0x60806040523480156200001157600080fd5b506040516200554f3803806200554f833981016040819052620000349162001098565b600054610100900460ff1615808015620000555750600054600160ff909116105b8062000085575062000072306200024c60201b62001acf1760201c565b15801562000085575060005460ff166001145b620000dd5760405162461bcd60e51b815260206004820152602e6024820152600080516020620054cf83398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084015b60405180910390fd5b6000805460ff19166001179055801562000101576000805461ff0019166101001790555b801562000137576000805461ff0019169055604051600181526000805160206200550f8339815191529060200160405180910390a15b50600054610100900460ff1615808015620001595750600054600160ff909116105b8062000189575062000176306200024c60201b62001acf1760201c565b15801562000189575060005460ff166001145b620001dd5760405162461bcd60e51b815260206004820152602e6024820152600080516020620054cf83398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000d4565b6000805460ff19166001179055801562000201576000805461ff0019166101001790555b6200020d83836200025b565b801562000243576000805461ff0019169055604051600181526000805160206200550f8339815191529060200160405180910390a15b50505062001396565b6001600160a01b03163b151590565b600054610100900460ff16158080156200027c5750600054600160ff909116105b80620002ac575062000299306200024c60201b62001acf1760201c565b158015620002ac575060005460ff166001145b620003005760405162461bcd60e51b815260206004820152602e6024820152600080516020620054cf83398151915260448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401620000d4565b6000805460ff19166001179055801562000324576000805461ff0019166101001790555b6200045d61010860000180546200033b90620011a0565b80601f01602080910402602001604051908101604052809291908181526020018280546200036990620011a0565b8015620003ba5780601f106200038e57610100808354040283529160200191620003ba565b820191906000526020600020905b8154815290600101906020018083116200039c57829003601f168201915b50505050506101086001018054620003d290620011a0565b80601f01602080910402602001604051908101604052809291908181526020018280546200040090620011a0565b8015620004515780601f10620004255761010080835404028352916020019162000451565b820191906000526020600020905b8154815290600101906020018083116200043357829003601f168201915b50506200064a92505050565b62000467620006b6565b62000472836200071e565b6200047d826200094e565b620004986000805160206200552f8339815191523362000ab5565b6040830151620004a89062000b59565b82518390610108908190620004be90826200122e565b5060208201516001820190620004d590826200122e565b5060408201516002820180546001600160a01b03199081166001600160a01b0393841617909155606084015160038401556080840151600484015560a0840151600584015560c0909301516006909201805490931691161790558151829060fc9081906200054490826200122e565b50602082015160018201805491151560ff199283161790556040830151600283015560608301516003830180549115159183169190911790556080830151600483015560a08301516005830180549115159190921617905560c0820151600682015560e082015160078201556101008201516008820190620005c790826200122e565b506101208201516009820155610140820151600a82015561016090910151600b90910180546001600160a01b0319166001600160a01b03909216919091179055608083015160fb55801562000645576000805461ff0019169055604051600181526000805160206200550f8339815191529060200160405180910390a15b505050565b600054610100900460ff16620006a65760405162461bcd60e51b815260206004820152602b6024820152600080516020620054ef83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d4565b620006b2828262000c16565b5050565b600054610100900460ff16620007125760405162461bcd60e51b815260206004820152602b6024820152600080516020620054ef83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d4565b6200071c62000c99565b565b6000816060015111620007745760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20737570706c79206d757374206265206e6f6e2d7a65726f006044820152606401620000d4565b60008160a0015111620007ca5760405162461bcd60e51b815260206004820181905260248201527f546f6b656e7320706572206d696e74206d757374206265206e6f6e2d7a65726f6044820152606401620000d4565b80606001518160a001511115620008395760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e7320706572206d696e74206d757374206265206c6573732074686160448201526b6e206d617820737570706c7960a01b6064820152608401620000d4565b60c08101516001600160a01b0316620008955760405162461bcd60e51b815260206004820152601f60248201527f547265617375727920616464726573732063616e6e6f74206265206e756c6c006044820152606401620000d4565b60408101516001600160a01b0316620008f15760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206d757374206861766520616e206f776e657200000000006044820152606401620000d4565b8060600151816080015111156200094b5760405162461bcd60e51b815260206004820152601b60248201527f526573657276652067726561746572207468616e20737570706c7900000000006044820152606401620000d4565b50565b61014081015161271010156200099c5760405162461bcd60e51b81526020600482015260126024820152710a4def2c2d8e8d2cae640e8dede40d0d2ced60731b6044820152606401620000d4565b60fe54604051620009f691620009b89160200190815260200190565b60408051808303601f1901815282825260ff805486840151602086015291939116910160408051601f19818403018152919052606085015162000cfc565b6101005460405162000a559162000a139160200190815260200190565b60408051808303601f190181528282526101015460808601516020850152909260ff909116910160408051601f1981840301815291905260a085015162000cfc565b6040516200094b9062000a6e9060fc90602001620012fa565b60408051601f198184030181529082905260fd548451919260ff9091169162000a9a9160200162001378565b60408051601f19818403018152919052602085015162000cfc565b60008281526097602090815260408083206001600160a01b038516845290915290205460ff16620006b25760008281526097602090815260408083206001600160a01b03851684529091529020805460ff1916600117905562000b153390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61010a546001600160a01b031662000b816000805160206200552f8339815191528262000db7565b62000b8e60008262000db7565b61010a80546001600160a01b0319166001600160a01b03841617905562000bc56000805160206200552f8339815191528362000ab5565b62000bd260008362000ab5565b816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b600054610100900460ff1662000c725760405162461bcd60e51b815260206004820152602b6024820152600080516020620054ef83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d4565b606762000c8083826200122e565b50606862000c8f82826200122e565b5060006065555050565b600054610100900460ff1662000cf55760405162461bcd60e51b815260206004820152602b6024820152600080516020620054ef83398151915260448201526a6e697469616c697a696e6760a81b6064820152608401620000d4565b600160c955565b821562000db1578062000d525760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420756e667265657a65207661726961626c6500000000000000006044820152606401620000d4565b818051906020012084805190602001201462000db15760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74206368616e67652066726f7a656e207661726961626c650000006044820152606401620000d4565b50505050565b60008281526097602090815260408083206001600160a01b038516845290915290205460ff1615620006b25760008281526097602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b038111828210171562000e775762000e7762000e3b565b60405290565b60405160e081016001600160401b038111828210171562000e775762000e7762000e3b565b60005b8381101562000ebf57818101518382015260200162000ea5565b8381111562000db15750506000910152565b600082601f83011262000ee357600080fd5b81516001600160401b038082111562000f005762000f0062000e3b565b604051601f8301601f19908116603f0116810190828211818310171562000f2b5762000f2b62000e3b565b8160405283815286602085880101111562000f4557600080fd5b62000f5884602083016020890162000ea2565b9695505050505050565b80516001600160a01b038116811462000f7a57600080fd5b919050565b8051801515811462000f7a57600080fd5b6000610180828403121562000fa457600080fd5b62000fae62000e51565b82519091506001600160401b038082111562000fc957600080fd5b62000fd78583860162000ed1565b835262000fe76020850162000f7f565b602084015260408401516040840152620010046060850162000f7f565b6060840152608084015160808401526200102160a0850162000f7f565b60a084015260c084015160c084015260e084015160e0840152610100915081840151818111156200105157600080fd5b6200105f8682870162000ed1565b838501525050506101208083015181830152506101408083015181830152506101606200108e81840162000f62565b9082015292915050565b60008060408385031215620010ac57600080fd5b82516001600160401b0380821115620010c457600080fd5b9084019060e08287031215620010d957600080fd5b620010e362000e7d565b825182811115620010f357600080fd5b620011018882860162000ed1565b8252506020830151828111156200111757600080fd5b620011258882860162000ed1565b602083015250620011396040840162000f62565b6040820152606083015160608201526080830151608082015260a083015160a08201526200116a60c0840162000f62565b60c082015260208601519094509150808211156200118757600080fd5b50620011968582860162000f90565b9150509250929050565b600181811c90821680620011b557607f821691505b602082108103620011d657634e487b7160e01b600052602260045260246000fd5b50919050565b601f8211156200064557600081815260208120601f850160051c81016020861015620012055750805b601f850160051c820191505b81811015620012265782815560010162001211565b505050505050565b81516001600160401b038111156200124a576200124a62000e3b565b62001262816200125b8454620011a0565b84620011dc565b602080601f8311600181146200129a5760008415620012815750858301515b600019600386901b1c1916600185901b17855562001226565b600085815260208120601f198616915b82811015620012cb57888601518255948401946001909101908401620012aa565b5085821015620012ea5787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60008083546200130a81620011a0565b600182811680156200132557600181146200133b576200136c565b60ff19841687528215158302870194506200136c565b8760005260208060002060005b85811015620013635781548a82015290840190820162001348565b50505082870194505b50929695505050505050565b600082516200138c81846020870162000ea2565b9190910192915050565b61412980620013a66000396000f3fe6080604052600436106102465760003560e01c80637ecc2b5611610139578063b5106add116100b6578063d761aa481161007a578063d761aa48146106e0578063e3e1e8ef14610700578063e8a3d48514610713578063e985e9c514610728578063f2fde38b14610771578063ffa1ad741461079157600080fd5b8063b5106add14610640578063b88d4fde14610660578063c87b56dd14610680578063d1bff694146106a0578063d547741f146106c057600080fd5b8063a0712d68116100fd578063a0712d681461059f578063a217fddf146105b2578063a22cb465146105c7578063a3f4df7e146105e7578063b0ea18021461062057600080fd5b80637ecc2b561461050d5780638da5cb5b1461052257806391d148541461054157806395d89b41146105615780639da5b0a51461057657600080fd5b806336568abe116101c75780635a9b0b891161018b5780635a9b0b89146104735780635c629f4c146104955780636352211e146104ab57806370a08231146104cb57806375b238fc146104eb57600080fd5b806336568abe146103e657806342842e0e14610406578063476343ee1461042657806353135ca01461043b5780635a23dd991461045357600080fd5b806323b872dd1161020e57806323b872dd1461031f578063248a9ca31461033f5780632a55205a1461036f5780632f2ff15d146103ae57806331f9c919146103ce57600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b61026636600461316a565b6107a7565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102956107e2565b60405161027791906131df565b3480156102ae57600080fd5b506102c26102bd3660046131f2565b610874565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004613230565b6108b8565b005b34801561030857600080fd5b50606654606554035b604051908152602001610277565b34801561032b57600080fd5b506102fa61033a36600461325c565b610945565b34801561034b57600080fd5b5061031161035a3660046131f2565b60009081526097602052604090206001015490565b34801561037b57600080fd5b5061038f61038a36600461329d565b610950565b604080516001600160a01b039093168352602083019190915201610277565b3480156103ba57600080fd5b506102fa6103c93660046132bf565b610989565b3480156103da57600080fd5b5061010254421161026b565b3480156103f257600080fd5b506102fa6104013660046132bf565b6109ae565b34801561041257600080fd5b506102fa61042136600461325c565b610a31565b34801561043257600080fd5b506102fa610a4c565b34801561044757600080fd5b5061010354421161026b565b34801561045f57600080fd5b5061026b61046e36600461333a565b610a7e565b34801561047f57600080fd5b50610488610b5e565b6040516102779190613464565b3480156104a157600080fd5b5061031160fb5481565b3480156104b757600080fd5b506102c26104c63660046131f2565b610ea8565b3480156104d757600080fd5b506103116104e6366004613515565b610eba565b3480156104f757600080fd5b506103116000805160206140d483398151915281565b34801561051957600080fd5b50610311610f08565b34801561052e57600080fd5b5061010a546001600160a01b03166102c2565b34801561054d57600080fd5b5061026b61055c3660046132bf565b610f37565b34801561056d57600080fd5b50610295610f62565b34801561058257600080fd5b5061058c61271081565b60405161ffff9091168152602001610277565b6102fa6105ad3660046131f2565b610f71565b3480156105be57600080fd5b50610311600081565b3480156105d357600080fd5b506102fa6105e236600461354b565b61109a565b3480156105f357600080fd5b506102956040518060400160405280600d81526020016c27232a21b7b63632b1ba34b7b760991b81525081565b34801561062c57600080fd5b506102fa61063b366004613230565b61112f565b34801561064c57600080fd5b506102fa61065b366004613515565b6111b1565b34801561066c57600080fd5b506102fa61067b36600461364f565b6112a4565b34801561068c57600080fd5b5061029561069b3660046131f2565b6112f5565b3480156106ac57600080fd5b506102fa6106bb3660046137e4565b61141e565b3480156106cc57600080fd5b506102fa6106db3660046132bf565b6117ec565b3480156106ec57600080fd5b506102fa6106fb3660046138d9565b611811565b6102fa61070e366004613914565b611847565b34801561071f57600080fd5b506102956119ea565b34801561073457600080fd5b5061026b610743366004613946565b6001600160a01b039182166000908152606c6020908152604080832093909416825291909152205460ff1690565b34801561077d57600080fd5b506102fa61078c366004613515565b611a68565b34801561079d57600080fd5b5061031161290481565b60006107b282611ade565b806107c157506107c182611b2e565b806107dc575063152a902d60e11b6001600160e01b03198316145b92915050565b6060606780546107f190613974565b80601f016020809104026020016040519081016040528092919081815260200182805461081d90613974565b801561086a5780601f1061083f5761010080835404028352916020019161086a565b820191906000526020600020905b81548152906001019060200180831161084d57829003601f168201915b5050505050905090565b600061087f82611b53565b61089c576040516333d1c03960e21b815260040160405180910390fd5b506000908152606b60205260409020546001600160a01b031690565b60006108c382610ea8565b9050806001600160a01b0316836001600160a01b0316036108f75760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061091757506109158133610743565b155b15610935576040516367d9dca160e11b815260040160405180910390fd5b610940838383611b7f565b505050565b610940838383611bdb565b61010754610106546001600160a01b0390911690600090612710906109769085906139c4565b61098091906139f9565b90509250929050565b6000828152609760205260409020600101546109a481611dc6565b6109408383611dd0565b6001600160a01b0381163314610a235760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610a2d8282611e56565b5050565b610940838383604051806020016040528060008152506112a4565b6000805160206140d4833981519152610a6481611dc6565b61010e54610a7b906001600160a01b031647611ebd565b50565b6001600160a01b038316600090815261010f602052604081205460ff1615610ad95760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606401610a1a565b6040516bffffffffffffffffffffffff19606086901b166020820152600090603401604051602081830303815290604052805190602001209050610b5584848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050610105549150849050611fd6565b95945050505050565b610b66613070565b61290481526040805160e08101909152610108805482908290610b8890613974565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb490613974565b8015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b50505050508152602001600182018054610c1a90613974565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4690613974565b8015610c935780601f10610c6857610100808354040283529160200191610c93565b820191906000526020600020905b815481529060010190602001808311610c7657829003601f168201915b505050918352505060028201546001600160a01b039081166020808401919091526003840154604080850191909152600485015460608501526005850154608085015260069094015490911660a0909201919091528301919091528051610180810190915260fc805482908290610d0990613974565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3590613974565b8015610d825780601f10610d5757610100808354040283529160200191610d82565b820191906000526020600020905b815481529060010190602001808311610d6557829003601f168201915b5050509183525050600182015460ff9081161515602083015260028301546040830152600383015481161515606083015260048301546080830152600583015416151560a0820152600682015460c0820152600782015460e082015260088201805461010090920191610df490613974565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2090613974565b8015610e6d5780601f10610e4257610100808354040283529160200191610e6d565b820191906000526020600020905b815481529060010190602001808311610e5057829003601f168201915b505050918352505060098201546020820152600a820154604080830191909152600b909201546001600160a01b031660609091015282015290565b6000610eb382611fec565b5192915050565b60006001600160a01b038216610ee3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152606a60205260409020546001600160401b031690565b600060fb54610f1a6066546065540390565b61010b54610f289190613a0d565b610f329190613a0d565b905090565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060606880546107f190613974565b60fe54610f7e90826139c4565b80341015610fc25760405162461bcd60e51b815260206004820152601160248201527014185e5b595b9d081d1bdbc81cdb585b1b607a1b6044820152606401610a1a565b600260c954036110145760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a1a565b600260c95561010254421161106b5760405162461bcd60e51b815260206004820152601b60248201527f4d696e74696e6720686173206e6f7420737461727465642079657400000000006044820152606401610a1a565b6110753383612106565b600160c95534811015610a2d57600061108e8234613a0d565b90506109403382611ebd565b336001600160a01b038316036110c35760405163b06307db60e01b815260040160405180910390fd5b336000818152606c602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000805160206140d483398151915261114781611dc6565b60fb5482111561118f5760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da081c995cd95c9d9959606a1b6044820152606401610a1a565b8160fb60008282546111a19190613a0d565b9091555061094090508383612106565b6000805160206140d48339815191526111c981611dc6565b6111e16000805160206140d483398151915283610f37565b156112215760405162461bcd60e51b815260206004820152601060248201526f20b63932b0b23c9030b71030b236b4b760811b6044820152606401610a1a565b61010a546001600160a01b031633036112745760405162461bcd60e51b81526020600482015260156024820152740557365207472616e736665724f776e65727368697605c1b6044820152606401610a1a565b61128c6000805160206140d483398151915233611e56565b610a2d6000805160206140d483398151915283611dd0565b6112af848484611bdb565b6001600160a01b0383163b151580156112d157506112cf848484846121a6565b155b156112ef576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061130082611b53565b6113435760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610a1a565b600060fc600001805461135590613974565b9050116113ed57610104805461136a90613974565b80601f016020809104026020016040519081016040528092919081815260200182805461139690613974565b80156113e35780601f106113b8576101008083540402835291602001916113e3565b820191906000526020600020905b8154815290600101906020018083116113c657829003601f168201915b50505050506107dc565b60fc6113f883612292565b604051602001611409929190613a97565b60405160208183030381529060405292915050565b600054610100900460ff161580801561143e5750600054600160ff909116105b806114585750303b158015611458575060005460ff166001145b6114bb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a1a565b6000805460ff1916600117905580156114de576000805461ff0019166101001790555b61160461010860000180546114f290613974565b80601f016020809104026020016040519081016040528092919081815260200182805461151e90613974565b801561156b5780601f106115405761010080835404028352916020019161156b565b820191906000526020600020905b81548152906001019060200180831161154e57829003601f168201915b5050505050610108600101805461158190613974565b80601f01602080910402602001604051908101604052809291908181526020018280546115ad90613974565b80156115fa5780601f106115cf576101008083540402835291602001916115fa565b820191906000526020600020905b8154815290600101906020018083116115dd57829003601f168201915b5050505050612392565b61160c6123c3565b611615836123f4565b61161e82612615565b6116366000805160206140d483398151915233611dd0565b611643836040015161276b565b825183906101089081906116579082613b0a565b506020820151600182019061166c9082613b0a565b5060408201516002820180546001600160a01b03199081166001600160a01b0393841617909155606084015160038401556080840151600484015560a0840151600584015560c0909301516006909201805490931691161790558151829060fc9081906116d99082613b0a565b50602082015160018201805491151560ff199283161790556040830151600283015560608301516003830180549115159183169190911790556080830151600483015560a08301516005830180549115159190921617905560c0820151600682015560e08201516007820155610100820151600882019061175a9082613b0a565b506101208201516009820155610140820151600a82015561016090910151600b90910180546001600160a01b0319166001600160a01b03909216919091179055608083015160fb558015610940576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b60008281526097602052604090206001015461180781611dc6565b6109408383611e56565b6000805160206140d483398151915261182981611dc6565b61183a61183583613bc9565b612615565b8160fc6112ef8282613cf4565b6101005461185590846139c4565b803410156118995760405162461bcd60e51b815260206004820152601160248201527014185e5b595b9d081d1bdbc81cdb585b1b607a1b6044820152606401610a1a565b600260c954036118eb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a1a565b600260c9556101035442116119425760405162461bcd60e51b815260206004820152601b60248201527f50726573616c6520686173206e6f7420737461727465642079657400000000006044820152606401610a1a565b61194d338484610a7e565b6119995760405162461bcd60e51b815260206004820152601b60248201527f4e6f742077686974656c697374656420666f722070726573616c6500000000006044820152606401610a1a565b33600081815261010f60205260409020805460ff191660011790556119be9085612106565b600160c955348110156112ef5760006119d78234613a0d565b90506119e33382611ebd565b5050505050565b60606000611a3c6119ff60fc600a0154612292565b61010754611a17906001600160a01b0316601461281e565b604051602001611a28929190613e13565b6040516020818303038152906040526129c0565b9050600081604051602001611a519190613e9a565b60408051601f198184030181529190529392505050565b6000611a7381611dc6565b61010a546001600160a01b0390811690831603611ac65760405162461bcd60e51b815260206004820152601160248201527020b63932b0b23c903a34329037bbb732b960791b6044820152606401610a1a565b610a2d8261276b565b6001600160a01b03163b151590565b60006001600160e01b031982166380ac58cd60e01b1480611b0f57506001600160e01b03198216635b5e139f60e01b145b806107dc57506301ffc9a760e01b6001600160e01b03198316146107dc565b60006001600160e01b03198216637965db0b60e01b14806107dc57506107dc82611ade565b6000606554821080156107dc575050600090815260696020526040902054600160e01b900460ff161590565b6000828152606b602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611be682611fec565b9050836001600160a01b031681600001516001600160a01b031614611c1d5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611c3b5750611c3b8533610743565b80611c56575033611c4b84610874565b6001600160a01b0316145b905080611c7657604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611c9d57604051633a954ecd60e21b815260040160405180910390fd5b611ca960008487611b7f565b6001600160a01b038581166000908152606a60209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652606990945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611d7d576065548214611d7d57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119e3565b610a7b8133612b29565b611dda8282610f37565b610a2d5760008281526097602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611e123390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611e608282610f37565b15610a2d5760008281526097602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b80471015611f0d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a1a565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611f5a576040519150601f19603f3d011682016040523d82523d6000602084013e611f5f565b606091505b50509050806109405760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a1a565b600082611fe38584612b8d565b14949350505050565b6040805160608101825260008082526020820181905291810191909152816065548110156120ed57600081815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906120eb5780516001600160a01b031615612082579392505050565b5060001901600081815260696020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156120e6579392505050565b612082565b505b604051636f96cda160e11b815260040160405180910390fd5b61010d5481111561214c5760405162461bcd60e51b815260206004820152601060248201526f416d6f756e7420746f6f206c6172676560801b6044820152606401610a1a565b612154610f08565b81111561219c5760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b6044820152606401610a1a565b610a2d8282612bda565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906121db903390899088908890600401613edf565b6020604051808303816000875af1925050508015612216575060408051601f3d908101601f1916820190925261221391810190613f1c565b60015b612274573d808015612244576040519150601f19603f3d011682016040523d82523d6000602084013e612249565b606091505b50805160000361226c576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036122b95750506040805180820190915260018152600360fc1b602082015290565b8160005b81156122e357806122cd81613f39565b91506122dc9050600a836139f9565b91506122bd565b6000816001600160401b038111156122fd576122fd613579565b6040519080825280601f01601f191660200182016040528015612327576020820181803683370190505b5090505b841561228a5761233c600183613a0d565b9150612349600a86613f52565b612354906030613f66565b60f81b81838151811061236957612369613f7e565b60200101906001600160f81b031916908160001a90535061238b600a866139f9565b945061232b565b600054610100900460ff166123b95760405162461bcd60e51b8152600401610a1a90613f94565b610a2d8282612bf4565b600054610100900460ff166123ea5760405162461bcd60e51b8152600401610a1a90613f94565b6123f2612c3e565b565b60008160600151116124485760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20737570706c79206d757374206265206e6f6e2d7a65726f006044820152606401610a1a565b60008160a001511161249c5760405162461bcd60e51b815260206004820181905260248201527f546f6b656e7320706572206d696e74206d757374206265206e6f6e2d7a65726f6044820152606401610a1a565b80606001518160a0015111156125095760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e7320706572206d696e74206d757374206265206c6573732074686160448201526b6e206d617820737570706c7960a01b6064820152608401610a1a565b60c08101516001600160a01b03166125635760405162461bcd60e51b815260206004820152601f60248201527f547265617375727920616464726573732063616e6e6f74206265206e756c6c006044820152606401610a1a565b60408101516001600160a01b03166125bd5760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206d757374206861766520616e206f776e657200000000006044820152606401610a1a565b806060015181608001511115610a7b5760405162461bcd60e51b815260206004820152601b60248201527f526573657276652067726561746572207468616e20737570706c7900000000006044820152606401610a1a565b61014081015161271010156126615760405162461bcd60e51b81526020600482015260126024820152710a4def2c2d8e8d2cae640e8dede40d0d2ced60731b6044820152606401610a1a565b60fe546040516126b79161267b9160200190815260200190565b60408051808303601f1901815282825260ff80548684015160208601529193911691016040516020818303038152906040528460600151612c6c565b61010054604051612712916126d29160200190815260200190565b60408051808303601f190181528282526101015460808601516020850152909260ff90911691016040516020818303038152906040528460a00151612c6c565b604051610a7b906127289060fc90602001613fdf565b60408051601f198184030181529082905260fd548451919260ff9091169161275291602001613feb565b6040516020818303038152906040528460200151612c6c565b61010a546001600160a01b03166127906000805160206140d483398151915282611e56565b61279b600082611e56565b61010a80546001600160a01b0319166001600160a01b0384161790556127cf6000805160206140d483398151915283611dd0565b6127da600083611dd0565b816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6060600061282d8360026139c4565b612838906002613f66565b6001600160401b0381111561284f5761284f613579565b6040519080825280601f01601f191660200182016040528015612879576020820181803683370190505b509050600360fc1b8160008151811061289457612894613f7e565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106128c3576128c3613f7e565b60200101906001600160f81b031916908160001a90535060006128e78460026139c4565b6128f2906001613f66565b90505b600181111561296a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061292657612926613f7e565b1a60f81b82828151811061293c5761293c613f7e565b60200101906001600160f81b031916908160001a90535060049490941c9361296381614007565b90506128f5565b5083156129b95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a1a565b9392505050565b805160609060008190036129e4575050604080516020810190915260008152919050565b600060036129f3836002613f66565b6129fd91906139f9565b612a089060046139c4565b90506000612a17826020613f66565b6001600160401b03811115612a2e57612a2e613579565b6040519080825280601f01601f191660200182016040528015612a58576020820181803683370190505b5090506000604051806060016040528060408152602001614094604091399050600181016020830160005b86811015612ae4576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612a83565b506003860660018114612afe5760028114612b0f57612b1b565b613d3d60f01b600119830152612b1b565b603d60f81b6000198301525b505050918152949350505050565b612b338282610f37565b610a2d57612b4b816001600160a01b03166014612d1c565b612b56836020612d1c565b604051602001612b6792919061401e565b60408051601f198184030181529082905262461bcd60e51b8252610a1a916004016131df565b600081815b8451811015612bd257612bbe82868381518110612bb157612bb1613f7e565b6020026020010151612e68565b915080612bca81613f39565b915050612b92565b509392505050565b610a2d828260405180602001604052806000815250612e97565b600054610100900460ff16612c1b5760405162461bcd60e51b8152600401610a1a90613f94565b6067612c278382613b0a565b506068612c348282613b0a565b5060006065555050565b600054610100900460ff16612c655760405162461bcd60e51b8152600401610a1a90613f94565b600160c955565b82156112ef5780612cbf5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420756e667265657a65207661726961626c6500000000000000006044820152606401610a1a565b81805190602001208480519060200120146112ef5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74206368616e67652066726f7a656e207661726961626c650000006044820152606401610a1a565b60606000612d2b8360026139c4565b612d36906002613f66565b6001600160401b03811115612d4d57612d4d613579565b6040519080825280601f01601f191660200182016040528015612d77576020820181803683370190505b509050600360fc1b81600081518110612d9257612d92613f7e565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612dc157612dc1613f7e565b60200101906001600160f81b031916908160001a9053506000612de58460026139c4565b612df0906001613f66565b90505b600181111561296a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612e2457612e24613f7e565b1a60f81b828281518110612e3a57612e3a613f7e565b60200101906001600160f81b031916908160001a90535060049490941c93612e6181614007565b9050612df3565b6000818310612e845760008281526020849052604090206129b9565b60008381526020839052604090206129b9565b61094083838360016065546001600160a01b038516612ec857604051622e076360e81b815260040160405180910390fd5b83600003612ee95760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0385166000818152606a6020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452606990925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015612f9a57506001600160a01b0387163b15155b15613022575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612feb60008884806001019550886121a6565b613008576040516368d2bf6b60e11b815260040160405180910390fd5b808203612fa057826065541461301d57600080fd5b613067565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203613023575b506065556119e3565b6040518060600160405280600081526020016130d46040518060e00160405280606081526020016060815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b031681525090565b815260200161314f604051806101800160405280606081526020016000151581526020016000815260200160001515815260200160008152602001600015158152602001600081526020016000815260200160608152602001600080191681526020016000815260200160006001600160a01b031681525090565b905290565b6001600160e01b031981168114610a7b57600080fd5b60006020828403121561317c57600080fd5b81356129b981613154565b60005b838110156131a257818101518382015260200161318a565b838111156112ef5750506000910152565b600081518084526131cb816020860160208601613187565b601f01601f19169290920160200192915050565b6020815260006129b960208301846131b3565b60006020828403121561320457600080fd5b5035919050565b6001600160a01b0381168114610a7b57600080fd5b803561322b8161320b565b919050565b6000806040838503121561324357600080fd5b823561324e8161320b565b946020939093013593505050565b60008060006060848603121561327157600080fd5b833561327c8161320b565b9250602084013561328c8161320b565b929592945050506040919091013590565b600080604083850312156132b057600080fd5b50508035926020909101359150565b600080604083850312156132d257600080fd5b8235915060208301356132e48161320b565b809150509250929050565b60008083601f84011261330157600080fd5b5081356001600160401b0381111561331857600080fd5b6020830191508360208260051b850101111561333357600080fd5b9250929050565b60008060006040848603121561334f57600080fd5b833561335a8161320b565b925060208401356001600160401b0381111561337557600080fd5b613381868287016132ef565b9497909650939450505050565b600061018082518185526133a4828601826131b3565b91505060208301516133ba602086018215159052565b506040830151604085015260608301516133d8606086018215159052565b506080830151608085015260a08301516133f660a086018215159052565b5060c083015160c085015260e083015160e0850152610100808401518583038287015261342383826131b3565b925050506101208084015181860152506101408084015181860152506101608084015161345a828701826001600160a01b03169052565b5090949350505050565b60208152815160208201526000602083015160606040840152805160e060808501526134946101608501826131b3565b90506020820151607f198583030160a08601526134b182826131b3565b6040848101516001600160a01b0390811660c08981019190915260608088015160e08b015260808801516101008b015260a08801516101208b015296015116610140880152870151868203601f1901948701949094529150610b559050818361338e565b60006020828403121561352757600080fd5b81356129b98161320b565b8015158114610a7b57600080fd5b803561322b81613532565b6000806040838503121561355e57600080fd5b82356135698161320b565b915060208301356132e481613532565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b03811182821017156135b2576135b2613579565b60405290565b60405160e081016001600160401b03811182821017156135b2576135b2613579565b60006001600160401b03808411156135f4576135f4613579565b604051601f8501601f19908116603f0116810190828211818310171561361c5761361c613579565b8160405280935085815286868601111561363557600080fd5b858560208301376000602087830101525050509392505050565b6000806000806080858703121561366557600080fd5b84356136708161320b565b935060208501356136808161320b565b92506040850135915060608501356001600160401b038111156136a257600080fd5b8501601f810187136136b357600080fd5b6136c2878235602084016135da565b91505092959194509250565b600082601f8301126136df57600080fd5b6129b9838335602085016135da565b6000610180828403121561370157600080fd5b61370961358f565b905081356001600160401b038082111561372257600080fd5b61372e858386016136ce565b835261373c60208501613540565b60208401526040840135604084015261375760608501613540565b60608401526080840135608084015261377260a08501613540565b60a084015260c084013560c084015260e084013560e0840152610100915081840135818111156137a157600080fd5b6137ad868287016136ce565b838501525050506101208083013581830152506101408083013581830152506101606137da818401613220565b9082015292915050565b600080604083850312156137f757600080fd5b82356001600160401b038082111561380e57600080fd5b9084019060e0828703121561382257600080fd5b61382a6135b8565b82358281111561383957600080fd5b613845888286016136ce565b82525060208301358281111561385a57600080fd5b613866888286016136ce565b60208301525061387860408401613220565b6040820152606083013560608201526080830135608082015260a083013560a08201526138a760c08401613220565b60c0820152935060208501359150808211156138c257600080fd5b506138cf858286016136ee565b9150509250929050565b6000602082840312156138eb57600080fd5b81356001600160401b0381111561390157600080fd5b820161018081850312156129b957600080fd5b60008060006040848603121561392957600080fd5b8335925060208401356001600160401b0381111561337557600080fd5b6000806040838503121561395957600080fd5b82356139648161320b565b915060208301356132e48161320b565b600181811c9082168061398857607f821691505b6020821081036139a857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156139de576139de6139ae565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613a0857613a086139e3565b500490565b600082821015613a1f57613a1f6139ae565b500390565b60008154613a3181613974565b60018281168015613a495760018114613a5e57613a8d565b60ff1984168752821515830287019450613a8d565b8560005260208060002060005b85811015613a845781548a820152908401908201613a6b565b50505082870194505b5050505092915050565b6000613aa38285613a24565b8351613ab3818360208801613187565b01949350505050565b601f82111561094057600081815260208120601f850160051c81016020861015613ae35750805b601f850160051c820191505b81811015613b0257828155600101613aef565b505050505050565b81516001600160401b03811115613b2357613b23613579565b613b3781613b318454613974565b84613abc565b602080601f831160018114613b6c5760008415613b545750858301515b600019600386901b1c1916600185901b178555613b02565b600085815260208120601f198616915b82811015613b9b57888601518255948401946001909101908401613b7c565b5085821015613bb95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006107dc36836136ee565b6000808335601e19843603018112613bec57600080fd5b8301803591506001600160401b03821115613c0657600080fd5b60200191503681900382131561333357600080fd5b6001600160401b03831115613c3257613c32613579565b613c4683613c408354613974565b83613abc565b6000601f841160018114613c7a5760008515613c625750838201355b600019600387901b1c1916600186901b1783556119e3565b600083815260209020601f19861690835b82811015613cab5786850135825560209485019460019092019101613c8b565b5086821015613cc85760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600081356107dc81613532565b600081356107dc8161320b565b613cfe8283613bd5565b613d09818385613c1b565b5050613d33613d1a60208401613cda565b6001830160ff1981541660ff8315151681178255505050565b60408201356002820155613d65613d4c60608401613cda565b6003830160ff1981541660ff8315151681178255505050565b60808201356004820155613d97613d7e60a08401613cda565b6005830160ff1981541660ff8315151681178255505050565b60c0820135600682015560e08201356007820155613db9610100830183613bd5565b613dc7818360088601613c1b565b50506101208201356009820155610140820135600a820155610a2d613def6101608401613ce7565b600b830180546001600160a01b0319166001600160a01b0392909216919091179055565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a2000000000815260008351613e4b81601c850160208801613187565b731610113332b2afb932b1b4b834b2b73a111d101160611b601c918401918201528351613e7f816030840160208801613187565b61227d60f01b60309290910191820152603201949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613ed281601d850160208701613187565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613f12908301846131b3565b9695505050505050565b600060208284031215613f2e57600080fd5b81516129b981613154565b600060018201613f4b57613f4b6139ae565b5060010190565b600082613f6157613f616139e3565b500690565b60008219821115613f7957613f796139ae565b500190565b634e487b7160e01b600052603260045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006129b98284613a24565b60008251613ffd818460208701613187565b9190910192915050565b600081614016576140166139ae565b506000190190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614056816017850160208801613187565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614087816028840160208801613187565b0160280194935050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220db30eaaa18194ab9f8d000768b719fa43de23da54abb4e519bd756181f8fb30464736f6c634300080f0033496e697469616c697a61626c653a20636f6e747261637420697320616c726561496e697469616c697a61626c653a20636f6e7472616374206973206e6f7420697f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498a49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775", + "deployedBytecode": "0x6080604052600436106102465760003560e01c80637ecc2b5611610139578063b5106add116100b6578063d761aa481161007a578063d761aa48146106e0578063e3e1e8ef14610700578063e8a3d48514610713578063e985e9c514610728578063f2fde38b14610771578063ffa1ad741461079157600080fd5b8063b5106add14610640578063b88d4fde14610660578063c87b56dd14610680578063d1bff694146106a0578063d547741f146106c057600080fd5b8063a0712d68116100fd578063a0712d681461059f578063a217fddf146105b2578063a22cb465146105c7578063a3f4df7e146105e7578063b0ea18021461062057600080fd5b80637ecc2b561461050d5780638da5cb5b1461052257806391d148541461054157806395d89b41146105615780639da5b0a51461057657600080fd5b806336568abe116101c75780635a9b0b891161018b5780635a9b0b89146104735780635c629f4c146104955780636352211e146104ab57806370a08231146104cb57806375b238fc146104eb57600080fd5b806336568abe146103e657806342842e0e14610406578063476343ee1461042657806353135ca01461043b5780635a23dd991461045357600080fd5b806323b872dd1161020e57806323b872dd1461031f578063248a9ca31461033f5780632a55205a1461036f5780632f2ff15d146103ae57806331f9c919146103ce57600080fd5b806301ffc9a71461024b57806306fdde0314610280578063081812fc146102a2578063095ea7b3146102da57806318160ddd146102fc575b600080fd5b34801561025757600080fd5b5061026b61026636600461316a565b6107a7565b60405190151581526020015b60405180910390f35b34801561028c57600080fd5b506102956107e2565b60405161027791906131df565b3480156102ae57600080fd5b506102c26102bd3660046131f2565b610874565b6040516001600160a01b039091168152602001610277565b3480156102e657600080fd5b506102fa6102f5366004613230565b6108b8565b005b34801561030857600080fd5b50606654606554035b604051908152602001610277565b34801561032b57600080fd5b506102fa61033a36600461325c565b610945565b34801561034b57600080fd5b5061031161035a3660046131f2565b60009081526097602052604090206001015490565b34801561037b57600080fd5b5061038f61038a36600461329d565b610950565b604080516001600160a01b039093168352602083019190915201610277565b3480156103ba57600080fd5b506102fa6103c93660046132bf565b610989565b3480156103da57600080fd5b5061010254421161026b565b3480156103f257600080fd5b506102fa6104013660046132bf565b6109ae565b34801561041257600080fd5b506102fa61042136600461325c565b610a31565b34801561043257600080fd5b506102fa610a4c565b34801561044757600080fd5b5061010354421161026b565b34801561045f57600080fd5b5061026b61046e36600461333a565b610a7e565b34801561047f57600080fd5b50610488610b5e565b6040516102779190613464565b3480156104a157600080fd5b5061031160fb5481565b3480156104b757600080fd5b506102c26104c63660046131f2565b610ea8565b3480156104d757600080fd5b506103116104e6366004613515565b610eba565b3480156104f757600080fd5b506103116000805160206140d483398151915281565b34801561051957600080fd5b50610311610f08565b34801561052e57600080fd5b5061010a546001600160a01b03166102c2565b34801561054d57600080fd5b5061026b61055c3660046132bf565b610f37565b34801561056d57600080fd5b50610295610f62565b34801561058257600080fd5b5061058c61271081565b60405161ffff9091168152602001610277565b6102fa6105ad3660046131f2565b610f71565b3480156105be57600080fd5b50610311600081565b3480156105d357600080fd5b506102fa6105e236600461354b565b61109a565b3480156105f357600080fd5b506102956040518060400160405280600d81526020016c27232a21b7b63632b1ba34b7b760991b81525081565b34801561062c57600080fd5b506102fa61063b366004613230565b61112f565b34801561064c57600080fd5b506102fa61065b366004613515565b6111b1565b34801561066c57600080fd5b506102fa61067b36600461364f565b6112a4565b34801561068c57600080fd5b5061029561069b3660046131f2565b6112f5565b3480156106ac57600080fd5b506102fa6106bb3660046137e4565b61141e565b3480156106cc57600080fd5b506102fa6106db3660046132bf565b6117ec565b3480156106ec57600080fd5b506102fa6106fb3660046138d9565b611811565b6102fa61070e366004613914565b611847565b34801561071f57600080fd5b506102956119ea565b34801561073457600080fd5b5061026b610743366004613946565b6001600160a01b039182166000908152606c6020908152604080832093909416825291909152205460ff1690565b34801561077d57600080fd5b506102fa61078c366004613515565b611a68565b34801561079d57600080fd5b5061031161290481565b60006107b282611ade565b806107c157506107c182611b2e565b806107dc575063152a902d60e11b6001600160e01b03198316145b92915050565b6060606780546107f190613974565b80601f016020809104026020016040519081016040528092919081815260200182805461081d90613974565b801561086a5780601f1061083f5761010080835404028352916020019161086a565b820191906000526020600020905b81548152906001019060200180831161084d57829003601f168201915b5050505050905090565b600061087f82611b53565b61089c576040516333d1c03960e21b815260040160405180910390fd5b506000908152606b60205260409020546001600160a01b031690565b60006108c382610ea8565b9050806001600160a01b0316836001600160a01b0316036108f75760405163250fdee360e21b815260040160405180910390fd5b336001600160a01b0382161480159061091757506109158133610743565b155b15610935576040516367d9dca160e11b815260040160405180910390fd5b610940838383611b7f565b505050565b610940838383611bdb565b61010754610106546001600160a01b0390911690600090612710906109769085906139c4565b61098091906139f9565b90509250929050565b6000828152609760205260409020600101546109a481611dc6565b6109408383611dd0565b6001600160a01b0381163314610a235760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b610a2d8282611e56565b5050565b610940838383604051806020016040528060008152506112a4565b6000805160206140d4833981519152610a6481611dc6565b61010e54610a7b906001600160a01b031647611ebd565b50565b6001600160a01b038316600090815261010f602052604081205460ff1615610ad95760405162461bcd60e51b815260206004820152600e60248201526d105b1c9958591e481b5a5b9d195960921b6044820152606401610a1a565b6040516bffffffffffffffffffffffff19606086901b166020820152600090603401604051602081830303815290604052805190602001209050610b5584848080602002602001604051908101604052809392919081815260200183836020028082843760009201919091525050610105549150849050611fd6565b95945050505050565b610b66613070565b61290481526040805160e08101909152610108805482908290610b8890613974565b80601f0160208091040260200160405190810160405280929190818152602001828054610bb490613974565b8015610c015780601f10610bd657610100808354040283529160200191610c01565b820191906000526020600020905b815481529060010190602001808311610be457829003601f168201915b50505050508152602001600182018054610c1a90613974565b80601f0160208091040260200160405190810160405280929190818152602001828054610c4690613974565b8015610c935780601f10610c6857610100808354040283529160200191610c93565b820191906000526020600020905b815481529060010190602001808311610c7657829003601f168201915b505050918352505060028201546001600160a01b039081166020808401919091526003840154604080850191909152600485015460608501526005850154608085015260069094015490911660a0909201919091528301919091528051610180810190915260fc805482908290610d0990613974565b80601f0160208091040260200160405190810160405280929190818152602001828054610d3590613974565b8015610d825780601f10610d5757610100808354040283529160200191610d82565b820191906000526020600020905b815481529060010190602001808311610d6557829003601f168201915b5050509183525050600182015460ff9081161515602083015260028301546040830152600383015481161515606083015260048301546080830152600583015416151560a0820152600682015460c0820152600782015460e082015260088201805461010090920191610df490613974565b80601f0160208091040260200160405190810160405280929190818152602001828054610e2090613974565b8015610e6d5780601f10610e4257610100808354040283529160200191610e6d565b820191906000526020600020905b815481529060010190602001808311610e5057829003601f168201915b505050918352505060098201546020820152600a820154604080830191909152600b909201546001600160a01b031660609091015282015290565b6000610eb382611fec565b5192915050565b60006001600160a01b038216610ee3576040516323d3ad8160e21b815260040160405180910390fd5b506001600160a01b03166000908152606a60205260409020546001600160401b031690565b600060fb54610f1a6066546065540390565b61010b54610f289190613a0d565b610f329190613a0d565b905090565b60009182526097602090815260408084206001600160a01b0393909316845291905290205460ff1690565b6060606880546107f190613974565b60fe54610f7e90826139c4565b80341015610fc25760405162461bcd60e51b815260206004820152601160248201527014185e5b595b9d081d1bdbc81cdb585b1b607a1b6044820152606401610a1a565b600260c954036110145760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a1a565b600260c95561010254421161106b5760405162461bcd60e51b815260206004820152601b60248201527f4d696e74696e6720686173206e6f7420737461727465642079657400000000006044820152606401610a1a565b6110753383612106565b600160c95534811015610a2d57600061108e8234613a0d565b90506109403382611ebd565b336001600160a01b038316036110c35760405163b06307db60e01b815260040160405180910390fd5b336000818152606c602090815260408083206001600160a01b03871680855290835292819020805460ff191686151590811790915590519081529192917f17307eab39ab6107e8899845ad3d59bd9653f200f220920489ca2b5937696c31910160405180910390a35050565b6000805160206140d483398151915261114781611dc6565b60fb5482111561118f5760405162461bcd60e51b8152602060048201526013602482015272139bdd08195b9bdd59da081c995cd95c9d9959606a1b6044820152606401610a1a565b8160fb60008282546111a19190613a0d565b9091555061094090508383612106565b6000805160206140d48339815191526111c981611dc6565b6111e16000805160206140d483398151915283610f37565b156112215760405162461bcd60e51b815260206004820152601060248201526f20b63932b0b23c9030b71030b236b4b760811b6044820152606401610a1a565b61010a546001600160a01b031633036112745760405162461bcd60e51b81526020600482015260156024820152740557365207472616e736665724f776e65727368697605c1b6044820152606401610a1a565b61128c6000805160206140d483398151915233611e56565b610a2d6000805160206140d483398151915283611dd0565b6112af848484611bdb565b6001600160a01b0383163b151580156112d157506112cf848484846121a6565b155b156112ef576040516368d2bf6b60e11b815260040160405180910390fd5b50505050565b606061130082611b53565b6113435760405162461bcd60e51b8152602060048201526014602482015273151bdad95b88191bd95cc81b9bdd08195e1a5cdd60621b6044820152606401610a1a565b600060fc600001805461135590613974565b9050116113ed57610104805461136a90613974565b80601f016020809104026020016040519081016040528092919081815260200182805461139690613974565b80156113e35780601f106113b8576101008083540402835291602001916113e3565b820191906000526020600020905b8154815290600101906020018083116113c657829003601f168201915b50505050506107dc565b60fc6113f883612292565b604051602001611409929190613a97565b60405160208183030381529060405292915050565b600054610100900460ff161580801561143e5750600054600160ff909116105b806114585750303b158015611458575060005460ff166001145b6114bb5760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b6064820152608401610a1a565b6000805460ff1916600117905580156114de576000805461ff0019166101001790555b61160461010860000180546114f290613974565b80601f016020809104026020016040519081016040528092919081815260200182805461151e90613974565b801561156b5780601f106115405761010080835404028352916020019161156b565b820191906000526020600020905b81548152906001019060200180831161154e57829003601f168201915b5050505050610108600101805461158190613974565b80601f01602080910402602001604051908101604052809291908181526020018280546115ad90613974565b80156115fa5780601f106115cf576101008083540402835291602001916115fa565b820191906000526020600020905b8154815290600101906020018083116115dd57829003601f168201915b5050505050612392565b61160c6123c3565b611615836123f4565b61161e82612615565b6116366000805160206140d483398151915233611dd0565b611643836040015161276b565b825183906101089081906116579082613b0a565b506020820151600182019061166c9082613b0a565b5060408201516002820180546001600160a01b03199081166001600160a01b0393841617909155606084015160038401556080840151600484015560a0840151600584015560c0909301516006909201805490931691161790558151829060fc9081906116d99082613b0a565b50602082015160018201805491151560ff199283161790556040830151600283015560608301516003830180549115159183169190911790556080830151600483015560a08301516005830180549115159190921617905560c0820151600682015560e08201516007820155610100820151600882019061175a9082613b0a565b506101208201516009820155610140820151600a82015561016090910151600b90910180546001600160a01b0319166001600160a01b03909216919091179055608083015160fb558015610940576000805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb38474024989060200160405180910390a1505050565b60008281526097602052604090206001015461180781611dc6565b6109408383611e56565b6000805160206140d483398151915261182981611dc6565b61183a61183583613bc9565b612615565b8160fc6112ef8282613cf4565b6101005461185590846139c4565b803410156118995760405162461bcd60e51b815260206004820152601160248201527014185e5b595b9d081d1bdbc81cdb585b1b607a1b6044820152606401610a1a565b600260c954036118eb5760405162461bcd60e51b815260206004820152601f60248201527f5265656e7472616e637947756172643a207265656e7472616e742063616c6c006044820152606401610a1a565b600260c9556101035442116119425760405162461bcd60e51b815260206004820152601b60248201527f50726573616c6520686173206e6f7420737461727465642079657400000000006044820152606401610a1a565b61194d338484610a7e565b6119995760405162461bcd60e51b815260206004820152601b60248201527f4e6f742077686974656c697374656420666f722070726573616c6500000000006044820152606401610a1a565b33600081815261010f60205260409020805460ff191660011790556119be9085612106565b600160c955348110156112ef5760006119d78234613a0d565b90506119e33382611ebd565b5050505050565b60606000611a3c6119ff60fc600a0154612292565b61010754611a17906001600160a01b0316601461281e565b604051602001611a28929190613e13565b6040516020818303038152906040526129c0565b9050600081604051602001611a519190613e9a565b60408051601f198184030181529190529392505050565b6000611a7381611dc6565b61010a546001600160a01b0390811690831603611ac65760405162461bcd60e51b815260206004820152601160248201527020b63932b0b23c903a34329037bbb732b960791b6044820152606401610a1a565b610a2d8261276b565b6001600160a01b03163b151590565b60006001600160e01b031982166380ac58cd60e01b1480611b0f57506001600160e01b03198216635b5e139f60e01b145b806107dc57506301ffc9a760e01b6001600160e01b03198316146107dc565b60006001600160e01b03198216637965db0b60e01b14806107dc57506107dc82611ade565b6000606554821080156107dc575050600090815260696020526040902054600160e01b900460ff161590565b6000828152606b602052604080822080546001600160a01b0319166001600160a01b0387811691821790925591518593918516917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a4505050565b6000611be682611fec565b9050836001600160a01b031681600001516001600160a01b031614611c1d5760405162a1148160e81b815260040160405180910390fd5b6000336001600160a01b0386161480611c3b5750611c3b8533610743565b80611c56575033611c4b84610874565b6001600160a01b0316145b905080611c7657604051632ce44b5f60e11b815260040160405180910390fd5b6001600160a01b038416611c9d57604051633a954ecd60e21b815260040160405180910390fd5b611ca960008487611b7f565b6001600160a01b038581166000908152606a60209081526040808320805467ffffffffffffffff198082166001600160401b0392831660001901831617909255898616808652838620805493841693831660019081018416949094179055898652606990945282852080546001600160e01b031916909417600160a01b42909216919091021783558701808452922080549193909116611d7d576065548214611d7d57805460208601516001600160401b0316600160a01b026001600160e01b03199091166001600160a01b038a16171781555b50505082846001600160a01b0316866001600160a01b03167fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef60405160405180910390a46119e3565b610a7b8133612b29565b611dda8282610f37565b610a2d5760008281526097602090815260408083206001600160a01b03851684529091529020805460ff19166001179055611e123390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b611e608282610f37565b15610a2d5760008281526097602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b80471015611f0d5760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e63650000006044820152606401610a1a565b6000826001600160a01b03168260405160006040518083038185875af1925050503d8060008114611f5a576040519150601f19603f3d011682016040523d82523d6000602084013e611f5f565b606091505b50509050806109405760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c207260448201527f6563697069656e74206d617920686176652072657665727465640000000000006064820152608401610a1a565b600082611fe38584612b8d565b14949350505050565b6040805160608101825260008082526020820181905291810191909152816065548110156120ed57600081815260696020908152604091829020825160608101845290546001600160a01b0381168252600160a01b81046001600160401b031692820192909252600160e01b90910460ff161515918101829052906120eb5780516001600160a01b031615612082579392505050565b5060001901600081815260696020908152604091829020825160608101845290546001600160a01b038116808352600160a01b82046001600160401b031693830193909352600160e01b900460ff16151592810192909252156120e6579392505050565b612082565b505b604051636f96cda160e11b815260040160405180910390fd5b61010d5481111561214c5760405162461bcd60e51b815260206004820152601060248201526f416d6f756e7420746f6f206c6172676560801b6044820152606401610a1a565b612154610f08565b81111561219c5760405162461bcd60e51b8152602060048201526016602482015275139bdd08195b9bdd59da081d1bdad95b9cc81b19599d60521b6044820152606401610a1a565b610a2d8282612bda565b604051630a85bd0160e11b81526000906001600160a01b0385169063150b7a02906121db903390899088908890600401613edf565b6020604051808303816000875af1925050508015612216575060408051601f3d908101601f1916820190925261221391810190613f1c565b60015b612274573d808015612244576040519150601f19603f3d011682016040523d82523d6000602084013e612249565b606091505b50805160000361226c576040516368d2bf6b60e11b815260040160405180910390fd5b805181602001fd5b6001600160e01b031916630a85bd0160e11b1490505b949350505050565b6060816000036122b95750506040805180820190915260018152600360fc1b602082015290565b8160005b81156122e357806122cd81613f39565b91506122dc9050600a836139f9565b91506122bd565b6000816001600160401b038111156122fd576122fd613579565b6040519080825280601f01601f191660200182016040528015612327576020820181803683370190505b5090505b841561228a5761233c600183613a0d565b9150612349600a86613f52565b612354906030613f66565b60f81b81838151811061236957612369613f7e565b60200101906001600160f81b031916908160001a90535061238b600a866139f9565b945061232b565b600054610100900460ff166123b95760405162461bcd60e51b8152600401610a1a90613f94565b610a2d8282612bf4565b600054610100900460ff166123ea5760405162461bcd60e51b8152600401610a1a90613f94565b6123f2612c3e565b565b60008160600151116124485760405162461bcd60e51b815260206004820152601f60248201527f4d6178696d756d20737570706c79206d757374206265206e6f6e2d7a65726f006044820152606401610a1a565b60008160a001511161249c5760405162461bcd60e51b815260206004820181905260248201527f546f6b656e7320706572206d696e74206d757374206265206e6f6e2d7a65726f6044820152606401610a1a565b80606001518160a0015111156125095760405162461bcd60e51b815260206004820152602c60248201527f546f6b656e7320706572206d696e74206d757374206265206c6573732074686160448201526b6e206d617820737570706c7960a01b6064820152608401610a1a565b60c08101516001600160a01b03166125635760405162461bcd60e51b815260206004820152601f60248201527f547265617375727920616464726573732063616e6e6f74206265206e756c6c006044820152606401610a1a565b60408101516001600160a01b03166125bd5760405162461bcd60e51b815260206004820152601b60248201527f436f6e7472616374206d757374206861766520616e206f776e657200000000006044820152606401610a1a565b806060015181608001511115610a7b5760405162461bcd60e51b815260206004820152601b60248201527f526573657276652067726561746572207468616e20737570706c7900000000006044820152606401610a1a565b61014081015161271010156126615760405162461bcd60e51b81526020600482015260126024820152710a4def2c2d8e8d2cae640e8dede40d0d2ced60731b6044820152606401610a1a565b60fe546040516126b79161267b9160200190815260200190565b60408051808303601f1901815282825260ff80548684015160208601529193911691016040516020818303038152906040528460600151612c6c565b61010054604051612712916126d29160200190815260200190565b60408051808303601f190181528282526101015460808601516020850152909260ff90911691016040516020818303038152906040528460a00151612c6c565b604051610a7b906127289060fc90602001613fdf565b60408051601f198184030181529082905260fd548451919260ff9091169161275291602001613feb565b6040516020818303038152906040528460200151612c6c565b61010a546001600160a01b03166127906000805160206140d483398151915282611e56565b61279b600082611e56565b61010a80546001600160a01b0319166001600160a01b0384161790556127cf6000805160206140d483398151915283611dd0565b6127da600083611dd0565b816001600160a01b0316816001600160a01b03167f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e060405160405180910390a35050565b6060600061282d8360026139c4565b612838906002613f66565b6001600160401b0381111561284f5761284f613579565b6040519080825280601f01601f191660200182016040528015612879576020820181803683370190505b509050600360fc1b8160008151811061289457612894613f7e565b60200101906001600160f81b031916908160001a905350600f60fb1b816001815181106128c3576128c3613f7e565b60200101906001600160f81b031916908160001a90535060006128e78460026139c4565b6128f2906001613f66565b90505b600181111561296a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f166010811061292657612926613f7e565b1a60f81b82828151811061293c5761293c613f7e565b60200101906001600160f81b031916908160001a90535060049490941c9361296381614007565b90506128f5565b5083156129b95760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e746044820152606401610a1a565b9392505050565b805160609060008190036129e4575050604080516020810190915260008152919050565b600060036129f3836002613f66565b6129fd91906139f9565b612a089060046139c4565b90506000612a17826020613f66565b6001600160401b03811115612a2e57612a2e613579565b6040519080825280601f01601f191660200182016040528015612a58576020820181803683370190505b5090506000604051806060016040528060408152602001614094604091399050600181016020830160005b86811015612ae4576003818a01810151603f601282901c8116860151600c83901c8216870151600684901c831688015192909316870151600891821b60ff94851601821b92841692909201901b91160160e01b835260049092019101612a83565b506003860660018114612afe5760028114612b0f57612b1b565b613d3d60f01b600119830152612b1b565b603d60f81b6000198301525b505050918152949350505050565b612b338282610f37565b610a2d57612b4b816001600160a01b03166014612d1c565b612b56836020612d1c565b604051602001612b6792919061401e565b60408051601f198184030181529082905262461bcd60e51b8252610a1a916004016131df565b600081815b8451811015612bd257612bbe82868381518110612bb157612bb1613f7e565b6020026020010151612e68565b915080612bca81613f39565b915050612b92565b509392505050565b610a2d828260405180602001604052806000815250612e97565b600054610100900460ff16612c1b5760405162461bcd60e51b8152600401610a1a90613f94565b6067612c278382613b0a565b506068612c348282613b0a565b5060006065555050565b600054610100900460ff16612c655760405162461bcd60e51b8152600401610a1a90613f94565b600160c955565b82156112ef5780612cbf5760405162461bcd60e51b815260206004820152601860248201527f43616e6e6f7420756e667265657a65207661726961626c6500000000000000006044820152606401610a1a565b81805190602001208480519060200120146112ef5760405162461bcd60e51b815260206004820152601d60248201527f43616e6e6f74206368616e67652066726f7a656e207661726961626c650000006044820152606401610a1a565b60606000612d2b8360026139c4565b612d36906002613f66565b6001600160401b03811115612d4d57612d4d613579565b6040519080825280601f01601f191660200182016040528015612d77576020820181803683370190505b509050600360fc1b81600081518110612d9257612d92613f7e565b60200101906001600160f81b031916908160001a905350600f60fb1b81600181518110612dc157612dc1613f7e565b60200101906001600160f81b031916908160001a9053506000612de58460026139c4565b612df0906001613f66565b90505b600181111561296a576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110612e2457612e24613f7e565b1a60f81b828281518110612e3a57612e3a613f7e565b60200101906001600160f81b031916908160001a90535060049490941c93612e6181614007565b9050612df3565b6000818310612e845760008281526020849052604090206129b9565b60008381526020839052604090206129b9565b61094083838360016065546001600160a01b038516612ec857604051622e076360e81b815260040160405180910390fd5b83600003612ee95760405163b562e8dd60e01b815260040160405180910390fd5b6001600160a01b0385166000818152606a6020908152604080832080546fffffffffffffffffffffffffffffffff1981166001600160401b038083168c0181169182176801000000000000000067ffffffffffffffff1990941690921783900481168c01811690920217909155858452606990925290912080546001600160e01b031916909217600160a01b429092169190910217905580808501838015612f9a57506001600160a01b0387163b15155b15613022575b60405182906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4612feb60008884806001019550886121a6565b613008576040516368d2bf6b60e11b815260040160405180910390fd5b808203612fa057826065541461301d57600080fd5b613067565b5b6040516001830192906001600160a01b038916906000907fddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3ef908290a4808203613023575b506065556119e3565b6040518060600160405280600081526020016130d46040518060e00160405280606081526020016060815260200160006001600160a01b0316815260200160008152602001600081526020016000815260200160006001600160a01b031681525090565b815260200161314f604051806101800160405280606081526020016000151581526020016000815260200160001515815260200160008152602001600015158152602001600081526020016000815260200160608152602001600080191681526020016000815260200160006001600160a01b031681525090565b905290565b6001600160e01b031981168114610a7b57600080fd5b60006020828403121561317c57600080fd5b81356129b981613154565b60005b838110156131a257818101518382015260200161318a565b838111156112ef5750506000910152565b600081518084526131cb816020860160208601613187565b601f01601f19169290920160200192915050565b6020815260006129b960208301846131b3565b60006020828403121561320457600080fd5b5035919050565b6001600160a01b0381168114610a7b57600080fd5b803561322b8161320b565b919050565b6000806040838503121561324357600080fd5b823561324e8161320b565b946020939093013593505050565b60008060006060848603121561327157600080fd5b833561327c8161320b565b9250602084013561328c8161320b565b929592945050506040919091013590565b600080604083850312156132b057600080fd5b50508035926020909101359150565b600080604083850312156132d257600080fd5b8235915060208301356132e48161320b565b809150509250929050565b60008083601f84011261330157600080fd5b5081356001600160401b0381111561331857600080fd5b6020830191508360208260051b850101111561333357600080fd5b9250929050565b60008060006040848603121561334f57600080fd5b833561335a8161320b565b925060208401356001600160401b0381111561337557600080fd5b613381868287016132ef565b9497909650939450505050565b600061018082518185526133a4828601826131b3565b91505060208301516133ba602086018215159052565b506040830151604085015260608301516133d8606086018215159052565b506080830151608085015260a08301516133f660a086018215159052565b5060c083015160c085015260e083015160e0850152610100808401518583038287015261342383826131b3565b925050506101208084015181860152506101408084015181860152506101608084015161345a828701826001600160a01b03169052565b5090949350505050565b60208152815160208201526000602083015160606040840152805160e060808501526134946101608501826131b3565b90506020820151607f198583030160a08601526134b182826131b3565b6040848101516001600160a01b0390811660c08981019190915260608088015160e08b015260808801516101008b015260a08801516101208b015296015116610140880152870151868203601f1901948701949094529150610b559050818361338e565b60006020828403121561352757600080fd5b81356129b98161320b565b8015158114610a7b57600080fd5b803561322b81613532565b6000806040838503121561355e57600080fd5b82356135698161320b565b915060208301356132e481613532565b634e487b7160e01b600052604160045260246000fd5b60405161018081016001600160401b03811182821017156135b2576135b2613579565b60405290565b60405160e081016001600160401b03811182821017156135b2576135b2613579565b60006001600160401b03808411156135f4576135f4613579565b604051601f8501601f19908116603f0116810190828211818310171561361c5761361c613579565b8160405280935085815286868601111561363557600080fd5b858560208301376000602087830101525050509392505050565b6000806000806080858703121561366557600080fd5b84356136708161320b565b935060208501356136808161320b565b92506040850135915060608501356001600160401b038111156136a257600080fd5b8501601f810187136136b357600080fd5b6136c2878235602084016135da565b91505092959194509250565b600082601f8301126136df57600080fd5b6129b9838335602085016135da565b6000610180828403121561370157600080fd5b61370961358f565b905081356001600160401b038082111561372257600080fd5b61372e858386016136ce565b835261373c60208501613540565b60208401526040840135604084015261375760608501613540565b60608401526080840135608084015261377260a08501613540565b60a084015260c084013560c084015260e084013560e0840152610100915081840135818111156137a157600080fd5b6137ad868287016136ce565b838501525050506101208083013581830152506101408083013581830152506101606137da818401613220565b9082015292915050565b600080604083850312156137f757600080fd5b82356001600160401b038082111561380e57600080fd5b9084019060e0828703121561382257600080fd5b61382a6135b8565b82358281111561383957600080fd5b613845888286016136ce565b82525060208301358281111561385a57600080fd5b613866888286016136ce565b60208301525061387860408401613220565b6040820152606083013560608201526080830135608082015260a083013560a08201526138a760c08401613220565b60c0820152935060208501359150808211156138c257600080fd5b506138cf858286016136ee565b9150509250929050565b6000602082840312156138eb57600080fd5b81356001600160401b0381111561390157600080fd5b820161018081850312156129b957600080fd5b60008060006040848603121561392957600080fd5b8335925060208401356001600160401b0381111561337557600080fd5b6000806040838503121561395957600080fd5b82356139648161320b565b915060208301356132e48161320b565b600181811c9082168061398857607f821691505b6020821081036139a857634e487b7160e01b600052602260045260246000fd5b50919050565b634e487b7160e01b600052601160045260246000fd5b60008160001904831182151516156139de576139de6139ae565b500290565b634e487b7160e01b600052601260045260246000fd5b600082613a0857613a086139e3565b500490565b600082821015613a1f57613a1f6139ae565b500390565b60008154613a3181613974565b60018281168015613a495760018114613a5e57613a8d565b60ff1984168752821515830287019450613a8d565b8560005260208060002060005b85811015613a845781548a820152908401908201613a6b565b50505082870194505b5050505092915050565b6000613aa38285613a24565b8351613ab3818360208801613187565b01949350505050565b601f82111561094057600081815260208120601f850160051c81016020861015613ae35750805b601f850160051c820191505b81811015613b0257828155600101613aef565b505050505050565b81516001600160401b03811115613b2357613b23613579565b613b3781613b318454613974565b84613abc565b602080601f831160018114613b6c5760008415613b545750858301515b600019600386901b1c1916600185901b178555613b02565b600085815260208120601f198616915b82811015613b9b57888601518255948401946001909101908401613b7c565b5085821015613bb95787850151600019600388901b60f8161c191681555b5050505050600190811b01905550565b60006107dc36836136ee565b6000808335601e19843603018112613bec57600080fd5b8301803591506001600160401b03821115613c0657600080fd5b60200191503681900382131561333357600080fd5b6001600160401b03831115613c3257613c32613579565b613c4683613c408354613974565b83613abc565b6000601f841160018114613c7a5760008515613c625750838201355b600019600387901b1c1916600186901b1783556119e3565b600083815260209020601f19861690835b82811015613cab5786850135825560209485019460019092019101613c8b565b5086821015613cc85760001960f88860031b161c19848701351681555b505060018560011b0183555050505050565b600081356107dc81613532565b600081356107dc8161320b565b613cfe8283613bd5565b613d09818385613c1b565b5050613d33613d1a60208401613cda565b6001830160ff1981541660ff8315151681178255505050565b60408201356002820155613d65613d4c60608401613cda565b6003830160ff1981541660ff8315151681178255505050565b60808201356004820155613d97613d7e60a08401613cda565b6005830160ff1981541660ff8315151681178255505050565b60c0820135600682015560e08201356007820155613db9610100830183613bd5565b613dc7818360088601613c1b565b50506101208201356009820155610140820135600a820155610a2d613def6101608401613ce7565b600b830180546001600160a01b0319166001600160a01b0392909216919091179055565b7f7b2273656c6c65725f6665655f62617369735f706f696e7473223a2000000000815260008351613e4b81601c850160208801613187565b731610113332b2afb932b1b4b834b2b73a111d101160611b601c918401918201528351613e7f816030840160208801613187565b61227d60f01b60309290910191820152603201949350505050565b7f646174613a6170706c69636174696f6e2f6a736f6e3b6261736536342c000000815260008251613ed281601d850160208701613187565b91909101601d0192915050565b6001600160a01b0385811682528416602082015260408101839052608060608201819052600090613f12908301846131b3565b9695505050505050565b600060208284031215613f2e57600080fd5b81516129b981613154565b600060018201613f4b57613f4b6139ae565b5060010190565b600082613f6157613f616139e3565b500690565b60008219821115613f7957613f796139ae565b500190565b634e487b7160e01b600052603260045260246000fd5b6020808252602b908201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960408201526a6e697469616c697a696e6760a81b606082015260800190565b60006129b98284613a24565b60008251613ffd818460208701613187565b9190910192915050565b600081614016576140166139ae565b506000190190565b7f416363657373436f6e74726f6c3a206163636f756e7420000000000000000000815260008351614056816017850160208801613187565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351614087816028840160208801613187565b0160280194935050505056fe4142434445464748494a4b4c4d4e4f505152535455565758595a6162636465666768696a6b6c6d6e6f707172737475767778797a303132333435363738392b2fa49807205ce4d355092ef5a8a18f56e8913cf4a201fbe287825b095693c21775a2646970667358221220db30eaaa18194ab9f8d000768b719fa43de23da54abb4e519bd756181f8fb30464736f6c634300080f0033", "devdoc": { "kind": "dev", "methods": { @@ -1328,7 +1461,7 @@ "details": "See {IERC721-balanceOf}." }, "contractURI()": { - "details": "OpenSea contract metadata" + "details": "OpenSea contract metadata, returns a base64 encoded JSON string containing royalties basis points and royalties address" }, "getApproved(uint256)": { "details": "See {IERC721-getApproved}." @@ -1340,7 +1473,7 @@ "details": "Returns the admin role that controls `role`. See {grantRole} and {revokeRole}. To change a role's admin, use {_setRoleAdmin}." }, "grantRole(bytes32,address)": { - "details": "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." + "details": "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." }, "hasRole(bytes32,address)": { "details": "Returns `true` if `account` has been granted `role`." @@ -1349,19 +1482,19 @@ "details": "See {IERC721-isApprovedForAll}." }, "name()": { - "details": "Need name() to support setting it in the initializer instead of constructor" + "details": "See {IERC721Metadata-name}." }, "owner()": { - "details": "Required for easy integration with OpenSea" + "details": "Required for easy integration with OpenSea, the owner address can edit the collection there" }, "ownerOf(uint256)": { "details": "See {IERC721-ownerOf}." }, "renounceRole(bytes32,address)": { - "details": "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`." + "details": "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." }, "revokeRole(bytes32,address)": { - "details": "Revokes `role` from `account`. If `account` had been granted `role`, emits a {RoleRevoked} event. Requirements: - the caller must have ``role``'s admin role." + "details": "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." }, "royaltyInfo(uint256,uint256)": { "details": "ERC2981 token royalty info" @@ -1379,12 +1512,15 @@ "details": "See {IERC165-supportsInterface}." }, "symbol()": { - "details": "Need symbol() to support setting it in the initializer instead of constructor" + "details": "See {IERC721Metadata-symbol}." + }, + "totalSupply()": { + "details": "Burned tokens are calculated here, use _totalMinted() if you want to count just minted tokens." }, "transferFrom(address,address,uint256)": { "details": "See {IERC721-transferFrom}." }, - "updateConfig((string,bool,uint256,uint256,string,bytes32,uint256,address))": { + "updateConfig((string,bool,uint256,bool,uint256,bool,uint256,uint256,string,bytes32,uint256,address))": { "details": "Callable by admin roles only" }, "withdrawFees()": { @@ -1397,22 +1533,28 @@ "kind": "user", "methods": { "ADMIN_ROLE()": { - "notice": "Admin role" + "notice": "Admin role, on contract initialization given to the deployer." + }, + "NAME()": { + "notice": "Contract name" }, "VERSION()": { "notice": "Contract version, semver-style uint X_YY_ZZ" }, + "availableSupply()": { + "notice": "Get the number of tokens still available for minting" + }, "getInfo()": { "notice": "Get full contract information" }, - "initialize((string,string,address,uint256,uint256,uint256,address),(string,bool,uint256,uint256,string,bytes32,uint256,address))": { + "initialize((string,string,address,uint256,uint256,uint256,address),(string,bool,uint256,bool,uint256,bool,uint256,uint256,string,bytes32,uint256,address))": { "notice": "Contract initializer" }, "isWhitelisted(address,bytes32[])": { "notice": "Check if the wallet is whitelisted for the presale" }, "mint(uint256)": { - "notice": "Mint tokens" + "notice": "Public mint function, can be called by any address if `DeploymentConfig.publicMintStart` is before the current block timestamp" }, "mintingActive()": { "notice": "Check if public minting is active" @@ -1424,21 +1566,24 @@ "notice": "Check if presale minting is active" }, "presaleMint(uint256,bytes32[])": { - "notice": "Mint tokens if the wallet has been whitelisted" + "notice": "Mint tokens if the wallet has been whitelisted, can be called if `DeploymentConfig.presaleMintStart` is before the current block timestamp" + }, + "reserveMint(address,uint256)": { + "notice": "Mint a token from the reserve" + }, + "reserveRemaining()": { + "notice": "The number of tokens remaining in the reserve" }, "tokenURI(uint256)": { "notice": "Get the token metadata URI" }, - "totalSupply()": { - "notice": "The number of currently minted tokens" - }, "transferAdminRights(address)": { - "notice": "Transfer contract ownership" + "notice": "Transfer contract admin rights, changes `ADMIN_ROLE` from sender address to input `to` address input `to` address cannot already have `ADMIN_ROLE` access rights" }, "transferOwnership(address)": { "notice": "Transfer contract ownership" }, - "updateConfig((string,bool,uint256,uint256,string,bytes32,uint256,address))": { + "updateConfig((string,bool,uint256,bool,uint256,bool,uint256,uint256,string,bytes32,uint256,address))": { "notice": "Update contract configuration" }, "withdrawFees()": { @@ -1450,115 +1595,171 @@ "storageLayout": { "storage": [ { - "astId": 583, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", - "label": "_name", + "astId": 419, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "_initialized", "offset": 0, "slot": "0", + "type": "t_uint8" + }, + { + "astId": 422, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "_initializing", + "offset": 1, + "slot": "0", + "type": "t_bool" + }, + { + "astId": 3527, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "__gap", + "offset": 0, + "slot": "1", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 3797, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "__gap", + "offset": 0, + "slot": "51", + "type": "t_array(t_uint256)50_storage" + }, + { + "astId": 9728, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "_currentIndex", + "offset": 0, + "slot": "101", + "type": "t_uint256" + }, + { + "astId": 9730, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "_burnCounter", + "offset": 0, + "slot": "102", + "type": "t_uint256" + }, + { + "astId": 9732, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "_name", + "offset": 0, + "slot": "103", "type": "t_string_storage" }, { - "astId": 585, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 9734, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "_symbol", "offset": 0, - "slot": "1", + "slot": "104", "type": "t_string_storage" }, { - "astId": 589, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", - "label": "_owners", + "astId": 9739, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "_ownerships", "offset": 0, - "slot": "2", - "type": "t_mapping(t_uint256,t_address)" + "slot": "105", + "type": "t_mapping(t_uint256,t_struct(TokenOwnership)9717_storage)" }, { - "astId": 593, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", - "label": "_balances", + "astId": 9744, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "_addressData", "offset": 0, - "slot": "3", - "type": "t_mapping(t_address,t_uint256)" + "slot": "106", + "type": "t_mapping(t_address,t_struct(AddressData)9726_storage)" }, { - "astId": 597, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 9748, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "_tokenApprovals", "offset": 0, - "slot": "4", + "slot": "107", "type": "t_mapping(t_uint256,t_address)" }, { - "astId": 603, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 9754, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "_operatorApprovals", "offset": 0, - "slot": "5", + "slot": "108", "type": "t_mapping(t_address,t_mapping(t_address,t_bool))" }, { - "astId": 24, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", - "label": "_roles", + "astId": 11002, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "__gap", "offset": 0, - "slot": "6", - "type": "t_mapping(t_bytes32,t_struct(RoleData)19_storage)" + "slot": "109", + "type": "t_array(t_uint256)42_storage" }, { - "astId": 490, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", - "label": "_initialized", + "astId": 39, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "_roles", "offset": 0, - "slot": "7", - "type": "t_bool" + "slot": "151", + "type": "t_mapping(t_bytes32,t_struct(RoleData)34_storage)" }, { - "astId": 493, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", - "label": "_initializing", - "offset": 1, - "slot": "7", - "type": "t_bool" + "astId": 338, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "__gap", + "offset": 0, + "slot": "152", + "type": "t_array(t_uint256)49_storage" }, { - "astId": 2850, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", - "label": "totalSupply", + "astId": 577, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "_status", "offset": 0, - "slot": "8", + "slot": "201", "type": "t_uint256" }, { - "astId": 3207, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", - "label": "_runtimeConfig", + "astId": 621, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "__gap", "offset": 0, - "slot": "9", - "type": "t_struct(RuntimeConfig)2819_storage" + "slot": "202", + "type": "t_array(t_uint256)49_storage" }, { - "astId": 3210, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", - "label": "_deploymentConfig", + "astId": 8797, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "reserveRemaining", "offset": 0, - "slot": "17", - "type": "t_struct(DeploymentConfig)2794_storage" + "slot": "251", + "type": "t_uint256" }, { - "astId": 3213, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", - "label": "_preventInitialization", + "astId": 9177, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "_runtimeConfig", "offset": 0, - "slot": "24", - "type": "t_bool" + "slot": "252", + "type": "t_struct(RuntimeConfig)8762_storage" + }, + { + "astId": 9181, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "_deploymentConfig", + "offset": 0, + "slot": "264", + "type": "t_struct(DeploymentConfig)8737_storage" }, { - "astId": 3218, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 9186, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "_presaleMinted", "offset": 0, - "slot": "25", + "slot": "271", "type": "t_mapping(t_address,t_bool)" } ], @@ -1573,6 +1774,24 @@ "label": "address payable", "numberOfBytes": "20" }, + "t_array(t_uint256)42_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[42]", + "numberOfBytes": "1344" + }, + "t_array(t_uint256)49_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[49]", + "numberOfBytes": "1568" + }, + "t_array(t_uint256)50_storage": { + "base": "t_uint256", + "encoding": "inplace", + "label": "uint256[50]", + "numberOfBytes": "1600" + }, "t_bool": { "encoding": "inplace", "label": "bool", @@ -1597,19 +1816,19 @@ "numberOfBytes": "32", "value": "t_mapping(t_address,t_bool)" }, - "t_mapping(t_address,t_uint256)": { + "t_mapping(t_address,t_struct(AddressData)9726_storage)": { "encoding": "mapping", "key": "t_address", - "label": "mapping(address => uint256)", + "label": "mapping(address => struct ERC721AUpgradeable.AddressData)", "numberOfBytes": "32", - "value": "t_uint256" + "value": "t_struct(AddressData)9726_storage" }, - "t_mapping(t_bytes32,t_struct(RoleData)19_storage)": { + "t_mapping(t_bytes32,t_struct(RoleData)34_storage)": { "encoding": "mapping", "key": "t_bytes32", - "label": "mapping(bytes32 => struct AccessControl.RoleData)", + "label": "mapping(bytes32 => struct AccessControlUpgradeable.RoleData)", "numberOfBytes": "32", - "value": "t_struct(RoleData)19_storage" + "value": "t_struct(RoleData)34_storage" }, "t_mapping(t_uint256,t_address)": { "encoding": "mapping", @@ -1618,66 +1837,112 @@ "numberOfBytes": "32", "value": "t_address" }, + "t_mapping(t_uint256,t_struct(TokenOwnership)9717_storage)": { + "encoding": "mapping", + "key": "t_uint256", + "label": "mapping(uint256 => struct ERC721AUpgradeable.TokenOwnership)", + "numberOfBytes": "32", + "value": "t_struct(TokenOwnership)9717_storage" + }, "t_string_storage": { "encoding": "bytes", "label": "string", "numberOfBytes": "32" }, - "t_struct(DeploymentConfig)2794_storage": { + "t_struct(AddressData)9726_storage": { + "encoding": "inplace", + "label": "struct ERC721AUpgradeable.AddressData", + "members": [ + { + "astId": 9719, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "balance", + "offset": 0, + "slot": "0", + "type": "t_uint64" + }, + { + "astId": 9721, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "numberMinted", + "offset": 8, + "slot": "0", + "type": "t_uint64" + }, + { + "astId": 9723, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "numberBurned", + "offset": 16, + "slot": "0", + "type": "t_uint64" + }, + { + "astId": 9725, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "aux", + "offset": 24, + "slot": "0", + "type": "t_uint64" + } + ], + "numberOfBytes": "32" + }, + "t_struct(DeploymentConfig)8737_storage": { "encoding": "inplace", "label": "struct NFTCollection.DeploymentConfig", "members": [ { - "astId": 2775, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 8724, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "name", "offset": 0, "slot": "0", "type": "t_string_storage" }, { - "astId": 2778, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 8726, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "symbol", "offset": 0, "slot": "1", "type": "t_string_storage" }, { - "astId": 2781, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 8728, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "owner", "offset": 0, "slot": "2", "type": "t_address" }, { - "astId": 2784, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 8730, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "maxSupply", "offset": 0, "slot": "3", "type": "t_uint256" }, { - "astId": 2787, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", - "label": "mintPrice", + "astId": 8732, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "reservedSupply", "offset": 0, "slot": "4", "type": "t_uint256" }, { - "astId": 2790, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 8734, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "tokensPerMint", "offset": 0, "slot": "5", "type": "t_uint256" }, { - "astId": 2793, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 8736, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "treasuryAddress", "offset": 0, "slot": "6", @@ -1686,21 +1951,21 @@ ], "numberOfBytes": "224" }, - "t_struct(RoleData)19_storage": { + "t_struct(RoleData)34_storage": { "encoding": "inplace", - "label": "struct AccessControl.RoleData", + "label": "struct AccessControlUpgradeable.RoleData", "members": [ { - "astId": 16, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 31, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "members", "offset": 0, "slot": "0", "type": "t_mapping(t_address,t_bool)" }, { - "astId": 18, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 33, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "adminRole", "offset": 0, "slot": "1", @@ -1709,81 +1974,154 @@ ], "numberOfBytes": "64" }, - "t_struct(RuntimeConfig)2819_storage": { + "t_struct(RuntimeConfig)8762_storage": { "encoding": "inplace", "label": "struct NFTCollection.RuntimeConfig", "members": [ { - "astId": 2797, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 8739, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "baseURI", "offset": 0, "slot": "0", "type": "t_string_storage" }, { - "astId": 2800, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", - "label": "metadataUpdatable", + "astId": 8741, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "metadataFrozen", "offset": 0, "slot": "1", "type": "t_bool" }, { - "astId": 2803, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", - "label": "publicMintStart", + "astId": 8743, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "publicMintPrice", "offset": 0, "slot": "2", "type": "t_uint256" }, { - "astId": 2806, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", - "label": "presaleMintStart", + "astId": 8745, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "publicMintPriceFrozen", "offset": 0, "slot": "3", + "type": "t_bool" + }, + { + "astId": 8747, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "presaleMintPrice", + "offset": 0, + "slot": "4", + "type": "t_uint256" + }, + { + "astId": 8749, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "presaleMintPriceFrozen", + "offset": 0, + "slot": "5", + "type": "t_bool" + }, + { + "astId": 8751, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "publicMintStart", + "offset": 0, + "slot": "6", + "type": "t_uint256" + }, + { + "astId": 8753, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "presaleMintStart", + "offset": 0, + "slot": "7", "type": "t_uint256" }, { - "astId": 2809, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 8755, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "prerevealTokenURI", "offset": 0, - "slot": "4", + "slot": "8", "type": "t_string_storage" }, { - "astId": 2812, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 8757, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "presaleMerkleRoot", "offset": 0, - "slot": "5", + "slot": "9", "type": "t_bytes32" }, { - "astId": 2815, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 8759, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "royaltiesBps", "offset": 0, - "slot": "6", + "slot": "10", "type": "t_uint256" }, { - "astId": 2818, - "contract": "contracts/deployables/NFTCollectionContract.sol:NFTCollectionContract", + "astId": 8761, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", "label": "royaltiesAddress", "offset": 0, - "slot": "7", + "slot": "11", "type": "t_address" } ], - "numberOfBytes": "256" + "numberOfBytes": "384" + }, + "t_struct(TokenOwnership)9717_storage": { + "encoding": "inplace", + "label": "struct ERC721AUpgradeable.TokenOwnership", + "members": [ + { + "astId": 9712, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "addr", + "offset": 0, + "slot": "0", + "type": "t_address" + }, + { + "astId": 9714, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "startTimestamp", + "offset": 20, + "slot": "0", + "type": "t_uint64" + }, + { + "astId": 9716, + "contract": "contracts/standalone/NFTCollectionContract.sol:NFTCollectionContract", + "label": "burned", + "offset": 28, + "slot": "0", + "type": "t_bool" + } + ], + "numberOfBytes": "32" }, "t_uint256": { "encoding": "inplace", "label": "uint256", "numberOfBytes": "32" + }, + "t_uint64": { + "encoding": "inplace", + "label": "uint64", + "numberOfBytes": "8" + }, + "t_uint8": { + "encoding": "inplace", + "label": "uint8", + "numberOfBytes": "1" } } }