[ { "inputs": [], "name": "CANNOT_APPROVE_SELF", "type": "error" }, { "inputs": [], "name": "CANT_EXTEND_NON_EXPIRING_KEY", "type": "error" }, { "inputs": [], "name": "GAS_REFUND_FAILED", "type": "error" }, { "inputs": [], "name": "INSUFFICIENT_ERC20_VALUE", "type": "error" }, { "inputs": [], "name": "INSUFFICIENT_VALUE", "type": "error" }, { "inputs": [], "name": "INVALID_ADDRESS", "type": "error" }, { "inputs": [ { "internalType": "uint8", "name": "hookIndex", "type": "uint8" } ], "name": "INVALID_HOOK", "type": "error" }, { "inputs": [], "name": "INVALID_LENGTH", "type": "error" }, { "inputs": [], "name": "INVALID_TOKEN", "type": "error" }, { "inputs": [], "name": "KEY_NOT_VALID", "type": "error" }, { "inputs": [], "name": "KEY_TRANSFERS_DISABLED", "type": "error" }, { "inputs": [], "name": "LOCK_HAS_CHANGED", "type": "error" }, { "inputs": [], "name": "LOCK_SOLD_OUT", "type": "error" }, { "inputs": [], "name": "MAX_KEYS_REACHED", "type": "error" }, { "inputs": [], "name": "MIGRATION_REQUIRED", "type": "error" }, { "inputs": [], "name": "NON_COMPLIANT_ERC721_RECEIVER", "type": "error" }, { "inputs": [], "name": "NON_RENEWABLE_LOCK", "type": "error" }, { "inputs": [], "name": "NOT_ENOUGH_FUNDS", "type": "error" }, { "inputs": [], "name": "NOT_ENOUGH_TIME", "type": "error" }, { "inputs": [], "name": "NOT_READY_FOR_RENEWAL", "type": "error" }, { "inputs": [], "name": "NO_SUCH_KEY", "type": "error" }, { "inputs": [], "name": "NULL_VALUE", "type": "error" }, { "inputs": [], "name": "ONLY_KEY_MANAGER_OR_APPROVED", "type": "error" }, { "inputs": [], "name": "ONLY_LOCK_MANAGER", "type": "error" }, { "inputs": [], "name": "ONLY_LOCK_MANAGER_OR_KEY_GRANTER", "type": "error" }, { "inputs": [], "name": "OUT_OF_RANGE", "type": "error" }, { "inputs": [], "name": "OWNER_CANT_BE_ADDRESS_ZERO", "type": "error" }, { "inputs": [], "name": "SCHEMA_VERSION_NOT_CORRECT", "type": "error" }, { "inputs": [ { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "uint256", "name": "length", "type": "uint256" } ], "name": "StringsInsufficientHexLength", "type": "error" }, { "inputs": [], "name": "TRANSFER_TO_SELF", "type": "error" }, { "inputs": [], "name": "TransferFailed", "type": "error" }, { "inputs": [], "name": "UNAUTHORIZED", "type": "error" }, { "inputs": [], "name": "UNAUTHORIZED_KEY_MANAGER_UPDATE", "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": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "owner", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sendTo", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "refund", "type": "uint256" } ], "name": "CancelKey", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "onKeyPurchaseHook", "type": "address" }, { "indexed": false, "internalType": "address", "name": "onKeyCancelHook", "type": "address" }, { "indexed": false, "internalType": "address", "name": "onValidKeyHook", "type": "address" }, { "indexed": false, "internalType": "address", "name": "onTokenURIHook", "type": "address" }, { "indexed": false, "internalType": "address", "name": "onKeyTransferHook", "type": "address" }, { "indexed": false, "internalType": "address", "name": "onKeyExtendHook", "type": "address" }, { "indexed": false, "internalType": "address", "name": "onKeyGrantHook", "type": "address" }, { "indexed": false, "internalType": "address", "name": "onHasRoleHook", "type": "address" } ], "name": "EventHooksUpdated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "prevExpiration", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newExpiration", "type": "uint256" } ], "name": "ExpirationChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "ExpireKey", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "refundValue", "type": "uint256" } ], "name": "GasRefundValueChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "receiver", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "refundedAmount", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "tokenAddress", "type": "address" } ], "name": "GasRefunded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint8", "name": "version", "type": "uint8" } ], "name": "Initialized", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "newTimestamp", "type": "uint256" } ], "name": "KeyExtended", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "account", "type": "address" } ], "name": "KeyGranterAdded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "account", "type": "address" } ], "name": "KeyGranterRemoved", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "uint256", "name": "_tokenId", "type": "uint256" }, { "indexed": true, "internalType": "address", "name": "_newManager", "type": "address" } ], "name": "KeyManagerChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "updatedRecordsCount", "type": "uint256" } ], "name": "KeysMigrated", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "expirationDuration", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "maxNumberOfKeys", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "maxKeysPerAcccount", "type": "uint256" } ], "name": "LockConfig", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "account", "type": "address" } ], "name": "LockManagerAdded", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "account", "type": "address" } ], "name": "LockManagerRemoved", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "string", "name": "name", "type": "string" }, { "indexed": false, "internalType": "string", "name": "symbol", "type": "string" }, { "indexed": false, "internalType": "string", "name": "baseTokenURI", "type": "string" } ], "name": "LockMetadata", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "previousOwner", "type": "address" }, { "indexed": false, "internalType": "address", "name": "newOwner", "type": "address" } ], "name": "OwnershipTransferred", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256[]", "name": "tokenIds", "type": "uint256[]" }, { "indexed": false, "internalType": "uint256", "name": "purchases", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "extensions", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "payer", "type": "address" }, { "indexed": false, "internalType": "address", "name": "tokenAddress", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "totalPaid", "type": "uint256" } ], "name": "PaymentReceipt", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "oldKeyPrice", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "keyPrice", "type": "uint256" }, { "indexed": false, "internalType": "address", "name": "oldTokenAddress", "type": "address" }, { "indexed": false, "internalType": "address", "name": "tokenAddress", "type": "address" } ], "name": "PricingChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "referrer", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "fee", "type": "uint256" } ], "name": "ReferrerFee", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "address", "name": "tokenAddress", "type": "address" }, { "indexed": false, "internalType": "address", "name": "referrer", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "fee", "type": "uint256" } ], "name": "ReferrerPaid", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "freeTrialLength", "type": "uint256" }, { "indexed": false, "internalType": "uint256", "name": "refundPenaltyBasisPoints", "type": "uint256" } ], "name": "RefundPenaltyChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "previousAdminRole", "type": "bytes32" }, { "indexed": true, "internalType": "bytes32", "name": "newAdminRole", "type": "bytes32" } ], "name": "RoleAdminChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleGranted", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "indexed": true, "internalType": "address", "name": "account", "type": "address" }, { "indexed": true, "internalType": "address", "name": "sender", "type": "address" } ], "name": "RoleRevoked", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "from", "type": "address" }, { "indexed": true, "internalType": "address", "name": "to", "type": "address" }, { "indexed": true, "internalType": "uint256", "name": "tokenId", "type": "uint256" } ], "name": "Transfer", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": false, "internalType": "uint256", "name": "transferFeeBasisPoints", "type": "uint256" } ], "name": "TransferFeeChanged", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "lockAddress", "type": "address" }, { "indexed": false, "internalType": "address", "name": "unlockAddress", "type": "address" } ], "name": "UnlockCallFailed", "type": "event" }, { "anonymous": false, "inputs": [ { "indexed": true, "internalType": "address", "name": "sender", "type": "address" }, { "indexed": true, "internalType": "address", "name": "tokenAddress", "type": "address" }, { "indexed": true, "internalType": "address", "name": "recipient", "type": "address" }, { "indexed": false, "internalType": "uint256", "name": "amount", "type": "uint256" } ], "name": "Withdrawal", "type": "event" }, { "inputs": [], "name": "DEFAULT_ADMIN_ROLE", "outputs": [ { "internalType": "bytes32", "name": "", "type": "bytes32" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_approved", "type": "address" }, { "internalType": "uint256", "name": "_tokenId", "type": "uint256" } ], "name": "approve", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_keyOwner", "type": "address" } ], "name": "balanceOf", "outputs": [ { "internalType": "uint256", "name": "balance", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenId", "type": "uint256" } ], "name": "burn", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenId", "type": "uint256" } ], "name": "cancelAndRefund", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "expirationDuration", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "expireAndRefundFor", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_value", "type": "uint256" }, { "internalType": "uint256", "name": "_tokenId", "type": "uint256" }, { "internalType": "address", "name": "_referrer", "type": "address" }, { "internalType": "bytes", "name": "_data", "type": "bytes" } ], "name": "extend", "outputs": [], "stateMutability": "payable", "type": "function" }, { "inputs": [], "name": "freeTrialLength", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "gasRefundValue", "outputs": [ { "internalType": "uint256", "name": "_refundValue", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenId", "type": "uint256" } ], "name": "getApproved", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenId", "type": "uint256" } ], "name": "getCancelAndRefundValue", "outputs": [ { "internalType": "uint256", "name": "refund", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_keyOwner", "type": "address" } ], "name": "getHasValidKey", "outputs": [ { "internalType": "bool", "name": "isValid", "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": "uint256", "name": "_tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "_time", "type": "uint256" } ], "name": "getTransferFee", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "_duration", "type": "uint256" } ], "name": "grantKeyExtension", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address[]", "name": "_recipients", "type": "address[]" }, { "internalType": "uint256[]", "name": "_expirationTimestamps", "type": "uint256[]" }, { "internalType": "address[]", "name": "_keyManagers", "type": "address[]" } ], "name": "grantKeys", "outputs": [ { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "grantRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "hasRole", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address payable", "name": "_lockCreator", "type": "address" }, { "internalType": "uint256", "name": "_expirationDuration", "type": "uint256" }, { "internalType": "address", "name": "_tokenAddress", "type": "address" }, { "internalType": "uint256", "name": "_keyPrice", "type": "uint256" }, { "internalType": "uint256", "name": "_maxNumberOfKeys", "type": "uint256" }, { "internalType": "string", "name": "_lockName", "type": "string" } ], "name": "initialize", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "isLockManager", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "isOwner", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenId", "type": "uint256" }, { "internalType": "address", "name": "_referrer", "type": "address" } ], "name": "isRenewable", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenId", "type": "uint256" } ], "name": "isValidKey", "outputs": [ { "internalType": "bool", "name": "", "type": "bool" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenId", "type": "uint256" } ], "name": "keyExpirationTimestampFor", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "name": "keyManagerOf", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "keyPrice", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_from", "type": "address" }, { "internalType": "address", "name": "_recipient", "type": "address" }, { "internalType": "uint256", "name": "_tokenId", "type": "uint256" } ], "name": "lendKey", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "maxKeysPerAddress", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "maxNumberOfKeys", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenIdFrom", "type": "uint256" }, { "internalType": "uint256", "name": "_tokenIdTo", "type": "uint256" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "mergeKeys", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes", "name": "", "type": "bytes" } ], "name": "migrate", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "name", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "numberOfOwners", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "onHasRoleHook", "outputs": [ { "internalType": "contract ILockHasRoleHook", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "onKeyCancelHook", "outputs": [ { "internalType": "contract ILockKeyCancelHook", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "onKeyExtendHook", "outputs": [ { "internalType": "contract ILockKeyExtendHook", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "onKeyGrantHook", "outputs": [ { "internalType": "contract ILockKeyGrantHook", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "onKeyPurchaseHook", "outputs": [ { "internalType": "contract ILockKeyPurchaseHook", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "onKeyTransferHook", "outputs": [ { "internalType": "contract ILockKeyTransferHook", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "onTokenURIHook", "outputs": [ { "internalType": "contract ILockTokenURIHook", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "onValidKeyHook", "outputs": [ { "internalType": "contract ILockValidKeyHook", "name": "", "type": "address" } ], "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": "publicLockVersion", "outputs": [ { "internalType": "uint16", "name": "", "type": "uint16" } ], "stateMutability": "pure", "type": "function" }, { "inputs": [ { "internalType": "uint256[]", "name": "_values", "type": "uint256[]" }, { "internalType": "address[]", "name": "_recipients", "type": "address[]" }, { "internalType": "address[]", "name": "_referrers", "type": "address[]" }, { "internalType": "address[]", "name": "_keyManagers", "type": "address[]" }, { "internalType": "bytes[]", "name": "_data", "type": "bytes[]" } ], "name": "purchase", "outputs": [ { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "components": [ { "internalType": "uint256", "name": "value", "type": "uint256" }, { "internalType": "address", "name": "recipient", "type": "address" }, { "internalType": "address", "name": "referrer", "type": "address" }, { "internalType": "address", "name": "protocolReferrer", "type": "address" }, { "internalType": "address", "name": "keyManager", "type": "address" }, { "internalType": "bytes", "name": "data", "type": "bytes" }, { "internalType": "uint256", "name": "additionalPeriods", "type": "uint256" } ], "internalType": "struct MixinPurchase.PurchaseArgs[]", "name": "purchaseArgs", "type": "tuple[]" } ], "name": "purchase", "outputs": [ { "internalType": "uint256[]", "name": "", "type": "uint256[]" } ], "stateMutability": "payable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_recipient", "type": "address" }, { "internalType": "address", "name": "_referrer", "type": "address" }, { "internalType": "bytes", "name": "_data", "type": "bytes" } ], "name": "purchasePriceFor", "outputs": [ { "internalType": "uint256", "name": "minKeyPrice", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "", "type": "address" } ], "name": "referrerFees", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "refundPenaltyBasisPoints", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenId", "type": "uint256" }, { "internalType": "address", "name": "_referrer", "type": "address" } ], "name": "renewMembershipFor", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "renounceRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "bytes32", "name": "role", "type": "bytes32" }, { "internalType": "address", "name": "account", "type": "address" } ], "name": "revokeRole", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_from", "type": "address" }, { "internalType": "address", "name": "_to", "type": "address" }, { "internalType": "uint256", "name": "_tokenId", "type": "uint256" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_from", "type": "address" }, { "internalType": "address", "name": "_to", "type": "address" }, { "internalType": "uint256", "name": "_tokenId", "type": "uint256" }, { "internalType": "bytes", "name": "_data", "type": "bytes" } ], "name": "safeTransferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_onKeyPurchaseHook", "type": "address" }, { "internalType": "address", "name": "_onKeyCancelHook", "type": "address" }, { "internalType": "address", "name": "_onValidKeyHook", "type": "address" }, { "internalType": "address", "name": "_onTokenURIHook", "type": "address" }, { "internalType": "address", "name": "_onKeyTransferHook", "type": "address" }, { "internalType": "address", "name": "_onKeyExtendHook", "type": "address" }, { "internalType": "address", "name": "_onKeyGrantHook", "type": "address" }, { "internalType": "address", "name": "_onHasRoleHook", "type": "address" } ], "name": "setEventHooks", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_refundValue", "type": "uint256" } ], "name": "setGasRefundValue", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenId", "type": "uint256" }, { "internalType": "uint256", "name": "_newExpiration", "type": "uint256" } ], "name": "setKeyExpiration", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenId", "type": "uint256" }, { "internalType": "address", "name": "_keyManager", "type": "address" } ], "name": "setKeyManagerOf", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "string", "name": "_lockName", "type": "string" }, { "internalType": "string", "name": "_lockSymbol", "type": "string" }, { "internalType": "string", "name": "_baseTokenURI", "type": "string" } ], "name": "setLockMetadata", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "account", "type": "address" } ], "name": "setOwner", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_referrer", "type": "address" }, { "internalType": "uint256", "name": "_feeBasisPoint", "type": "uint256" } ], "name": "setReferrerFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_to", "type": "address" }, { "internalType": "uint256", "name": "_tokenIdFrom", "type": "uint256" }, { "internalType": "uint256", "name": "_timeShared", "type": "uint256" } ], "name": "shareKey", "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": [], "name": "tokenAddress", "outputs": [ { "internalType": "address", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_index", "type": "uint256" } ], "name": "tokenByIndex", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_keyOwner", "type": "address" }, { "internalType": "uint256", "name": "_index", "type": "uint256" } ], "name": "tokenOfOwnerByIndex", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_tokenId", "type": "uint256" } ], "name": "tokenURI", "outputs": [ { "internalType": "string", "name": "", "type": "string" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_keyOwner", "type": "address" } ], "name": "totalKeys", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "totalSupply", "outputs": [ { "internalType": "uint256", "name": "_totalKeysCreated", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [], "name": "transferFeeBasisPoints", "outputs": [ { "internalType": "uint256", "name": "", "type": "uint256" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_from", "type": "address" }, { "internalType": "address", "name": "_recipient", "type": "address" }, { "internalType": "uint256", "name": "_tokenId", "type": "uint256" } ], "name": "transferFrom", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_recipient", "type": "address" }, { "internalType": "uint256", "name": "_tokenId", "type": "uint256" } ], "name": "unlendKey", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [], "name": "unlockProtocol", "outputs": [ { "internalType": "contract IUnlock", "name": "", "type": "address" } ], "stateMutability": "view", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_keyPrice", "type": "uint256" }, { "internalType": "address", "name": "_tokenAddress", "type": "address" } ], "name": "updateKeyPricing", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_newExpirationDuration", "type": "uint256" }, { "internalType": "uint256", "name": "_maxNumberOfKeys", "type": "uint256" }, { "internalType": "uint256", "name": "_maxKeysPerAcccount", "type": "uint256" } ], "name": "updateLockConfig", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_freeTrialLength", "type": "uint256" }, { "internalType": "uint256", "name": "_refundPenaltyBasisPoints", "type": "uint256" } ], "name": "updateRefundPenalty", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "uint256", "name": "_transferFeeBasisPoints", "type": "uint256" } ], "name": "updateTransferFee", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "inputs": [ { "internalType": "address", "name": "_tokenAddress", "type": "address" }, { "internalType": "address payable", "name": "_recipient", "type": "address" }, { "internalType": "uint256", "name": "_amount", "type": "uint256" } ], "name": "withdraw", "outputs": [], "stateMutability": "nonpayable", "type": "function" }, { "stateMutability": "payable", "type": "receive" } ]
608060405234801561000f575f80fd5b50615e39806200001e5f395ff3fe6080604052600436106103ee575f3560e01c80636eadde4311610205578063a98d362311610116578063d1bbd49c116100a4578063d1bbd49c14610c8c578063d32bfb6c14610ca7578063d52e4a1014610cc6578063d547741f14610cdb578063d813cc1914610cfa578063d9caed1214610d0d578063debe2b0d14610d2c578063dec0f27814610d4b578063f12c6b6e14610d6a578063f5766b3914610d89575f80fd5b8063a98d362314610b47578063aae4b8f714610b66578063b11d7ec114610b85578063b129694e14610ba4578063b1a3b25d14610bc4578063b88d4fde14610be3578063c23135dd14610c02578063c87b56dd14610c2e578063c907c3ec14610c4d578063d1b8759b14610c6d575f80fd5b806391a6459d1161019357806391a6459d14610a3957806391d1485414610a5857806392ac98a514610a7757806393fd184414610a9657806395d89b4114610aac578063982bf09014610ac05780639d76ea5814610adf578063a217fddf14610aff578063a2e4cd2e14610b12578063a375cb0514610b31575f80fd5b80636eadde431461090c57806370a082311461092b57806374b6c1061461094a5780637ec2a72414610960578063812eecd41461098057806381a3c9431461099f5780638505fe95146109be5780638577a6d5146109dd5780638932a90d146109fc5780638da5cb5b14610a1b575f80fd5b80632f54bf6e116102ff5780634cd38c1d1161028d5780634cd38c1d146107c35780634d025fed146107e25780634f6ccce71461081757806350878a471461083657806354b249fb14610855578063558b71e91461088457806356e0d51f146108a35780636207a8da146108b95780636352211e146108ce5780636d8ea5b4146108ed575f80fd5b80632f54bf6e146106875780632f745c59146106b657806333818997146106d557806336568abe146106f5578063389f07e81461071457806339f4698614610734578063407dc5891461075357806342842e0e1461077257806342966c68146107915780634609b39b146107b0575f80fd5b806313af40351161037c57806313af40351461055257806318160ddd14610571578063183767da14610586578063217751bc1461059c57806323b872dd146105bc578063248a9ca3146105db57806326e9ca0714610609578063282478df146106295780632d33dd5b146106485780632f2ff15d14610668575f80fd5b806301ffc9a7146103f9578063068208cd1461042d57806306fdde031461044e578063081812fc1461046f578063095ea7b31461049b578063097ba333146104ba5780630c2db8d1146104e75780630f15023b1461050657806310e569731461052657806311a4c03a1461053c575f80fd5b366103f557005b5f80fd5b348015610404575f80fd5b50610418610413366004614d80565b610da8565b60405190151581526020015b60405180910390f35b348015610438575f80fd5b5061044c610447366004614d9b565b610db8565b005b348015610459575f80fd5b50610462610e35565b6040516104249190614e11565b34801561047a575f80fd5b5061048e610489366004614e23565b610ec2565b6040516104249190614e3a565b3480156104a6575f80fd5b5061044c6104b5366004614e6d565b610ee8565b3480156104c5575f80fd5b506104d96104d4366004614f7b565b610f82565b604051908152602001610424565b3480156104f2575f80fd5b5061044c610501366004614fd8565b611020565b348015610511575f80fd5b50610c835461048e906001600160a01b031681565b348015610531575f80fd5b506104d9610c855481565b348015610547575f80fd5b506104d9610c845481565b34801561055d575f80fd5b5061044c61056c366004615016565b611074565b34801561057c575f80fd5b50610c87546104d9565b348015610591575f80fd5b506104d96124075481565b3480156105a7575f80fd5b50610c8a5461048e906001600160a01b031681565b3480156105c7575f80fd5b5061044c6105d6366004614fd8565b611105565b3480156105e6575f80fd5b506104d96105f5366004614e23565b5f9081526097602052604090206001015490565b348015610614575f80fd5b50610c8b5461048e906001600160a01b031681565b348015610634575f80fd5b5061044c610643366004614d9b565b611135565b348015610653575f80fd5b50610c895461048e906001600160a01b031681565b348015610673575f80fd5b5061044c610682366004615031565b6111b5565b348015610692575f80fd5b506104186106a1366004615016565b612bda546001600160a01b0390811691161490565b3480156106c1575f80fd5b506104d96106d0366004614e6d565b6111d9565b6106e86106e336600461518c565b61122b565b6040516104249190615293565b348015610700575f80fd5b5061044c61070f366004615031565b611475565b34801561071f575f80fd5b50610c8f5461048e906001600160a01b031681565b34801561073f575f80fd5b5061044c61074e3660046152a5565b6114f8565b34801561075e575f80fd5b5061044c61076d366004614e6d565b611546565b34801561077d575f80fd5b5061044c61078c366004614fd8565b611590565b34801561079c575f80fd5b5061044c6107ab366004614e23565b6115aa565b6106e86107be3660046152c5565b6115fc565b3480156107ce575f80fd5b5061044c6107dd3660046152a5565b6118ce565b3480156107ed575f80fd5b5061048e6107fc366004614e23565b6110786020525f90815260409020546001600160a01b031681565b348015610822575f80fd5b506104d9610831366004614e23565b611931565b348015610841575f80fd5b50610418610850366004615031565b611959565b348015610860575f80fd5b506104d961086f366004614e23565b5f90815261107b602052604090206001015490565b34801561088f575f80fd5b5061044c61089e3660046152a5565b611aa7565b3480156108ae575f80fd5b506104d96127f05481565b3480156108c4575f80fd5b5061201e546104d9565b3480156108d9575f80fd5b5061048e6108e8366004614e23565b611acb565b3480156108f8575f80fd5b50610418610907366004615016565b611ae6565b348015610917575f80fd5b5061044c61092636600461543f565b611b86565b348015610936575f80fd5b506104d9610945366004615016565b611d00565b348015610955575f80fd5b506104d9610c865481565b34801561096b575f80fd5b50610c8c5461048e906001600160a01b031681565b34801561098b575f80fd5b506104d961099a366004615016565b611d3f565b3480156109aa575f80fd5b506106e86109b93660046154be565b611d5a565b3480156109c9575f80fd5b5061044c6109d8366004615031565b611fc1565b3480156109e8575f80fd5b5061044c6109f7366004614e23565b612049565b348015610a07575f80fd5b5061044c610a16366004615531565b61208a565b348015610a26575f80fd5b50612bda546001600160a01b031661048e565b348015610a44575f80fd5b5060c95461048e906001600160a01b031681565b348015610a63575f80fd5b50610418610a72366004615031565b6120fe565b348015610a82575f80fd5b506104d9610a91366004614e23565b6121b2565b348015610aa1575f80fd5b506104d96110775481565b348015610ab7575f80fd5b5061046261229c565b348015610acb575f80fd5b5061044c610ada36600461556f565b6123bf565b348015610aea575f80fd5b506104b15461048e906001600160a01b031681565b348015610b0a575f80fd5b506104d95f81565b348015610b1d575f80fd5b5061044c610b2c366004615031565b61250f565b348015610b3c575f80fd5b506104d96127f15481565b348015610b52575f80fd5b50610418610b61366004614e23565b61259d565b348015610b71575f80fd5b50610418610b80366004615016565b61265d565b348015610b90575f80fd5b5061044c610b9f366004615031565b612675565b348015610baf575f80fd5b50610c915461048e906001600160a01b031681565b348015610bcf575f80fd5b506104d9610bde3660046152a5565b6126c3565b348015610bee575f80fd5b5061044c610bfd366004615613565b612738565b348015610c0d575f80fd5b506104d9610c1c366004615016565b6120236020525f908152604090205481565b348015610c39575f80fd5b50610462610c48366004614e23565b612772565b348015610c58575f80fd5b50610c905461048e906001600160a01b031681565b348015610c78575f80fd5b5061044c610c8736600461567a565b612a0e565b348015610c97575f80fd5b50604051600f8152602001610424565b348015610cb2575f80fd5b5061044c610cc1366004614e23565b612a8c565b348015610cd1575f80fd5b50610c8e546104d9565b348015610ce6575f80fd5b5061044c610cf5366004615031565b612abd565b61044c610d083660046156fa565b612ae1565b348015610d18575f80fd5b5061044c610d27366004614fd8565b612b84565b348015610d37575f80fd5b5061044c610d46366004614e6d565b612cb5565b348015610d56575f80fd5b5061044c610d653660046152a5565b612d16565b348015610d75575f80fd5b5061044c610d8436600461575e565b612d28565b348015610d94575f80fd5b5061044c610da3366004614e23565b612eeb565b5f610db282612f2f565b92915050565b610dc183612f39565b610dca83612f6a565b610dd383612f90565b610ddc82612f39565b5f83815261107b6020526040902060010154610df99042906157a4565b811115610e19576040516310e88eed60e31b815260040160405180910390fd5b610e2483825f612fee565b610e3082826001612fee565b505050565b6114638054610e43906157b7565b80601f0160208091040260200160405190810160405280929190818152602001828054610e6f906157b7565b8015610eba5780601f10610e9157610100808354040283529160200191610eba565b820191905f5260205f20905b815481529060010190602001808311610e9d57829003601f168201915b505050505081565b5f610ecc82612f39565b505f90815261107960205260409020546001600160a01b031690565b610ef181612f90565b6001600160a01b0382163303610f1a57604051637899146560e11b815260040160405180910390fd5b5f8181526110796020908152604080832080546001600160a01b0319166001600160a01b03878116918217909255611076909352818420549151859492909116917f8c5be1e5ebec7d5bd14f71427d1e84f3dd0314c0f7b2291e5b200ac8c7c3b92591a45050565b610c89545f906001600160a01b03161561101357610c895460405163221c1fd160e01b81526001600160a01b039091169063221c1fd190610fcd9033908890889088906004016157e9565b602060405180830381865afa158015610fe8573d5f803e3d5ffd5b505050506040513d601f19601f8201168201806040525081019061100c9190615826565b9050611019565b50610c85545b9392505050565b61102a813361306b565b6110475760405163075fd2b160e01b815260040160405180910390fd5b6110528383836130e0565b5f9081526110786020526040902080546001600160a01b031916331790555050565b61107c6132b1565b6001600160a01b0381166110a3576040516330c6e09f60e21b815260040160405180910390fd5b612bda80546001600160a01b038381166001600160a01b031983168117909355604080519190921680825260208201939093527f8be0079c531659141344cd1fd0a4f28419497f9722a3daafe3b4186f6b6457e0910160405180910390a15050565b61110e81612f90565b5f8181526110786020526040902080546001600160a01b0319169055610e308383836130e0565b61113d6132b1565b805f0361115d5760405163e03b033d60e01b815260040160405180910390fd5b610c8e819055610c84839055610c8682905560408051848152602081018490529081018290527f9a09448a3f24d3a01ccc67103c7cddbeea820176a18182cc83d0bce585f26a5b9060600160405180910390a1505050565b5f828152609760205260409020600101546111cf816132e7565b610e3083836132f1565b5f6111e383611d3f565b821061120257604051630471175760e11b815260040160405180910390fd5b506001600160a01b03919091165f90815261107c60209081526040808320938352929052205490565b60608451865114158061124057508351865114155b1561125e576040516376b3b52560e11b815260040160405180910390fd5b5f86516001600160401b0381111561127857611278614e97565b6040519080825280602002602001820160405280156112dc57816020015b6040805160e0810182525f808252602080830182905292820181905260608083018290526080830182905260a083015260c082015282525f199092019101816112965790505b5090505f5b875181101561145f576040805160e081019091526104b15481906001600160a01b031661130e575f611329565b8a83815181106113205761132061583d565b60200260200101515b81526020018983815181106113405761134061583d565b60200260200101516001600160a01b031681526020018883815181106113685761136861583d565b60200260200101516001600160a01b031681526020018883815181106113905761139061583d565b60200260200101516001600160a01b031681526020018783815181106113b8576113b861583d565b60200260200101516001600160a01b031681526020018686848181106113e0576113e061583d565b90506020028101906113f29190615851565b8080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92018290525093855250505060209091015282518390839081106114415761144161583d565b6020026020010181905250808061145790615893565b9150506112e1565b50611469816115fc565b98975050505050505050565b6001600160a01b03811633146114ea5760405162461bcd60e51b815260206004820152602f60248201527f416363657373436f6e74726f6c3a2063616e206f6e6c792072656e6f756e636560448201526e103937b632b9903337b91039b2b63360891b60648201526084015b60405180910390fd5b6114f48282613376565b5050565b6115006132b1565b60408051838152602081018390527fd6867bc538320e67d7bdc35860c27c08486eb490b4fd9b820fff18fb28381d3c910160405180910390a16127f1919091556127f055565b5f81815261107860205260409020546001600160a01b0316331461157d5760405163075fd2b160e01b815260040160405180910390fd5b6114f461158982611acb565b83836130e0565b610e3083838360405180602001604052805f815250612738565b6115b381612f39565b6115bc81612f90565b6115cf6115c882611acb565b5f836130e0565b610c878054905f6115df836158ab565b909155505061107f8054905f6115f483615893565b919050555050565b606061160882516133dc565b5f8083516001600160401b0381111561162357611623614e97565b60405190808252806020026020018201604052801561164c578160200160208202803683370190505b5090505f805b8551811015611826575f806117188884815181106116725761167261583d565b60200260200101515f015189858151811061168f5761168f61583d565b6020026020010151602001518a86815181106116ad576116ad61583d565b6020026020010151608001518b87815181106116cb576116cb61583d565b6020026020010151604001518c88815181106116e9576116e961583d565b6020026020010151606001518d89815181106117075761170761583d565b602002602001015160a00151613416565b909250905061172781876158c0565b95508185848151811061173c5761173c61583d565b60200260200101818152505087838151811061175a5761175a61583d565b602002602001015160c001518461177191906158c0565b93505f5b8884815181106117875761178761583d565b602002602001015160c00151811015611810576117a4835f61351e565b506117af82886158c0565b96506117d8828a86815181106117c7576117c761583d565b602002602001015160600151613675565b6117fe8985815181106117ed576117ed61583d565b602002602001015160400151613745565b8061180881615893565b915050611775565b505050808061181e90615893565b915050611652565b5084516104b1546040517f11b468ecf06bc0fc24b28943bae35c968062beaa93da530a0916484cab5fd2449261186f928692869133916001600160a01b03909116908a906158d3565b60405180910390a16118813384613835565b61188a836138dd565b6118926139ce565b5f5b85518110156118c4576118b28682815181106117ed576117ed61583d565b806118bc81615893565b915050611894565b5090949350505050565b6118d6613a42565b6118df82612f39565b6118f65f80516020615d84833981519152336120fe565b15801561190957506119073361265d565b155b1561192757604051631798fedb60e01b815260040160405180910390fd5b610e30828261351e565b5f610c8754821061195557604051630471175760e11b815260040160405180910390fd5b5090565b5f82815261202060205260408120545f19148061198057506104b1546001600160a01b0316155b1561199e57604051636cd40e1160e11b815260040160405180910390fd5b6119bf6119aa84611acb565b8360405180602001604052805f815250610f82565b5f84815261201f602052604090205410806119ea5750610c84545f8481526120206020526040902054115b80611a1357506104b1545f84815261202160205260409020546001600160a01b03908116911614155b15611a315760405163986739e760e01b815260040160405180910390fd5b5f612710610c8454612328611a469190615918565b611a50919061592f565b610c84545f86815261107b6020526040902060010154611a7091906157a4565b611a7a91906158c0565b905080421015611a9d576040516360d8ec3360e11b815260040160405180910390fd5b5060019392505050565b611ab082612f39565b611ab982612f6a565b611ac16132b1565b6114f48282613a66565b5f90815261107660205260409020546001600160a01b031690565b5f80611af183611d00565b610c8b54911091506001600160a01b031615611b8157610c8b5460405163084fdbc760e31b81526001600160a01b039091169063427ede3890611b4290309033905f9081908990899060040161594e565b602060405180830381865afa158015611b5d573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610db29190615989565b919050565b5f54610100900460ff1615808015611ba457505f54600160ff909116105b80611bc45750611bb330613b6b565b158015611bc457505f5460ff166001145b611c275760405162461bcd60e51b815260206004820152602e60248201527f496e697469616c697a61626c653a20636f6e747261637420697320616c72656160448201526d191e481a5b9a5d1a585b1a5e995960921b60648201526084016114e1565b5f805460ff191660011790558015611c48575f805461ff0019166101001790555b611c5186613b7a565b611c5d88888787613ba6565b611c678383613be7565b611c6f613c0e565b611c7b6103e86127f055565b611c8488613c1e565b612bda80546001600160a01b0319166001600160a01b038a16179055611cb06380ac58cd60e01b613caf565b8015611cf6575f805461ff0019169055604051600181527f7f26b83ff96e1f2b6a682f133852f6798a09c465da95921460cefb3847402498906020015b60405180910390a15b5050505050505050565b5f80611d0b83611d3f565b90505f5b81811015611d3857611d24610b6185836111d9565b15611d30576001909201915b600101611d0f565b5050919050565b6001600160a01b03165f90815261107e602052604090205490565b6060611d64613a42565b611d7b5f80516020615d84833981519152336120fe565b158015611d8e5750611d8c3361265d565b155b15611dac57604051631798fedb60e01b815260040160405180910390fd5b5f866001600160401b03811115611dc557611dc5614e97565b604051908082528060200260200182016040528015611dee578160200160208202803683370190505b5090505f5b87811015611fb557611e6a898983818110611e1057611e1061583d565b9050602002016020810190611e259190615016565b868684818110611e3757611e3761583d565b9050602002016020810190611e4c9190615016565b898985818110611e5e57611e5e61583d565b90506020020135613d2d565b828281518110611e7c57611e7c61583d565b6020908102919091010152610c91546001600160a01b031615611fa357610c915482516001600160a01b03909116906348a254b890849084908110611ec357611ec361583d565b6020026020010151338c8c86818110611ede57611ede61583d565b9050602002016020810190611ef39190615016565b898987818110611f0557611f0561583d565b9050602002016020810190611f1a9190615016565b8c8c88818110611f2c57611f2c61583d565b6040516001600160e01b031960e08a901b16815260048101979097526001600160a01b039586166024880152938516604487015250921660648401526020020135608482015260a4015f604051808303815f87803b158015611f8c575f80fd5b505af1158015611f9e573d5f803e3d5ffd5b505050505b80611fad81615893565b915050611df3565b50979650505050505050565b611fc9613a42565b611fd282612f39565b5f82815261202260205260408120546001600160a01b03161561200c575f83815261202260205260409020546001600160a01b031661200e565b815b905061201a8382611959565b50612025835f61351e565b50610e308361203385611acb565b5f86815261201f60205260409020548490613e0a565b6120516132b1565b6040518181527f0496ed1e61eb69727f9659a8e859288db4758ffb1f744d1c1424634f90a257f49060200160405180910390a161240755565b6120966001600f6159a8565b61ffff16610c8d5414806120ab5750610c8d54155b6120f45760405162461bcd60e51b815260206004820152601a60248201527914d0d211535057d5915494d253d397d393d517d0d3d4949150d560321b60448201526064016114e1565b5050600f610c8d55565b5f8281526097602090815260408083206001600160a01b038581168552925282205460c95460ff9091169116156110195760c954604051632c02f5ad60e01b8152600481018690526001600160a01b038581166024830152831515604483015290911690632c02f5ad90606401602060405180830381865afa158015612186573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906121aa9190615989565b915050610db2565b5f6121bc82612f6a565b5f19610c8454036121d0575050610c855490565b5f82815261107b60205260408120600101546121ed9042906157a4565b9050610c84546127f1548261220291906158c0565b1061221257610c85549150612232565b610c845481610c85546122259190615918565b61222f919061592f565b91505b6127f15415806122515750610c84546127f15461224f90836158c0565b105b15612296575f6127106127f054610c855461226c9190615918565b612276919061592f565b9050808311156122915761228a81846157a4565b9250611d38565b5f9250505b50919050565b606061146480546122ac906157b7565b90505f0361233057610c835f9054906101000a90046001600160a01b03166001600160a01b031663cec410526040518163ffffffff1660e01b81526004015f60405180830381865afa158015612304573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261232b91908101906159c3565b905090565b611464805461233e906157b7565b80601f016020809104026020016040519081016040528092919081815260200182805461236a906157b7565b80156123b55780601f1061238c576101008083540402835291602001916123b5565b820191905f5260205f20905b81548152906001019060200180831161239857829003601f168201915b5050505050905090565b6123c76132b1565b6123d1885f613ec8565b6123dc876001613ec8565b6123e7866002613ec8565b6123f2856003613ec8565b6123fd846004613ec8565b612408836005613ec8565b612413826006613ec8565b61241e816007613ec8565b610c8980546001600160a01b038a81166001600160a01b03199283168117909355610c8a80548b83169084168117909155610c8c80548a84169085168117909155610c8b80548c85169086168117909155610c8f80548b86169087168117909155610c9080548b87169088168117909155610c9180548b8816908916811790915560c98054978b16979098168717909755604080519889526020890195909552938701919091526060860191909152608085015260a084015260c083019190915260e08201527f4a21a825c2b28d7dd6702a5068282d441d7b7cb48622e5f6c9413f66e0aed1329061010001611ced565b6125176132b1565b61252081613f12565b610c8580546104b18054928590556001600160a01b031983166001600160a01b0385811691821790925560408051848152602081018890529290941693820184905260608201529091907f3615065ccf48367ac483ac86701248e2e5ff55bdd9be845007d34a3b68d719d49060800160405180910390a150505050565b5f81815261107b6020526040812060010154610c8b5442909111906001600160a01b031615610db257610c8b545f84815261107b60209081526040808320600101546110769092529182902054915163084fdbc760e31b81526001600160a01b039384169363427ede389361261e93309333938b931690899060040161594e565b602060405180830381865afa158015612639573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906110199190615989565b5f610db25f80516020615de4833981519152836120fe565b61267e82612f39565b612688823361306b565b15801561269b57506126993361265d565b155b156126b95760405163866c2fa760e01b815260040160405180910390fd5b6114f48282613fa6565b5f6126cd83612f39565b5f83815261107b6020526040902060010154428110156126f0575f915050610db2565b5f835f036127095761270242836157a4565b905061270c565b50825b612710612407548261271e9190615918565b612728919061592f565b92505050610db2565b5092915050565b612743848484611105565b61274f84848484614030565b61276c576040516303f8ea1560e41b815260040160405180910390fd5b50505050565b606080805f612780306140e2565b90506060851561279a57612793866140f8565b92506127ac565b60405180602001604052805f81525092505b610c8c546001600160a01b03161561287e575f86815261107b6020526040902060010154610c8c546001600160a01b031663988b93ad30336127ed8b611acb565b60405160e085901b6001600160e01b03191681526001600160a01b03938416600482015291831660248301529091166044820152606481018a90526084810184905260a4015f60405180830381865afa15801561284c573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261287391908101906159c3565b979650505050505050565b611465805461288c906157b7565b90505f0361292e57610c835f9054906101000a90046001600160a01b03166001600160a01b031663a998e9fb6040518163ffffffff1660e01b81526004015f60405180830381865afa1580156128e4573d5f803e3d5ffd5b505050506040513d5f823e601f3d908101601f1916820160405261290b91908101906159c3565b9350604051806040016040528060018152602001602f60f81b81525090506129dd565b611465805461293c906157b7565b80601f0160208091040260200160405190810160405280929190818152602001828054612968906157b7565b80156129b35780601f1061298a576101008083540402835291602001916129b3565b820191905f5260205f20905b81548152906001019060200180831161299657829003601f168201915b5050505050935060405180602001604052805f815250905060405180602001604052805f81525091505b838282856040516020016129f49493929190615a34565b604051602081830303815290604052945050505050919050565b612a166132b1565b611463612a24868883615acf565b50611464612a33848683615acf565b50611465612a42828483615acf565b507f1e6d6a19e45ae156dcf4155bc83cf8f59e98d536000998f0e95f4cd330ecfb3e611463611464611465604051612a7c93929190615c02565b60405180910390a1505050505050565b612a9581612f39565b612a9e81612f6a565b612aa781612f90565b5f612ab1826121b2565b90506114f48282613a66565b5f82815260976020526040902060010154612ad7816132e7565b610e308383613376565b612ae9613a42565b612af284612f39565b612afc845f61351e565b505f612b46612b0a86611acb565b8585858080601f0160208091040260200160405190810160405280939291908181526020018383808284375f92019190915250610f8292505050565b6104b1549091506001600160a01b031615612b6557612b658682614187565b612b708582866141a8565b612b7c85338684613e0a565b505050505050565b612b8c6132b1565b5f6001600160a01b038416612ba2575047612c10565b6040516370a0823160e01b81526001600160a01b038516906370a0823190612bce903090600401614e3a565b602060405180830381865afa158015612be9573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190612c0d9190615826565b90505b5f821580612c1d57508183115b15612c49575f8211612c42576040516303e09bb960e31b815260040160405180910390fd5b5080612c4c565b50815b836001600160a01b0316856001600160a01b0316336001600160a01b03167f342e7ff505a8a0364cd0dc2ff195c315e43bce86b204846ecd36913e117b109e84604051612c9b91815260200190565b60405180910390a4612cae858583614209565b5050505050565b612cbd6132b1565b6001600160a01b0382165f818152612023602052604090819020839055517fa027572bb55de556a0df93bd38c3871aaf311245c2cd34f0da045aa33a66dbc590612d0a9084815260200190565b60405180910390a25050565b612d1e6132b1565b6114f48282614245565b612d30613a42565b610c8754610c865411612d56576040516331af695160e01b815260040160405180910390fd5b612d5f82612f90565b612d6882612f6a565b612d7061429e565b5f82815261107660205260408120546001600160a01b0316908042612da4865f90815261107b602052604090206001015490565b612dae91906157a4565b90505f612dba3361265d565b612dcd57612dc886866126c3565b612dcf565b5f5b90505f612ddc82876158c0565b905082811015612df957859350612df487825f612fee565b612e64565b612e023361265d565b612e1557612e1087876126c3565b612e17565b5f5b9150612e2382846157a4565b5f88815261107b6020526040808220426001909101555191955088917f59f2fe866dd27a1c2d34115520888c3150365cbc931aab97fa88c4b9ab40b7959190a25b5f612e798982612e7488426158c0565b613d2d565b905080896001600160a01b0316876001600160a01b03165f80516020615dc483398151915260405160405180910390a4612ec3868a8360405180602001604052805f815250614030565b612ee0576040516303f8ea1560e41b815260040160405180910390fd5b505050505050505050565b612ef36132b1565b61201e8190556040518181527f4d816c1058de34c4241ba72c371fb3f2ea05147691b364f04d16bc967ae68a119060200160405180910390a150565b5f610db2826142d7565b5f81815261107b60205260408120549003612f67576040516378fe247360e01b815260040160405180910390fd5b50565b612f738161259d565b612f67576040516306cfa7d760e11b815260040160405180910390fd5b612f993361265d565b158015612fad5750612fab813361306b565b155b8015612fd057505f81815261107960205260409020546001600160a01b03163314155b15612f675760405163e17c6d4560e01b815260040160405180910390fd5b612ff783612f39565b5f83815261107b6020526040812060010154908215613054575f19820361303157604051630471175760e11b815260040160405180910390fd5b4282111561304a5761304384836158c0565b9050613061565b61304384426158c0565b61305e84836157a4565b90505b612cae8582614245565b5f82815261107860205260408120546001600160a01b03838116911614806130cc5750816001600160a01b03166130a184611acb565b6001600160a01b03161480156130cc57505f83815261107860205260409020546001600160a01b0316155b156130d957506001610db2565b505f610db2565b6130e981612f6a565b6130f161429e565b826001600160a01b031661310482611acb565b6001600160a01b03161461312b5760405163075fd2b160e01b815260040160405180910390fd5b816001600160a01b0316836001600160a01b03160361315d57604051633fbd1a4960e01b815260040160405180910390fd5b6131858161316a3361265d565b61317d57613178835f6126c3565b61317f565b5f5b5f612fee565b5f81815261107b6020526040902061319c83611d3f565b1580156131b157506001600160a01b03831615155b156131cc576110778054905f6131c683615893565b91905055505b6131d5826142e1565b6131df82846143d6565b6131e882614480565b6131f3825f806141a8565b81836001600160a01b0316856001600160a01b03165f80516020615dc483398151915260405160405180910390a4610c8f546001600160a01b03161561276c57610c8f5460018201546040516375b37aef60e01b8152306004820152602481018590523360448201526001600160a01b038781166064830152868116608483015260a48201929092529116906375b37aef9060c4015f604051808303815f87803b15801561329f575f80fd5b505af1158015611cf6573d5f803e3d5ffd5b6132c85f80516020615de4833981519152336120fe565b6132e557604051632386d63160e21b815260040160405180910390fd5b565b612f6781336144bb565b6132fb82826120fe565b6114f4575f8281526097602090815260408083206001600160a01b03851684529091529020805460ff191660011790556133323390565b6001600160a01b0316816001600160a01b0316837f2f8788117e7eff1d82e926ec794901d17c78024a50270940304540a733656f0d60405160405180910390a45050565b61338082826120fe565b156114f4575f8281526097602090815260408083206001600160a01b0385168085529252808320805460ff1916905551339285917ff6391f5c32d9c69d2a47ea670b442974b53935d1edc7fd64eb21e047a839171b9190a45050565b6133e4613a42565b610c865481610c87546133f791906158c0565b1115612f67576040516331af695160e01b815260040160405180910390fd5b5f8061343d87875f19610c84541461343657610c8454612e7490426158c0565b5f19613d2d565b915061344a878685610f82565b90506134578282876141a8565b6104b1546001600160a01b031615613473576134738882614187565b61347d8185613675565b610c89546001600160a01b03161561351357610c89546104b1546001600160a01b0391821691635e895f2991859133918c918b918a91899116156134c1578f6134c3565b345b6040518863ffffffff1660e01b81526004016134e59796959493929190615c3a565b5f604051808303815f87803b1580156134fc575f80fd5b505af115801561350e573d5f803e3d5ffd5b505050505b965096945050505050565b5f82815261107b6020526040812060019081015490810161355257604051630fed19c160e11b815260040160405180910390fd5b5f831561355f5783613564565b610c84545b90505f198103613577575f19925061359d565b428211156135905761358981836158c0565b925061359d565b61359a81426158c0565b92505b5f85815261107b6020526040908190206001018490555185907f3ca112768ff7861e008ace1c11570c52e404c043e585545b5957a1e20961dde3906135e59086815260200190565b60405180910390a2610c90546001600160a01b03161561366d57610c90546040516202d72d60e71b81526004810187905233602482015260448101859052606481018490526001600160a01b039091169063016b9680906084015f604051808303815f87803b158015613656575f80fd5b505af1158015613668573d5f803e3d5ffd5b505050505b505092915050565b610c83546001600160a01b03163b1561371a57610c835460405163939d9f1f60e01b8152600481018490526001600160a01b0383811660248301529091169063939d9f1f90620493e0906044015f604051808303815f88803b1580156136d9575f80fd5b5087f1935050505080156136eb575060015b6114f457610c835460405130915f80516020615da483398151915291612d0a916001600160a01b031690614e3a565b610c835460405130915f80516020615da483398151915291612d0a916001600160a01b031690614e3a565b6001600160a01b03811615612f67576120236020527f7d36fb299e69498e4f50f1259e26de1410e0af62fd4a40ccabb60b72a53a9c87546001600160a01b0382165f9081526040902054156137af57506001600160a01b0381165f90815261202360205260409020545b80156114f4575f61271082610c85546137c89190615918565b6137d2919061592f565b6104b1546040519192507f7b738c16aedc7a7aa4707eff83812b3bac54bd9e9a5acc8d019203de2063498891613815916001600160a01b03169086908590615c89565b60405180910390a16104b154610e30906001600160a01b03168483614209565b6104b1546001600160a01b0316156138bc576104b1546040516323b872dd60e01b81526001600160a01b03909116906323b872dd9061387c90859030908690600401615c89565b6020604051808303815f875af1158015613898573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190610e309190615989565b803410156114f4576040516306c3cddf60e41b815260040160405180910390fd5b610c83545f906001600160a01b03163b156114f457610c835f9054906101000a90046001600160a01b03166001600160a01b031663b0e21e8a6040518163ffffffff1660e01b8152600401602060405180830381865afa925050508015613961575060408051601f3d908101601f1916820190925261395e91810190615826565b60015b61399057610c835460405130915f80516020615da483398151915291612d0a916001600160a01b031690614e3a565b61271061399d8285615918565b6139a7919061592f565b91508115610e30576104b154610c8354610e30916001600160a01b03908116911684614209565b61201e54156132e5576104b15461201e546139f4916001600160a01b0316903390614209565b61201e546104b154604080519283526001600160a01b03909116602083015233917f522a883b471164223f18b50f326da8671372b64b4792eac0e63d447e714c3e3b910160405180910390a2565b610c8d54600f146132e5576040516302eae03b60e61b815260040160405180910390fd5b5f613a7083611acb565b9050613a7b83614514565b336001600160a01b0316816001600160a01b0316847f0a7068a9989857441c039a14a42b67ed71dd1fcfe5a9b17cc87b252e47bce52885604051613ac191815260200190565b60405180910390a48115613ae7576104b154613ae7906001600160a01b03168284614209565b613af2835f806141a8565b610c8a546001600160a01b031615610e3057610c8a5460405163b499b6c560e01b81526001600160a01b039091169063b499b6c590613b3990339085908790600401615c89565b5f604051808303815f87803b158015613b50575f80fd5b505af1158015613b62573d5f803e3d5ffd5b50505050505050565b6001600160a01b03163b151590565b613b8381613f12565b6104b180546001600160a01b0319166001600160a01b0392909216919091179055565b610c8380546001600160a01b03191633179055610c84839055610c85829055610c86819055613bd3600f90565b61ffff16610c8d5550506001610c8e555050565b613bef61451e565b611463613bfd828483615acf565b506114f4635b5e139f60e01b613caf565b6132e563780e9d6360e01b613caf565b613c355f80516020615de483398151915280614588565b613c595f80516020615d848339815191525f80516020615de4833981519152614588565b613c628161265d565b613c7d57613c7d5f80516020615de4833981519152826145d2565b613c945f80516020615d84833981519152826120fe565b612f6757612f675f80516020615d84833981519152826145d2565b6001600160e01b03198082169003613d095760405162461bcd60e51b815260206004820152601c60248201527f4552433136353a20696e76616c696420696e746572666163652069640000000060448201526064016114e1565b6001600160e01b0319165f908152606560205260409020805460ff19166001179055565b5f6001600160a01b038416613d5557604051635963709b60e01b815260040160405180910390fd5b610c8780546001019081905561107f54613d6e916158c0565b60408051808201825282815260208082018681525f85815261107b9092529290209051815590516001909101559050613da684611d3f565b158015613dbb57506001600160a01b03841615155b15613dcb57611077805460010190555b613dd581856143d6565b613ddf8184613fa6565b60405181906001600160a01b038616905f905f80516020615dc4833981519152908290a49392505050565b6040805160018082528183019092525f916020808301908036833701905050905084815f81518110613e3e57613e3e61583d565b60209081029190910101526104b1546040517f11b468ecf06bc0fc24b28943bae35c968062beaa93da530a0916484cab5fd24491613e929184915f9160019133916001600160a01b039091169089906158d3565b60405180910390a1613ea48284613675565b613eae8483613835565b613eb66139ce565b613ebf83613745565b612cae826138dd565b6001600160a01b03821615801590613eef5750613eed826001600160a01b0316613b6b565b155b156114f457604051636788e02b60e01b815260ff821660048201526024016114e1565b6001600160a01b03811615801590613f8857505f816001600160a01b03166318160ddd6040518163ffffffff1660e01b8152600401602060405180830381865afa158015613f62573d5f803e3d5ffd5b505050506040513d601f19601f82011682018060405250810190613f869190615826565b105b15612f675760405163684cae7960e11b815260040160405180910390fd5b5f82815261107860205260409020546001600160a01b038281169116146114f4575f8281526110786020526040902080546001600160a01b0319166001600160a01b038316179055613ff782614480565b6040516001600160a01b0382169083907f9d2895c45a420624de863a2f437b022d879f457bf7a829044055a10c5a6fd5e3905f90a35050565b5f614043846001600160a01b0316613b6b565b61404f575060016140da565b604051630a85bd0160e11b81525f906001600160a01b0386169063150b7a02906140839033908a9089908990600401615cad565b6020604051808303815f875af115801561409f573d5f803e3d5ffd5b505050506040513d601f19601f820116820180604052508101906140c39190615cdf565b6001600160e01b031916630a85bd0160e11b149150505b949350505050565b6060610db26001600160a01b03831660146145dc565b60605f6141048361474d565b60010190505f816001600160401b0381111561412257614122614e97565b6040519080825280601f01601f19166020018201604052801561414c576020820181803683370190505b5090508181016020015b5f19016f181899199a1a9b1b9c1cb0b131b232b360811b600a86061a8153600a850494508461415657509392505050565b808210156114f4576040516330005fb160e21b815260040160405180910390fd5b5f92835261201f6020908152604080852093909355610c84546120208252838520556104b154612021825283852080546001600160a01b039283166001600160a01b0319918216179091556120229092529290932080549093169116179055565b8015610e30576001600160a01b03831661423057610e306001600160a01b03831682614824565b8261276c6001600160a01b0382168484614936565b5f82815261107b602090815260409182902060010180549084905582518181529182018490529184917feff98df468b347f5cf62ed3329054836e763fc673bf48dce3c41dd0612c5fc68910160405180910390a2505050565b61271061240754101580156142b957506142b73361265d565b155b156132e5576040516323f21a3d60e21b815260040160405180910390fd5b5f610db282614988565b5f81815261107660205260408120546001600160a01b031690600161430583611d3f565b61430f91906157a4565b5f84815261107d6020526040902054909150808214614363576001600160a01b0383165f90815261107c60209081526040808320858452825280832054848452818420819055835261107d90915290208190555b6001600160a01b0383165f90815261107c6020908152604080832085845290915281205561439083611d3f565b6001036143a25761107780545f190190555b6001600160a01b0383165f90815261107e602052604081208054600192906143cb9084906157a4565b909155505050505050565b5f6143e082611d3f565b9050610c8e5481101580156143fd57506001600160a01b03821615155b1561441b57604051630bf6c32360e11b815260040160405180910390fd5b5f83815261107d602090815260408083208490556001600160a01b0390941680835261107c8252848320938352928152838220859055938152611076845282812080546001600160a01b0319168317905590815261107e909252902080546001019055565b5f81815261107960205260409020546001600160a01b031615612f67575f9081526110796020526040902080546001600160a01b0319169055565b6144c582826120fe565b6114f4576144d2816149ac565b6144dd8360206149be565b6040516020016144ee929190615cfa565b60408051601f198184030181529082905262461bcd60e51b82526114e191600401614e11565b612f678142614245565b5f54610100900460ff166132e55760405162461bcd60e51b815260206004820152602b60248201527f496e697469616c697a61626c653a20636f6e7472616374206973206e6f74206960448201526a6e697469616c697a696e6760a81b60648201526084016114e1565b5f82815260976020526040808220600101805490849055905190918391839186917fbd79b86ffe0ab8e8776151514217cd7cacd52c909f66475c3af44e129f0b00ff9190a4505050565b6114f482826132f1565b6060825f6145eb846002615918565b6145f69060026158c0565b6001600160401b0381111561460d5761460d614e97565b6040519080825280601f01601f191660200182016040528015614637576020820181803683370190505b509050600360fc1b815f815181106146515761465161583d565b60200101906001600160f81b03191690815f1a905350600f60fb1b8160018151811061467f5761467f61583d565b60200101906001600160f81b03191690815f1a9053505f6146a1856002615918565b6146ac9060016158c0565b90505b6001811115614723576f181899199a1a9b1b9c1cb0b131b232b360811b83600f16601081106146e0576146e061583d565b1a60f81b8282815181106146f6576146f661583d565b60200101906001600160f81b03191690815f1a90535060049290921c9161471c816158ab565b90506146af565b5081156140da5760405163e22e27eb60e01b815260048101869052602481018590526044016114e1565b5f8072184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b831061478b5772184f03e93ff9f4daa797ed6e38ed64bf6a1f0160401b830492506040015b6d04ee2d6d415b85acef810000000083106147b7576d04ee2d6d415b85acef8100000000830492506020015b662386f26fc1000083106147d557662386f26fc10000830492506010015b6305f5e10083106147ed576305f5e100830492506008015b612710831061480157612710830492506004015b60648310614813576064830492506002015b600a8310610db25760010192915050565b804710156148745760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a20696e73756666696369656e742062616c616e636500000060448201526064016114e1565b5f826001600160a01b0316826040515f6040518083038185875af1925050503d805f81146148bd576040519150601f19603f3d011682016040523d82523d5f602084013e6148c2565b606091505b5050905080610e305760405162461bcd60e51b815260206004820152603a60248201527f416464726573733a20756e61626c6520746f2073656e642076616c75652c20726044820152791958da5c1a595b9d081b585e481a185d99481c995d995c9d195960321b60648201526084016114e1565b604080516001600160a01b038416602482015260448082018490528251808303909101815260649091019091526020810180516001600160e01b031663a9059cbb60e01b179052610e30908490614b53565b5f6001600160e01b03198216637965db0b60e01b1480610db25750610db282614c26565b6060610db26001600160a01b03831660145b60605f6149cc836002615918565b6149d79060026158c0565b6001600160401b038111156149ee576149ee614e97565b6040519080825280601f01601f191660200182016040528015614a18576020820181803683370190505b509050600360fc1b815f81518110614a3257614a3261583d565b60200101906001600160f81b03191690815f1a905350600f60fb1b81600181518110614a6057614a6061583d565b60200101906001600160f81b03191690815f1a9053505f614a82846002615918565b614a8d9060016158c0565b90505b6001811115614b04576f181899199a1a9b1b9c1cb0b131b232b360811b85600f1660108110614ac157614ac161583d565b1a60f81b828281518110614ad757614ad761583d565b60200101906001600160f81b03191690815f1a90535060049490941c93614afd816158ab565b9050614a90565b5083156110195760405162461bcd60e51b815260206004820181905260248201527f537472696e67733a20686578206c656e67746820696e73756666696369656e7460448201526064016114e1565b5f614ba7826040518060400160405280602081526020017f5361666545524332303a206c6f772d6c6576656c2063616c6c206661696c6564815250856001600160a01b0316614c609092919063ffffffff16565b905080515f1480614bc7575080806020019051810190614bc79190615989565b610e305760405162461bcd60e51b815260206004820152602a60248201527f5361666545524332303a204552433230206f7065726174696f6e20646964206e6044820152691bdd081cdd58d8d9595960b21b60648201526084016114e1565b5f6301ffc9a760e01b6001600160e01b031983161480610db25750506001600160e01b0319165f9081526065602052604090205460ff1690565b60606140da84845f85855f80866001600160a01b03168587604051614c859190615d68565b5f6040518083038185875af1925050503d805f8114614cbf576040519150601f19603f3d011682016040523d82523d5f602084013e614cc4565b606091505b50915091506128738783838760608315614d3c5782515f03614d3557614ce985613b6b565b614d355760405162461bcd60e51b815260206004820152601d60248201527f416464726573733a2063616c6c20746f206e6f6e2d636f6e747261637400000060448201526064016114e1565b50816140da565b6140da8383815115614d515781518083602001fd5b8060405162461bcd60e51b81526004016114e19190614e11565b6001600160e01b031981168114612f67575f80fd5b5f60208284031215614d90575f80fd5b813561101981614d6b565b5f805f60608486031215614dad575f80fd5b505081359360208301359350604090920135919050565b5f5b83811015614dde578181015183820152602001614dc6565b50505f910152565b5f8151808452614dfd816020860160208601614dc4565b601f01601f19169290920160200192915050565b602081525f6110196020830184614de6565b5f60208284031215614e33575f80fd5b5035919050565b6001600160a01b0391909116815260200190565b6001600160a01b0381168114612f67575f80fd5b8035611b8181614e4e565b5f8060408385031215614e7e575f80fd5b8235614e8981614e4e565b946020939093013593505050565b634e487b7160e01b5f52604160045260245ffd5b60405160e081016001600160401b0381118282101715614ecd57614ecd614e97565b60405290565b604051601f8201601f191681016001600160401b0381118282101715614efb57614efb614e97565b604052919050565b5f6001600160401b03821115614f1b57614f1b614e97565b50601f01601f191660200190565b5f82601f830112614f38575f80fd5b8135614f4b614f4682614f03565b614ed3565b818152846020838601011115614f5f575f80fd5b816020850160208301375f918101602001919091529392505050565b5f805f60608486031215614f8d575f80fd5b8335614f9881614e4e565b92506020840135614fa881614e4e565b915060408401356001600160401b03811115614fc2575f80fd5b614fce86828701614f29565b9150509250925092565b5f805f60608486031215614fea575f80fd5b8335614ff581614e4e565b9250602084013561500581614e4e565b929592945050506040919091013590565b5f60208284031215615026575f80fd5b813561101981614e4e565b5f8060408385031215615042575f80fd5b82359150602083013561505481614e4e565b809150509250929050565b5f6001600160401b0382111561507757615077614e97565b5060051b60200190565b5f82601f830112615090575f80fd5b813560206150a0614f468361505f565b82815260059290921b840181019181810190868411156150be575f80fd5b8286015b848110156150d957803583529183019183016150c2565b509695505050505050565b5f82601f8301126150f3575f80fd5b81356020615103614f468361505f565b82815260059290921b84018101918181019086841115615121575f80fd5b8286015b848110156150d957803561513881614e4e565b8352918301918301615125565b5f8083601f840112615155575f80fd5b5081356001600160401b0381111561516b575f80fd5b6020830191508360208260051b8501011115615185575f80fd5b9250929050565b5f805f805f8060a087890312156151a1575f80fd5b86356001600160401b03808211156151b7575f80fd5b6151c38a838b01615081565b975060208901359150808211156151d8575f80fd5b6151e48a838b016150e4565b965060408901359150808211156151f9575f80fd5b6152058a838b016150e4565b9550606089013591508082111561521a575f80fd5b6152268a838b016150e4565b9450608089013591508082111561523b575f80fd5b5061524889828a01615145565b979a9699509497509295939492505050565b5f8151808452602080850194508084015f5b838110156152885781518752958201959082019060010161526c565b509495945050505050565b602081525f611019602083018461525a565b5f80604083850312156152b6575f80fd5b50508035926020909101359150565b5f60208083850312156152d6575f80fd5b82356001600160401b03808211156152ec575f80fd5b818501915085601f8301126152ff575f80fd5b813561530d614f468261505f565b81815260059190911b8301840190848101908883111561532b575f80fd5b8585015b838110156153f557803585811115615345575f80fd5b860160e0818c03601f1901121561535b575f8081fd5b615363614eab565b8882013581526040615376818401614e62565b8a8301526060615387818501614e62565b828401526080915061539a828501614e62565b9083015260a06153ab848201614e62565b8284015260c0915081840135898111156153c4575f8081fd5b6153d28f8d83880101614f29565b918401919091525060e0929092013591810191909152835291860191860161532f565b5098975050505050505050565b5f8083601f840112615412575f80fd5b5081356001600160401b03811115615428575f80fd5b602083019150836020828501011115615185575f80fd5b5f805f805f805f60c0888a031215615455575f80fd5b873561546081614e4e565b965060208801359550604088013561547781614e4e565b9450606088013593506080880135925060a08801356001600160401b0381111561549f575f80fd5b6154ab8a828b01615402565b989b979a50959850939692959293505050565b5f805f805f80606087890312156154d3575f80fd5b86356001600160401b03808211156154e9575f80fd5b6154f58a838b01615145565b9098509650602089013591508082111561550d575f80fd5b6155198a838b01615145565b9096509450604089013591508082111561523b575f80fd5b5f8060208385031215615542575f80fd5b82356001600160401b03811115615557575f80fd5b61556385828601615402565b90969095509350505050565b5f805f805f805f80610100898b031215615587575f80fd5b883561559281614e4e565b975060208901356155a281614e4e565b965060408901356155b281614e4e565b955060608901356155c281614e4e565b945060808901356155d281614e4e565b935060a08901356155e281614e4e565b925060c08901356155f281614e4e565b915060e089013561560281614e4e565b809150509295985092959890939650565b5f805f8060808587031215615626575f80fd5b843561563181614e4e565b9350602085013561564181614e4e565b92506040850135915060608501356001600160401b03811115615662575f80fd5b61566e87828801614f29565b91505092959194509250565b5f805f805f806060878903121561568f575f80fd5b86356001600160401b03808211156156a5575f80fd5b6156b18a838b01615402565b909850965060208901359150808211156156c9575f80fd5b6156d58a838b01615402565b909650945060408901359150808211156156ed575f80fd5b5061524889828a01615402565b5f805f805f6080868803121561570e575f80fd5b8535945060208601359350604086013561572781614e4e565b925060608601356001600160401b03811115615741575f80fd5b61574d88828901615402565b969995985093965092949392505050565b5f805f60608486031215615770575f80fd5b833561577b81614e4e565b95602085013595506040909401359392505050565b634e487b7160e01b5f52601160045260245ffd5b81810381811115610db257610db2615790565b600181811c908216806157cb57607f821691505b60208210810361229657634e487b7160e01b5f52602260045260245ffd5b6001600160a01b0385811682528481166020830152831660408201526080606082018190525f9061581c90830184614de6565b9695505050505050565b5f60208284031215615836575f80fd5b5051919050565b634e487b7160e01b5f52603260045260245ffd5b5f808335601e19843603018112615866575f80fd5b8301803591506001600160401b0382111561587f575f80fd5b602001915036819003821315615185575f80fd5b5f600182016158a4576158a4615790565b5060010190565b5f816158b9576158b9615790565b505f190190565b80820180821115610db257610db2615790565b60c081525f6158e560c083018961525a565b60208301979097525060408101949094526001600160a01b0392831660608501529116608083015260a090910152919050565b8082028115828204841417610db257610db2615790565b5f8261594957634e487b7160e01b5f52601260045260245ffd5b500490565b6001600160a01b039687168152948616602086015260408501939093526060840191909152909216608082015290151560a082015260c00190565b5f60208284031215615999575f80fd5b81518015158114611019575f80fd5b61ffff82811682821603908082111561273157612731615790565b5f602082840312156159d3575f80fd5b81516001600160401b038111156159e8575f80fd5b8201601f810184136159f8575f80fd5b8051615a06614f4682614f03565b818152856020838501011115615a1a575f80fd5b615a2b826020830160208601614dc4565b95945050505050565b5f8551615a45818460208a01614dc4565b855190830190615a59818360208a01614dc4565b8551910190615a6c818360208901614dc4565b8451910190615a7f818360208801614dc4565b019695505050505050565b601f821115610e30575f81815260208120601f850160051c81016020861015615ab05750805b601f850160051c820191505b81811015612b7c57828155600101615abc565b6001600160401b03831115615ae657615ae6614e97565b615afa83615af483546157b7565b83615a8a565b5f601f841160018114615b2b575f8515615b145750838201355b5f19600387901b1c1916600186901b178355612cae565b5f83815260209020601f19861690835b82811015615b5b5786850135825560209485019460019092019101615b3b565b5086821015615b77575f1960f88860031b161c19848701351681555b505060018560011b0183555050505050565b5f8154615b95816157b7565b808552602060018381168015615bb25760018114615bcc57615bf7565b60ff1985168884015283151560051b880183019550615bf7565b865f52825f205f5b85811015615bef5781548a8201860152908301908401615bd4565b890184019650505b505050505092915050565b606081525f615c146060830186615b89565b8281036020840152615c268186615b89565b9050828103604084015261581c8185615b89565b8781526001600160a01b03878116602083015286811660408301528516606082015260e0608082018190525f90615c7390830186614de6565b60a08301949094525060c0015295945050505050565b6001600160a01b039384168152919092166020820152604081019190915260600190565b6001600160a01b03858116825284166020820152604081018390526080606082018190525f9061581c90830184614de6565b5f60208284031215615cef575f80fd5b815161101981614d6b565b76020b1b1b2b9b9a1b7b73a3937b61d1030b1b1b7bab73a1604d1b81525f8351615d2b816017850160208801614dc4565b7001034b99036b4b9b9b4b733903937b6329607d1b6017918401918201528351615d5c816028840160208801614dc4565b01602801949350505050565b5f8251615d79818460208701614dc4565b919091019291505056feb309c40027c81d382c3b58d8de24207a34b27e1db369b1434e4a11311f154b5e6b18946261693dfd6c760d986b28ad2238b5b0267f8e5b6bc40a2f998e2f20acddf252ad1be2c89b69c2b068fc378daa952ba7f163c4a11628f55a4df523b3efb89cdd26cddd51301940bf2715f765b626b8a5a9e2681ac62dc83cc2db2530c0a264697066735822122025ce853add834b99ee289e2ca854fe8209a783045829ec84ef57d2670ca9f5c664736f6c63430008150033